From 99f98eadfce9b26c4ec4736fb5710bd62b788f86 Mon Sep 17 00:00:00 2001 From: milisbir Date: Sat, 9 Jun 2018 00:06:58 +0200 Subject: [PATCH] aktarma --- talimatname/genel/8/8cc/fix_cflags.patch | 10 + talimatname/genel/8/8cc/talimat | 21 + talimatname/genel/9/9base/9 | 13 + talimatname/genel/9/9base/plan9.sh | 4 + talimatname/genel/9/9base/talimat | 33 + talimatname/genel/g/geos/talimat | 20 + talimatname/genel/g/gnet/talimat | 18 + talimatname/genel/g/gocr/talimat | 26 + talimatname/genel/g/goocanvas/talimat | 30 + ...0001-Fix-displaying-images-with-GTK3.patch | 173 + talimatname/genel/g/gpicview/talimat | 27 + talimatname/genel/g/gradle/gradle.sh | 2 + talimatname/genel/g/gradle/talimat | 49 + talimatname/genel/g/gssdp/talimat | 17 + ...-plugins-bad-0.10.23-compatibility-1.patch | 29 + .../genel/g/gstreamer-plugins-bad/talimat | 24 + .../genel/g/gstreamer-plugins-base/talimat | 22 + .../genel/g/gstreamer-plugins-ffmpeg/talimat | 28 + .../genel/g/gstreamer-plugins-good/talimat | 23 + .../genel/g/gstreamer-plugins-python/talimat | 18 + .../genel/g/gstreamer-plugins-ugly/talimat | 22 + talimatname/genel/g/gstreamer/talimat | 25 + .../genel/g/gstreamer1-plugins-bad/talimat | 20 + .../genel/g/gstreamer1-plugins-base/talimat | 20 + .../genel/g/gstreamer1-plugins-good/talimat | 20 + .../genel/g/gstreamer1-plugins-libav/talimat | 20 + .../genel/g/gstreamer1-plugins-ugly/talimat | 21 + talimatname/genel/g/gstreamer1/talimat | 20 + talimatname/genel/g/gtest/talimat | 28 + talimatname/genel/g/gthumb/gthumb.kur-kos | 1 + talimatname/genel/g/gthumb/talimat | 24 + talimatname/genel/g/gtk-doc/talimat | 16 + .../genel/g/gtk-engine-murrine/talimat | 21 + talimatname/genel/g/gtk-engines/talimat | 21 + talimatname/genel/g/gtk-gnutella/talimat | 15 + .../gtk-theme-config-tr.desktop | 10 + .../gtk-theme-config/gtk-theme-config-tr.vala | 724 + talimatname/genel/g/gtk-theme-config/talimat | 20 + .../genel/g/gtk-update-icon-cache/talimat | 23 + talimatname/genel/g/gtk-vnc/talimat | 19 + talimatname/genel/g/gtk2/gtk.kur-kos | 5 + talimatname/genel/g/gtk2/talimat | 56 + talimatname/genel/g/gtk3/gtk3.kur-kos | 1 + talimatname/genel/g/gtk3/talimat | 30 + talimatname/genel/g/gtkdialog/talimat | 18 + talimatname/genel/g/gtkglext/gtk2.20.patch | 77 + talimatname/genel/g/gtkglext/talimat | 23 + talimatname/genel/g/gtkhtml/talimat | 16 + talimatname/genel/g/gtkmm/talimat | 23 + talimatname/genel/g/gtkmm3/talimat | 18 + talimatname/genel/g/gtksourceview2/talimat | 18 + talimatname/genel/g/gtksourceview3/talimat | 17 + talimatname/genel/g/gtkspell/talimat | 26 + talimatname/genel/g/gtop/talimat | 23 + talimatname/genel/g/gtrayicon/talimat | 25 + talimatname/genel/g/guake/guake.kur-kos | 1 + talimatname/genel/g/guake/talimat | 25 + .../genel/g/gucharmap/gucharmap.kur-kos | 2 + talimatname/genel/g/gucharmap/talimat | 17 + talimatname/genel/g/guile/talimat | 35 + talimatname/genel/g/gunicorn/talimat | 19 + talimatname/genel/g/gupnp/talimat | 18 + talimatname/genel/g/gutenprint-gimp/talimat | 27 + .../genel/g/gutenprint/gutenprint.kur-kos | 3 + talimatname/genel/g/gutenprint/talimat | 23 + talimatname/genel/g/gvfs/gvfs.kur-kos | 2 + talimatname/genel/g/gvfs/talimat | 20 + talimatname/genel/g/gvim/gvim.desktop | 12 + talimatname/genel/g/gvim/talimat | 26 + talimatname/genel/g/gwenview/talimat | 23 + talimatname/genel/h/handbrake/talimat | 22 + talimatname/genel/h/hardinfo/hardinfo-tr.po | 4350 ++ talimatname/genel/h/hardinfo/talimat | 31 + talimatname/genel/h/harfbuzz/harfbuzz.kos-kur | 1 + talimatname/genel/h/harfbuzz/harfbuzz.kos-sil | 1 + talimatname/genel/h/harfbuzz/harfbuzz.sil-kos | 1 + talimatname/genel/h/harfbuzz/talimat | 32 + talimatname/genel/h/haveged/talimat | 29 + talimatname/genel/h/hd2u/talimat | 20 + talimatname/genel/h/hdajackretask/talimat | 16 + .../hddtemp/hddtemp-0.3-beta15-byteswap.patch | 28 + .../hddtemp/hddtemp-0.3-beta15-execinfo.patch | 21 + .../h/hddtemp/hddtemp-0.3-beta15-iconv.patch | 28 + .../h/hddtemp/hddtemp-0.3-beta15-nls.patch | 14 + .../hddtemp/hddtemp-0.3-beta15-satacmds.patch | 26 + talimatname/genel/h/hddtemp/hddtemp.rc | 37 + talimatname/genel/h/hddtemp/talimat | 37 + talimatname/genel/h/hdparm/talimat | 14 + talimatname/genel/h/heimdall/heimdall.desktop | 9 + talimatname/genel/h/heimdall/talimat | 25 + talimatname/genel/h/help2man/talimat | 19 + talimatname/genel/h/hexchat/talimat | 25 + talimatname/genel/h/hfsprogs/license | 353 + talimatname/genel/h/hfsprogs/makefile.patch | 10 + talimatname/genel/h/hfsprogs/talimat | 35 + .../genel/h/hiawatha/hiawatha.conf.sample | 114 + talimatname/genel/h/hiawatha/hiawatha.kur-kos | 1 + talimatname/genel/h/hiawatha/hiawatha.rc | 33 + talimatname/genel/h/hiawatha/talimat | 65 + .../genel/h/hicolor-icon-theme/talimat | 18 + talimatname/genel/h/hidapi/talimat | 18 + talimatname/genel/h/highlight/talimat | 15 + talimatname/genel/h/hping/Makefile.patch | 30 + talimatname/genel/h/hping/talimat | 21 + talimatname/genel/h/hping/tshzset.patch | 13 + talimatname/genel/h/hplip-plugin/talimat | 48 + ...-ppd.h-in-various-places-as-CUPS-2.2.patch | 50 + talimatname/genel/h/hplip/fix_tabs.patch | 17 + talimatname/genel/h/hplip/hplip.kur-kos | 3 + talimatname/genel/h/hplip/talimat | 62 + talimatname/genel/h/htop/talimat | 16 + talimatname/genel/h/http-parser/talimat | 21 + talimatname/genel/h/httpup/talimat | 15 + talimatname/genel/h/hunspell/talimat | 20 + talimatname/genel/h/hydra/talimat | 17 + talimatname/genel/h/hyphen/talimat | 17 + talimatname/genel/i/i2pd/i2pd.conf | 168 + talimatname/genel/i/i2pd/i2pd.kur-kos | 5 + talimatname/genel/i/i2pd/talimat | 60 + talimatname/genel/i/i2pd/tunnels.conf | 49 + talimatname/genel/i/i3-status/talimat | 19 + talimatname/genel/i/i3wm/talimat | 21 + talimatname/genel/i/ibus/talimat | 25 + .../genel/i/icecat/fix-wifi-scanner.diff | 16 + .../genel/i/icecat/icecat-safe.desktop | 78 + talimatname/genel/i/icecat/icecat.desktop | 78 + talimatname/genel/i/icecat/mozconfig | 37 + .../genel/i/icecat/mozilla-1228540-1.patch | 84 + talimatname/genel/i/icecat/no-crmf.diff | 27 + talimatname/genel/i/icecat/talimat | 58 + talimatname/genel/i/icecat/vendor.js | 9 + talimatname/genel/i/icedtea-web/talimat | 90 + talimatname/genel/i/icewm/icewm.post.install | 40 + talimatname/genel/i/icewm/talimat | 25 + talimatname/genel/i/icon-naming-utils/talimat | 19 + talimatname/genel/i/icu/talimat | 23 + talimatname/genel/i/id3lib/talimat | 23 + talimatname/genel/i/ido/talimat | 24 + talimatname/genel/i/iftop/talimat | 16 + talimatname/genel/i/ijs/talimat | 18 + talimatname/genel/i/ilmbase/talimat | 20 + talimatname/genel/i/imagemagick/talimat | 42 + talimatname/genel/i/imlib2/talimat | 21 + talimatname/genel/i/impacket/talimat | 19 + talimatname/genel/i/incidenceeditor/talimat | 20 + .../i/indicator-sound/indicator-sound.kur-kos | 1 + talimatname/genel/i/indicator-sound/talimat | 29 + .../initd-tools-0.1.3-0.1.3.tar.gz.partial | 0 talimatname/genel/i/initd-tools/talimat | 23 + .../inkscape/inkscape-0.91-testfiles-1.patch | 257 + talimatname/genel/i/inkscape/talimat | 18 + talimatname/genel/i/innoextract/talimat | 23 + talimatname/genel/i/inspircd/inspircd.kur-kos | 16 + talimatname/genel/i/inspircd/inspircd.sil-kos | 1 + talimatname/genel/i/inspircd/talimat | 47 + .../genel/i/intel-ucode/intel-ucode.kur-kos | 3 + talimatname/genel/i/intel-ucode/talimat | 18 + talimatname/genel/i/intltool/talimat | 19 + talimatname/genel/i/inxi/talimat | 18 + talimatname/genel/i/io/talimat | 23 + talimatname/genel/i/iperf/talimat | 28 + talimatname/genel/i/iprange/talimat | 19 + talimatname/genel/i/ipset/talimat | 19 + talimatname/genel/i/iptables/iptables.kur-kos | 1 + talimatname/genel/i/iptables/iptables.okubeni | 57 + talimatname/genel/i/iptables/iptables.rc | 84 + talimatname/genel/i/iptables/talimat | 22 + talimatname/genel/i/iputils/talimat | 16 + talimatname/genel/i/ipw2100-fw/talimat | 18 + talimatname/genel/i/ipw2200-fw/talimat | 19 + talimatname/genel/i/irssi/talimat | 26 + talimatname/genel/i/iso-codes/talimat | 16 + talimatname/genel/i/isodumper/header.png | Bin 0 -> 21241 bytes talimatname/genel/i/isodumper/header.svg | 435 + talimatname/genel/i/isodumper/talimat | 35 + talimatname/genel/i/isomaster/talimat | 17 + talimatname/genel/i/isowriter/talimat | 40 + talimatname/genel/i/itstool/talimat | 16 + talimatname/genel/i/iucode-tool/talimat | 17 + talimatname/genel/i/iw/talimat | 17 + .../j/jack/jack-40-hpet-permissions.rules | 2 + talimatname/genel/j/jack/jack-99-audio.conf | 2 + talimatname/genel/j/jack/talimat | 25 + talimatname/genel/j/jam/talimat | 17 + talimatname/genel/j/jansson/talimat | 22 + talimatname/genel/j/jasper/talimat | 22 + talimatname/genel/j/java-mysql/talimat | 17 + talimatname/genel/j/jbigkit/talimat | 36 + talimatname/genel/j/jd-gui/jd-gui.desktop | 7 + talimatname/genel/j/jd-gui/talimat | 21 + talimatname/genel/j/jemalloc/talimat | 17 + talimatname/genel/j/jfsutils/talimat | 19 + talimatname/genel/j/joe/talimat | 24 + talimatname/genel/j/john/talimat | 28 + talimatname/genel/j/jq/talimat | 17 + talimatname/genel/j/jre/jre.kos-kur | 3 + talimatname/genel/j/jre/talimat | 31 + talimatname/genel/j/js1/talimat | 25 + talimatname/genel/j/js2/talimat | 29 + .../genel/j/js38/mozjs38-1269317.patch | 122 + .../genel/j/js38/mozjs38-copy-headers.patch | 20 + .../j/js38/mozjs38-fix-tracelogger.patch | 603 + .../genel/j/js38/mozjs38-install-name.patch | 11 + talimatname/genel/j/js38/talimat | 37 + .../j/js52/mozjs52-disable-mozglue.patch | 66 + talimatname/genel/j/js52/talimat | 37 + talimatname/genel/j/json-c/talimat | 18 + talimatname/genel/j/json-glib/talimat | 16 + talimatname/genel/j/jsoncpp/talimat | 28 + talimatname/genel/j/jumpnbump/desktop.patch | 14 + talimatname/genel/j/jumpnbump/menu.patch | 31 + talimatname/genel/j/jumpnbump/talimat | 22 + talimatname/genel/j/junit/talimat | 24 + talimatname/genel/j/jwm/jwm-tr.po | 449 + talimatname/genel/j/jwm/jwm.desktop | 6 + talimatname/genel/j/jwm/jwm.readme | 8 + talimatname/genel/j/jwm/system.jwmrc | 191 + talimatname/genel/j/jwm/talimat | 27 + talimatname/genel/k/k3b/talimat | 26 + .../genel/k/kaccounts-integration/talimat | 21 + .../genel/k/kaccounts-providers/talimat | 21 + talimatname/genel/k/kaffeine/talimat | 24 + talimatname/genel/k/kakoune/talimat | 21 + talimatname/genel/k/kalarmcal/talimat | 21 + talimatname/genel/k/kashmir/talimat | 16 + talimatname/genel/k/kate/talimat | 23 + talimatname/genel/k/kblog/talimat | 22 + talimatname/genel/k/kcalc/talimat | 23 + talimatname/genel/k/kcalcore/talimat | 21 + talimatname/genel/k/kcalutils/talimat | 21 + talimatname/genel/k/kcontacts/talimat | 21 + talimatname/genel/k/kcptun/talimat | 27 + talimatname/genel/k/kde-app/talimat | 14 + talimatname/genel/k/kde-extra/talimat | 14 + talimatname/genel/k/kde5-l10n/talimat | 28 + talimatname/genel/k/kde5/talimat | 29 + talimatname/genel/k/kdeconnect/talimat | 26 + .../genel/k/kdegraphics-thumbnailers/talimat | 22 + talimatname/genel/k/kdenlive/talimat | 23 + talimatname/genel/k/kdepim-addons/talimat | 21 + talimatname/genel/k/kdepim-apps-libs/talimat | 21 + talimatname/genel/k/kdepim-runtime/talimat | 21 + talimatname/genel/k/kdepim/talimat | 22 + talimatname/genel/k/kdgantt2/talimat | 22 + talimatname/genel/k/kdiagram/talimat | 24 + talimatname/genel/k/kdialog/talimat | 20 + talimatname/genel/k/kdiamond/kdiamond.kur-kos | 1 + talimatname/genel/k/kdiamond/talimat | 22 + talimatname/genel/k/keepassx2/talimat | 33 + talimatname/genel/k/kerberos/kerberos.kur-kos | 7 + talimatname/genel/k/kerberos/kerberos.okubeni | 37 + talimatname/genel/k/kerberos/talimat | 55 + talimatname/genel/k/kernel/aufs4-base.patch | 332 + talimatname/genel/k/kernel/aufs4-kbuild.patch | 24 + .../genel/k/kernel/aufs4-loopback.patch | 243 + talimatname/genel/k/kernel/aufs4-mmap.patch | 398 + .../genel/k/kernel/aufs4-standalone.patch | 436 + talimatname/genel/k/kernel/aufs4.patch | 37214 ++++++++++++++++ talimatname/genel/k/kernel/config | 8658 ++++ talimatname/genel/k/kernel/config.aufs | 21 + talimatname/genel/k/kernel/create-aufs.sh | 36 + talimatname/genel/k/kernel/kernel.kos-sil | 8 + talimatname/genel/k/kernel/kernel.kur-kos | 24 + talimatname/genel/k/kernel/talimat | 212 + talimatname/genel/k/kernel/tmpfs-idr.patch | 225 + talimatname/genel/k/kernel/vfs-ino.patch | 23 + talimatname/genel/k/keybinder/talimat | 18 + talimatname/genel/k/keybinder3/talimat | 18 + talimatname/genel/k/keyutils/talimat | 18 + talimatname/genel/k/kf5-attica/talimat | 24 + .../genel/k/kf5-baloo/kf5-baloo.kur-kos | 2 + talimatname/genel/k/kf5-baloo/talimat | 25 + talimatname/genel/k/kf5-bluez-qt/talimat | 25 + talimatname/genel/k/kf5-breeze-icons/talimat | 24 + .../genel/k/kf5-extra-cmake-modules/talimat | 21 + .../genel/k/kf5-frameworkintegration/talimat | 24 + .../genel/k/kf5-kactivities-stats/talimat | 27 + talimatname/genel/k/kf5-kactivities/talimat | 27 + talimatname/genel/k/kf5-kapidox/talimat | 23 + talimatname/genel/k/kf5-karchive/talimat | 24 + talimatname/genel/k/kf5-kauth/talimat | 24 + talimatname/genel/k/kf5-kbookmarks/talimat | 25 + talimatname/genel/k/kf5-kcmutils/talimat | 27 + talimatname/genel/k/kf5-kcodecs/talimat | 25 + talimatname/genel/k/kf5-kcompletion/talimat | 26 + talimatname/genel/k/kf5-kconfig/talimat | 25 + .../genel/k/kf5-kconfigwidgets/talimat | 26 + .../k/kf5-kcoreaddons/kf5-kcoreaddons.kur-kos | 1 + talimatname/genel/k/kf5-kcoreaddons/talimat | 25 + talimatname/genel/k/kf5-kcrash/talimat | 26 + talimatname/genel/k/kf5-kdbusaddons/talimat | 25 + talimatname/genel/k/kf5-kdeclarative/talimat | 26 + talimatname/genel/k/kf5-kded/talimat | 26 + .../genel/k/kf5-kdelibs4support/talimat | 29 + .../genel/k/kf5-kdesignerplugin/talimat | 26 + talimatname/genel/k/kf5-kdesu/talimat | 26 + talimatname/genel/k/kf5-kdewebkit/talimat | 27 + talimatname/genel/k/kf5-kdnssd/talimat | 26 + talimatname/genel/k/kf5-kdoctools/talimat | 26 + talimatname/genel/k/kf5-kemoticons/talimat | 25 + talimatname/genel/k/kf5-kfilemetadata/talimat | 25 + talimatname/genel/k/kf5-kglobalaccel/talimat | 25 + talimatname/genel/k/kf5-kguiaddons/talimat | 25 + talimatname/genel/k/kf5-khtml/talimat | 26 + .../genel/k/kf5-ki18n/kf5-ki18n.kos-kur | 1 + talimatname/genel/k/kf5-ki18n/talimat | 25 + talimatname/genel/k/kf5-kiconthemes/talimat | 26 + talimatname/genel/k/kf5-kidletime/talimat | 26 + talimatname/genel/k/kf5-kimageformats/talimat | 26 + talimatname/genel/k/kf5-kinit/talimat | 26 + talimatname/genel/k/kf5-kio/kf5-kio.kur-kos | 2 + talimatname/genel/k/kf5-kio/talimat | 26 + talimatname/genel/k/kf5-kitemmodels/talimat | 26 + talimatname/genel/k/kf5-kitemviews/talimat | 26 + talimatname/genel/k/kf5-kjobwidgets/talimat | 26 + talimatname/genel/k/kf5-kjs/talimat | 26 + talimatname/genel/k/kf5-kjsembed/talimat | 26 + talimatname/genel/k/kf5-kmediaplayer/talimat | 26 + talimatname/genel/k/kf5-knewstuff/talimat | 26 + .../genel/k/kf5-knotifications/talimat | 26 + talimatname/genel/k/kf5-knotifyconfig/talimat | 26 + talimatname/genel/k/kf5-kpackage/talimat | 26 + talimatname/genel/k/kf5-kparts/talimat | 26 + talimatname/genel/k/kf5-kpeople/talimat | 25 + talimatname/genel/k/kf5-kplotting/talimat | 26 + talimatname/genel/k/kf5-kprison/talimat | 24 + talimatname/genel/k/kf5-kpty/talimat | 25 + talimatname/genel/k/kf5-kross/talimat | 26 + talimatname/genel/k/kf5-krunner/talimat | 25 + talimatname/genel/k/kf5-kservice/talimat | 26 + talimatname/genel/k/kf5-ktexteditor/talimat | 26 + talimatname/genel/k/kf5-ktextwidgets/talimat | 26 + .../genel/k/kf5-kunitconversion/talimat | 26 + talimatname/genel/k/kf5-kwallet/talimat | 26 + talimatname/genel/k/kf5-kwayland/talimat | 24 + .../genel/k/kf5-kwidgetsaddons/talimat | 25 + talimatname/genel/k/kf5-kwindowsystem/talimat | 25 + talimatname/genel/k/kf5-kxmlgui/talimat | 26 + talimatname/genel/k/kf5-kxmlrpcclient/talimat | 26 + .../genel/k/kf5-modemmanager-qt/talimat | 25 + .../genel/k/kf5-networkmanager-qt/talimat | 25 + talimatname/genel/k/kf5-oxygen-icons5/talimat | 23 + .../genel/k/kf5-plasma-framework/talimat | 26 + talimatname/genel/k/kf5-solid/talimat | 25 + talimatname/genel/k/kf5-sonnet/talimat | 27 + talimatname/genel/k/kf5-threadweaver/talimat | 26 + talimatname/genel/k/kf5/talimat | 15 + talimatname/genel/k/khelpcenter/talimat | 23 + talimatname/genel/k/kholidays/talimat | 21 + .../genel/k/kidentitymanagement/talimat | 21 + talimatname/genel/k/kimap/talimat | 21 + .../genel/k/kio-extras/kio-extras.kur-kos | 1 + talimatname/genel/k/kio-extras/talimat | 22 + talimatname/genel/k/kirigami/talimat | 22 + talimatname/genel/k/klavaro/klavaro.mo | Bin 0 -> 29018 bytes talimatname/genel/k/klavaro/talimat | 18 + talimatname/genel/k/kldap/talimat | 22 + talimatname/genel/k/kmahjongg/talimat | 21 + talimatname/genel/k/kmailtransport/talimat | 21 + talimatname/genel/k/kmbox/talimat | 22 + talimatname/genel/k/kmime/talimat | 21 + talimatname/genel/k/kmix/talimat | 26 + talimatname/genel/k/kolourpaint/talimat | 24 + talimatname/genel/k/kompare/talimat | 24 + talimatname/genel/k/komutan/komutan.kur-kos | 22 + talimatname/genel/k/komutan/talimat | 25 + talimatname/genel/k/konsole/talimat | 23 + talimatname/genel/k/kontactinterface/talimat | 22 + talimatname/genel/k/konversation/talimat | 20 + talimatname/genel/k/kpat/kpat.kur-kos | 3 + talimatname/genel/k/kpat/talimat | 22 + talimatname/genel/k/kpimtextedit/talimat | 21 + talimatname/genel/k/kpmcore/talimat | 23 + .../genel/k/krb5/krb5-config_LDFLAGS.patch | 13 + talimatname/genel/k/krb5/talimat | 38 + talimatname/genel/k/krita/talimat | 23 + talimatname/genel/k/ktnef/talimat | 22 + talimatname/genel/k/kutuphane/baglanti.java | 290 + .../genel/k/kutuphane/kutuphane.kur-kos | 3 + talimatname/genel/k/kutuphane/talimat | 27 + .../ladspa/ladspa-fallback-ladspa-path.patch | 27 + ...adspa-fix-memleak-in-plugin-scanning.patch | 11 + talimatname/genel/l/ladspa/talimat | 29 + talimatname/genel/l/lame/talimat | 16 + talimatname/genel/l/lapack/talimat | 25 + talimatname/genel/l/lazagne/lazagne.kur-kos | 1 + talimatname/genel/l/lazagne/sifrebul | 2 + talimatname/genel/l/lazagne/talimat | 21 + talimatname/genel/l/lazarus/talimat | 24 + talimatname/genel/l/lcms/talimat | 19 + talimatname/genel/l/lcms2/talimat | 21 + talimatname/genel/l/ldns/talimat | 30 + talimatname/genel/l/leafpad/talimat | 18 + talimatname/genel/l/lemonbar/talimat | 29 + talimatname/genel/l/lensfun/talimat | 18 + talimatname/genel/l/leptonica/talimat | 20 + talimatname/genel/l/lesstif/talimat | 29 + talimatname/genel/l/lftp/talimat | 20 + talimatname/genel/l/liba52/talimat | 26 + talimatname/genel/l/libabw/talimat | 20 + talimatname/genel/l/libaccounts-glib/talimat | 23 + talimatname/genel/l/libaccounts-qt5/talimat | 19 + talimatname/genel/l/libao/talimat | 16 + .../genel/l/libappindicator-gtk2/talimat | 31 + talimatname/genel/l/libart_lgpl/talimat | 16 + talimatname/genel/l/libass/talimat | 16 + talimatname/genel/l/libassuan/talimat | 19 + talimatname/genel/l/libasyncd/talimat | 16 + talimatname/genel/l/libasyncns/talimat | 16 + talimatname/genel/l/libatasmart/talimat | 18 + talimatname/genel/l/libatomic-ops/talimat | 23 + talimatname/genel/l/libb64/talimat | 30 + talimatname/genel/l/libbluray/talimat | 20 + talimatname/genel/l/libbsd/talimat | 17 + talimatname/genel/l/libburn/talimat | 17 + talimatname/genel/l/libcaca/talimat | 22 + talimatname/genel/l/libcacard/talimat | 17 + talimatname/genel/l/libcanberra/talimat | 25 + talimatname/genel/l/libcap-ng/talimat | 19 + talimatname/genel/l/libcddb/talimat | 16 + talimatname/genel/l/libcdio-paranoia/talimat | 17 + talimatname/genel/l/libcdio/talimat | 18 + talimatname/genel/l/libcdr/talimat | 17 + talimatname/genel/l/libchamplain/talimat | 17 + talimatname/genel/l/libcli/talimat | 17 + talimatname/genel/l/libcmis/google_drive.diff | 106 + talimatname/genel/l/libcmis/talimat | 19 + talimatname/genel/l/libconfig/talimat | 21 + talimatname/genel/l/libcroco/talimat | 20 + .../genel/l/libcryptui/libcryptui.kur-kos | 1 + talimatname/genel/l/libcryptui/talimat | 19 + talimatname/genel/l/libcxx/talimat | 44 + talimatname/genel/l/libdaemon/talimat | 19 + talimatname/genel/l/libdatrie/talimat | 20 + talimatname/genel/l/libdbusmenu-glib/talimat | 27 + talimatname/genel/l/libdbusmenu-gtk2/talimat | 27 + talimatname/genel/l/libdbusmenu-gtk3/talimat | 27 + talimatname/genel/l/libdbusmenu-qt/talimat | 18 + talimatname/genel/l/libdbusmenu-qt5/talimat | 21 + talimatname/genel/l/libdmapsharing/talimat | 19 + talimatname/genel/l/libdmtx/talimat | 19 + talimatname/genel/l/libdnet/talimat | 18 + talimatname/genel/l/libdv/talimat | 17 + talimatname/genel/l/libdvdcss/talimat | 17 + talimatname/genel/l/libdvdnav/talimat | 18 + talimatname/genel/l/libdvdread/talimat | 18 + talimatname/genel/l/libe-book/talimat | 18 + talimatname/genel/l/libechonest/talimat | 25 + talimatname/genel/l/libedit/talimat | 20 + talimatname/genel/l/libepoxy/talimat | 18 + talimatname/genel/l/libesmtp/talimat | 19 + .../0001-Allow-building-with-mdds-1.2.patch | 83 + ...rop-test-that-violates-Unicode-tr-35.patch | 37 + .../l/libetonyek/0001-fix-test-on-i686.patch | 27 + talimatname/genel/l/libetonyek/talimat | 25 + talimatname/genel/l/libetpan/talimat | 16 + talimatname/genel/l/libev/talimat | 18 + talimatname/genel/l/libevdev/talimat | 17 + talimatname/genel/l/libevent/talimat | 16 + talimatname/genel/l/libexif/talimat | 21 + talimatname/genel/l/libexttextcat/talimat | 20 + talimatname/genel/l/libfakekey/talimat | 20 + talimatname/genel/l/libffi/libffi.kur-kos | 2 + talimatname/genel/l/libffi/talimat | 28 + talimatname/genel/l/libfilezilla/talimat | 18 + talimatname/genel/l/libfm-extra/talimat | 21 + talimatname/genel/l/libfm-qt/talimat | 22 + talimatname/genel/l/libfm/talimat | 24 + talimatname/genel/l/libfprint/talimat | 20 + talimatname/genel/l/libftdi/talimat | 25 + talimatname/genel/l/libgcrypt/talimat | 23 + talimatname/genel/l/libgd/talimat | 21 + .../0001-Convert-files-to-Unicode.patch | 83 + talimatname/genel/l/libgda/fix-crash.diff | 21 + .../genel/l/libgda/glib-2.54-ftbfs-2.patch | 11 + .../genel/l/libgda/glib-2.54-ftbfs.patch | 103 + talimatname/genel/l/libgda/java.patch | 36 + talimatname/genel/l/libgda/talimat | 44 + talimatname/genel/l/libgdata/talimat | 18 + .../l/libgdiplus/libgdiplus0-giflib5.patch | 136 + talimatname/genel/l/libgdiplus/talimat | 17 + talimatname/genel/l/libgee/talimat | 18 + talimatname/genel/l/libgee06/talimat | 18 + talimatname/genel/l/libgexiv2/talimat | 19 + talimatname/genel/l/libgig/talimat | 20 + .../genel/l/libgksu/libgksu-2.0.0-fbsd.patch | 60 + .../libgksu-2.0.12-automake-1.11.2.patch | 25 + .../libgksu-2.0.12-fix-make-3.82.patch | 19 + .../l/libgksu/libgksu-2.0.12-notests.patch | 26 + .../libgksu-2.0.12-revert-forkpty.patch | 359 + .../genel/l/libgksu/libgksu-2.0.7-libs.patch | 76 + .../l/libgksu/libgksu-2.0.7-polinguas.patch | 40 + talimatname/genel/l/libgksu/libgksu-tr.po | 682 + talimatname/genel/l/libgksu/talimat | 50 + talimatname/genel/l/libglade/talimat | 22 + talimatname/genel/l/libglademm/talimat | 21 + talimatname/genel/l/libgnome-keyring/talimat | 17 + talimatname/genel/l/libgnomecanvas/talimat | 19 + talimatname/genel/l/libgnomecanvasmm/talimat | 21 + .../genel/l/libgnomekbd/libgnomekbd.kur-kos | 1 + talimatname/genel/l/libgnomekbd/talimat | 17 + talimatname/genel/l/libgovirt/talimat | 20 + talimatname/genel/l/libgpg-error/talimat | 20 + talimatname/genel/l/libgphoto2/jpeg.patch | 92 + talimatname/genel/l/libgphoto2/talimat | 20 + talimatname/genel/l/libgravatar/talimat | 22 + talimatname/genel/l/libgsf/talimat | 18 + talimatname/genel/l/libgsignon-glib/talimat | 22 + talimatname/genel/l/libgtop/talimat | 21 + talimatname/genel/l/libgudev/talimat | 17 + .../genel/l/libguestfs/libguestfs.kur-kos | 15 + talimatname/genel/l/libguestfs/talimat | 45 + talimatname/genel/l/libgusb/talimat | 18 + .../genel/l/libgweather/libgweather.kur-kos | 2 + talimatname/genel/l/libgweather/talimat | 17 + talimatname/genel/l/libical/libical.kur-kos | 2 + talimatname/genel/l/libical/talimat | 22 + talimatname/genel/l/libid3tag/talimat | 21 + talimatname/genel/l/libidl/talimat | 19 + talimatname/genel/l/libidn/talimat | 27 + talimatname/genel/l/libindicator-gtk2/talimat | 31 + talimatname/genel/l/libindicator/talimat | 31 + talimatname/genel/l/libinput/talimat | 20 + talimatname/genel/l/libiodbc/talimat | 21 + talimatname/genel/l/libisoburn/talimat | 18 + talimatname/genel/l/libisofs/talimat | 17 + talimatname/genel/l/libixion/talimat | 22 + talimatname/genel/l/libjpeg-turbo/talimat | 21 + talimatname/genel/l/libkcddb/talimat | 21 + talimatname/genel/l/libkdcraw/talimat | 21 + talimatname/genel/l/libkdegames/talimat | 21 + talimatname/genel/l/libkdepim/talimat | 22 + talimatname/genel/l/libkexiv2/talimat | 20 + talimatname/genel/l/libkgapi/talimat | 21 + talimatname/genel/l/libkipi/libkipi.kur-kos | 1 + talimatname/genel/l/libkipi/talimat | 23 + talimatname/genel/l/libkleo/talimat | 21 + talimatname/genel/l/libkmahjongg/talimat | 21 + talimatname/genel/l/libkomparediff2/talimat | 24 + talimatname/genel/l/libksane/talimat | 26 + talimatname/genel/l/libksba/talimat | 20 + talimatname/genel/l/libksieve/talimat | 21 + talimatname/genel/l/liblangtag/talimat | 18 + talimatname/genel/l/liblinear/talimat | 18 + talimatname/genel/l/liblo/talimat | 19 + talimatname/genel/l/liblxqt/talimat | 22 + talimatname/genel/l/libmad/amd64-64bit.diff | 12 + talimatname/genel/l/libmad/frame_length.diff | 197 + talimatname/genel/l/libmad/libmad.patch | 117 + talimatname/genel/l/libmad/mad.pc | 11 + talimatname/genel/l/libmad/optimize.diff | 77 + talimatname/genel/l/libmad/talimat | 28 + .../genel/l/libmatekbd/libmatekbd.kur-kos | 1 + talimatname/genel/l/libmatekbd/talimat | 22 + talimatname/genel/l/libmatemixer/talimat | 24 + .../l/libmateweather/libmateweather.kur-kos | 3 + talimatname/genel/l/libmateweather/talimat | 26 + talimatname/genel/l/libmbim/talimat | 20 + talimatname/genel/l/libmcrypt/talimat | 18 + talimatname/genel/l/libmediaart/talimat | 18 + talimatname/genel/l/libmediainfo/talimat | 34 + talimatname/genel/l/libmicrohttpd/talimat | 21 + talimatname/genel/l/libmikmod/talimat | 22 + talimatname/genel/l/libmms/talimat | 22 + talimatname/genel/l/libmng/talimat | 24 + talimatname/genel/l/libmnl/talimat | 18 + talimatname/genel/l/libmodplug/talimat | 16 + talimatname/genel/l/libmp4v2/talimat | 17 + talimatname/genel/l/libmpcdec/talimat | 22 + talimatname/genel/l/libmpeg2/talimat | 20 + talimatname/genel/l/libmspack/talimat | 18 + talimatname/genel/l/libmspub/talimat | 17 + talimatname/genel/l/libmtp/talimat | 19 + talimatname/genel/l/libmusicbrainz2/talimat | 25 + talimatname/genel/l/libmusicbrainz5/talimat | 26 + talimatname/genel/l/libmwaw/talimat | 17 + talimatname/genel/l/libmypaint/gegl-0.4.patch | 53 + talimatname/genel/l/libmypaint/talimat | 24 + .../genel/l/libmypaint/versioning.patch | 268 + talimatname/genel/l/libnatpmp/talimat | 19 + talimatname/genel/l/libndp/talimat | 19 + talimatname/genel/l/libnet/talimat | 20 + talimatname/genel/l/libnetfilter_acct/talimat | 16 + .../genel/l/libnetfilter_conntrack/talimat | 17 + talimatname/genel/l/libnetfilter_log/talimat | 18 + .../sync_with_kernel_headers.patch | 110 + talimatname/genel/l/libnfnetlink/talimat | 18 + talimatname/genel/l/libnfs-python/talimat | 16 + talimatname/genel/l/libnfs/talimat | 17 + talimatname/genel/l/libnftnl/talimat | 18 + talimatname/genel/l/libnice/talimat | 19 + talimatname/genel/l/libnih/talimat | 17 + talimatname/genel/l/libnl/talimat | 18 + talimatname/genel/l/libnotify/talimat | 19 + talimatname/genel/l/libntru/talimat | 16 + talimatname/genel/l/liboauth/talimat | 19 + talimatname/genel/l/libodfgen/talimat | 17 + .../l/libofa/libofa-0.9.3-curl-7.21.patch | 11 + .../genel/l/libofa/libofa-0.9.3-gcc-4.7.patch | 22 + .../genel/l/libofa/libofa-gcc4.3.patch | 35 + .../genel/l/libofa/libofa-gcc4.5.patch | 10 + talimatname/genel/l/libofa/libofa-gcc4.patch | 39 + talimatname/genel/l/libofa/talimat | 31 + talimatname/genel/l/libogg/talimat | 22 + talimatname/genel/l/liboobs/talimat | 17 + talimatname/genel/l/libopenraw/talimat | 16 + talimatname/genel/l/liborcus/talimat | 19 + talimatname/genel/l/libosinfo/talimat | 19 + talimatname/genel/l/libotr/talimat | 18 + talimatname/genel/l/libpagemaker/talimat | 19 + talimatname/genel/l/libpaper/run-parts | 48 + talimatname/genel/l/libpaper/talimat | 26 + talimatname/genel/l/libpcap/libpcap.kur-kos | 1 + talimatname/genel/l/libpcap/talimat | 19 + talimatname/genel/l/libpeas/libpeas.kur-kos | 1 + talimatname/genel/l/libpeas/talimat | 18 + talimatname/genel/l/libpgf/talimat | 19 + talimatname/genel/l/libpgm/talimat | 19 + talimatname/genel/l/libpng/talimat | 22 + talimatname/genel/l/libpng12/talimat | 21 + talimatname/genel/l/libproxy/talimat | 25 + talimatname/genel/l/libpst/talimat | 18 + talimatname/genel/l/libpwquality/talimat | 20 + talimatname/genel/l/libqmi/talimat | 19 + talimatname/genel/l/libqtxdg/talimat | 21 + talimatname/genel/l/libquvi-scripts/talimat | 17 + talimatname/genel/l/libquvi/talimat | 17 + talimatname/genel/l/librangetree/talimat | 16 + talimatname/genel/l/libraw/talimat | 18 + talimatname/genel/l/libre/talimat | 17 + talimatname/genel/l/librecad/talimat | 54 + talimatname/genel/l/librem/talimat | 17 + .../l/libreoffice-bin/libreoffice-bin.kur-kos | 2 + talimatname/genel/l/libreoffice-bin/talimat | 57 + .../genel/l/libreoffice/libreoffice.kur-kos | 9 + talimatname/genel/l/libreoffice/talimat | 134 + talimatname/genel/l/librep/talimat | 20 + talimatname/genel/l/librest/talimat | 21 + talimatname/genel/l/librevenge/talimat | 15 + talimatname/genel/l/libringclient/talimat | 22 + talimatname/genel/l/librsvg/librsvg.kur-kos | 1 + talimatname/genel/l/librsvg/talimat | 18 + talimatname/genel/l/libsamplerate/talimat | 18 + talimatname/genel/l/libseccomp/talimat | 19 + talimatname/genel/l/libsecp256k1/talimat | 36 + talimatname/genel/l/libsecret/talimat | 20 + .../genel/l/libselinux/libselinux.tmpfiles.d | 1 + talimatname/genel/l/libselinux/talimat | 27 + talimatname/genel/l/libsepol/talimat | 15 + talimatname/genel/l/libsexy/talimat | 21 + talimatname/genel/l/libsexymm/talimat | 19 + talimatname/genel/l/libshout/talimat | 17 + talimatname/genel/l/libsigc++/talimat | 17 + talimatname/genel/l/libsignon-glib/talimat | 22 + talimatname/genel/l/libsigsegv/talimat | 22 + talimatname/genel/l/libsndfile/talimat | 19 + talimatname/genel/l/libsodium/talimat | 18 + talimatname/genel/l/libsoundio/talimat | 29 + talimatname/genel/l/libsoup-22/talimat | 20 + talimatname/genel/l/libsoup-22/update.patch | 526 + talimatname/genel/l/libsoup/talimat | 18 + .../libspectre-0.2.7-ghostscript-9.18-1.patch | 41 + talimatname/genel/l/libspectre/talimat | 22 + talimatname/genel/l/libspiro/talimat | 19 + talimatname/genel/l/libspotify/talimat | 25 + talimatname/genel/l/libspoton/talimat | 19 + talimatname/genel/l/libsrtp/talimat | 19 + talimatname/genel/l/libssh/talimat | 18 + talimatname/genel/l/libssh2/talimat | 18 + talimatname/genel/l/libstatgrab/talimat | 22 + .../l/libstroke/libgstroke-Makefile.am.patch | 11 + .../libstroke/libstroke-0.5.1-m4_syntax.patch | 58 + .../l/libstroke/libstroke-0.5.1-no_gtk1.patch | 33 + .../l/libstroke/libstroke-Makefile.am.patch | 15 + talimatname/genel/l/libstroke/talimat | 25 + talimatname/genel/l/libsysstat/talimat | 20 + talimatname/genel/l/libt3config/talimat | 18 + talimatname/genel/l/libt3highlight/talimat | 18 + talimatname/genel/l/libt3key/talimat | 18 + talimatname/genel/l/libt3widget/talimat | 18 + talimatname/genel/l/libt3window/talimat | 18 + talimatname/genel/l/libtasn1/talimat | 21 + talimatname/genel/l/libthai/talimat | 23 + talimatname/genel/l/libtheora/talimat | 17 + talimatname/genel/l/libtiff/talimat | 21 + talimatname/genel/l/libtimezonemap/talimat | 20 + talimatname/genel/l/libtins/talimat | 20 + talimatname/genel/l/libtirpc/talimat | 30 + talimatname/genel/l/libtommath/talimat | 17 + .../libtorrent-boost-1.65.patch | 34 + .../genel/l/libtorrent-rasterbar/talimat | 47 + talimatname/genel/l/libtorrent/talimat | 21 + talimatname/genel/l/libtranscript/talimat | 21 + talimatname/genel/l/libuecc/talimat | 18 + talimatname/genel/l/libunique/talimat | 18 + talimatname/genel/l/libunique1/talimat | 25 + talimatname/genel/l/libunique3/talimat | 28 + talimatname/genel/l/libunistring/talimat | 18 + talimatname/genel/l/libunwind/talimat | 19 + talimatname/genel/l/libupnp/talimat | 22 + talimatname/genel/l/liburcu/talimat | 17 + talimatname/genel/l/libusb-compat/talimat | 19 + talimatname/genel/l/libusb/talimat | 20 + talimatname/genel/l/libutempter/talimat | 19 + talimatname/genel/l/libuv/talimat | 19 + talimatname/genel/l/libva/talimat | 21 + talimatname/genel/l/libvdpau-va-gl/talimat | 16 + talimatname/genel/l/libvdpau/talimat | 22 + talimatname/genel/l/libvisio/talimat | 17 + talimatname/genel/l/libvlc/lua53_compat.patch | 30 + talimatname/genel/l/libvlc/talimat | 29 + talimatname/genel/l/libvncserver/talimat | 17 + talimatname/genel/l/libvorbis/talimat | 18 + talimatname/genel/l/libvpx/talimat | 25 + talimatname/genel/l/libwacom/talimat | 17 + talimatname/genel/l/libwebp/talimat | 23 + talimatname/genel/l/libwebsockets/talimat | 21 + talimatname/genel/l/libwlocate/talimat | 19 + .../l/libwmf/libwmf.0.2.8.4-libpng-1.5.patch | 12 + .../libwmf/libwmf.0.2.8.4-useafterfree.patch | 10 + talimatname/genel/l/libwmf/libwmf.kur-kos | 4 + talimatname/genel/l/libwmf/talimat | 27 + talimatname/genel/l/libwnck/talimat | 16 + talimatname/genel/l/libwnck3/talimat | 16 + talimatname/genel/l/libwpd/talimat | 17 + talimatname/genel/l/libwpg/talimat | 17 + talimatname/genel/l/libwps/talimat | 17 + .../libxcb/libxcb-1.1-no-pthread-stubs.patch | 11 + .../genel/l/libxcb/python-35x-fixes.patch | 42 + talimatname/genel/l/libxcb/talimat | 30 + talimatname/genel/l/libxdg-basedir/talimat | 18 + .../libxfcegui4-4.10.0-no-xfce_setenv.patch | 14 + talimatname/genel/l/libxfcegui4/talimat | 26 + talimatname/genel/l/libxkbcommon/talimat | 18 + talimatname/genel/l/libxml++26/talimat | 19 + talimatname/genel/l/libxml2/talimat | 19 + talimatname/genel/l/libxslt/talimat | 17 + .../l/libyubikey/libyubikey.70-yubikey.rules | 4 + talimatname/genel/l/libyubikey/talimat | 20 + talimatname/genel/l/libzeitgeist/talimat | 18 + talimatname/genel/l/libzen/talimat | 34 + talimatname/genel/l/libzip/talimat | 20 + talimatname/genel/l/libzmf/talimat | 19 + .../lightdm-gtk-greeter-settings-tr.po | 910 + .../l/lightdm-gtk-greeter-settings/talimat | 18 + .../cinnamon_badge_symbolic.svg | 75 + .../genel/l/lightdm-gtk-greeter/talimat | 43 + talimatname/genel/l/lightdm/Xsession | 25 + talimatname/genel/l/lightdm/lightdm.kur-kos | 8 + talimatname/genel/l/lightdm/talimat | 67 + talimatname/genel/l/lighttpd/lighttpd.conf | 204 + talimatname/genel/l/lighttpd/talimat | 28 + .../lila-hd-icon-theme.kur-kos | 7 + .../genel/l/lila-hd-icon-theme/talimat | 19 + talimatname/genel/l/links/talimat | 21 + .../microcode_amd_fam17h.bin.xz | Bin 0 -> 1988 bytes talimatname/genel/l/linux-firmware/talimat | 46 + talimatname/genel/l/lirc/lirc.logrotate | 5 + talimatname/genel/l/lirc/lirc.tmpfiles | 1 + talimatname/genel/l/lirc/talimat | 30 + talimatname/genel/l/live/talimat | 36 + ...read-handling-for-out-of-tree-builds.patch | 78 + talimatname/genel/l/lld/talimat | 24 + talimatname/genel/l/llvm/llvm-config.h | 12 + talimatname/genel/l/llvm/talimat | 38 + talimatname/genel/l/lm-sensors/talimat | 24 + talimatname/genel/l/lmdb/talimat | 19 + talimatname/genel/l/lockfile/talimat | 16 + .../genel/l/logmein-hamachi/hamachi.servis | 23 + talimatname/genel/l/logmein-hamachi/talimat | 31 + talimatname/genel/l/logrotate/logrotate.conf | 30 + .../genel/l/logrotate/logrotate.okubeni | 56 + talimatname/genel/l/logrotate/talimat | 25 + talimatname/genel/l/lpsolve/cflags.patch | 25 + .../l/lpsolve/lpsolve-5.5.2.0.defines.patch | 22 + talimatname/genel/l/lpsolve/talimat | 31 + talimatname/genel/l/lsb-release/lsbrelease | 4 + talimatname/genel/l/lsb-release/milis-release | 1 + .../genel/l/lsb-release/system-release | 1 + talimatname/genel/l/lsb-release/talimat | 19 + talimatname/genel/l/lshw/lshw-gtk.desktop | 8 + talimatname/genel/l/lshw/lshw-gtk.xpm | 239 + talimatname/genel/l/lshw/talimat | 30 + talimatname/genel/l/lsof/talimat | 20 + talimatname/genel/l/lua-alt-getopt/talimat | 18 + talimatname/genel/l/lua-filesystem/talimat | 16 + talimatname/genel/l/lua-lgi/talimat | 39 + talimatname/genel/l/lua/LICENSE | 30 + talimatname/genel/l/lua/liblua.so.patch | 60 + talimatname/genel/l/lua/lua.pc | 20 + talimatname/genel/l/lua/talimat | 45 + talimatname/genel/l/lua51/talimat | 46 + talimatname/genel/l/lua52/lua-5.2-cflags.diff | 19 + talimatname/genel/l/lua52/lua.diff | 57 + talimatname/genel/l/lua52/lua.pc | 20 + talimatname/genel/l/lua52/talimat | 47 + talimatname/genel/l/luajit/talimat | 16 + talimatname/genel/l/luarocks-51/talimat | 25 + talimatname/genel/l/luarocks-52/talimat | 25 + talimatname/genel/l/luarocks-53/talimat | 23 + talimatname/genel/l/lucenepp/talimat | 28 + talimatname/genel/l/lumina-desktop/talimat | 22 + talimatname/genel/l/lxc/lxc.tmpfiles.d | 1 + talimatname/genel/l/lxc/talimat | 41 + .../genel/l/lxde-appearance-obconf/talimat | 20 + talimatname/genel/l/lxde-appearance/talimat | 24 + .../genel/l/lxde-common/chrystal_red_root.png | Bin 0 -> 1622 bytes .../genel/l/lxde-common/lxde-common.kur-kos | 3 + talimatname/genel/l/lxde-common/lxde.desktop | 11 + talimatname/genel/l/lxde-common/okubeni | 4 + talimatname/genel/l/lxde-common/talimat | 33 + talimatname/genel/l/lxde-gpicview/talimat | 19 + .../l/lxde-icon-theme/lxde-icon-theme.kur-kos | 1 + talimatname/genel/l/lxde-icon-theme/talimat | 18 + talimatname/genel/l/lxde-input/talimat | 19 + talimatname/genel/l/lxde-menu-data/talimat | 18 + .../genel/l/lxde-panel/fix-crash.patch | 71 + talimatname/genel/l/lxde-panel/talimat | 30 + talimatname/genel/l/lxde-randr/talimat | 21 + talimatname/genel/l/lxde-session/talimat | 19 + talimatname/genel/l/lxde-task/talimat | 20 + .../l/lxde-terminal/lxde-terminal.kur-kos | 1 + talimatname/genel/l/lxde-terminal/talimat | 20 + talimatname/genel/l/lxdm-tema/talimat | 17 + talimatname/genel/l/lxdm/Xsession | 48 + talimatname/genel/l/lxdm/lxdm.conf.in.patch | 20 + talimatname/genel/l/lxdm/lxdm.in.patch | 26 + talimatname/genel/l/lxdm/lxdm.kur-kos | 2 + talimatname/genel/l/lxdm/lxdm.pam | 6 + talimatname/genel/l/lxdm/talimat | 41 + talimatname/genel/l/lximage-qt/talimat | 21 + talimatname/genel/l/lxqt-about/talimat | 21 + talimatname/genel/l/lxqt-admin/talimat | 21 + talimatname/genel/l/lxqt-build-tools/talimat | 20 + talimatname/genel/l/lxqt-common/talimat | 24 + talimatname/genel/l/lxqt-config/talimat | 22 + talimatname/genel/l/lxqt-globalkeys/talimat | 22 + talimatname/genel/l/lxqt-l10n/talimat | 21 + .../genel/l/lxqt-notificationd/talimat | 23 + .../genel/l/lxqt-openssh-askpass/talimat | 21 + talimatname/genel/l/lxqt-panel/talimat | 29 + talimatname/genel/l/lxqt-policykit/talimat | 20 + .../genel/l/lxqt-powermanagement/talimat | 20 + talimatname/genel/l/lxqt-qtermwidget/talimat | 22 + .../l/lxqt-qtplugin/lxqt-qtplugin.kur-kos | 7 + talimatname/genel/l/lxqt-qtplugin/talimat | 22 + talimatname/genel/l/lxqt-runner/talimat | 22 + talimatname/genel/l/lxqt-session/talimat | 21 + talimatname/genel/l/lxqt-sudo/talimat | 21 + talimatname/genel/l/lxqt/lxqt.sira | 31 + talimatname/genel/l/lxqt/talimat | 15 + talimatname/genel/l/lynx/talimat | 24 + talimatname/genel/l/lziprecover/talimat | 17 + talimatname/genel/l/lzop/talimat | 19 + talimatname/genel/m/maclookup/talimat | 19 + talimatname/genel/m/macos-simge-tema/talimat | 19 + talimatname/genel/m/mailcommon/talimat | 21 + talimatname/genel/m/mailimporter/talimat | 21 + talimatname/genel/m/mailx/talimat | 27 + talimatname/genel/m/maim/talimat | 16 + talimatname/genel/m/makemkv/makemkv.1 | 30 + talimatname/genel/m/makemkv/makemkv.kur-kos | 6 + talimatname/genel/m/makemkv/makemkvcon.1 | 266 + talimatname/genel/m/makemkv/mmdtsdec.1 | 51 + talimatname/genel/m/makemkv/talimat | 25 + talimatname/genel/m/maltego/talimat | 27 + talimatname/genel/m/manokwari/talimat | 28 + talimatname/genel/m/marble/talimat | 32 + talimatname/genel/m/marco/marco.kur-kos | 4 + talimatname/genel/m/marco/talimat | 23 + talimatname/genel/m/mariadb/mariadb.kur-kos | 6 + talimatname/genel/m/mariadb/mariadb.okubeni | 45 + talimatname/genel/m/mariadb/talimat | 139 + talimatname/genel/m/masscan/talimat | 19 + .../genel/m/mate-applets/mate-applets.kur-kos | 3 + talimatname/genel/m/mate-applets/talimat | 22 + talimatname/genel/m/mate-backgrounds/talimat | 17 + .../genel/m/mate-calc/mate-calc.kur-kos | 3 + talimatname/genel/m/mate-calc/talimat | 17 + talimatname/genel/m/mate-common/talimat | 17 + .../mate-control-center.kur-kos | 5 + .../genel/m/mate-control-center/talimat | 26 + .../genel/m/mate-desktop/mate-desktop.kur-kos | 5 + talimatname/genel/m/mate-desktop/talimat | 23 + .../mate-icon-theme-faenza.kur-kos | 4 + .../genel/m/mate-icon-theme-faenza/talimat | 19 + .../m/mate-icon-theme/mate-icon-theme.kur-kos | 3 + talimatname/genel/m/mate-icon-theme/talimat | 19 + .../mate-indicator-applet.kur-kos | 1 + .../genel/m/mate-indicator-applet/talimat | 19 + .../genel/m/mate-media/mate-media.kur-kos | 1 + talimatname/genel/m/mate-media/talimat | 21 + talimatname/genel/m/mate-menus/talimat | 25 + .../genel/m/mate-netbook/mate-netbook.kur-kos | 1 + talimatname/genel/m/mate-netbook/talimat | 20 + .../mate-notification-daemon.kur-kos | 5 + .../genel/m/mate-notification-daemon/talimat | 24 + .../genel/m/mate-panel/mate-panel.kur-kos | 5 + talimatname/genel/m/mate-panel/talimat | 28 + talimatname/genel/m/mate-polkit/talimat | 27 + .../mate-power-manager.kur-kos | 5 + .../genel/m/mate-power-manager/talimat | 24 + .../genel/m/mate-screensaver-hacks/LICENSE | 9 + .../migrate-xscreensaver-config.sh | 34 + .../genel/m/mate-screensaver-hacks/talimat | 18 + .../xscreensaver-config.xsl | 27 + .../mate-screensaver/mate-screensaver.kur-kos | 3 + talimatname/genel/m/mate-screensaver/talimat | 26 + .../mate-sensors-applet.kur-kos | 3 + .../genel/m/mate-sensors-applet/talimat | 23 + .../mate-session-manager.kur-kos | 5 + .../genel/m/mate-session-manager/talimat | 22 + .../mate-settings-daemon.kur-kos | 6 + .../genel/m/mate-settings-daemon/talimat | 25 + .../mate-system-monitor.kur-kos | 3 + .../genel/m/mate-system-monitor/talimat | 20 + .../m/mate-terminal/mate-terminal.kur-kos | 3 + talimatname/genel/m/mate-terminal/talimat | 18 + .../genel/m/mate-themes/mate-themes.kur-kos | 3 + talimatname/genel/m/mate-themes/talimat | 18 + talimatname/genel/m/mate-user-guide/talimat | 20 + .../m/mate-user-share/mate-user-share.kur-kos | 3 + talimatname/genel/m/mate-user-share/talimat | 25 + .../genel/m/mate-utils/mate-utils.kur-kos | 5 + talimatname/genel/m/mate-utils/talimat | 26 + talimatname/genel/m/mate/talimat | 15 + talimatname/genel/m/maven/maven.sh | 5 + talimatname/genel/m/maven/talimat | 36 + talimatname/genel/m/mbedtls/talimat | 22 + talimatname/genel/m/mc/talimat | 20 + talimatname/genel/m/mdadm/talimat | 18 + talimatname/genel/m/mdds/talimat | 17 + talimatname/genel/m/mdm/defaults.conf | 748 + talimatname/genel/m/mdm/mdm-autologin.pam | 25 + talimatname/genel/m/mdm/mdm.kur-kos | 16 + talimatname/genel/m/mdm/mdm.pam | 14 + talimatname/genel/m/mdm/mdm.sil-kos | 3 + .../m/mdm/org.cinnamon.pkexec.mdmsetup.policy | 21 + talimatname/genel/m/mdm/resim-1.jpg | Bin 0 -> 509698 bytes talimatname/genel/m/mdm/talimat | 68 + talimatname/genel/m/media-player-info/talimat | 20 + talimatname/genel/m/mediainfo/talimat | 19 + talimatname/genel/m/meld/meld.kur-kos | 1 + talimatname/genel/m/meld/talimat | 16 + talimatname/genel/m/menu-cache/talimat | 17 + talimatname/genel/m/menulibre/talimat | 14 + .../genel/m/mercurial/mercurial.profile | 1 + talimatname/genel/m/mercurial/talimat | 45 + talimatname/genel/m/meson/milis-meson | 21 + talimatname/genel/m/meson/talimat | 26 + talimatname/genel/m/messagelib/talimat | 21 + talimatname/genel/m/metasploit/talimat | 41 + talimatname/genel/m/mhash/talimat | 20 + talimatname/genel/m/miam-player/talimat | 29 + talimatname/genel/m/midori/midori.kur-kos | 2 + talimatname/genel/m/midori/talimat | 25 + .../genel/m/mikrolock/mikrolock_tr_TR.ts | 632 + talimatname/genel/m/mikrolock/talimat | 40 + talimatname/genel/m/milis-yukleyici/talimat | 26 + .../genel/m/milis-yukleyici/yukleyici.desktop | 10 + .../m/milislinux-saat/kk_milislinux-saat | 53 + .../m/milislinux-saat/milislinux-saat.desktop | 9 + .../m/milislinux-saat/milislinux-saat.xpm | 23 + talimatname/genel/m/milislinux-saat/talimat | 20 + talimatname/genel/m/minidlna/minidlna | 55 + talimatname/genel/m/minidlna/talimat | 44 + talimatname/genel/m/mininet/talimat | 24 + talimatname/genel/m/miniupnpc/talimat | 16 + talimatname/genel/m/minizip/talimat | 27 + talimatname/genel/m/mixxx/talimat | 18 + talimatname/genel/m/mlocate/mlocate.kur-kos | 1 + talimatname/genel/m/mlocate/talimat | 28 + talimatname/genel/m/mlocate/updatedb.conf | 4 + talimatname/genel/m/mlt/talimat | 28 + talimatname/genel/m/mlton/talimat | 16 + .../m/mobile-broadband-provider-info/talimat | 17 + talimatname/genel/m/moc/talimat | 25 + .../m/mod-dnssd/fix_undefined_reference.patch | 21 + talimatname/genel/m/mod-dnssd/talimat | 21 + talimatname/genel/m/modemmanager/talimat | 26 + .../m/moka-icon-theme/moka-icon-theme.kur-kos | 1 + talimatname/genel/m/moka-icon-theme/talimat | 17 + talimatname/genel/m/mono-addins/talimat | 27 + talimatname/genel/m/mono/mono.binfmt.d | 1 + talimatname/genel/m/mono/mono.kur-kos | 1 + talimatname/genel/m/mono/talimat | 31 + talimatname/genel/m/moreutils/talimat | 19 + talimatname/genel/m/mosh/talimat | 24 + talimatname/genel/m/mosquitto-php/talimat | 28 + talimatname/genel/m/mosquitto/talimat | 25 + talimatname/genel/m/mousepad/mousepad.kur-kos | 2 + talimatname/genel/m/mousepad/talimat | 24 + talimatname/genel/m/movit/talimat | 17 + talimatname/genel/m/mozo/mozo.kur-kos | 3 + talimatname/genel/m/mozo/talimat | 18 + talimatname/genel/m/mpd/servis | 28 + talimatname/genel/m/mpd/talimat | 32 + talimatname/genel/m/mpg123/talimat | 16 + talimatname/genel/m/mplayer/mplayer.conf | 4 + talimatname/genel/m/mplayer/mplayer.kur-kos | 2 + talimatname/genel/m/mplayer/talimat | 69 + talimatname/genel/m/mpsweb/talimat | 25 + talimatname/genel/m/mpv/talimat | 115 + talimatname/genel/m/mruby/talimat | 21 + talimatname/genel/m/msgpack-c/talimat | 20 + talimatname/genel/m/mtdev/talimat | 19 + talimatname/genel/m/mtools/talimat | 26 + talimatname/genel/m/mtr/talimat | 22 + talimatname/genel/m/muffin/talimat | 34 + talimatname/genel/m/mugshot-milis/talimat | 13 + .../m/mugshot/missing_default_face.patch | 28 + .../genel/m/mugshot/office-phone.patch | 35 + talimatname/genel/m/mugshot/talimat | 24 + .../genel/m/multibootusb/multibootusb.desktop | 10 + talimatname/genel/m/multibootusb/talimat | 19 + talimatname/genel/m/mumble-client/talimat | 37 + talimatname/genel/m/mumble/talimat | 38 + talimatname/genel/m/muparser/talimat | 19 + talimatname/genel/m/mupdf/talimat | 20 + talimatname/genel/m/murrine/talimat | 22 + talimatname/genel/m/musl/talimat | 23 + talimatname/genel/m/mutagen/talimat | 17 + talimatname/genel/m/mutt/mutt.kos-kur | 2 + talimatname/genel/m/mutt/talimat | 31 + talimatname/genel/m/mutter/mutter.kur-kos | 1 + talimatname/genel/m/mutter/talimat | 21 + talimatname/genel/m/mygpoclient/talimat | 14 + talimatname/genel/m/mygui/talimat | 46 + talimatname/genel/m/mypaint-brushes/talimat | 24 + talimatname/genel/m/mypaint/talimat | 22 + talimatname/genel/m/myrddin/talimat | 27 + talimatname/genel/m/mythes/talimat | 18 + talimatname/genel/n/nana/talimat | 19 + talimatname/genel/n/nautilus/nautilus.kur-kos | 2 + talimatname/genel/n/nautilus/talimat | 19 + talimatname/genel/n/nbd/allow | 7 + talimatname/genel/n/nbd/nbd-server | 28 + talimatname/genel/n/nbd/talimat | 24 + talimatname/genel/n/ncftp/talimat | 23 + talimatname/genel/n/nemo/nemo.kur-kos | 1 + talimatname/genel/n/nemo/org.nemo.root.policy | 23 + talimatname/genel/n/nemo/talimat | 30 + talimatname/genel/n/neofetch/linux | 31 + talimatname/genel/n/neofetch/talimat | 19 + talimatname/genel/n/neomutt/talimat | 32 + talimatname/genel/n/neon/talimat | 22 + talimatname/genel/n/net-snmp/talimat | 36 + ...net-tools-CVS_20101030-remove_dups-1.patch | 520 + talimatname/genel/n/net-tools/talimat | 19 + talimatname/genel/n/netbeans/netbeans.conf | 63 + talimatname/genel/n/netbeans/netbeans.desktop | 9 + talimatname/genel/n/netbeans/netbeans.sh | 223 + talimatname/genel/n/netbeans/talimat | 27 + talimatname/genel/n/netcat/talimat | 20 + talimatname/genel/n/netdata/netdata.kur-kos | 14 + talimatname/genel/n/netdata/talimat | 25 + talimatname/genel/n/netdiscover/talimat | 21 + .../genel/n/nethogs-qt/nethogs-qt.desktop | 9 + talimatname/genel/n/nethogs-qt/talimat | 20 + talimatname/genel/n/nethogs/talimat | 23 + .../genel/n/netpbm/netpbm-noppmtompeg.patch | 25 + talimatname/genel/n/netpbm/talimat | 126 + talimatname/genel/n/netsniff-ng/talimat | 17 + talimatname/genel/n/nettle/talimat | 22 + talimatname/genel/n/nettle/talimat.E | 20 + .../network-manager-applet.kur-kos | 2 + .../genel/n/network-manager-applet/talimat | 27 + .../n/networkmanager/networkmanager.kos-sil | 10 + talimatname/genel/n/networkmanager/talimat | 63 + talimatname/genel/n/neverball/neverball.po | 1676 + talimatname/genel/n/neverball/talimat | 39 + talimatname/genel/n/newt/talimat | 21 + .../genel/n/nfs-utils/nfs-utils.kos-kur | 6 + .../genel/n/nfs-utils/nfs-utils.kur-kos | 25 + talimatname/genel/n/nfs-utils/talimat | 35 + talimatname/genel/n/nftables/talimat | 19 + talimatname/genel/n/nginx-mod-nchan/talimat | 26 + talimatname/genel/n/nginx/nginx.kos-kur | 18 + talimatname/genel/n/nginx/nginx.logrotate | 14 + talimatname/genel/n/nginx/nginx.servis | 93 + talimatname/genel/n/nginx/talimat | 138 + talimatname/genel/n/nicotine-plus/talimat | 14 + talimatname/genel/n/nikto/talimat | 31 + talimatname/genel/n/nim/talimat | 49 + talimatname/genel/n/nimble/talimat | 19 + talimatname/genel/n/ninja/talimat | 16 + talimatname/genel/n/ninvaders/talimat | 16 + talimatname/genel/n/nitroshare/talimat | 29 + talimatname/genel/n/nlohmann-json/talimat | 25 + talimatname/genel/n/nmap/talimat | 27 + talimatname/genel/n/nnn/talimat | 15 + talimatname/genel/n/node/node.npm.sh | 13 + talimatname/genel/n/node/talimat | 23 + talimatname/genel/n/nodm/nodm.conf | 23 + talimatname/genel/n/nodm/talimat | 20 + talimatname/genel/n/nomacs/talimat | 49 + talimatname/genel/n/notepadqq/talimat | 18 + .../genel/n/notification-daemon/talimat | 20 + talimatname/genel/n/noto-fonts/talimat | 21 + talimatname/genel/n/npapi-sdk/talimat | 17 + talimatname/genel/n/npth/talimat | 19 + talimatname/genel/n/nspr/talimat | 23 + talimatname/genel/n/nss-mdns/talimat | 21 + talimatname/genel/n/nss/nss-config.in | 142 + talimatname/genel/n/nss/nss-softokn.pc.in | 11 + talimatname/genel/n/nss/nss-util.pc.in | 11 + talimatname/genel/n/nss/nss.pc.in | 11 + talimatname/genel/n/nss/talimat | 63 + talimatname/genel/n/ntfs-3g/ntfs-3g.okubeni | 3 + talimatname/genel/n/ntfs-3g/talimat | 21 + talimatname/genel/n/ntp/talimat | 68 + .../n/numix-gtk-theme/numix-gtk-theme.kur-kos | 5 + talimatname/genel/n/numix-gtk-theme/talimat | 42 + talimatname/genel/n/numlockx/talimat | 21 + .../genel/n/nvidia/90-nvidia-uvm.rules | 1 + talimatname/genel/n/nvidia/nvidia.kur-kos | 1 + talimatname/genel/n/nvidia/talimat | 105 + talimatname/genel/o/obconf-qt/talimat | 23 + talimatname/genel/o/obconf/talimat | 17 + talimatname/genel/o/obex-data-server/talimat | 18 + talimatname/genel/o/obexd/talimat | 19 + talimatname/genel/o/obmenu-generator/talimat | 16 + talimatname/genel/o/obmenu/talimat | 18 + talimatname/genel/o/obs-studio/obs.desktop | 14 + talimatname/genel/o/obs-studio/talimat | 25 + talimatname/genel/o/ocaml-batteries/talimat | 24 + talimatname/genel/o/ocaml-biniou/talimat | 27 + talimatname/genel/o/ocaml-easy-format/talimat | 26 + talimatname/genel/o/ocaml-findlib/talimat | 23 + talimatname/genel/o/ocaml-lablgl/talimat | 31 + talimatname/genel/o/ocaml-lablgtk/talimat | 40 + talimatname/genel/o/ocaml-menhir/talimat | 18 + talimatname/genel/o/ocaml-ocamlsdl/talimat | 25 + talimatname/genel/o/ocaml-pprint/talimat | 19 + talimatname/genel/o/ocaml-stdint/talimat | 21 + talimatname/genel/o/ocaml-yojson/talimat | 26 + talimatname/genel/o/ocaml/talimat | 18 + talimatname/genel/o/ocamlbuild/talimat | 17 + talimatname/genel/o/ocrfeeder/talimat | 26 + talimatname/genel/o/ode/talimat | 18 + talimatname/genel/o/ogre/talimat | 48 + talimatname/genel/o/ois/gcc47.patch | 56 + talimatname/genel/o/ois/talimat | 25 + talimatname/genel/o/okular/talimat | 24 + talimatname/genel/o/olsrd/talimat | 15 + talimatname/genel/o/omnikey_ifdokccid/talimat | 22 + talimatname/genel/o/opal/talimat | 19 + talimatname/genel/o/opam/talimat | 18 + ...01-Fix-vmxnet-module-on-kernels-3.16.patch | 74 + ...-Support-backing-dev-info-kernel-4.0.patch | 86 + .../0005-Remove-new_sync-for-Linux-4.1.patch | 27 + ...06-vmhgfs-support-linux-4.2.x-kernel.patch | 93 + .../genel/o/open-vm-tools-kernel/talimat | 33 + ...he-backend-for-gtk3-of-open-vm-tools.patch | 83 + talimatname/genel/o/open-vm-tools/README | 45 + talimatname/genel/o/open-vm-tools/talimat | 32 + talimatname/genel/o/open-vm-tools/tools.conf | 11 + talimatname/genel/o/open-vm-tools/vmtools.rc | 77 + talimatname/genel/o/openal/talimat | 24 + .../genel/o/openboard/openboard.desktop | 10 + talimatname/genel/o/openboard/qchar.patch | 12 + .../genel/o/openboard/qtmultimediadefs.patch | 13 + talimatname/genel/o/openboard/ssl10.patch | 19 + talimatname/genel/o/openboard/talimat | 67 + talimatname/genel/o/openbox/openbox.kur-kos | 1 + talimatname/genel/o/openbox/openbox.xinitrc | 2 + talimatname/genel/o/openbox/talimat | 24 + talimatname/genel/o/opencolorio/talimat | 21 + talimatname/genel/o/openconnect/talimat | 21 + talimatname/genel/o/opencore-amr/talimat | 17 + talimatname/genel/o/openct/talimat | 29 + talimatname/genel/o/openct/udev-sleep.patch | 11 + talimatname/genel/o/opencv/talimat | 59 + talimatname/genel/o/opendht/talimat | 22 + talimatname/genel/o/openexr/talimat | 20 + talimatname/genel/o/openh264/talimat | 16 + talimatname/genel/o/openimageio/talimat | 26 + talimatname/genel/o/openjade/iostream.patch | 11 + talimatname/genel/o/openjade/msggen.pl.patch | 32 + talimatname/genel/o/openjade/openjade.kur-kos | 2 + talimatname/genel/o/openjade/talimat | 26 + talimatname/genel/o/openjdk/openjdk.kur-kos | 14 + talimatname/genel/o/openjdk/talimat | 52 + talimatname/genel/o/openjdk8/talimat | 150 + talimatname/genel/o/openjpeg/talimat | 20 + talimatname/genel/o/openjpeg2/talimat | 32 + talimatname/genel/o/openldap/bdb.yama | 29 + .../genel/o/openldap/openldap-config.patch | 25 + talimatname/genel/o/openldap/slapd | 29 + talimatname/genel/o/openldap/talimat | 51 + talimatname/genel/o/openmpi/talimat | 16 + talimatname/genel/o/openmw/talimat | 19 + talimatname/genel/o/openobex/talimat | 21 + talimatname/genel/o/openra/talimat | 23 + talimatname/genel/o/opensc-openct/talimat | 26 + talimatname/genel/o/opensc/talimat | 31 + talimatname/genel/o/openscenegraph/talimat | 24 + talimatname/genel/o/opensp/opensp.kur-kos | 1 + talimatname/genel/o/opensp/talimat | 37 + talimatname/genel/o/opensubdiv/talimat | 23 + talimatname/genel/o/openttd-opengfx/talimat | 19 + talimatname/genel/o/openttd-opensfx/talimat | 21 + talimatname/genel/o/openttd/openttd.kur-kos | 2 + talimatname/genel/o/openttd/talimat | 27 + talimatname/genel/o/openvpn/openvpnd | 65 + talimatname/genel/o/openvpn/talimat | 26 + .../genel/o/openvswitch/openvswitch.tmpfiles | 1 + talimatname/genel/o/openvswitch/talimat | 32 + talimatname/genel/o/opera/default | 4 + talimatname/genel/o/opera/opera | 13 + talimatname/genel/o/opera/opera.kur-kos | 5 + talimatname/genel/o/opera/talimat | 47 + talimatname/genel/o/opmsg/talimat | 23 + talimatname/genel/o/optipng/talimat | 23 + talimatname/genel/o/opus/talimat | 18 + talimatname/genel/o/opusfile/talimat | 17 + talimatname/genel/o/orage/orage.kur-kos | 2 + talimatname/genel/o/orage/talimat | 24 + talimatname/genel/o/os-installer/talimat | 24 + talimatname/genel/o/os-prober/talimat | 52 + talimatname/genel/o/ostree/talimat | 45 + talimatname/genel/o/owncloud-cli/talimat | 27 + talimatname/genel/o/oxygen-fonts/talimat | 19 + talimatname/genel/o/oxygen-gtk2/talimat | 21 + .../genel/o/oxygen-gtk3/oxygen-gtk3.kur-kos | 14 + .../genel/o/oxygen-gtk3/oxygen-gtk3.okubeni | 3 + talimatname/genel/o/oxygen-gtk3/talimat | 22 + talimatname/genel/p/p0f/talimat | 24 + .../genel/p/p11-kit/libnssckbi-compat.patch | 57 + talimatname/genel/p/p11-kit/talimat | 26 + talimatname/genel/p/p7zip/CVE-2016-9296.patch | 11 + talimatname/genel/p/p7zip/talimat | 31 + .../genel/p/pa-applet/pa-applet.desktop | 12 + talimatname/genel/p/pa-applet/talimat | 26 + talimatname/genel/p/packit/talimat | 18 + talimatname/genel/p/pamsshagentauth/talimat | 16 + talimatname/genel/p/pango-perl/talimat | 18 + talimatname/genel/p/pango/talimat | 21 + talimatname/genel/p/pangomm/talimat | 16 + talimatname/genel/p/pangox-compat/talimat | 21 + talimatname/genel/p/parole/talimat | 16 + talimatname/genel/p/partclone/talimat | 21 + talimatname/genel/p/parted/talimat | 30 + talimatname/genel/p/partitionmanager/talimat | 23 + talimatname/genel/p/patchutils/talimat | 20 + talimatname/genel/p/pavucontrol-qt/talimat | 21 + .../p/pavucontrol/pavucontrol-gtk2.patch | 32 + talimatname/genel/p/pavucontrol/talimat | 27 + talimatname/genel/p/pax-utils/libcap.pc | 10 + talimatname/genel/p/pax-utils/talimat | 19 + talimatname/genel/p/pax/talimat | 32 + talimatname/genel/p/paxtest/talimat | 17 + talimatname/genel/p/pcmanfm-qt/talimat | 21 + talimatname/genel/p/pcmanfm/talimat | 18 + talimatname/genel/p/pcre/talimat | 30 + talimatname/genel/p/pcre2/talimat | 28 + talimatname/genel/p/pcsc-lite/talimat | 24 + talimatname/genel/p/pcsc-perl/talimat | 24 + talimatname/genel/p/pcsc-tools/talimat | 19 + .../genel/p/pdfshuffler/pdfshuffler-tr.po | 202 + talimatname/genel/p/pdfshuffler/talimat | 24 + talimatname/genel/p/peek/talimat | 25 + .../genel/p/pencilsheep/pencilsheep.sh | 1 + talimatname/genel/p/pencilsheep/talimat | 18 + talimatname/genel/p/peony/peony.kur-kos | 7 + talimatname/genel/p/peony/talimat | 21 + talimatname/genel/p/perl-anyevent/talimat | 18 + talimatname/genel/p/perl-archive-zip/talimat | 18 + talimatname/genel/p/perl-carp-always/talimat | 26 + talimatname/genel/p/perl-carp/talimat | 26 + talimatname/genel/p/perl-cgi-carp/talimat | 26 + .../genel/p/perl-class-accessor/talimat | 19 + .../genel/p/perl-class-inspector/talimat | 17 + talimatname/genel/p/perl-convert-asn1/talimat | 20 + talimatname/genel/p/perl-crypt-le/talimat | 17 + .../genel/p/perl-crypt-openssl-bignum/talimat | 23 + .../genel/p/perl-crypt-openssl-random/talimat | 25 + .../0001-Adapt-to-OpenSSL-1.1.0.patch | 185 + .../genel/p/perl-crypt-openssl-rsa/talimat | 23 + talimatname/genel/p/perl-crypt-ssleay/talimat | 20 + talimatname/genel/p/perl-curses-ui/talimat | 26 + talimatname/genel/p/perl-curses/talimat | 26 + talimatname/genel/p/perl-data-dump/talimat | 19 + talimatname/genel/p/perl-dbi/talimat | 21 + talimatname/genel/p/perl-devel-leak/talimat | 27 + .../genel/p/perl-devel-symdump/talimat | 22 + talimatname/genel/p/perl-digest-hmac/talimat | 21 + .../genel/p/perl-digest-nilsimsa/talimat | 21 + talimatname/genel/p/perl-digest-sha1/talimat | 20 + .../genel/p/perl-encode-locale/talimat | 21 + talimatname/genel/p/perl-error/talimat | 21 + .../genel/p/perl-extutils-depends/talimat | 22 + .../genel/p/perl-extutils-makemaker/talimat | 31 + .../genel/p/perl-extutils-pkgconfig/talimat | 22 + talimatname/genel/p/perl-file-listing/talimat | 21 + .../genel/p/perl-file-sharedir/talimat | 20 + talimatname/genel/p/perl-glib/talimat | 21 + talimatname/genel/p/perl-html-parser/talimat | 22 + talimatname/genel/p/perl-html-tagset/talimat | 21 + talimatname/genel/p/perl-http-cookies/talimat | 21 + talimatname/genel/p/perl-http-daemon/talimat | 21 + talimatname/genel/p/perl-http-date/talimat | 21 + talimatname/genel/p/perl-http-message/talimat | 27 + .../genel/p/perl-http-negotiate/talimat | 22 + .../genel/p/perl-image-exiftool/talimat | 21 + .../genel/p/perl-io-socket-inet6/talimat | 25 + .../genel/p/perl-io-socket-ssl/talimat | 18 + talimatname/genel/p/perl-io-tty/talimat | 26 + talimatname/genel/p/perl-ipc-run/talimat | 26 + talimatname/genel/p/perl-json-maybexs/talimat | 29 + talimatname/genel/p/perl-json/talimat | 20 + talimatname/genel/p/perl-libwww/talimat | 21 + .../genel/p/perl-linux-desktopfiles/talimat | 28 + .../genel/p/perl-locale-gettext/talimat | 22 + talimatname/genel/p/perl-log-log4perl/talimat | 18 + .../genel/p/perl-lwp-mediatypes/talimat | 21 + .../genel/p/perl-lwp-protocol-https/talimat | 22 + talimatname/genel/p/perl-mail-dkim/talimat | 21 + talimatname/genel/p/perl-mail-spf/talimat | 17 + talimatname/genel/p/perl-mailtools/talimat | 21 + talimatname/genel/p/perl-module-build/talimat | 19 + talimatname/genel/p/perl-mozilla-ca/talimat | 17 + .../talimat | 21 + talimatname/genel/p/perl-net-dns/talimat | 20 + talimatname/genel/p/perl-net-http/talimat | 21 + talimatname/genel/p/perl-net-ip/talimat | 20 + talimatname/genel/p/perl-net-ssleay/talimat | 31 + talimatname/genel/p/perl-netaddr-ip/talimat | 21 + talimatname/genel/p/perl-path-class/talimat | 27 + talimatname/genel/p/perl-pod-coverage/talimat | 23 + talimatname/genel/p/perl-socket6/talimat | 21 + talimatname/genel/p/perl-term-readkey/talimat | 19 + .../genel/p/perl-test-pod-coverage/talimat | 26 + talimatname/genel/p/perl-test-pod/talimat | 22 + .../genel/p/perl-time-duration/talimat | 23 + talimatname/genel/p/perl-timedate/talimat | 23 + talimatname/genel/p/perl-tk/talimat | 17 + talimatname/genel/p/perl-try-tiny/talimat | 19 + talimatname/genel/p/perl-uri/talimat | 21 + .../genel/p/perl-www-robotrules/talimat | 20 + .../genel/p/perl-xml-namespacesupport/talimat | 22 + talimatname/genel/p/perl-xml-parser/talimat | 19 + talimatname/genel/p/perl-xml-sax-base/talimat | 24 + .../genel/p/perl-xml-sax/perl-xml-sax.patch | 46 + talimatname/genel/p/perl-xml-sax/talimat | 26 + talimatname/genel/p/perl-xml-simple/talimat | 21 + talimatname/genel/p/perldoc/perldoc.desktop | 9 + talimatname/genel/p/perldoc/perldoc.png | Bin 0 -> 4190 bytes talimatname/genel/p/perldoc/talimat | 24 + .../p/pgadmin3/pgadmin3-fix-segfault.patch | 11 + talimatname/genel/p/pgadmin3/talimat | 26 + .../p/phonon-backend-gstreamer-qt5/talimat | 24 + .../genel/p/phonon-backend-vlc-qt5/talimat | 24 + talimatname/genel/p/phonon-qt4/talimat | 30 + talimatname/genel/p/phonon-qt5/talimat | 25 + talimatname/genel/p/php-gd/talimat | 22 + talimatname/genel/p/php-gettext/talimat | 25 + talimatname/genel/p/php-mysql/talimat | 28 + talimatname/genel/p/php-xsl/talimat | 23 + talimatname/genel/p/php/php.kos-kur | 12 + talimatname/genel/p/php/talimat | 44 + talimatname/genel/p/php7-apache/apache.conf | 11 + talimatname/genel/p/php7-apache/talimat | 23 + talimatname/genel/p/php7/php7.kos-kur | 12 + talimatname/genel/p/php7/php7.kur-kos | 1 + talimatname/genel/p/php7/talimat | 50 + talimatname/genel/p/physfs/talimat | 22 + talimatname/genel/p/picolisp/talimat | 43 + talimatname/genel/p/pidgin/pidgin.kur-kos | 2 + talimatname/genel/p/pidgin/talimat | 33 + talimatname/genel/p/pimcommon/talimat | 22 + talimatname/genel/p/pinentry/talimat | 22 + .../genel/p/pingus/missing-header.patch | 22 + .../p/pingus/pingus-0.7.6-gcc470-udl.patch | 22 + talimatname/genel/p/pingus/pingus.desktop | 9 + talimatname/genel/p/pingus/talimat | 24 + talimatname/genel/p/pinta/talimat | 25 + talimatname/genel/p/pix/talimat | 30 + .../p/pjproject-ring/add_dtls_transport.patch | 63 + .../genel/p/pjproject-ring/endianness.patch | 19 + .../genel/p/pjproject-ring/fix_base64.patch | 20 + .../fix_ioqueue_ipv6_sendto.patch | 19 + .../p/pjproject-ring/fix_turn_fallback.patch | 53 + .../genel/p/pjproject-ring/gnutls.patch | 3295 ++ .../genel/p/pjproject-ring/ice_config.patch | 27 + talimatname/genel/p/pjproject-ring/ipv6.patch | 11 + .../p/pjproject-ring/multiple_listeners.patch | 66 + .../genel/p/pjproject-ring/notestsapps.patch | 97 + .../genel/p/pjproject-ring/pj_ice_sess.patch | 22 + talimatname/genel/p/pjproject-ring/talimat | 57 + talimatname/genel/p/plank/talimat | 20 + talimatname/genel/p/plasma-bluedevil/talimat | 23 + talimatname/genel/p/plasma-breeze-gtk/talimat | 23 + talimatname/genel/p/plasma-breeze/talimat | 23 + .../p/plasma-desktop/plasma-desktop.kur-kos | 2 + talimatname/genel/p/plasma-desktop/talimat | 22 + .../genel/p/plasma-integration/talimat | 22 + .../genel/p/plasma-kactivitymanagerd/talimat | 24 + .../genel/p/plasma-kde-cli-tools/talimat | 24 + .../genel/p/plasma-kde-gtk-config/talimat | 26 + .../genel/p/plasma-kdecoration/talimat | 23 + .../plasma-kdeplasma-addons.kur-kos | 2 + .../genel/p/plasma-kdeplasma-addons/talimat | 24 + talimatname/genel/p/plasma-kgamma5/talimat | 23 + talimatname/genel/p/plasma-khotkeys/talimat | 23 + .../genel/p/plasma-kinfocenter/talimat | 23 + .../plasma-kmenuedit/plasma-kmenuedit.kur-kos | 1 + talimatname/genel/p/plasma-kmenuedit/talimat | 23 + .../p/plasma-kscreen/plasma-kscreen.kur-kos | 2 + talimatname/genel/p/plasma-kscreen/talimat | 23 + .../genel/p/plasma-kscreenlocker/talimat | 25 + .../genel/p/plasma-ksshaskpass/talimat | 22 + .../plasma-ksysguard/plasma-ksysguard.kur-kos | 2 + talimatname/genel/p/plasma-ksysguard/talimat | 23 + .../genel/p/plasma-kwallet-pam/talimat | 23 + .../p/plasma-kwayland-integration/talimat | 24 + .../genel/p/plasma-kwin/plasma-kwin.kur-kos | 1 + talimatname/genel/p/plasma-kwin/talimat | 23 + talimatname/genel/p/plasma-kwrited/talimat | 23 + talimatname/genel/p/plasma-libkscreen/talimat | 23 + .../libksysguard-5.5.5-glibc2.23-1.patch | 12 + .../genel/p/plasma-libksysguard/talimat | 25 + talimatname/genel/p/plasma-milou/talimat | 23 + talimatname/genel/p/plasma-nm/talimat | 22 + talimatname/genel/p/plasma-oxygen/talimat | 22 + talimatname/genel/p/plasma-pa/talimat | 22 + .../genel/p/plasma-polkit-kde-agent/talimat | 25 + talimatname/genel/p/plasma-powerdevil/talimat | 23 + talimatname/genel/p/plasma-sddm-kcm/talimat | 24 + talimatname/genel/p/plasma-sdk/talimat | 23 + .../genel/p/plasma-systemsettings/talimat | 23 + .../genel/p/plasma-user-manager/talimat | 23 + .../p/plasma-workspace-wallpapers/talimat | 25 + .../genel/p/plasma-workspace/kscreensaver.pam | 1 + talimatname/genel/p/plasma-workspace/talimat | 44 + talimatname/genel/p/plasma/talimat | 15 + talimatname/genel/p/plib/talimat | 17 + talimatname/genel/p/pluma/pluma.kur-kos | 3 + talimatname/genel/p/pluma/talimat | 26 + talimatname/genel/p/plymouth/plymouthd.conf | 3 + talimatname/genel/p/plymouth/talimat | 46 + talimatname/genel/p/pm-quirks/talimat | 15 + talimatname/genel/p/pm-utils/talimat | 35 + talimatname/genel/p/podofo/talimat | 25 + talimatname/genel/p/poedit/talimat | 19 + talimatname/genel/p/polkit-gnome/talimat | 30 + talimatname/genel/p/polkit-qt5/talimat | 21 + talimatname/genel/p/polkit/polkit.okubeni | 4 + talimatname/genel/p/polkit/talimat | 34 + talimatname/genel/p/polyml/talimat | 17 + talimatname/genel/p/ponyc/talimat | 34 + talimatname/genel/p/poppler-glib/talimat | 34 + talimatname/genel/p/poppler-qt4/talimat | 31 + talimatname/genel/p/poppler-qt5/talimat | 26 + talimatname/genel/p/poppler/talimat | 46 + talimatname/genel/p/popt/talimat | 17 + talimatname/genel/p/portaudio/talimat | 19 + .../p/portmidi/portmidi-217-build-fix.patch | 30 + talimatname/genel/p/portmidi/talimat | 39 + talimatname/genel/p/postfix/postfix.kos-kur | 5 + talimatname/genel/p/postfix/talimat | 38 + .../genel/p/postgresql/postgresql.kurulum | 24 + talimatname/genel/p/postgresql/talimat | 25 + talimatname/genel/p/ppp/ppp.kos-kur | 4 + talimatname/genel/p/ppp/pppd.servis | 50 + talimatname/genel/p/ppp/talimat | 24 + talimatname/genel/p/pptp/talimat | 18 + talimatname/genel/p/premake/talimat | 17 + talimatname/genel/p/print-manager/talimat | 24 + .../genel/p/privoxy/privoxy.logrotate.d | 9 + talimatname/genel/p/privoxy/privoxy.sysusers | 1 + talimatname/genel/p/privoxy/talimat | 62 + talimatname/genel/p/procmail/talimat | 20 + talimatname/genel/p/proftpd/proftpd.conf | 55 + talimatname/genel/p/proftpd/proftpd.kos-kur | 7 + talimatname/genel/p/proftpd/talimat | 32 + talimatname/genel/p/proj/talimat | 24 + talimatname/genel/p/proot/talimat | 23 + talimatname/genel/p/protobuf-c/talimat | 19 + talimatname/genel/p/protobuf/talimat | 17 + talimatname/genel/p/prun/talimat | 25 + talimatname/genel/p/psi/talimat | 22 + talimatname/genel/p/psutil/talimat | 14 + talimatname/genel/p/pth/talimat | 20 + talimatname/genel/p/ptlib/talimat | 20 + talimatname/genel/p/pugixml/talimat | 21 + .../genel/p/pulseaudio/pulseaudio.desktop | 87 + .../genel/p/pulseaudio/pulseaudio.kur-kos | 2 + talimatname/genel/p/pulseaudio/talimat | 42 + talimatname/genel/p/pv/talimat | 17 + talimatname/genel/p/pyattrs/talimat | 25 + talimatname/genel/p/pybitmessage/talimat | 62 + talimatname/genel/p/pycertifi/talimat | 24 + talimatname/genel/p/pychardet/talimat | 24 + talimatname/genel/p/pycharm/talimat | 42 + talimatname/genel/p/pycparser/talimat | 20 + talimatname/genel/p/pycups/talimat | 21 + talimatname/genel/p/pycurl/talimat | 25 + talimatname/genel/p/pydateutil/talimat | 25 + talimatname/genel/p/pydbus/talimat | 22 + talimatname/genel/p/pydecorator/talimat | 23 + talimatname/genel/p/pyenchant/talimat | 26 + talimatname/genel/p/pygments/talimat | 25 + talimatname/genel/p/pyidna/talimat | 24 + talimatname/genel/p/pyjinja/talimat | 25 + talimatname/genel/p/pymarkupsafe/talimat | 25 + talimatname/genel/p/pympv/talimat | 16 + talimatname/genel/p/pynetworkx/talimat | 23 + talimatname/genel/p/pypam/talimat | 19 + talimatname/genel/p/pypdf/talimat | 18 + talimatname/genel/p/pypeg2/talimat | 21 + talimatname/genel/p/pyprctl/talimat | 24 + talimatname/genel/p/pypy/talimat | 47 + talimatname/genel/p/pyrdflib/talimat | 25 + talimatname/genel/p/pyreportlab/talimat | 21 + talimatname/genel/p/pyrequests/talimat | 25 + talimatname/genel/p/pysensors/talimat | 14 + talimatname/genel/p/python-apsw/talimat | 16 + talimatname/genel/p/python-atspi/talimat | 17 + .../genel/p/python-beautifulsoup3/talimat | 16 + talimatname/genel/p/python-cairo/talimat | 17 + talimatname/genel/p/python-caja/talimat | 22 + talimatname/genel/p/python-cffi/talimat | 15 + talimatname/genel/p/python-chardet/talimat | 16 + talimatname/genel/p/python-cherrypy/talimat | 16 + talimatname/genel/p/python-cparser/talimat | 21 + talimatname/genel/p/python-crypto/talimat | 17 + .../genel/p/python-cryptography/talimat | 16 + talimatname/genel/p/python-cssselect/talimat | 15 + talimatname/genel/p/python-cssutils/talimat | 19 + talimatname/genel/p/python-cups/talimat | 16 + .../genel/p/python-distutils-extra/talimat | 14 + talimatname/genel/p/python-django/talimat | 21 + talimatname/genel/p/python-dnspython/talimat | 16 + talimatname/genel/p/python-docutils/talimat | 15 + talimatname/genel/p/python-ecdsa/talimat | 15 + talimatname/genel/p/python-enum34/talimat | 17 + talimatname/genel/p/python-fonttools/talimat | 15 + talimatname/genel/p/python-gconf/talimat | 24 + talimatname/genel/p/python-geoip/talimat | 17 + talimatname/genel/p/python-gitdb/talimat | 15 + talimatname/genel/p/python-gitpython/talimat | 16 + talimatname/genel/p/python-gobject/talimat | 21 + .../pygobject-2.16.1-fixdetection.patch | 13 + .../pygobject-2.28.6-fixes-1.patch | 720 + talimatname/genel/p/python-gobject2/talimat | 21 + talimatname/genel/p/python-gtk/talimat | 18 + .../genel/p/python-gtksourceview2/talimat | 18 + .../python-httplib2.cert.patch | 30 + .../python-httplib2.ssl_hostname.patch | 21 + talimatname/genel/p/python-httplib2/talimat | 23 + talimatname/genel/p/python-keybinder/talimat | 21 + .../genel/p/python-levenshtein/talimat | 15 + talimatname/genel/p/python-lxml/talimat | 18 + talimatname/genel/p/python-magic/talimat | 15 + talimatname/genel/p/python-mako/talimat | 15 + talimatname/genel/p/python-msgpack/talimat | 22 + talimatname/genel/p/python-nassl/talimat | 15 + talimatname/genel/p/python-netifaces/talimat | 16 + talimatname/genel/p/python-notify/talimat | 22 + talimatname/genel/p/python-numpy/talimat | 18 + talimatname/genel/p/python-oauth2/talimat | 17 + talimatname/genel/p/python-opengl/talimat | 15 + talimatname/genel/p/python-openssl/talimat | 15 + talimatname/genel/p/python-paramiko/talimat | 16 + talimatname/genel/p/python-parted/talimat | 17 + talimatname/genel/p/python-pcapy/talimat | 17 + talimatname/genel/p/python-pexpect/talimat | 14 + talimatname/genel/p/python-pillow/talimat | 32 + talimatname/genel/p/python-pip/talimat | 19 + talimatname/genel/p/python-polib/talimat | 14 + .../pypoppler-0.12.1-poppler-0.16.0.patch | 12 + ...oppler-0.12.1-poppler-0.39.0-changes.patch | 20 + talimatname/genel/p/python-poppler/talimat | 36 + talimatname/genel/p/python-protobuf/talimat | 18 + talimatname/genel/p/python-psutil/talimat | 17 + talimatname/genel/p/python-ptyprocess/talimat | 14 + talimatname/genel/p/python-pyasn1/talimat | 15 + talimatname/genel/p/python-pyaudio/talimat | 15 + talimatname/genel/p/python-pycountry/talimat | 16 + talimatname/genel/p/python-pygame/talimat | 16 + talimatname/genel/p/python-pygments/talimat | 16 + talimatname/genel/p/python-pyinotify/talimat | 25 + talimatname/genel/p/python-pyrex/talimat | 17 + .../genel/p/python-pythondialog/talimat | 15 + talimatname/genel/p/python-pytz/talimat | 15 + talimatname/genel/p/python-pyxml/talimat | 17 + talimatname/genel/p/python-pyyaml/talimat | 18 + talimatname/genel/p/python-qt4/talimat | 25 + talimatname/genel/p/python-qt5/talimat | 25 + talimatname/genel/p/python-reportlab/talimat | 17 + talimatname/genel/p/python-rsvg/talimat | 19 + .../genel/p/python-setproctitle/talimat | 21 + .../genel/p/python-setuptools-scm/talimat | 18 + talimatname/genel/p/python-setuptools/talimat | 20 + talimatname/genel/p/python-simplejson/talimat | 16 + talimatname/genel/p/python-sip/talimat | 22 + talimatname/genel/p/python-six/talimat | 17 + talimatname/genel/p/python-smmap/talimat | 16 + talimatname/genel/p/python-tweepy/talimat | 16 + talimatname/genel/p/python-twisted/talimat | 14 + talimatname/genel/p/python-typing/talimat | 15 + talimatname/genel/p/python-urwid/talimat | 16 + talimatname/genel/p/python-virtualenv/talimat | 15 + talimatname/genel/p/python-vte/talimat | 37 + talimatname/genel/p/python-xdg/talimat | 15 + talimatname/genel/p/python-xlib/talimat | 16 + talimatname/genel/p/python-yaml/talimat | 14 + .../genel/p/python-zope_interface/talimat | 14 + talimatname/genel/p/python/python.okubeni | 1 + talimatname/genel/p/python/python.png | Bin 0 -> 2162 bytes talimatname/genel/p/python/talimat | 43 + talimatname/genel/p/python3-astroid/talimat | 16 + .../genel/p/python3-beautifulsoup4/talimat | 15 + .../python3-cairo-1.10.0-waf-python3.4.patch | Bin 0 -> 160375 bytes talimatname/genel/p/python3-cairo/talimat | 19 + talimatname/genel/p/python3-cffi/talimat | 16 + talimatname/genel/p/python3-cparser/talimat | 22 + .../genel/p/python3-cryptography/talimat | 17 + talimatname/genel/p/python3-cssselect/talimat | 15 + .../genel/p/python3-distutils-extra/talimat | 14 + talimatname/genel/p/python3-django/talimat | 21 + talimatname/genel/p/python3-enum34/talimat | 17 + talimatname/genel/p/python3-geoip/talimat | 17 + talimatname/genel/p/python3-gitdb/talimat | 15 + talimatname/genel/p/python3-gitpython/talimat | 16 + talimatname/genel/p/python3-gobject/talimat | 21 + talimatname/genel/p/python3-lxml/talimat | 15 + talimatname/genel/p/python3-magic/talimat | 15 + talimatname/genel/p/python3-mprpc/talimat | 16 + .../genel/p/python3-multipledispatch/talimat | 15 + talimatname/genel/p/python3-numpy/talimat | 18 + talimatname/genel/p/python3-opengl/talimat | 15 + talimatname/genel/p/python3-openssl/talimat | 15 + talimatname/genel/p/python3-parted/talimat | 17 + talimatname/genel/p/python3-pexpect/talimat | 14 + talimatname/genel/p/python3-pillow/talimat | 32 + talimatname/genel/p/python3-pip/talimat | 19 + talimatname/genel/p/python3-psutil/talimat | 17 + talimatname/genel/p/python3-pyasn1/talimat | 15 + talimatname/genel/p/python3-pyaudio/talimat | 15 + talimatname/genel/p/python3-pylint/talimat | 18 + talimatname/genel/p/python3-pyrr/talimat | 14 + .../genel/p/python3-pythondialog/talimat | 15 + talimatname/genel/p/python3-pytz/talimat | 15 + talimatname/genel/p/python3-qt5/talimat | 25 + talimatname/genel/p/python3-reportlab/talimat | 17 + .../genel/p/python3-setuptools-scm/talimat | 18 + .../genel/p/python3-setuptools/talimat | 20 + talimatname/genel/p/python3-sip/talimat | 22 + talimatname/genel/p/python3-six/talimat | 18 + talimatname/genel/p/python3-smmap/talimat | 16 + talimatname/genel/p/python3-thrift/talimat | 14 + .../genel/p/python3-virtualenv/talimat | 17 + talimatname/genel/p/python3-xdg/talimat | 15 + talimatname/genel/p/python3-yaml/talimat | 14 + talimatname/genel/p/python3/python3.okubeni | 1 + talimatname/genel/p/python3/python3.png | Bin 0 -> 2162 bytes talimatname/genel/p/python3/talimat | 68 + talimatname/genel/p/pytwodict/talimat | 18 + talimatname/genel/p/pyurllibs/talimat | 24 + talimatname/genel/p/pywget/talimat | 16 + talimatname/genel/p/pyxapp/talimat | 24 + talimatname/genel/q/qbs/talimat | 23 + talimatname/genel/q/qca-qt5/talimat | 25 + talimatname/genel/q/qca/talimat | 23 + talimatname/genel/q/qemu-all/talimat | 41 + talimatname/genel/q/qjson/talimat | 21 + talimatname/genel/q/qlibc/talimat | 18 + talimatname/genel/q/qmmp/talimat | 21 + talimatname/genel/q/qpdf/talimat | 18 + talimatname/genel/q/qps/qps.desktop | 87 + talimatname/genel/q/qps/talimat | 22 + talimatname/genel/q/qqwing/talimat | 20 + talimatname/genel/q/qrencode/talimat | 17 + talimatname/genel/q/qt4/talimat | 168 + .../q/qt5-gstreamer/qt5-gstreamer-1.6.patch | 38 + talimatname/genel/q/qt5-gstreamer/talimat | 27 + talimatname/genel/q/qt5-pas/talimat | 17 + talimatname/genel/q/qt5-styleplugins/talimat | 20 + .../genel/q/qt5-webengine/clip-ft-glyph.diff | 162 + .../genel/q/qt5-webengine/gzip_string.py | 43 + .../genel/q/qt5-webengine/harmony-fix.diff | 69 + .../qt5-webengine/last-commit-position.patch | 28 + talimatname/genel/q/qt5-webengine/talimat | 34 + .../genel/q/qt5-webkit/qt5-webkit-icu59.patch | 73 + talimatname/genel/q/qt5-webkit/talimat | 26 + talimatname/genel/q/qt5/qt5-logo.png | Bin 0 -> 3495 bytes talimatname/genel/q/qt5/talimat | 152 + talimatname/genel/q/qtav/talimat | 17 + talimatname/genel/q/qtchess/qtchess.desktop | 10 + talimatname/genel/q/qtchess/talimat | 22 + talimatname/genel/q/qtcreator/talimat | 30 + talimatname/genel/q/qterminal/talimat | 21 + talimatname/genel/q/qtermwidget/talimat | 22 + talimatname/genel/q/qtkeychain-qt5/talimat | 25 + talimatname/genel/q/qtox/talimat | 20 + talimatname/genel/q/qtwebkit/talimat | 25 + .../genel/q/quadrapassel/quadrapassel.kur-kos | 3 + talimatname/genel/q/quadrapassel/talimat | 18 + talimatname/genel/q/quicklisp/talimat | 19 + talimatname/genel/q/qutebrowser/talimat | 17 + talimatname/genel/q/quvi/talimat | 18 + .../genel/r/rabbitmq/rabbitmq-env.conf | 6 + .../genel/r/rabbitmq/rabbitmq-script-wrapper | 48 + .../genel/r/rabbitmq/rabbitmq.logrotate | 6 + .../genel/r/rabbitmq/rabbitmq.sysusers | 1 + .../genel/r/rabbitmq/rabbitmq.tmpfiles | 2 + talimatname/genel/r/rabbitmq/talimat | 40 + talimatname/genel/r/racket/talimat | 34 + talimatname/genel/r/radare2/talimat | 22 + talimatname/genel/r/ragel/talimat | 18 + talimatname/genel/r/ranger/ranger.okubeni | 29 + talimatname/genel/r/ranger/talimat | 16 + talimatname/genel/r/raptor/talimat | 18 + talimatname/genel/r/rarian/talimat | 17 + talimatname/genel/r/rasqal/talimat | 18 + .../genel/r/ratpoison/ratpoison.desktop | 7 + .../genel/r/ratpoison/ratpoison.okubeni | 38 + talimatname/genel/r/ratpoison/talimat | 39 + .../r/razor/razor-2.85-cosmetic-pv-fix.patch | 23 + talimatname/genel/r/razor/talimat | 23 + .../rdesktop-send_physical_buttons.diff | 71 + talimatname/genel/r/rdesktop/talimat | 24 + talimatname/genel/r/re-alpine/talimat | 24 + talimatname/genel/r/re2/talimat | 18 + talimatname/genel/r/re2c/talimat | 19 + talimatname/genel/r/rebar3/talimat | 17 + talimatname/genel/r/recordmydesktop/talimat | 17 + talimatname/genel/r/recoverjpeg/talimat | 19 + talimatname/genel/r/redland/rpath.diff | 11 + talimatname/genel/r/redland/talimat | 27 + talimatname/genel/r/reflex/talimat | 16 + talimatname/genel/r/reiserfsprogs/talimat | 22 + talimatname/genel/r/remake/talimat | 22 + talimatname/genel/r/remmina/talimat | 31 + talimatname/genel/r/reptyr/talimat | 17 + talimatname/genel/r/restbed/strand.patch | 8 + talimatname/genel/r/restbed/talimat | 24 + talimatname/genel/r/retroshare/talimat | 28 + talimatname/genel/r/rfkill/talimat | 15 + talimatname/genel/r/rhash/talimat | 27 + talimatname/genel/r/rhino/talimat | 20 + .../genel/r/rhythmbox/rhythmbox.kur-kos | 3 + talimatname/genel/r/rhythmbox/talimat | 29 + talimatname/genel/r/ricin/talimat | 21 + talimatname/genel/r/ring-daemon/talimat | 39 + talimatname/genel/r/ristretto/talimat | 18 + talimatname/genel/r/rlog/rlog-section.patch | 75 + talimatname/genel/r/rlog/talimat | 19 + talimatname/genel/r/rlwrap/talimat | 18 + talimatname/genel/r/rofi/talimat | 41 + .../r/rosa-imagewriter/imagewriter-tr_TR.ts | 214 + .../genel/r/rosa-imagewriter/logo-rosa.png | Bin 0 -> 3530 bytes talimatname/genel/r/rosa-imagewriter/talimat | 45 + talimatname/genel/r/rox-filer/talimat | 62 + talimatname/genel/r/roxterm/talimat | 17 + talimatname/genel/r/rpcbind/talimat | 34 + talimatname/genel/r/rsound/talimat | 16 + talimatname/genel/r/rssguard/talimat | 23 + talimatname/genel/r/rtmpdump/talimat | 20 + talimatname/genel/r/ruby-bundler/talimat | 18 + talimatname/genel/r/ruby/gemrc | 5 + talimatname/genel/r/ruby/talimat | 30 + talimatname/genel/r/ruby23-bundler/talimat | 25 + talimatname/genel/r/ruby23/gemrc | 5 + talimatname/genel/r/ruby23/talimat | 43 + ...llvm-build-Force-link-against-libffi.patch | 32 + .../genel/r/rust/bootstrap-config.toml | 5 + talimatname/genel/r/rust/talimat | 25 + .../genel/r/rxvt-unicode/rxvt-unicode.desktop | 9 + .../genel/r/rxvt-unicode/rxvt-unicode.svg | 198 + talimatname/genel/r/rxvt-unicode/talimat | 55 + talimatname/genel/s/samba/samba.conf | 1 + talimatname/genel/s/samba/talimat | 60 + talimatname/genel/s/samsung-printer/talimat | 69 + .../s/samsung-printer/xerox_mfp-smfp.conf | 67 + talimatname/genel/s/sane/sane.kur-kos | 4 + talimatname/genel/s/sane/talimat | 37 + talimatname/genel/s/sayonara-player/talimat | 19 + talimatname/genel/s/sbc/talimat | 19 + talimatname/genel/s/sbcl/arch-fixes.lisp | 21 + .../s/sbcl/customize-target-features.lisp | 6 + talimatname/genel/s/sbcl/talimat | 52 + talimatname/genel/s/scons/talimat | 16 + talimatname/genel/s/scratch/scratch.desktop | 9 + talimatname/genel/s/scratch/talimat | 35 + talimatname/genel/s/screen/talimat | 28 + talimatname/genel/s/scribus/talimat | 31 + talimatname/genel/s/scrot/talimat | 19 + talimatname/genel/s/sddm/10-backlight.rules | 12 + talimatname/genel/s/sddm/ecb903e4.patch | 33 + .../genel/s/sddm/sddm-0.14.0-consolekit.patch | 9 + talimatname/genel/s/sddm/sddm.conf | 100 + talimatname/genel/s/sddm/sddm.kos-kur | 18 + talimatname/genel/s/sddm/sddm.kur-kos | 3 + talimatname/genel/s/sddm/talimat | 96 + talimatname/genel/s/sdl-image/talimat | 22 + talimatname/genel/s/sdl-mixer/talimat | 17 + talimatname/genel/s/sdl-net/talimat | 17 + .../sdl-pango/SDL_Pango-0.1.2-API-adds.patch | 116 + .../s/sdl-pango/matrix_declarations.patch | 131 + talimatname/genel/s/sdl-pango/talimat | 22 + talimatname/genel/s/sdl-ttf/talimat | 20 + talimatname/genel/s/sdl/talimat | 18 + talimatname/genel/s/sdl2-image/talimat | 19 + talimatname/genel/s/sdl2-mixer/talimat | 20 + talimatname/genel/s/sdl2-ttf/talimat | 21 + talimatname/genel/s/sdl2/talimat | 24 + talimatname/genel/s/sdl2_gfx/talimat | 17 + talimatname/genel/s/sdl2_net/talimat | 17 + talimatname/genel/s/sdl_gfx/talimat | 17 + .../seahorse-nautilus.kur-kos | 2 + talimatname/genel/s/seahorse-nautilus/talimat | 18 + talimatname/genel/s/seahorse/seahorse.kur-kos | 3 + talimatname/genel/s/seahorse/talimat | 17 + talimatname/genel/s/sendmail/sendmail.kos-kur | 5 + talimatname/genel/s/sendmail/sendmail.sil-kos | 3 + talimatname/genel/s/sendmail/site.config.m4 | 5 + talimatname/genel/s/sendmail/talimat | 74 + talimatname/genel/s/serf/talimat | 22 + talimatname/genel/s/setconf/talimat | 15 + talimatname/genel/s/seyhan/seyhan-logo.png | Bin 0 -> 4024 bytes talimatname/genel/s/seyhan/talimat | 42 + talimatname/genel/s/sfml-python/talimat | 19 + talimatname/genel/s/sfml/talimat | 32 + talimatname/genel/s/sg3-utils/talimat | 16 + talimatname/genel/s/sgml-common/talimat | 25 + .../genel/s/shared-color-targets/talimat | 16 + .../shared-mime-info/shared-mime-info.kur-kos | 1 + talimatname/genel/s/shared-mime-info/talimat | 18 + talimatname/genel/s/sharutils/talimat | 17 + talimatname/genel/s/shashlik/shashlik-gui.sh | 44 + talimatname/genel/s/shashlik/shashlik.desktop | 11 + talimatname/genel/s/shashlik/talimat | 22 + talimatname/genel/s/shotcut/talimat | 37 + talimatname/genel/s/shotwell/shotwell.kur-kos | 4 + talimatname/genel/s/shotwell/talimat | 19 + talimatname/genel/s/siege/talimat | 19 + talimatname/genel/s/sielo-navigateur/talimat | 28 + .../genel/s/signon-kwallet-extension/talimat | 22 + .../genel/s/signon-plugin-oauth2/talimat | 23 + talimatname/genel/s/signon-ui/talimat | 20 + talimatname/genel/s/signond/talimat | 20 + talimatname/genel/s/simple-mtpfs/talimat | 22 + .../genel/s/simple-scan/simple-scan.kur-kos | 2 + talimatname/genel/s/simple-scan/talimat | 18 + .../simplescreenrecorder.desktop | 10 + .../simplescreenrecorder_tr.qm | Bin 0 -> 78294 bytes .../genel/s/simplescreenrecorder/talimat | 33 + talimatname/genel/s/slack/slack.desktop | 12 + talimatname/genel/s/slack/talimat | 20 + talimatname/genel/s/slang/talimat | 23 + talimatname/genel/s/slim/CMakeLists.txt.patch | 14 + talimatname/genel/s/slim/background.png | 1 + talimatname/genel/s/slim/panel.png | Bin 0 -> 1687 bytes .../s/slim/slim-1.3.6_freetype-2.5.1.diff | 22 + talimatname/genel/s/slim/slim.conf | 95 + talimatname/genel/s/slim/slim.kur-kos | 1 + talimatname/genel/s/slim/slim.logrotate | 9 + talimatname/genel/s/slim/slim.theme | 46 + talimatname/genel/s/slim/talimat | 67 + talimatname/genel/s/slop/talimat | 16 + talimatname/genel/s/slowloris/talimat | 14 + talimatname/genel/s/smartmontools/talimat | 23 + .../genel/s/smpeg/smpeg-0.4.4_m4.patch | 12 + .../genel/s/smpeg/smpeg-mpegaudiosdl.patch | 14 + talimatname/genel/s/smpeg/talimat | 25 + talimatname/genel/s/smpeg2/talimat | 19 + talimatname/genel/s/smplayer/talimat | 24 + .../0001-Set-windowing-backend-to-X11.patch | 25 + .../genel/s/snappy-player/clutter-gst3.patch | 164 + talimatname/genel/s/snappy-player/talimat | 27 + talimatname/genel/s/snappy/talimat | 18 + talimatname/genel/s/sndio/talimat | 16 + talimatname/genel/s/sni-qt/sni-qt.conf | 6 + talimatname/genel/s/sni-qt/talimat | 26 + talimatname/genel/s/snownews/talimat | 18 + talimatname/genel/s/socat/libressl.patch | 173 + talimatname/genel/s/socat/talimat | 18 + .../genel/s/sound-theme-freedesktop/talimat | 17 + talimatname/genel/s/soundtouch/talimat | 17 + talimatname/genel/s/sox/sox-dynamic.patch | 12 + talimatname/genel/s/sox/talimat | 27 + talimatname/genel/s/soxr/talimat | 31 + talimatname/genel/s/spacefm/spacefm.kur-kos | 2 + talimatname/genel/s/spacefm/talimat | 18 + talimatname/genel/s/spacenavd/talimat | 18 + .../spamassassin-net-dns-01.patch | 13 + .../genel/s/spamassassin/spamassassin.service | 15 + talimatname/genel/s/spamassassin/talimat | 35 + talimatname/genel/s/sparsehash/talimat | 18 + talimatname/genel/s/spectacle/talimat | 23 + talimatname/genel/s/speedcrunch/talimat | 18 + talimatname/genel/s/speex/talimat | 20 + talimatname/genel/s/speexdsp/talimat | 18 + .../genel/s/splix/splix-deviceID.patch | 105 + talimatname/genel/s/splix/talimat | 29 + talimatname/genel/s/sqlcipher/talimat | 17 + talimatname/genel/s/sqlite/talimat | 36 + talimatname/genel/s/sqlitebrowser/talimat | 24 + talimatname/genel/s/sqlmap/talimat | 41 + talimatname/genel/s/squeak-vm/talimat | 23 + talimatname/genel/s/squid/squid.kur-kos | 5 + talimatname/genel/s/squid/squid_servisi | 42 + talimatname/genel/s/squid/talimat | 40 + .../genel/s/ssh-askpass/ssh-askpass.kur-kos | 8 + talimatname/genel/s/ssh-askpass/talimat | 20 + talimatname/genel/s/sshfs-fuse/talimat | 16 + talimatname/genel/s/sshuttle/prefixes.conf | 5 + talimatname/genel/s/sshuttle/talimat | 28 + talimatname/genel/s/sshuttle/tunnel.conf | 19 + talimatname/genel/s/sslyze/talimat | 16 + talimatname/genel/s/st/talimat | 29 + talimatname/genel/s/stacer/talimat | 57 + .../genel/s/start-stop-daemon/makefile | 12 + .../genel/s/start-stop-daemon/ornek_servis | 48 + .../s/start-stop-daemon/start-stop-daemon.8 | 381 + .../s/start-stop-daemon/start-stop-daemon.c | 1059 + talimatname/genel/s/start-stop-daemon/talimat | 16 + .../genel/s/startup-notification/talimat | 20 + talimatname/genel/s/steghide/climit.diff | 11 + .../genel/s/steghide/float-constexpr.diff | 24 + talimatname/genel/s/steghide/talimat | 22 + .../genel/s/steghide/template-headers.diff | 75 + talimatname/genel/s/stfl/talimat | 15 + talimatname/genel/s/stopwatch/talimat | 16 + talimatname/genel/s/strace/talimat | 17 + talimatname/genel/s/strigi/talimat | 25 + .../genel/s/stunnel/cert-openssl.patch | 12 + talimatname/genel/s/stunnel/stunnel.conf | 21 + talimatname/genel/s/stunnel/stunnel.kos-kur | 7 + talimatname/genel/s/stunnel/stunnel.kur-kos | 2 + talimatname/genel/s/stunnel/talimat | 37 + talimatname/genel/s/sublime-text/talimat | 20 + talimatname/genel/s/subversion/talimat | 27 + talimatname/genel/s/supercat/talimat | 17 + talimatname/genel/s/supertux/talimat | 20 + talimatname/genel/s/supertuxkart/talimat | 30 + talimatname/genel/s/sweeper/talimat | 23 + talimatname/genel/s/sweethome3d/talimat | 120 + talimatname/genel/s/swi-prolog/talimat | 22 + talimatname/genel/s/swig/talimat | 18 + talimatname/genel/s/sxhkd/sxhkd.kurkos | 3 + talimatname/genel/s/sxhkd/sxhkdrc | 4 + talimatname/genel/s/sxhkd/talimat | 19 + talimatname/genel/s/sxiv/sxiv.giflib.patch | 15 + talimatname/genel/s/sxiv/talimat | 22 + talimatname/genel/s/sylpheed/sylpheed.kur-kos | 1 + talimatname/genel/s/sylpheed/talimat | 25 + talimatname/genel/s/syndication/talimat | 21 + .../genel/s/syntax-highlighting/talimat | 23 + talimatname/genel/s/sysfsutils/talimat | 17 + talimatname/genel/s/syslinux/talimat | 18 + talimatname/genel/s/sysstat/talimat | 20 + ...001-Fix-constructing-the-auth-dialog.patch | 31 + .../genel/s/system-config-printer/talimat | 23 + .../genel/s/system-tools-backends/talimat | 18 + talimatname/genel/s/systemtap/talimat | 24 + .../genel/s/sysv-rc-conf/sysv-rc-conf.pl | 1226 + talimatname/genel/s/sysv-rc-conf/talimat | 16 + talimatname/genel/t/t4k-common/libpng15.patch | 18 + talimatname/genel/t/t4k-common/talimat | 21 + talimatname/genel/t/taglib-extras/talimat | 20 + talimatname/genel/t/taglib/talimat | 21 + talimatname/genel/t/talloc/talimat | 17 + .../genel/t/tango-icon-theme-extras/talimat | 18 + talimatname/genel/t/tango-icon-theme/talimat | 18 + talimatname/genel/t/tcl/talimat | 40 + talimatname/genel/t/tcpdump/talimat | 17 + talimatname/genel/t/tcptraceroute/talimat | 22 + talimatname/genel/t/tdb/talimat | 19 + talimatname/genel/t/telegram-bin/talimat | 16 + talimatname/genel/t/telegram-cli/talimat | 22 + .../genel/t/telegram-cli/telegram-cli.patch | 90 + .../genel/t/telepathy-accounts-signon/talimat | 17 + .../genel/t/telepathy-farstream/talimat | 18 + talimatname/genel/t/telepathy-gabble/talimat | 19 + talimatname/genel/t/telepathy-glib/talimat | 20 + talimatname/genel/t/telepathy-idle/talimat | 18 + .../t/telepathy-kde-accounts-kcm/talimat | 22 + .../genel/t/telepathy-kde-approver/talimat | 22 + .../t/telepathy-kde-auth-handler/talimat | 22 + .../genel/t/telepathy-kde-call-ui/talimat | 22 + .../t/telepathy-kde-common-internals/talimat | 22 + .../t/telepathy-kde-contact-list/talimat | 22 + .../t/telepathy-kde-contact-runner/talimat | 22 + .../t/telepathy-kde-desktop-applets/talimat | 22 + .../talimat | 22 + .../telepathy-kde-integration-module/talimat | 22 + .../genel/t/telepathy-kde-send-file/talimat | 22 + .../genel/t/telepathy-kde-text-ui/talimat | 23 + .../genel/t/telepathy-logger-qt/talimat | 20 + talimatname/genel/t/telepathy-logger/talimat | 19 + .../genel/t/telepathy-mission-control/talimat | 23 + talimatname/genel/t/telepathy-python/talimat | 19 + talimatname/genel/t/telepathy-qt5/talimat | 23 + talimatname/genel/t/telepathy/talimat | 14 + talimatname/genel/t/termcap/talimat | 24 + talimatname/genel/t/terminology/talimat | 18 + talimatname/genel/t/terminus-font/talimat | 30 + .../t/terminus-font/terminus-font.kur-kos | 12 + talimatname/genel/t/tesseract/talimat | 28 + talimatname/genel/t/testdisk/talimat | 22 + talimatname/genel/t/tevent/talimat | 18 + talimatname/genel/t/tex-gyre-fonts/talimat | 16 + talimatname/genel/t/texi2html/talimat | 16 + .../genel/t/the_silver_searcher/talimat | 16 + talimatname/genel/t/theharvester/talimat | 30 + .../genel/t/theharvester/theharvester.kur-kos | 2 + talimatname/genel/t/thrift/talimat | 41 + .../genel/t/thunar-archive-plugin/talimat | 58 + talimatname/genel/t/thunar-vcs-plugin/talimat | 17 + .../thunar-vcs-plugin.kur-kos | 1 + talimatname/genel/t/thunar-volman/talimat | 17 + .../t/thunar-volman/thunar-volman.kur-kos | 2 + .../genel/t/thunar/no-root-warning.patch | 4 + talimatname/genel/t/thunar/talimat | 38 + talimatname/genel/t/thunar/thunar.kur-kos | 3 + talimatname/genel/t/thunderbird/talimat | 134 + .../genel/t/thunderbird/thunderbird.desktop | 173 + .../genel/t/thunderbird/thunderbird.kur-kos | 5 + talimatname/genel/t/tidy-html5/talimat | 23 + talimatname/genel/t/tidy/talimat | 28 + talimatname/genel/t/tig/talimat | 15 + talimatname/genel/t/tigervnc/talimat | 23 + talimatname/genel/t/tilda/talimat | 18 + talimatname/genel/t/tilde/talimat | 17 + talimatname/genel/t/time/talimat | 30 + talimatname/genel/t/tinc/talimat | 23 + talimatname/genel/t/tint2-extras/talimat | 28 + .../genel/t/tint2/add-power-now-support.patch | 19 + talimatname/genel/t/tint2/clock.patch | 22 + talimatname/genel/t/tint2/talimat | 28 + talimatname/genel/t/tinyxml/entity.patch | 64 + talimatname/genel/t/tinyxml/talimat | 30 + .../genel/t/tinyxml/tinyxml-use-stl.patch | 11 + talimatname/genel/t/tk/talimat | 43 + talimatname/genel/t/tmux/talimat | 16 + talimatname/genel/t/tolua++/talimat | 23 + talimatname/genel/t/tomb/talimat | 29 + talimatname/genel/t/totem-pl-parser/talimat | 18 + talimatname/genel/t/totem/talimat | 20 + talimatname/genel/t/totem/totem.kur-kos | 3 + talimatname/genel/t/toxcore/talimat | 21 + talimatname/genel/t/toxcore/toxcore.kur-kos | 4 + talimatname/genel/t/toybox/talimat | 20 + talimatname/genel/t/traceroute/talimat | 16 + talimatname/genel/t/tracker/talimat | 23 + talimatname/genel/t/tracker/tracker.kur-kos | 3 + talimatname/genel/t/transmission/talimat | 22 + .../genel/t/transmission/transmission.kur-kos | 2 + talimatname/genel/t/trayer/manpage.diff | 197 + talimatname/genel/t/trayer/talimat | 22 + talimatname/genel/t/trayer/trayer.diff | 22 + talimatname/genel/t/tree/talimat | 17 + talimatname/genel/t/trinity/talimat | 19 + talimatname/genel/t/tripwire/talimat | 56 + talimatname/genel/t/tripwire/twcfg.txt | 15 + talimatname/genel/t/tripwire/twpol.txt | 1093 + talimatname/genel/t/trojita/talimat | 21 + talimatname/genel/t/tslib/talimat | 21 + .../genel/t/tsocks/fix-mkinstalldirs.patch | 12 + talimatname/genel/t/tsocks/talimat | 23 + talimatname/genel/t/ttf-liberation/talimat | 28 + .../ttf-liberation.30-0-liberation-mono.conf | 17 + .../ttf-liberation.30-0-liberation-sans.conf | 17 + .../ttf-liberation.30-0-liberation-serif.conf | 17 + .../t/ttf-liberation/ttf-liberation.kur-kos | 12 + .../genel/t/ttf-linux-libertine/talimat | 23 + talimatname/genel/t/ttf-ms-fonts/talimat | 26 + talimatname/genel/t/tumbler/talimat | 22 + talimatname/genel/t/tuntox/shared-build.patch | 22 + talimatname/genel/t/tuntox/talimat | 23 + talimatname/genel/t/tup/talimat | 23 + talimatname/genel/t/turses/talimat | 16 + talimatname/genel/t/tuxmath/talimat | 31 + talimatname/genel/t/tuxmath/tuxmath.desktop | 18 + talimatname/genel/t/tuxpaint/talimat | 52 + talimatname/genel/t/txt2tags/talimat | 34 + talimatname/genel/u/uchardet/talimat | 20 + talimatname/genel/u/ucspi-tcp/head-1.patch | 40 + talimatname/genel/u/ucspi-tcp/talimat | 26 + .../u/ucspi-tcp/ucspi-tcp-0.88-ipv6.patch | 4976 +++ talimatname/genel/u/udevil/talimat | 18 + talimatname/genel/u/udisks/talimat | 20 + talimatname/genel/u/udisks2/talimat | 22 + .../u/udisks2/udisk2-2.1.5-policy-1.patch | 76 + talimatname/genel/u/ufsutils/talimat | 32 + talimatname/genel/u/uget/talimat | 17 + talimatname/genel/u/uhttpmock/talimat | 18 + talimatname/genel/u/ulib/talimat | 27 + talimatname/genel/u/umurmur/talimat | 28 + talimatname/genel/u/umurmur/umurmur.sysusers | 1 + talimatname/genel/u/unco/talimat | 27 + talimatname/genel/u/unison/talimat | 28 + talimatname/genel/u/unixodbc/talimat | 22 + talimatname/genel/u/unpaper/talimat | 20 + talimatname/genel/u/unrar/talimat | 23 + talimatname/genel/u/unshield/talimat | 22 + talimatname/genel/u/unzip/talimat | 28 + .../genel/u/upower/fix-critical-action.patch | 28 + talimatname/genel/u/upower/talimat | 22 + talimatname/genel/u/urbanterror/talimat | 41 + .../genel/u/urbanterror/urbanterror-server.sh | 4 + .../genel/u/urbanterror/urbanterror.desktop | 7 + .../genel/u/urbanterror/urbanterror.png | Bin 0 -> 41721 bytes .../genel/u/urbanterror/urbanterror.sh | 4 + talimatname/genel/u/urho3d/talimat | 23 + talimatname/genel/u/urlmatch/talimat | 16 + talimatname/genel/u/urweb/talimat | 19 + .../genel/u/urweb/use-system-uthash.patch | 993 + talimatname/genel/u/usbutils/talimat | 22 + talimatname/genel/u/usbutils/usbutils.kur-kos | 1 + talimatname/genel/u/uthash/talimat | 17 + talimatname/genel/u/utox/talimat | 16 + talimatname/genel/u/uwebsockets/talimat | 18 + talimatname/genel/u/uyap/product_logo_32.xpm | 209 + talimatname/genel/u/uyap/talimat | 92 + talimatname/genel/u/uyap/uyap-editor.png | Bin 0 -> 10872 bytes talimatname/genel/v/v4l-utils/talimat | 19 + talimatname/genel/v/vala/talimat | 18 + talimatname/genel/v/vala/vala.kos-sil | 10 + talimatname/genel/v/valgrind/talimat | 18 + talimatname/genel/v/vamp-plugin-sdk/talimat | 19 + talimatname/genel/v/varnish/talimat | 24 + talimatname/genel/v/varnish/varnish.service | 92 + talimatname/genel/v/vcdimager/talimat | 23 + talimatname/genel/v/vdrift/talimat | 46 + talimatname/genel/v/vdrift/vdrift-gcc6.patch | 12 + .../genel/v/vdrift/vdrift-sconscript.patch | 11 + .../genel/v/vdrift/vdrift-sconstruct.patch | 59 + talimatname/genel/v/vice/icons.tar.gz | Bin 0 -> 10209 bytes talimatname/genel/v/vice/talimat | 54 + talimatname/genel/v/vice/vice | 28 + talimatname/genel/v/vice/vice-2.4-64bit.patch | 129 + .../genel/v/vice/vice-2.4-giflib.patch | 38 + .../genel/v/vice/vice-2.4-no-fc-cache.patch | 15 + .../genel/v/vice/vice-2.4-notexi-notxt.patch | 28 + .../genel/v/vice/vice-2.4-texi2html.patch | 22 + .../genel/v/vice/vice-2.4-vice.texi.patch | 10 + .../genel/v/vice/vice-2.4-x11video.patch | 11 + .../genel/v/vice/vice-2.4-zlib-1.2.7.patch | 37 + talimatname/genel/v/vice/vice.desktop | 9 + talimatname/genel/v/vid-stab/talimat | 23 + talimatname/genel/v/viewnior/talimat | 17 + talimatname/genel/v/vile/talimat | 16 + talimatname/genel/v/vim/talimat | 46 + .../genel/v/vim/vim-7.4-locale-1.patch | 11 + talimatname/genel/v/vimb/talimat | 17 + talimatname/genel/v/vino/talimat | 17 + talimatname/genel/v/vino/vino.kur-kos | 2 + talimatname/genel/v/virtualbox-cli/talimat | 49 + talimatname/genel/v/virtualbox-cli/talimat~ | 48 + .../v/virtualbox-cli/virtualbox-cli.kos-kur | 5 + talimatname/genel/v/virtualbox/talimat | 58 + .../v/virtualbox/virtualbox.60-vboxdrv.rules | 8 + .../genel/v/virtualbox/virtualbox.kur-kos | 13 + .../genel/v/virtualbox/virtualbox.okubeni | 13 + talimatname/genel/v/virtualgl/talimat | 28 + talimatname/genel/v/vlc/lua53_compat.patch | 30 + talimatname/genel/v/vlc/talimat | 56 + talimatname/genel/v/vlc/vlc.kur-kos | 9 + talimatname/genel/v/vmware/Makefile | 24 + talimatname/genel/v/vmware/bootstrap | 11 + talimatname/genel/v/vmware/config | 25 + talimatname/genel/v/vmware/config.xml | 880 + talimatname/genel/v/vmware/datastores.xml | 16 + talimatname/genel/v/vmware/environments.xml | 46 + talimatname/genel/v/vmware/pam.d-vmware-authd | 5 + talimatname/genel/v/vmware/proxy.xml | 50 + talimatname/genel/v/vmware/talimat | 234 + talimatname/genel/v/vmware/vmmon.patch | 16 + talimatname/genel/v/vmware/vmnet.patch | 16 + .../genel/v/vmware/vmware-environment.sh | 9 + .../genel/v/vmware/vmware-vix-bootstrap | 2 + talimatname/genel/v/vmware/vmware.kur-kos | 16 + .../genel/v/vokoscreen/desktop_file.patch | 15 + .../genel/v/vokoscreen/fix_lrelease.patch | 12 + talimatname/genel/v/vokoscreen/talimat | 37 + talimatname/genel/v/vpnc/talimat | 17 + talimatname/genel/v/vte/talimat | 21 + talimatname/genel/v/vte3/talimat | 24 + talimatname/genel/v/vue/talimat | 48 + talimatname/genel/v/vuurmuur/talimat | 178 + talimatname/genel/w/w3af/talimat | 44 + talimatname/genel/w/w3af/w3af.desktop | 11 + talimatname/genel/w/w3af/w3af.kur-kos | 3 + talimatname/genel/w/w3m/talimat | 31 + talimatname/genel/w/wavpack/talimat | 20 + talimatname/genel/w/wayland-protocols/talimat | 19 + talimatname/genel/w/wayland/talimat | 18 + talimatname/genel/w/wbar/talimat | 21 + talimatname/genel/w/wcgbrowser/talimat | 29 + talimatname/genel/w/weather/talimat | 38 + talimatname/genel/w/webkit2gtk3/talimat | 31 + talimatname/genel/w/webkitfltk/talimat | 25 + talimatname/genel/w/webkitgtk2/icu59.patch | 38 + talimatname/genel/w/webkitgtk2/talimat | 39 + .../w/webkitgtk2/webkitgtk-2.4.9-abs.patch | 26 + talimatname/genel/w/webkitgtk3/icu59.patch | 38 + talimatname/genel/w/webkitgtk3/talimat | 38 + .../w/webkitgtk3/webkitgtk-2.4.9-abs.patch | 26 + talimatname/genel/w/websocketd/talimat | 16 + talimatname/genel/w/websocketpp/talimat | 21 + .../genel/w/webtorrent-desktop/talimat | 23 + .../webtorrent-desktop.desktop | 33 + talimatname/genel/w/weechat/talimat | 23 + talimatname/genel/w/weka/talimat | 26 + talimatname/genel/w/weka/weka.desktop | 19 + talimatname/genel/w/weka/weka.sh | 16 + talimatname/genel/w/wfuzz/talimat | 31 + talimatname/genel/w/whatsapp-desktop/talimat | 25 + .../whatsapp-desktop/whatsapp-desktop.desktop | 11 + .../w/whatsapp-desktop/whatsapp-desktop.png | Bin 0 -> 12363 bytes talimatname/genel/w/whatsie/talimat | 21 + talimatname/genel/w/whois/talimat | 19 + talimatname/genel/w/wicd/talimat | 36 + talimatname/genel/w/wicd/wicd.rc | 23 + talimatname/genel/w/widgetci/talimat | 35 + talimatname/genel/w/wifite/talimat | 15 + talimatname/genel/w/wildmidi/talimat | 20 + talimatname/genel/w/wireguard-kernel/talimat | 26 + .../w/wireguard-kernel/wireguard-kernel.hash | 1 + .../wireguard-kernel/wireguard-kernel.kur-kos | 2 + talimatname/genel/w/wireguard-tools/talimat | 23 + .../w/wireguard-tools/wireguard-tools.hash | 1 + talimatname/genel/w/wireless-tools/talimat | 17 + talimatname/genel/w/wireshark/talimat | 31 + .../genel/w/wireshark/wireshark.kur-kos | 16 + talimatname/genel/w/wmctrl/talimat | 20 + talimatname/genel/w/wmfs2/talimat | 26 + talimatname/genel/w/woeusb/talimat | 28 + talimatname/genel/w/woeusb/trad.mo | Bin 0 -> 3137 bytes .../genel/w/worker/ornek-ayar_by_frusen | 6841 +++ talimatname/genel/w/worker/talimat | 16 + talimatname/genel/w/wpa-supplicant/talimat | 54 + .../w/wpa-supplicant/wpa-supplicant.okubeni | 38 + talimatname/genel/w/wps-office/WEBDINGS.ttf | Bin 0 -> 121664 bytes talimatname/genel/w/wps-office/WINGDNG2.ttf | Bin 0 -> 65788 bytes talimatname/genel/w/wps-office/WINGDNG3.ttf | Bin 0 -> 35328 bytes talimatname/genel/w/wps-office/mtextra.ttf | Bin 0 -> 27092 bytes talimatname/genel/w/wps-office/symbol.ttf | Bin 0 -> 70128 bytes talimatname/genel/w/wps-office/talimat | 48 + talimatname/genel/w/wps-office/wingding.ttf | Bin 0 -> 83740 bytes talimatname/genel/w/wpscan/talimat | 29 + talimatname/genel/w/wpscan/wpscan.kur-kos | 6 + talimatname/genel/w/wren/talimat | 31 + talimatname/genel/w/wv/talimat | 16 + .../w/wxgtk/make-abicheck-non-fatal.patch | 14 + talimatname/genel/w/wxgtk/talimat | 43 + .../w/wxgtk/wxgtk-webkit-infinite-loop.patch | 36 + .../w/wxgtk28/make-abicheck-non-fatal.patch | 14 + talimatname/genel/w/wxgtk28/talimat | 25 + .../genel/w/wxgtk28/wxGTK-collision.patch | 81 + talimatname/genel/w/wxpython/talimat | 38 + talimatname/genel/x/x11vnc/talimat | 20 + talimatname/genel/x/x264/talimat | 21 + talimatname/genel/x/x265/talimat | 22 + talimatname/genel/x/xapian/talimat | 18 + talimatname/genel/x/xapps/talimat | 22 + talimatname/genel/x/xarchiver/talimat | 22 + talimatname/genel/x/xcb-proto/talimat | 19 + talimatname/genel/x/xcb-util-cursor/talimat | 17 + talimatname/genel/x/xcb-util-image/talimat | 19 + talimatname/genel/x/xcb-util-keysyms/talimat | 18 + .../genel/x/xcb-util-renderutil/talimat | 19 + talimatname/genel/x/xcb-util-wm/talimat | 18 + talimatname/genel/x/xcb-util-xrm/talimat | 17 + talimatname/genel/x/xcb-util/talimat | 19 + talimatname/genel/x/xcfa/talimat | 18 + talimatname/genel/x/xchat/talimat | 19 + talimatname/genel/x/xclip/talimat | 18 + .../genel/x/xcompmgr/fix_broken_shadows.diff | 28 + talimatname/genel/x/xcompmgr/talimat | 21 + talimatname/genel/x/xdg-user-dirs/talimat | 18 + .../genel/x/xdg-user-dirs/xdg-user-dirs-src | 4 + .../x/xdg-user-dirs/xdg-user-dirs.kur-kos | 1 + talimatname/genel/x/xdg-utils/talimat | 18 + talimatname/genel/x/xdialog/talimat | 19 + talimatname/genel/x/xdotool/talimat | 23 + talimatname/genel/x/xed/talimat | 19 + talimatname/genel/x/xed/xed.kur-kos | 1 + .../genel/x/xf86-video-openchrome/talimat | 25 + .../genel/x/xfce-theme-blackbird/talimat | 16 + .../genel/x/xfce-theme-bluebird/talimat | 16 + .../genel/x/xfce-theme-graybird/talimat | 16 + .../appfinder-preferences-ui.h | 334 + talimatname/genel/x/xfce4-appfinder/talimat | 34 + .../x/xfce4-appfinder/xfce4-appfinder.kur-kos | 1 + talimatname/genel/x/xfce4-artwork/talimat | 19 + .../genel/x/xfce4-battery-plugin/talimat | 27 + .../xfce4-battery-plugin.kur-kos | 1 + talimatname/genel/x/xfce4-burn/talimat | 19 + .../genel/x/xfce4-burn/xfce4-burn.kur-kos | 2 + .../genel/x/xfce4-calculator-plugin/talimat | 23 + .../genel/x/xfce4-clipman-plugin/talimat | 26 + .../xfce4-clipman-plugin.kur-kos | 1 + talimatname/genel/x/xfce4-conf/talimat | 30 + .../genel/x/xfce4-cpufreq-plugin/talimat | 24 + .../xfce4-cpufreq-plugin.kur-kos | 1 + .../genel/x/xfce4-cpugraph-plugin/talimat | 24 + .../xfce4-cpugraph-plugin.kur-kos | 1 + .../genel/x/xfce4-datetime-plugin/talimat | 27 + talimatname/genel/x/xfce4-desktop/talimat | 36 + .../x/xfce4-desktop/xfce4-desktop.kur-kos | 1 + talimatname/genel/x/xfce4-dev-tools/talimat | 16 + .../genel/x/xfce4-diskperf-plugin/talimat | 23 + .../x/xfce4-elementary-icon-theme/talimat | 18 + .../xfce4-elementary-icon-theme.kur-kos | 6 + .../genel/x/xfce4-fsguard-plugin/talimat | 22 + .../xfce4-fsguard-plugin.kur-kos | 1 + talimatname/genel/x/xfce4-garcon/talimat | 27 + talimatname/genel/x/xfce4-gtk-engine/talimat | 22 + .../x/xfce4-hardware-monitor-plugin/talimat | 22 + .../genel/x/xfce4-indicator-plugin/talimat | 19 + talimatname/genel/x/xfce4-libui/talimat | 32 + .../genel/x/xfce4-libui/xfce4-libui.kos-kur | 1 + .../genel/x/xfce4-libui/xfce4-libui.kos-sil | 11 + talimatname/genel/x/xfce4-libutil/talimat | 28 + .../x/xfce4-libutil/xfce4-libutil.kos-sil | 12 + .../genel/x/xfce4-linelight-plugin/talimat | 20 + .../genel/x/xfce4-mailwatch-plugin/talimat | 23 + talimatname/genel/x/xfce4-mixer/talimat | 22 + .../genel/x/xfce4-mixer/xfce4-mixer.kur-kos | 1 + .../genel/x/xfce4-netload-plugin/talimat | 22 + .../xfce4-netload-plugin.kur-kos | 1 + .../genel/x/xfce4-notes-plugin/talimat | 22 + talimatname/genel/x/xfce4-notifyd/talimat | 27 + .../x/xfce4-notifyd/xfce4-notifyd.kur-kos | 1 + talimatname/genel/x/xfce4-panel/talimat | 29 + .../genel/x/xfce4-panel/xfce4-panel.kos-sil | 12 + .../genel/x/xfce4-panel/xfce4-panel.kur-kos | 2 + .../genel/x/xfce4-places-plugin/mounts.patch | 12 + .../genel/x/xfce4-places-plugin/talimat | 34 + .../undefined-symbol.patch | 65 + .../genel/x/xfce4-power-manager/talimat | 22 + .../xfce4-power-manager.kos-sil | 13 + .../xfce4-power-manager.kur-kos | 1 + .../genel/x/xfce4-pulseaudio-plugin/talimat | 27 + .../genel/x/xfce4-screenshooter/talimat | 28 + .../xfce4-screenshooter.kur-kos | 1 + .../genel/x/xfce4-sensors-plugin/talimat | 25 + .../xfce4-sensors-plugin.kur-kos | 1 + ...T-number-to-xinit-if-XDG_VTNR-is-set.patch | 27 + talimatname/genel/x/xfce4-session/talimat | 32 + ...olkit-gnome-authentication-agent-1.desktop | 87 + .../x/xfce4-session/xfce4-session.kur-kos | 1 + talimatname/genel/x/xfce4-settings/talimat | 32 + .../x/xfce4-settings/xfce4-settings.kur-kos | 1 + .../x/xfce4-statusnotifier-plugin/talimat | 24 + .../genel/x/xfce4-systemload-plugin/talimat | 21 + .../xfce4-systemload-plugin.kur-kos | 1 + talimatname/genel/x/xfce4-taskmanager/talimat | 22 + talimatname/genel/x/xfce4-terminal/talimat | 26 + .../x/xfce4-terminal/xfce4-terminal.kur-kos | 1 + .../genel/x/xfce4-verve-plugin/talimat | 18 + .../genel/x/xfce4-volumed-pulse/talimat | 21 + talimatname/genel/x/xfce4-volumed/talimat | 23 + .../genel/x/xfce4-weather-plugin/talimat | 24 + .../xfce4-weather-plugin.kur-kos | 1 + .../genel/x/xfce4-whiskermenu-plugin/talimat | 27 + .../xfce4-whiskermenu-plugin.kur-kos | 1 + .../xfce4-whiskermenu-plugin.sil-kos | 1 + .../genel/x/xfce4-windowck-plugin/talimat | 21 + .../xfce4-windowck-plugin.kur-kos | 1 + talimatname/genel/x/xfce4-wm/talimat | 32 + talimatname/genel/x/xfce4-wm/xfce4-wm.kur-kos | 1 + talimatname/genel/x/xfce4-xkb-plugin/talimat | 22 + talimatname/genel/x/xfce4/surumler | 28 + talimatname/genel/x/xfce4/surumler_test | 28 + talimatname/genel/x/xfce4/talimat | 14 + talimatname/genel/x/xfdashboard/talimat | 23 + talimatname/genel/x/xfe/talimat | 20 + talimatname/genel/x/xfsprogs/talimat | 27 + talimatname/genel/x/xine-lib/talimat | 20 + talimatname/genel/x/xine-ui/talimat | 22 + talimatname/genel/x/xinetd/chargen | 25 + talimatname/genel/x/xinetd/daytime | 25 + talimatname/genel/x/xinetd/echo | 25 + talimatname/genel/x/xinetd/systat | 15 + talimatname/genel/x/xinetd/talimat | 50 + talimatname/genel/x/xinetd/xined_time | 25 + talimatname/genel/x/xinetd/xinetd.conf | 17 + talimatname/genel/x/xli/talimat | 22 + talimatname/genel/x/xli/xli.okubeni | 204 + talimatname/genel/x/xlockmore/talimat | 22 + talimatname/genel/x/xmlsec/talimat | 20 + talimatname/genel/x/xmlto/talimat | 18 + talimatname/genel/x/xmoto/lua52_compat.patch | 45 + talimatname/genel/x/xmoto/talimat | 31 + talimatname/genel/x/xneur/talimat | 19 + talimatname/genel/x/xnviewmp/talimat | 28 + talimatname/genel/x/xnviewmp/xnviewmp.desktop | 11 + talimatname/genel/x/xombrero/talimat | 21 + talimatname/genel/x/xonotic/talimat | 20 + talimatname/genel/x/xorg-app/talimat | 86 + talimatname/genel/x/xorg-cf-files/talimat | 16 + .../genel/x/xorg-compositeproto/talimat | 20 + talimatname/genel/x/xorg-dri2proto/talimat | 18 + talimatname/genel/x/xorg-encodings/talimat | 20 + talimatname/genel/x/xorg-font-util/talimat | 19 + talimatname/genel/x/xorg-font/talimat | 77 + .../genel/x/xorg-font/xorg-font.kur-kos | 6 + talimatname/genel/x/xorg-fontconfig/talimat | 23 + .../xorg-fontconfig.kos-sil.kos-sil | 11 + talimatname/genel/x/xorg-gccmakedep/talimat | 16 + talimatname/genel/x/xorg-glu/talimat | 16 + talimatname/genel/x/xorg-imake/talimat | 16 + talimatname/genel/x/xorg-libdmx/talimat | 16 + talimatname/genel/x/xorg-libdrm/talimat | 23 + talimatname/genel/x/xorg-libfontenc/talimat | 17 + talimatname/genel/x/xorg-libfs/talimat | 16 + talimatname/genel/x/xorg-libice/talimat | 18 + talimatname/genel/x/xorg-libpciaccess/talimat | 19 + talimatname/genel/x/xorg-libsm/talimat | 16 + talimatname/genel/x/xorg-libx11/talimat | 16 + talimatname/genel/x/xorg-libxau/talimat | 18 + talimatname/genel/x/xorg-libxaw/talimat | 16 + talimatname/genel/x/xorg-libxaw3d/talimat | 16 + .../genel/x/xorg-libxcomposite/talimat | 16 + talimatname/genel/x/xorg-libxcursor/talimat | 16 + talimatname/genel/x/xorg-libxdamage/talimat | 16 + talimatname/genel/x/xorg-libxdmcp/talimat | 17 + talimatname/genel/x/xorg-libxext/talimat | 16 + talimatname/genel/x/xorg-libxfixes/talimat | 16 + talimatname/genel/x/xorg-libxfont/talimat | 16 + talimatname/genel/x/xorg-libxft/talimat | 16 + talimatname/genel/x/xorg-libxi/talimat | 16 + talimatname/genel/x/xorg-libxinerama/talimat | 16 + talimatname/genel/x/xorg-libxkbfile/talimat | 18 + talimatname/genel/x/xorg-libxklavier/talimat | 20 + talimatname/genel/x/xorg-libxmu/talimat | 16 + talimatname/genel/x/xorg-libxp/talimat | 16 + talimatname/genel/x/xorg-libxpm/talimat | 16 + talimatname/genel/x/xorg-libxrandr/talimat | 16 + talimatname/genel/x/xorg-libxrender/talimat | 16 + talimatname/genel/x/xorg-libxres/talimat | 19 + .../genel/x/xorg-libxscrnsaver/talimat | 16 + talimatname/genel/x/xorg-libxshmfence/talimat | 16 + talimatname/genel/x/xorg-libxt/talimat | 17 + talimatname/genel/x/xorg-libxtst/talimat | 16 + talimatname/genel/x/xorg-libxv/talimat | 16 + talimatname/genel/x/xorg-libxvmc/talimat | 16 + talimatname/genel/x/xorg-libxxf86dga/talimat | 16 + talimatname/genel/x/xorg-libxxf86vm/talimat | 16 + talimatname/genel/x/xorg-mesa/talimat | 36 + talimatname/genel/x/xorg-pixman/talimat | 17 + talimatname/genel/x/xorg-proto/talimat | 55 + talimatname/genel/x/xorg-server/talimat | 32 + .../genel/x/xorg-server/xorg-server.kur-kos | 6 + .../genel/x/xorg-server/xorg-server.okubeni | 15 + talimatname/genel/x/xorg-term/talimat | 39 + talimatname/genel/x/xorg-term/xorg-term.list | 40 + talimatname/genel/x/xorg-twm/talimat | 18 + talimatname/genel/x/xorg-util-macros/talimat | 17 + talimatname/genel/x/xorg-xauth/talimat | 18 + talimatname/genel/x/xorg-xbitmaps/talimat | 17 + .../genel/x/xorg-xcb-util-keysyms/talimat | 18 + talimatname/genel/x/xorg-xclock/talimat | 17 + .../genel/x/xorg-xcursor-themes/talimat | 17 + talimatname/genel/x/xorg-xinit/talimat | 18 + .../genel/x/xorg-xkeyboard-config/talimat | 17 + talimatname/genel/x/xorg-xtrans/talimat | 17 + talimatname/genel/x/xorg/talimat | 67 + talimatname/genel/x/xorg/xorg.kur-kos | 8 + talimatname/genel/x/xorriso/talimat | 18 + talimatname/genel/x/xpad/talimat | 16 + talimatname/genel/x/xpdf/talimat | 31 + talimatname/genel/x/xquisite/talimat | 14 + talimatname/genel/x/xreader/talimat | 19 + talimatname/genel/x/xreader/xreader.kur-kos | 3 + talimatname/genel/x/xsane/talimat | 18 + talimatname/genel/x/xscreensaver/talimat | 30 + talimatname/genel/x/xtables-addons/talimat | 22 + talimatname/genel/x/xulrunner/talimat | 21 + talimatname/genel/x/xvid/talimat | 23 + talimatname/genel/x/xviewer/talimat | 19 + talimatname/genel/x/xviewer/xviewer.kur-kos | 1 + talimatname/genel/x/xzoom/talimat | 20 + talimatname/genel/y/yacy/talimat | 33 + talimatname/genel/y/yacy/yacy.rc | 37 + talimatname/genel/y/yad/talimat | 16 + talimatname/genel/y/yajl/talimat | 18 + talimatname/genel/y/yakuake/talimat | 20 + ...6d5c855b59e849b7228090981c520928c2a4.patch | 23 + ...b60f899ae6845039d4eca503133d0db81dbd.patch | 79 + talimatname/genel/y/yaml-cpp/talimat | 22 + talimatname/genel/y/yaml/talimat | 15 + talimatname/genel/y/yarn/talimat | 24 + talimatname/genel/y/yasm/talimat | 19 + talimatname/genel/y/yate/talimat | 24 + talimatname/genel/y/yelp-tools/talimat | 17 + talimatname/genel/y/yelp-xsl/talimat | 17 + talimatname/genel/y/yelp/talimat | 17 + talimatname/genel/y/yelp/yelp.kur-kos | 3 + talimatname/genel/y/you-get/talimat | 16 + talimatname/genel/y/youtube-dl-gui/talimat | 23 + .../y/youtube-dl-gui/youtube-dl-gui.desktop | 8 + .../genel/y/youtube-dl-gui/youtube_dl_gui.po | 590 + talimatname/genel/y/youtube-dl/talimat | 20 + .../youtube-viewer/gtk-youtube-viewer.desktop | 10 + talimatname/genel/y/youtube-viewer/talimat | 19 + talimatname/genel/y/yubico-c-client/talimat | 18 + talimatname/genel/z/zarith/talimat | 22 + talimatname/genel/z/zenity/talimat | 18 + talimatname/genel/z/zeromq/talimat | 28 + talimatname/genel/z/zig/talimat | 35 + talimatname/genel/z/zile/talimat | 18 + talimatname/genel/z/zim/talimat | 19 + talimatname/genel/z/zim/zim.kur-kos | 6 + talimatname/genel/z/zimg/talimat | 22 + talimatname/genel/z/zip/talimat | 16 + talimatname/genel/z/zsh/talimat | 42 + talimatname/genel/z/zsh/zsh.kur-kos | 3 + talimatname/genel/z/zzuf/talimat | 17 + talimatname/temel/acl/talimat | 33 + talimatname/temel/attr/talimat | 31 + talimatname/temel/autoconf/talimat | 19 + talimatname/temel/automake/talimat | 20 + talimatname/temel/bash/talimat | 28 + talimatname/temel/bc/talimat | 24 + talimatname/temel/binutils/talimat | 50 + talimatname/temel/bison/talimat | 22 + talimatname/temel/bzip2/talimat | 51 + .../ca-certificates/ca-certificates.kos-kur | 5 + .../ca-certificates/ca-certificates.okubeni | 22 + talimatname/temel/ca-certificates/talimat | 231 + talimatname/temel/coreutils/talimat | 49 + talimatname/temel/cpio/talimat | 29 + talimatname/temel/curl/talimat | 46 + talimatname/temel/derleme.sira | 79 + talimatname/temel/dhcpcd/dhcpcd.kur-kos | 1 + talimatname/temel/dhcpcd/talimat | 23 + talimatname/temel/dialog/talimat | 20 + talimatname/temel/diffutils/talimat | 20 + talimatname/temel/e2fsprogs/talimat | 46 + talimatname/temel/eudev/eudev.kos-kur | 1 + talimatname/temel/eudev/talimat | 64 + talimatname/temel/expat/talimat | 17 + talimatname/temel/file/talimat | 18 + talimatname/temel/findutils/talimat | 26 + talimatname/temel/flex/talimat | 36 + talimatname/temel/gawk/talimat | 22 + talimatname/temel/gcc/talimat | 101 + talimatname/temel/gdbm/talimat | 26 + talimatname/temel/gettext/talimat | 21 + .../temel/glibc/glibc.locales.supported | 18 + talimatname/temel/glibc/talimat | 106 + talimatname/temel/gmp/talimat | 34 + talimatname/temel/gperf/talimat | 18 + talimatname/temel/gpm/gpm.service.kur-kos | 4 + talimatname/temel/gpm/talimat | 31 + talimatname/temel/grep/talimat | 21 + talimatname/temel/groff/talimat | 26 + talimatname/temel/gzip/talimat | 21 + talimatname/temel/iana-etc/talimat | 21 + talimatname/temel/inetutils/talimat | 31 + talimatname/temel/iproute2/talimat | 27 + talimatname/temel/kbd/talimat | 28 + talimatname/temel/kmod/talimat | 30 + talimatname/temel/less/talimat | 19 + talimatname/temel/libarchive/talimat | 22 + talimatname/temel/libcap/talimat | 30 + talimatname/temel/libpipeline/talimat | 23 + talimatname/temel/libtool/talimat | 19 + talimatname/temel/lvm2/lvm2.okubeni | 8 + talimatname/temel/lvm2/talimat | 24 + talimatname/temel/lz4/talimat | 17 + talimatname/temel/lzip/talimat | 17 + talimatname/temel/lzo/talimat | 19 + talimatname/temel/m4/talimat | 20 + talimatname/temel/make/talimat | 18 + talimatname/temel/man-db/talimat | 40 + talimatname/temel/mpc/talimat | 20 + talimatname/temel/mpfr/talimat | 26 + talimatname/temel/nano/talimat | 27 + talimatname/temel/nasm/talimat | 28 + talimatname/temel/ncurses/talimat | 63 + talimatname/temel/openssh/openssh.okubeni | 439 + talimatname/temel/openssh/talimat | 54 + talimatname/temel/openssl/talimat | 42 + talimatname/temel/pam/talimat | 34 + talimatname/temel/patch/talimat | 19 + talimatname/temel/pciutils/pciutils.kur-kos | 1 + talimatname/temel/pciutils/talimat | 29 + talimatname/temel/perl/talimat | 58 + talimatname/temel/pkg-config/talimat | 21 + talimatname/temel/procps-ng/talimat | 31 + talimatname/temel/psmisc/talimat | 18 + talimatname/temel/readline/talimat | 47 + talimatname/temel/rsync/rsync.kur-kos | 12 + talimatname/temel/rsync/rsync.okubeni | 27 + talimatname/temel/rsync/talimat | 29 + talimatname/temel/sed/talimat | 22 + talimatname/temel/shadow/talimat | 222 + talimatname/temel/squashfs/talimat | 17 + talimatname/temel/sudo/talimat | 46 + talimatname/temel/sysklogd/talimat | 40 + talimatname/temel/sysvinit/talimat | 59 + talimatname/temel/tar/talimat | 21 + talimatname/temel/texinfo/talimat | 19 + talimatname/temel/tzdata/talimat | 21 + talimatname/temel/util-linux/talimat | 42 + talimatname/temel/wget/talimat | 23 + talimatname/temel/xz/talimat | 28 + talimatname/temel/zlib/talimat | 47 + 2607 files changed, 148167 insertions(+) create mode 100644 talimatname/genel/8/8cc/fix_cflags.patch create mode 100644 talimatname/genel/8/8cc/talimat create mode 100644 talimatname/genel/9/9base/9 create mode 100644 talimatname/genel/9/9base/plan9.sh create mode 100644 talimatname/genel/9/9base/talimat create mode 100644 talimatname/genel/g/geos/talimat create mode 100644 talimatname/genel/g/gnet/talimat create mode 100644 talimatname/genel/g/gocr/talimat create mode 100644 talimatname/genel/g/goocanvas/talimat create mode 100644 talimatname/genel/g/gpicview/0001-Fix-displaying-images-with-GTK3.patch create mode 100644 talimatname/genel/g/gpicview/talimat create mode 100644 talimatname/genel/g/gradle/gradle.sh create mode 100644 talimatname/genel/g/gradle/talimat create mode 100755 talimatname/genel/g/gssdp/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-bad/gstreamer-plugins-bad-0.10.23-compatibility-1.patch create mode 100644 talimatname/genel/g/gstreamer-plugins-bad/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-base/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-ffmpeg/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-good/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-python/talimat create mode 100644 talimatname/genel/g/gstreamer-plugins-ugly/talimat create mode 100644 talimatname/genel/g/gstreamer/talimat create mode 100644 talimatname/genel/g/gstreamer1-plugins-bad/talimat create mode 100644 talimatname/genel/g/gstreamer1-plugins-base/talimat create mode 100644 talimatname/genel/g/gstreamer1-plugins-good/talimat create mode 100644 talimatname/genel/g/gstreamer1-plugins-libav/talimat create mode 100644 talimatname/genel/g/gstreamer1-plugins-ugly/talimat create mode 100644 talimatname/genel/g/gstreamer1/talimat create mode 100644 talimatname/genel/g/gtest/talimat create mode 100644 talimatname/genel/g/gthumb/gthumb.kur-kos create mode 100644 talimatname/genel/g/gthumb/talimat create mode 100644 talimatname/genel/g/gtk-doc/talimat create mode 100644 talimatname/genel/g/gtk-engine-murrine/talimat create mode 100644 talimatname/genel/g/gtk-engines/talimat create mode 100644 talimatname/genel/g/gtk-gnutella/talimat create mode 100644 talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.desktop create mode 100644 talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.vala create mode 100644 talimatname/genel/g/gtk-theme-config/talimat create mode 100644 talimatname/genel/g/gtk-update-icon-cache/talimat create mode 100644 talimatname/genel/g/gtk-vnc/talimat create mode 100644 talimatname/genel/g/gtk2/gtk.kur-kos create mode 100644 talimatname/genel/g/gtk2/talimat create mode 100644 talimatname/genel/g/gtk3/gtk3.kur-kos create mode 100644 talimatname/genel/g/gtk3/talimat create mode 100644 talimatname/genel/g/gtkdialog/talimat create mode 100644 talimatname/genel/g/gtkglext/gtk2.20.patch create mode 100644 talimatname/genel/g/gtkglext/talimat create mode 100644 talimatname/genel/g/gtkhtml/talimat create mode 100644 talimatname/genel/g/gtkmm/talimat create mode 100644 talimatname/genel/g/gtkmm3/talimat create mode 100644 talimatname/genel/g/gtksourceview2/talimat create mode 100644 talimatname/genel/g/gtksourceview3/talimat create mode 100644 talimatname/genel/g/gtkspell/talimat create mode 100644 talimatname/genel/g/gtop/talimat create mode 100644 talimatname/genel/g/gtrayicon/talimat create mode 100644 talimatname/genel/g/guake/guake.kur-kos create mode 100644 talimatname/genel/g/guake/talimat create mode 100644 talimatname/genel/g/gucharmap/gucharmap.kur-kos create mode 100644 talimatname/genel/g/gucharmap/talimat create mode 100644 talimatname/genel/g/guile/talimat create mode 100644 talimatname/genel/g/gunicorn/talimat create mode 100755 talimatname/genel/g/gupnp/talimat create mode 100644 talimatname/genel/g/gutenprint-gimp/talimat create mode 100644 talimatname/genel/g/gutenprint/gutenprint.kur-kos create mode 100644 talimatname/genel/g/gutenprint/talimat create mode 100644 talimatname/genel/g/gvfs/gvfs.kur-kos create mode 100644 talimatname/genel/g/gvfs/talimat create mode 100644 talimatname/genel/g/gvim/gvim.desktop create mode 100644 talimatname/genel/g/gvim/talimat create mode 100644 talimatname/genel/g/gwenview/talimat create mode 100644 talimatname/genel/h/handbrake/talimat create mode 100644 talimatname/genel/h/hardinfo/hardinfo-tr.po create mode 100644 talimatname/genel/h/hardinfo/talimat create mode 100644 talimatname/genel/h/harfbuzz/harfbuzz.kos-kur create mode 100644 talimatname/genel/h/harfbuzz/harfbuzz.kos-sil create mode 100644 talimatname/genel/h/harfbuzz/harfbuzz.sil-kos create mode 100644 talimatname/genel/h/harfbuzz/talimat create mode 100644 talimatname/genel/h/haveged/talimat create mode 100644 talimatname/genel/h/hd2u/talimat create mode 100644 talimatname/genel/h/hdajackretask/talimat create mode 100644 talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-byteswap.patch create mode 100644 talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-execinfo.patch create mode 100644 talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-iconv.patch create mode 100644 talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-nls.patch create mode 100644 talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-satacmds.patch create mode 100644 talimatname/genel/h/hddtemp/hddtemp.rc create mode 100644 talimatname/genel/h/hddtemp/talimat create mode 100644 talimatname/genel/h/hdparm/talimat create mode 100644 talimatname/genel/h/heimdall/heimdall.desktop create mode 100644 talimatname/genel/h/heimdall/talimat create mode 100644 talimatname/genel/h/help2man/talimat create mode 100644 talimatname/genel/h/hexchat/talimat create mode 100644 talimatname/genel/h/hfsprogs/license create mode 100644 talimatname/genel/h/hfsprogs/makefile.patch create mode 100644 talimatname/genel/h/hfsprogs/talimat create mode 100644 talimatname/genel/h/hiawatha/hiawatha.conf.sample create mode 100644 talimatname/genel/h/hiawatha/hiawatha.kur-kos create mode 100755 talimatname/genel/h/hiawatha/hiawatha.rc create mode 100644 talimatname/genel/h/hiawatha/talimat create mode 100644 talimatname/genel/h/hicolor-icon-theme/talimat create mode 100644 talimatname/genel/h/hidapi/talimat create mode 100644 talimatname/genel/h/highlight/talimat create mode 100644 talimatname/genel/h/hping/Makefile.patch create mode 100644 talimatname/genel/h/hping/talimat create mode 100644 talimatname/genel/h/hping/tshzset.patch create mode 100644 talimatname/genel/h/hplip-plugin/talimat create mode 100644 talimatname/genel/h/hplip/0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch create mode 100644 talimatname/genel/h/hplip/fix_tabs.patch create mode 100644 talimatname/genel/h/hplip/hplip.kur-kos create mode 100644 talimatname/genel/h/hplip/talimat create mode 100644 talimatname/genel/h/htop/talimat create mode 100644 talimatname/genel/h/http-parser/talimat create mode 100644 talimatname/genel/h/httpup/talimat create mode 100644 talimatname/genel/h/hunspell/talimat create mode 100644 talimatname/genel/h/hydra/talimat create mode 100644 talimatname/genel/h/hyphen/talimat create mode 100644 talimatname/genel/i/i2pd/i2pd.conf create mode 100644 talimatname/genel/i/i2pd/i2pd.kur-kos create mode 100644 talimatname/genel/i/i2pd/talimat create mode 100644 talimatname/genel/i/i2pd/tunnels.conf create mode 100644 talimatname/genel/i/i3-status/talimat create mode 100644 talimatname/genel/i/i3wm/talimat create mode 100644 talimatname/genel/i/ibus/talimat create mode 100644 talimatname/genel/i/icecat/fix-wifi-scanner.diff create mode 100644 talimatname/genel/i/icecat/icecat-safe.desktop create mode 100644 talimatname/genel/i/icecat/icecat.desktop create mode 100644 talimatname/genel/i/icecat/mozconfig create mode 100644 talimatname/genel/i/icecat/mozilla-1228540-1.patch create mode 100644 talimatname/genel/i/icecat/no-crmf.diff create mode 100644 talimatname/genel/i/icecat/talimat create mode 100644 talimatname/genel/i/icecat/vendor.js create mode 100644 talimatname/genel/i/icedtea-web/talimat create mode 100644 talimatname/genel/i/icewm/icewm.post.install create mode 100644 talimatname/genel/i/icewm/talimat create mode 100644 talimatname/genel/i/icon-naming-utils/talimat create mode 100644 talimatname/genel/i/icu/talimat create mode 100644 talimatname/genel/i/id3lib/talimat create mode 100644 talimatname/genel/i/ido/talimat create mode 100644 talimatname/genel/i/iftop/talimat create mode 100644 talimatname/genel/i/ijs/talimat create mode 100644 talimatname/genel/i/ilmbase/talimat create mode 100644 talimatname/genel/i/imagemagick/talimat create mode 100644 talimatname/genel/i/imlib2/talimat create mode 100644 talimatname/genel/i/impacket/talimat create mode 100644 talimatname/genel/i/incidenceeditor/talimat create mode 100644 talimatname/genel/i/indicator-sound/indicator-sound.kur-kos create mode 100644 talimatname/genel/i/indicator-sound/talimat create mode 100644 talimatname/genel/i/initd-tools/initd-tools-0.1.3-0.1.3.tar.gz.partial create mode 100644 talimatname/genel/i/initd-tools/talimat create mode 100644 talimatname/genel/i/inkscape/inkscape-0.91-testfiles-1.patch create mode 100644 talimatname/genel/i/inkscape/talimat create mode 100644 talimatname/genel/i/innoextract/talimat create mode 100644 talimatname/genel/i/inspircd/inspircd.kur-kos create mode 100644 talimatname/genel/i/inspircd/inspircd.sil-kos create mode 100644 talimatname/genel/i/inspircd/talimat create mode 100644 talimatname/genel/i/intel-ucode/intel-ucode.kur-kos create mode 100644 talimatname/genel/i/intel-ucode/talimat create mode 100644 talimatname/genel/i/intltool/talimat create mode 100644 talimatname/genel/i/inxi/talimat create mode 100644 talimatname/genel/i/io/talimat create mode 100644 talimatname/genel/i/iperf/talimat create mode 100644 talimatname/genel/i/iprange/talimat create mode 100644 talimatname/genel/i/ipset/talimat create mode 100644 talimatname/genel/i/iptables/iptables.kur-kos create mode 100644 talimatname/genel/i/iptables/iptables.okubeni create mode 100755 talimatname/genel/i/iptables/iptables.rc create mode 100644 talimatname/genel/i/iptables/talimat create mode 100644 talimatname/genel/i/iputils/talimat create mode 100644 talimatname/genel/i/ipw2100-fw/talimat create mode 100644 talimatname/genel/i/ipw2200-fw/talimat create mode 100644 talimatname/genel/i/irssi/talimat create mode 100644 talimatname/genel/i/iso-codes/talimat create mode 100644 talimatname/genel/i/isodumper/header.png create mode 100644 talimatname/genel/i/isodumper/header.svg create mode 100644 talimatname/genel/i/isodumper/talimat create mode 100644 talimatname/genel/i/isomaster/talimat create mode 100644 talimatname/genel/i/isowriter/talimat create mode 100644 talimatname/genel/i/itstool/talimat create mode 100644 talimatname/genel/i/iucode-tool/talimat create mode 100644 talimatname/genel/i/iw/talimat create mode 100644 talimatname/genel/j/jack/jack-40-hpet-permissions.rules create mode 100644 talimatname/genel/j/jack/jack-99-audio.conf create mode 100644 talimatname/genel/j/jack/talimat create mode 100644 talimatname/genel/j/jam/talimat create mode 100644 talimatname/genel/j/jansson/talimat create mode 100644 talimatname/genel/j/jasper/talimat create mode 100644 talimatname/genel/j/java-mysql/talimat create mode 100644 talimatname/genel/j/jbigkit/talimat create mode 100644 talimatname/genel/j/jd-gui/jd-gui.desktop create mode 100644 talimatname/genel/j/jd-gui/talimat create mode 100644 talimatname/genel/j/jemalloc/talimat create mode 100644 talimatname/genel/j/jfsutils/talimat create mode 100644 talimatname/genel/j/joe/talimat create mode 100644 talimatname/genel/j/john/talimat create mode 100644 talimatname/genel/j/jq/talimat create mode 100644 talimatname/genel/j/jre/jre.kos-kur create mode 100644 talimatname/genel/j/jre/talimat create mode 100644 talimatname/genel/j/js1/talimat create mode 100644 talimatname/genel/j/js2/talimat create mode 100644 talimatname/genel/j/js38/mozjs38-1269317.patch create mode 100644 talimatname/genel/j/js38/mozjs38-copy-headers.patch create mode 100644 talimatname/genel/j/js38/mozjs38-fix-tracelogger.patch create mode 100644 talimatname/genel/j/js38/mozjs38-install-name.patch create mode 100644 talimatname/genel/j/js38/talimat create mode 100644 talimatname/genel/j/js52/mozjs52-disable-mozglue.patch create mode 100644 talimatname/genel/j/js52/talimat create mode 100644 talimatname/genel/j/json-c/talimat create mode 100644 talimatname/genel/j/json-glib/talimat create mode 100644 talimatname/genel/j/jsoncpp/talimat create mode 100644 talimatname/genel/j/jumpnbump/desktop.patch create mode 100644 talimatname/genel/j/jumpnbump/menu.patch create mode 100644 talimatname/genel/j/jumpnbump/talimat create mode 100644 talimatname/genel/j/junit/talimat create mode 100644 talimatname/genel/j/jwm/jwm-tr.po create mode 100644 talimatname/genel/j/jwm/jwm.desktop create mode 100644 talimatname/genel/j/jwm/jwm.readme create mode 100644 talimatname/genel/j/jwm/system.jwmrc create mode 100644 talimatname/genel/j/jwm/talimat create mode 100644 talimatname/genel/k/k3b/talimat create mode 100644 talimatname/genel/k/kaccounts-integration/talimat create mode 100644 talimatname/genel/k/kaccounts-providers/talimat create mode 100644 talimatname/genel/k/kaffeine/talimat create mode 100644 talimatname/genel/k/kakoune/talimat create mode 100644 talimatname/genel/k/kalarmcal/talimat create mode 100644 talimatname/genel/k/kashmir/talimat create mode 100644 talimatname/genel/k/kate/talimat create mode 100644 talimatname/genel/k/kblog/talimat create mode 100644 talimatname/genel/k/kcalc/talimat create mode 100644 talimatname/genel/k/kcalcore/talimat create mode 100644 talimatname/genel/k/kcalutils/talimat create mode 100644 talimatname/genel/k/kcontacts/talimat create mode 100644 talimatname/genel/k/kcptun/talimat create mode 100644 talimatname/genel/k/kde-app/talimat create mode 100644 talimatname/genel/k/kde-extra/talimat create mode 100644 talimatname/genel/k/kde5-l10n/talimat create mode 100644 talimatname/genel/k/kde5/talimat create mode 100644 talimatname/genel/k/kdeconnect/talimat create mode 100644 talimatname/genel/k/kdegraphics-thumbnailers/talimat create mode 100644 talimatname/genel/k/kdenlive/talimat create mode 100644 talimatname/genel/k/kdepim-addons/talimat create mode 100644 talimatname/genel/k/kdepim-apps-libs/talimat create mode 100644 talimatname/genel/k/kdepim-runtime/talimat create mode 100644 talimatname/genel/k/kdepim/talimat create mode 100644 talimatname/genel/k/kdgantt2/talimat create mode 100644 talimatname/genel/k/kdiagram/talimat create mode 100644 talimatname/genel/k/kdialog/talimat create mode 100644 talimatname/genel/k/kdiamond/kdiamond.kur-kos create mode 100644 talimatname/genel/k/kdiamond/talimat create mode 100644 talimatname/genel/k/keepassx2/talimat create mode 100644 talimatname/genel/k/kerberos/kerberos.kur-kos create mode 100644 talimatname/genel/k/kerberos/kerberos.okubeni create mode 100644 talimatname/genel/k/kerberos/talimat create mode 100644 talimatname/genel/k/kernel/aufs4-base.patch create mode 100644 talimatname/genel/k/kernel/aufs4-kbuild.patch create mode 100644 talimatname/genel/k/kernel/aufs4-loopback.patch create mode 100644 talimatname/genel/k/kernel/aufs4-mmap.patch create mode 100644 talimatname/genel/k/kernel/aufs4-standalone.patch create mode 100644 talimatname/genel/k/kernel/aufs4.patch create mode 100644 talimatname/genel/k/kernel/config create mode 100644 talimatname/genel/k/kernel/config.aufs create mode 100755 talimatname/genel/k/kernel/create-aufs.sh create mode 100644 talimatname/genel/k/kernel/kernel.kos-sil create mode 100644 talimatname/genel/k/kernel/kernel.kur-kos create mode 100644 talimatname/genel/k/kernel/talimat create mode 100644 talimatname/genel/k/kernel/tmpfs-idr.patch create mode 100644 talimatname/genel/k/kernel/vfs-ino.patch create mode 100644 talimatname/genel/k/keybinder/talimat create mode 100644 talimatname/genel/k/keybinder3/talimat create mode 100644 talimatname/genel/k/keyutils/talimat create mode 100644 talimatname/genel/k/kf5-attica/talimat create mode 100644 talimatname/genel/k/kf5-baloo/kf5-baloo.kur-kos create mode 100644 talimatname/genel/k/kf5-baloo/talimat create mode 100644 talimatname/genel/k/kf5-bluez-qt/talimat create mode 100644 talimatname/genel/k/kf5-breeze-icons/talimat create mode 100644 talimatname/genel/k/kf5-extra-cmake-modules/talimat create mode 100644 talimatname/genel/k/kf5-frameworkintegration/talimat create mode 100644 talimatname/genel/k/kf5-kactivities-stats/talimat create mode 100644 talimatname/genel/k/kf5-kactivities/talimat create mode 100644 talimatname/genel/k/kf5-kapidox/talimat create mode 100644 talimatname/genel/k/kf5-karchive/talimat create mode 100644 talimatname/genel/k/kf5-kauth/talimat create mode 100644 talimatname/genel/k/kf5-kbookmarks/talimat create mode 100644 talimatname/genel/k/kf5-kcmutils/talimat create mode 100644 talimatname/genel/k/kf5-kcodecs/talimat create mode 100644 talimatname/genel/k/kf5-kcompletion/talimat create mode 100644 talimatname/genel/k/kf5-kconfig/talimat create mode 100644 talimatname/genel/k/kf5-kconfigwidgets/talimat create mode 100644 talimatname/genel/k/kf5-kcoreaddons/kf5-kcoreaddons.kur-kos create mode 100644 talimatname/genel/k/kf5-kcoreaddons/talimat create mode 100644 talimatname/genel/k/kf5-kcrash/talimat create mode 100644 talimatname/genel/k/kf5-kdbusaddons/talimat create mode 100644 talimatname/genel/k/kf5-kdeclarative/talimat create mode 100644 talimatname/genel/k/kf5-kded/talimat create mode 100644 talimatname/genel/k/kf5-kdelibs4support/talimat create mode 100644 talimatname/genel/k/kf5-kdesignerplugin/talimat create mode 100644 talimatname/genel/k/kf5-kdesu/talimat create mode 100644 talimatname/genel/k/kf5-kdewebkit/talimat create mode 100644 talimatname/genel/k/kf5-kdnssd/talimat create mode 100644 talimatname/genel/k/kf5-kdoctools/talimat create mode 100644 talimatname/genel/k/kf5-kemoticons/talimat create mode 100644 talimatname/genel/k/kf5-kfilemetadata/talimat create mode 100644 talimatname/genel/k/kf5-kglobalaccel/talimat create mode 100644 talimatname/genel/k/kf5-kguiaddons/talimat create mode 100644 talimatname/genel/k/kf5-khtml/talimat create mode 100644 talimatname/genel/k/kf5-ki18n/kf5-ki18n.kos-kur create mode 100644 talimatname/genel/k/kf5-ki18n/talimat create mode 100644 talimatname/genel/k/kf5-kiconthemes/talimat create mode 100644 talimatname/genel/k/kf5-kidletime/talimat create mode 100644 talimatname/genel/k/kf5-kimageformats/talimat create mode 100644 talimatname/genel/k/kf5-kinit/talimat create mode 100644 talimatname/genel/k/kf5-kio/kf5-kio.kur-kos create mode 100644 talimatname/genel/k/kf5-kio/talimat create mode 100644 talimatname/genel/k/kf5-kitemmodels/talimat create mode 100644 talimatname/genel/k/kf5-kitemviews/talimat create mode 100644 talimatname/genel/k/kf5-kjobwidgets/talimat create mode 100644 talimatname/genel/k/kf5-kjs/talimat create mode 100644 talimatname/genel/k/kf5-kjsembed/talimat create mode 100644 talimatname/genel/k/kf5-kmediaplayer/talimat create mode 100644 talimatname/genel/k/kf5-knewstuff/talimat create mode 100644 talimatname/genel/k/kf5-knotifications/talimat create mode 100644 talimatname/genel/k/kf5-knotifyconfig/talimat create mode 100644 talimatname/genel/k/kf5-kpackage/talimat create mode 100644 talimatname/genel/k/kf5-kparts/talimat create mode 100644 talimatname/genel/k/kf5-kpeople/talimat create mode 100644 talimatname/genel/k/kf5-kplotting/talimat create mode 100644 talimatname/genel/k/kf5-kprison/talimat create mode 100644 talimatname/genel/k/kf5-kpty/talimat create mode 100644 talimatname/genel/k/kf5-kross/talimat create mode 100644 talimatname/genel/k/kf5-krunner/talimat create mode 100644 talimatname/genel/k/kf5-kservice/talimat create mode 100644 talimatname/genel/k/kf5-ktexteditor/talimat create mode 100644 talimatname/genel/k/kf5-ktextwidgets/talimat create mode 100644 talimatname/genel/k/kf5-kunitconversion/talimat create mode 100644 talimatname/genel/k/kf5-kwallet/talimat create mode 100644 talimatname/genel/k/kf5-kwayland/talimat create mode 100644 talimatname/genel/k/kf5-kwidgetsaddons/talimat create mode 100644 talimatname/genel/k/kf5-kwindowsystem/talimat create mode 100644 talimatname/genel/k/kf5-kxmlgui/talimat create mode 100644 talimatname/genel/k/kf5-kxmlrpcclient/talimat create mode 100644 talimatname/genel/k/kf5-modemmanager-qt/talimat create mode 100644 talimatname/genel/k/kf5-networkmanager-qt/talimat create mode 100644 talimatname/genel/k/kf5-oxygen-icons5/talimat create mode 100644 talimatname/genel/k/kf5-plasma-framework/talimat create mode 100644 talimatname/genel/k/kf5-solid/talimat create mode 100644 talimatname/genel/k/kf5-sonnet/talimat create mode 100644 talimatname/genel/k/kf5-threadweaver/talimat create mode 100644 talimatname/genel/k/kf5/talimat create mode 100644 talimatname/genel/k/khelpcenter/talimat create mode 100644 talimatname/genel/k/kholidays/talimat create mode 100644 talimatname/genel/k/kidentitymanagement/talimat create mode 100644 talimatname/genel/k/kimap/talimat create mode 100644 talimatname/genel/k/kio-extras/kio-extras.kur-kos create mode 100644 talimatname/genel/k/kio-extras/talimat create mode 100644 talimatname/genel/k/kirigami/talimat create mode 100644 talimatname/genel/k/klavaro/klavaro.mo create mode 100644 talimatname/genel/k/klavaro/talimat create mode 100644 talimatname/genel/k/kldap/talimat create mode 100644 talimatname/genel/k/kmahjongg/talimat create mode 100644 talimatname/genel/k/kmailtransport/talimat create mode 100644 talimatname/genel/k/kmbox/talimat create mode 100644 talimatname/genel/k/kmime/talimat create mode 100644 talimatname/genel/k/kmix/talimat create mode 100644 talimatname/genel/k/kolourpaint/talimat create mode 100644 talimatname/genel/k/kompare/talimat create mode 100644 talimatname/genel/k/komutan/komutan.kur-kos create mode 100644 talimatname/genel/k/komutan/talimat create mode 100644 talimatname/genel/k/konsole/talimat create mode 100644 talimatname/genel/k/kontactinterface/talimat create mode 100644 talimatname/genel/k/konversation/talimat create mode 100644 talimatname/genel/k/kpat/kpat.kur-kos create mode 100644 talimatname/genel/k/kpat/talimat create mode 100644 talimatname/genel/k/kpimtextedit/talimat create mode 100644 talimatname/genel/k/kpmcore/talimat create mode 100644 talimatname/genel/k/krb5/krb5-config_LDFLAGS.patch create mode 100644 talimatname/genel/k/krb5/talimat create mode 100644 talimatname/genel/k/krita/talimat create mode 100644 talimatname/genel/k/ktnef/talimat create mode 100644 talimatname/genel/k/kutuphane/baglanti.java create mode 100644 talimatname/genel/k/kutuphane/kutuphane.kur-kos create mode 100644 talimatname/genel/k/kutuphane/talimat create mode 100644 talimatname/genel/l/ladspa/ladspa-fallback-ladspa-path.patch create mode 100644 talimatname/genel/l/ladspa/ladspa-fix-memleak-in-plugin-scanning.patch create mode 100644 talimatname/genel/l/ladspa/talimat create mode 100644 talimatname/genel/l/lame/talimat create mode 100644 talimatname/genel/l/lapack/talimat create mode 100644 talimatname/genel/l/lazagne/lazagne.kur-kos create mode 100644 talimatname/genel/l/lazagne/sifrebul create mode 100644 talimatname/genel/l/lazagne/talimat create mode 100644 talimatname/genel/l/lazarus/talimat create mode 100644 talimatname/genel/l/lcms/talimat create mode 100644 talimatname/genel/l/lcms2/talimat create mode 100644 talimatname/genel/l/ldns/talimat create mode 100644 talimatname/genel/l/leafpad/talimat create mode 100644 talimatname/genel/l/lemonbar/talimat create mode 100644 talimatname/genel/l/lensfun/talimat create mode 100644 talimatname/genel/l/leptonica/talimat create mode 100644 talimatname/genel/l/lesstif/talimat create mode 100644 talimatname/genel/l/lftp/talimat create mode 100644 talimatname/genel/l/liba52/talimat create mode 100644 talimatname/genel/l/libabw/talimat create mode 100644 talimatname/genel/l/libaccounts-glib/talimat create mode 100644 talimatname/genel/l/libaccounts-qt5/talimat create mode 100644 talimatname/genel/l/libao/talimat create mode 100644 talimatname/genel/l/libappindicator-gtk2/talimat create mode 100644 talimatname/genel/l/libart_lgpl/talimat create mode 100644 talimatname/genel/l/libass/talimat create mode 100644 talimatname/genel/l/libassuan/talimat create mode 100644 talimatname/genel/l/libasyncd/talimat create mode 100644 talimatname/genel/l/libasyncns/talimat create mode 100644 talimatname/genel/l/libatasmart/talimat create mode 100644 talimatname/genel/l/libatomic-ops/talimat create mode 100644 talimatname/genel/l/libb64/talimat create mode 100644 talimatname/genel/l/libbluray/talimat create mode 100644 talimatname/genel/l/libbsd/talimat create mode 100644 talimatname/genel/l/libburn/talimat create mode 100644 talimatname/genel/l/libcaca/talimat create mode 100644 talimatname/genel/l/libcacard/talimat create mode 100644 talimatname/genel/l/libcanberra/talimat create mode 100644 talimatname/genel/l/libcap-ng/talimat create mode 100644 talimatname/genel/l/libcddb/talimat create mode 100644 talimatname/genel/l/libcdio-paranoia/talimat create mode 100644 talimatname/genel/l/libcdio/talimat create mode 100644 talimatname/genel/l/libcdr/talimat create mode 100644 talimatname/genel/l/libchamplain/talimat create mode 100644 talimatname/genel/l/libcli/talimat create mode 100644 talimatname/genel/l/libcmis/google_drive.diff create mode 100644 talimatname/genel/l/libcmis/talimat create mode 100644 talimatname/genel/l/libconfig/talimat create mode 100644 talimatname/genel/l/libcroco/talimat create mode 100644 talimatname/genel/l/libcryptui/libcryptui.kur-kos create mode 100644 talimatname/genel/l/libcryptui/talimat create mode 100644 talimatname/genel/l/libcxx/talimat create mode 100644 talimatname/genel/l/libdaemon/talimat create mode 100644 talimatname/genel/l/libdatrie/talimat create mode 100644 talimatname/genel/l/libdbusmenu-glib/talimat create mode 100644 talimatname/genel/l/libdbusmenu-gtk2/talimat create mode 100644 talimatname/genel/l/libdbusmenu-gtk3/talimat create mode 100644 talimatname/genel/l/libdbusmenu-qt/talimat create mode 100644 talimatname/genel/l/libdbusmenu-qt5/talimat create mode 100644 talimatname/genel/l/libdmapsharing/talimat create mode 100644 talimatname/genel/l/libdmtx/talimat create mode 100644 talimatname/genel/l/libdnet/talimat create mode 100644 talimatname/genel/l/libdv/talimat create mode 100644 talimatname/genel/l/libdvdcss/talimat create mode 100644 talimatname/genel/l/libdvdnav/talimat create mode 100644 talimatname/genel/l/libdvdread/talimat create mode 100644 talimatname/genel/l/libe-book/talimat create mode 100644 talimatname/genel/l/libechonest/talimat create mode 100644 talimatname/genel/l/libedit/talimat create mode 100644 talimatname/genel/l/libepoxy/talimat create mode 100644 talimatname/genel/l/libesmtp/talimat create mode 100644 talimatname/genel/l/libetonyek/0001-Allow-building-with-mdds-1.2.patch create mode 100644 talimatname/genel/l/libetonyek/0001-drop-test-that-violates-Unicode-tr-35.patch create mode 100644 talimatname/genel/l/libetonyek/0001-fix-test-on-i686.patch create mode 100644 talimatname/genel/l/libetonyek/talimat create mode 100644 talimatname/genel/l/libetpan/talimat create mode 100644 talimatname/genel/l/libev/talimat create mode 100644 talimatname/genel/l/libevdev/talimat create mode 100644 talimatname/genel/l/libevent/talimat create mode 100644 talimatname/genel/l/libexif/talimat create mode 100644 talimatname/genel/l/libexttextcat/talimat create mode 100644 talimatname/genel/l/libfakekey/talimat create mode 100755 talimatname/genel/l/libffi/libffi.kur-kos create mode 100644 talimatname/genel/l/libffi/talimat create mode 100644 talimatname/genel/l/libfilezilla/talimat create mode 100644 talimatname/genel/l/libfm-extra/talimat create mode 100644 talimatname/genel/l/libfm-qt/talimat create mode 100644 talimatname/genel/l/libfm/talimat create mode 100644 talimatname/genel/l/libfprint/talimat create mode 100644 talimatname/genel/l/libftdi/talimat create mode 100644 talimatname/genel/l/libgcrypt/talimat create mode 100644 talimatname/genel/l/libgd/talimat create mode 100644 talimatname/genel/l/libgda/0001-Convert-files-to-Unicode.patch create mode 100644 talimatname/genel/l/libgda/fix-crash.diff create mode 100644 talimatname/genel/l/libgda/glib-2.54-ftbfs-2.patch create mode 100644 talimatname/genel/l/libgda/glib-2.54-ftbfs.patch create mode 100644 talimatname/genel/l/libgda/java.patch create mode 100644 talimatname/genel/l/libgda/talimat create mode 100644 talimatname/genel/l/libgdata/talimat create mode 100644 talimatname/genel/l/libgdiplus/libgdiplus0-giflib5.patch create mode 100644 talimatname/genel/l/libgdiplus/talimat create mode 100644 talimatname/genel/l/libgee/talimat create mode 100644 talimatname/genel/l/libgee06/talimat create mode 100644 talimatname/genel/l/libgexiv2/talimat create mode 100644 talimatname/genel/l/libgig/talimat create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.0-fbsd.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.12-automake-1.11.2.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.12-fix-make-3.82.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.12-notests.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.12-revert-forkpty.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.7-libs.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-2.0.7-polinguas.patch create mode 100644 talimatname/genel/l/libgksu/libgksu-tr.po create mode 100644 talimatname/genel/l/libgksu/talimat create mode 100644 talimatname/genel/l/libglade/talimat create mode 100644 talimatname/genel/l/libglademm/talimat create mode 100644 talimatname/genel/l/libgnome-keyring/talimat create mode 100644 talimatname/genel/l/libgnomecanvas/talimat create mode 100644 talimatname/genel/l/libgnomecanvasmm/talimat create mode 100644 talimatname/genel/l/libgnomekbd/libgnomekbd.kur-kos create mode 100644 talimatname/genel/l/libgnomekbd/talimat create mode 100644 talimatname/genel/l/libgovirt/talimat create mode 100644 talimatname/genel/l/libgpg-error/talimat create mode 100644 talimatname/genel/l/libgphoto2/jpeg.patch create mode 100644 talimatname/genel/l/libgphoto2/talimat create mode 100644 talimatname/genel/l/libgravatar/talimat create mode 100644 talimatname/genel/l/libgsf/talimat create mode 100644 talimatname/genel/l/libgsignon-glib/talimat create mode 100644 talimatname/genel/l/libgtop/talimat create mode 100644 talimatname/genel/l/libgudev/talimat create mode 100644 talimatname/genel/l/libguestfs/libguestfs.kur-kos create mode 100644 talimatname/genel/l/libguestfs/talimat create mode 100644 talimatname/genel/l/libgusb/talimat create mode 100644 talimatname/genel/l/libgweather/libgweather.kur-kos create mode 100644 talimatname/genel/l/libgweather/talimat create mode 100755 talimatname/genel/l/libical/libical.kur-kos create mode 100644 talimatname/genel/l/libical/talimat create mode 100644 talimatname/genel/l/libid3tag/talimat create mode 100644 talimatname/genel/l/libidl/talimat create mode 100644 talimatname/genel/l/libidn/talimat create mode 100644 talimatname/genel/l/libindicator-gtk2/talimat create mode 100644 talimatname/genel/l/libindicator/talimat create mode 100644 talimatname/genel/l/libinput/talimat create mode 100644 talimatname/genel/l/libiodbc/talimat create mode 100644 talimatname/genel/l/libisoburn/talimat create mode 100644 talimatname/genel/l/libisofs/talimat create mode 100644 talimatname/genel/l/libixion/talimat create mode 100644 talimatname/genel/l/libjpeg-turbo/talimat create mode 100644 talimatname/genel/l/libkcddb/talimat create mode 100644 talimatname/genel/l/libkdcraw/talimat create mode 100644 talimatname/genel/l/libkdegames/talimat create mode 100644 talimatname/genel/l/libkdepim/talimat create mode 100644 talimatname/genel/l/libkexiv2/talimat create mode 100644 talimatname/genel/l/libkgapi/talimat create mode 100644 talimatname/genel/l/libkipi/libkipi.kur-kos create mode 100644 talimatname/genel/l/libkipi/talimat create mode 100644 talimatname/genel/l/libkleo/talimat create mode 100644 talimatname/genel/l/libkmahjongg/talimat create mode 100644 talimatname/genel/l/libkomparediff2/talimat create mode 100644 talimatname/genel/l/libksane/talimat create mode 100644 talimatname/genel/l/libksba/talimat create mode 100644 talimatname/genel/l/libksieve/talimat create mode 100644 talimatname/genel/l/liblangtag/talimat create mode 100644 talimatname/genel/l/liblinear/talimat create mode 100644 talimatname/genel/l/liblo/talimat create mode 100644 talimatname/genel/l/liblxqt/talimat create mode 100644 talimatname/genel/l/libmad/amd64-64bit.diff create mode 100644 talimatname/genel/l/libmad/frame_length.diff create mode 100644 talimatname/genel/l/libmad/libmad.patch create mode 100644 talimatname/genel/l/libmad/mad.pc create mode 100644 talimatname/genel/l/libmad/optimize.diff create mode 100644 talimatname/genel/l/libmad/talimat create mode 100755 talimatname/genel/l/libmatekbd/libmatekbd.kur-kos create mode 100644 talimatname/genel/l/libmatekbd/talimat create mode 100644 talimatname/genel/l/libmatemixer/talimat create mode 100755 talimatname/genel/l/libmateweather/libmateweather.kur-kos create mode 100644 talimatname/genel/l/libmateweather/talimat create mode 100644 talimatname/genel/l/libmbim/talimat create mode 100644 talimatname/genel/l/libmcrypt/talimat create mode 100644 talimatname/genel/l/libmediaart/talimat create mode 100644 talimatname/genel/l/libmediainfo/talimat create mode 100644 talimatname/genel/l/libmicrohttpd/talimat create mode 100644 talimatname/genel/l/libmikmod/talimat create mode 100644 talimatname/genel/l/libmms/talimat create mode 100644 talimatname/genel/l/libmng/talimat create mode 100644 talimatname/genel/l/libmnl/talimat create mode 100644 talimatname/genel/l/libmodplug/talimat create mode 100644 talimatname/genel/l/libmp4v2/talimat create mode 100644 talimatname/genel/l/libmpcdec/talimat create mode 100644 talimatname/genel/l/libmpeg2/talimat create mode 100644 talimatname/genel/l/libmspack/talimat create mode 100644 talimatname/genel/l/libmspub/talimat create mode 100644 talimatname/genel/l/libmtp/talimat create mode 100644 talimatname/genel/l/libmusicbrainz2/talimat create mode 100644 talimatname/genel/l/libmusicbrainz5/talimat create mode 100644 talimatname/genel/l/libmwaw/talimat create mode 100644 talimatname/genel/l/libmypaint/gegl-0.4.patch create mode 100644 talimatname/genel/l/libmypaint/talimat create mode 100644 talimatname/genel/l/libmypaint/versioning.patch create mode 100644 talimatname/genel/l/libnatpmp/talimat create mode 100644 talimatname/genel/l/libndp/talimat create mode 100644 talimatname/genel/l/libnet/talimat create mode 100644 talimatname/genel/l/libnetfilter_acct/talimat create mode 100644 talimatname/genel/l/libnetfilter_conntrack/talimat create mode 100644 talimatname/genel/l/libnetfilter_log/talimat create mode 100644 talimatname/genel/l/libnfnetlink/sync_with_kernel_headers.patch create mode 100644 talimatname/genel/l/libnfnetlink/talimat create mode 100644 talimatname/genel/l/libnfs-python/talimat create mode 100644 talimatname/genel/l/libnfs/talimat create mode 100644 talimatname/genel/l/libnftnl/talimat create mode 100644 talimatname/genel/l/libnice/talimat create mode 100644 talimatname/genel/l/libnih/talimat create mode 100644 talimatname/genel/l/libnl/talimat create mode 100644 talimatname/genel/l/libnotify/talimat create mode 100644 talimatname/genel/l/libntru/talimat create mode 100644 talimatname/genel/l/liboauth/talimat create mode 100644 talimatname/genel/l/libodfgen/talimat create mode 100644 talimatname/genel/l/libofa/libofa-0.9.3-curl-7.21.patch create mode 100644 talimatname/genel/l/libofa/libofa-0.9.3-gcc-4.7.patch create mode 100644 talimatname/genel/l/libofa/libofa-gcc4.3.patch create mode 100644 talimatname/genel/l/libofa/libofa-gcc4.5.patch create mode 100644 talimatname/genel/l/libofa/libofa-gcc4.patch create mode 100644 talimatname/genel/l/libofa/talimat create mode 100644 talimatname/genel/l/libogg/talimat create mode 100644 talimatname/genel/l/liboobs/talimat create mode 100644 talimatname/genel/l/libopenraw/talimat create mode 100644 talimatname/genel/l/liborcus/talimat create mode 100644 talimatname/genel/l/libosinfo/talimat create mode 100644 talimatname/genel/l/libotr/talimat create mode 100644 talimatname/genel/l/libpagemaker/talimat create mode 100644 talimatname/genel/l/libpaper/run-parts create mode 100644 talimatname/genel/l/libpaper/talimat create mode 100644 talimatname/genel/l/libpcap/libpcap.kur-kos create mode 100644 talimatname/genel/l/libpcap/talimat create mode 100755 talimatname/genel/l/libpeas/libpeas.kur-kos create mode 100644 talimatname/genel/l/libpeas/talimat create mode 100644 talimatname/genel/l/libpgf/talimat create mode 100644 talimatname/genel/l/libpgm/talimat create mode 100644 talimatname/genel/l/libpng/talimat create mode 100644 talimatname/genel/l/libpng12/talimat create mode 100644 talimatname/genel/l/libproxy/talimat create mode 100644 talimatname/genel/l/libpst/talimat create mode 100644 talimatname/genel/l/libpwquality/talimat create mode 100644 talimatname/genel/l/libqmi/talimat create mode 100644 talimatname/genel/l/libqtxdg/talimat create mode 100644 talimatname/genel/l/libquvi-scripts/talimat create mode 100644 talimatname/genel/l/libquvi/talimat create mode 100644 talimatname/genel/l/librangetree/talimat create mode 100644 talimatname/genel/l/libraw/talimat create mode 100644 talimatname/genel/l/libre/talimat create mode 100644 talimatname/genel/l/librecad/talimat create mode 100644 talimatname/genel/l/librem/talimat create mode 100644 talimatname/genel/l/libreoffice-bin/libreoffice-bin.kur-kos create mode 100644 talimatname/genel/l/libreoffice-bin/talimat create mode 100644 talimatname/genel/l/libreoffice/libreoffice.kur-kos create mode 100644 talimatname/genel/l/libreoffice/talimat create mode 100644 talimatname/genel/l/librep/talimat create mode 100644 talimatname/genel/l/librest/talimat create mode 100644 talimatname/genel/l/librevenge/talimat create mode 100644 talimatname/genel/l/libringclient/talimat create mode 100644 talimatname/genel/l/librsvg/librsvg.kur-kos create mode 100644 talimatname/genel/l/librsvg/talimat create mode 100644 talimatname/genel/l/libsamplerate/talimat create mode 100644 talimatname/genel/l/libseccomp/talimat create mode 100644 talimatname/genel/l/libsecp256k1/talimat create mode 100644 talimatname/genel/l/libsecret/talimat create mode 100644 talimatname/genel/l/libselinux/libselinux.tmpfiles.d create mode 100644 talimatname/genel/l/libselinux/talimat create mode 100644 talimatname/genel/l/libsepol/talimat create mode 100644 talimatname/genel/l/libsexy/talimat create mode 100644 talimatname/genel/l/libsexymm/talimat create mode 100644 talimatname/genel/l/libshout/talimat create mode 100644 talimatname/genel/l/libsigc++/talimat create mode 100644 talimatname/genel/l/libsignon-glib/talimat create mode 100644 talimatname/genel/l/libsigsegv/talimat create mode 100644 talimatname/genel/l/libsndfile/talimat create mode 100644 talimatname/genel/l/libsodium/talimat create mode 100644 talimatname/genel/l/libsoundio/talimat create mode 100644 talimatname/genel/l/libsoup-22/talimat create mode 100644 talimatname/genel/l/libsoup-22/update.patch create mode 100644 talimatname/genel/l/libsoup/talimat create mode 100644 talimatname/genel/l/libspectre/libspectre-0.2.7-ghostscript-9.18-1.patch create mode 100644 talimatname/genel/l/libspectre/talimat create mode 100644 talimatname/genel/l/libspiro/talimat create mode 100644 talimatname/genel/l/libspotify/talimat create mode 100644 talimatname/genel/l/libspoton/talimat create mode 100644 talimatname/genel/l/libsrtp/talimat create mode 100644 talimatname/genel/l/libssh/talimat create mode 100644 talimatname/genel/l/libssh2/talimat create mode 100644 talimatname/genel/l/libstatgrab/talimat create mode 100644 talimatname/genel/l/libstroke/libgstroke-Makefile.am.patch create mode 100644 talimatname/genel/l/libstroke/libstroke-0.5.1-m4_syntax.patch create mode 100644 talimatname/genel/l/libstroke/libstroke-0.5.1-no_gtk1.patch create mode 100644 talimatname/genel/l/libstroke/libstroke-Makefile.am.patch create mode 100644 talimatname/genel/l/libstroke/talimat create mode 100644 talimatname/genel/l/libsysstat/talimat create mode 100644 talimatname/genel/l/libt3config/talimat create mode 100644 talimatname/genel/l/libt3highlight/talimat create mode 100644 talimatname/genel/l/libt3key/talimat create mode 100644 talimatname/genel/l/libt3widget/talimat create mode 100644 talimatname/genel/l/libt3window/talimat create mode 100644 talimatname/genel/l/libtasn1/talimat create mode 100644 talimatname/genel/l/libthai/talimat create mode 100644 talimatname/genel/l/libtheora/talimat create mode 100644 talimatname/genel/l/libtiff/talimat create mode 100644 talimatname/genel/l/libtimezonemap/talimat create mode 100644 talimatname/genel/l/libtins/talimat create mode 100644 talimatname/genel/l/libtirpc/talimat create mode 100644 talimatname/genel/l/libtommath/talimat create mode 100644 talimatname/genel/l/libtorrent-rasterbar/libtorrent-boost-1.65.patch create mode 100644 talimatname/genel/l/libtorrent-rasterbar/talimat create mode 100644 talimatname/genel/l/libtorrent/talimat create mode 100644 talimatname/genel/l/libtranscript/talimat create mode 100644 talimatname/genel/l/libuecc/talimat create mode 100644 talimatname/genel/l/libunique/talimat create mode 100644 talimatname/genel/l/libunique1/talimat create mode 100644 talimatname/genel/l/libunique3/talimat create mode 100644 talimatname/genel/l/libunistring/talimat create mode 100644 talimatname/genel/l/libunwind/talimat create mode 100644 talimatname/genel/l/libupnp/talimat create mode 100644 talimatname/genel/l/liburcu/talimat create mode 100644 talimatname/genel/l/libusb-compat/talimat create mode 100644 talimatname/genel/l/libusb/talimat create mode 100644 talimatname/genel/l/libutempter/talimat create mode 100644 talimatname/genel/l/libuv/talimat create mode 100644 talimatname/genel/l/libva/talimat create mode 100644 talimatname/genel/l/libvdpau-va-gl/talimat create mode 100644 talimatname/genel/l/libvdpau/talimat create mode 100644 talimatname/genel/l/libvisio/talimat create mode 100644 talimatname/genel/l/libvlc/lua53_compat.patch create mode 100644 talimatname/genel/l/libvlc/talimat create mode 100644 talimatname/genel/l/libvncserver/talimat create mode 100644 talimatname/genel/l/libvorbis/talimat create mode 100644 talimatname/genel/l/libvpx/talimat create mode 100644 talimatname/genel/l/libwacom/talimat create mode 100644 talimatname/genel/l/libwebp/talimat create mode 100644 talimatname/genel/l/libwebsockets/talimat create mode 100644 talimatname/genel/l/libwlocate/talimat create mode 100644 talimatname/genel/l/libwmf/libwmf.0.2.8.4-libpng-1.5.patch create mode 100644 talimatname/genel/l/libwmf/libwmf.0.2.8.4-useafterfree.patch create mode 100644 talimatname/genel/l/libwmf/libwmf.kur-kos create mode 100644 talimatname/genel/l/libwmf/talimat create mode 100644 talimatname/genel/l/libwnck/talimat create mode 100644 talimatname/genel/l/libwnck3/talimat create mode 100644 talimatname/genel/l/libwpd/talimat create mode 100644 talimatname/genel/l/libwpg/talimat create mode 100644 talimatname/genel/l/libwps/talimat create mode 100644 talimatname/genel/l/libxcb/libxcb-1.1-no-pthread-stubs.patch create mode 100644 talimatname/genel/l/libxcb/python-35x-fixes.patch create mode 100644 talimatname/genel/l/libxcb/talimat create mode 100644 talimatname/genel/l/libxdg-basedir/talimat create mode 100644 talimatname/genel/l/libxfcegui4/libxfcegui4-4.10.0-no-xfce_setenv.patch create mode 100644 talimatname/genel/l/libxfcegui4/talimat create mode 100644 talimatname/genel/l/libxkbcommon/talimat create mode 100644 talimatname/genel/l/libxml++26/talimat create mode 100644 talimatname/genel/l/libxml2/talimat create mode 100644 talimatname/genel/l/libxslt/talimat create mode 100644 talimatname/genel/l/libyubikey/libyubikey.70-yubikey.rules create mode 100644 talimatname/genel/l/libyubikey/talimat create mode 100644 talimatname/genel/l/libzeitgeist/talimat create mode 100644 talimatname/genel/l/libzen/talimat create mode 100644 talimatname/genel/l/libzip/talimat create mode 100644 talimatname/genel/l/libzmf/talimat create mode 100644 talimatname/genel/l/lightdm-gtk-greeter-settings/lightdm-gtk-greeter-settings-tr.po create mode 100644 talimatname/genel/l/lightdm-gtk-greeter-settings/talimat create mode 100644 talimatname/genel/l/lightdm-gtk-greeter/cinnamon_badge_symbolic.svg create mode 100644 talimatname/genel/l/lightdm-gtk-greeter/talimat create mode 100644 talimatname/genel/l/lightdm/Xsession create mode 100644 talimatname/genel/l/lightdm/lightdm.kur-kos create mode 100644 talimatname/genel/l/lightdm/talimat create mode 100644 talimatname/genel/l/lighttpd/lighttpd.conf create mode 100644 talimatname/genel/l/lighttpd/talimat create mode 100644 talimatname/genel/l/lila-hd-icon-theme/lila-hd-icon-theme.kur-kos create mode 100644 talimatname/genel/l/lila-hd-icon-theme/talimat create mode 100644 talimatname/genel/l/links/talimat create mode 100644 talimatname/genel/l/linux-firmware/microcode_amd_fam17h.bin.xz create mode 100644 talimatname/genel/l/linux-firmware/talimat create mode 100644 talimatname/genel/l/lirc/lirc.logrotate create mode 100644 talimatname/genel/l/lirc/lirc.tmpfiles create mode 100644 talimatname/genel/l/lirc/talimat create mode 100644 talimatname/genel/l/live/talimat create mode 100644 talimatname/genel/l/lld/0003-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch create mode 100644 talimatname/genel/l/lld/talimat create mode 100644 talimatname/genel/l/llvm/llvm-config.h create mode 100644 talimatname/genel/l/llvm/talimat create mode 100644 talimatname/genel/l/lm-sensors/talimat create mode 100644 talimatname/genel/l/lmdb/talimat create mode 100644 talimatname/genel/l/lockfile/talimat create mode 100644 talimatname/genel/l/logmein-hamachi/hamachi.servis create mode 100644 talimatname/genel/l/logmein-hamachi/talimat create mode 100644 talimatname/genel/l/logrotate/logrotate.conf create mode 100644 talimatname/genel/l/logrotate/logrotate.okubeni create mode 100644 talimatname/genel/l/logrotate/talimat create mode 100644 talimatname/genel/l/lpsolve/cflags.patch create mode 100644 talimatname/genel/l/lpsolve/lpsolve-5.5.2.0.defines.patch create mode 100644 talimatname/genel/l/lpsolve/talimat create mode 100644 talimatname/genel/l/lsb-release/lsbrelease create mode 100644 talimatname/genel/l/lsb-release/milis-release create mode 100644 talimatname/genel/l/lsb-release/system-release create mode 100755 talimatname/genel/l/lsb-release/talimat create mode 100644 talimatname/genel/l/lshw/lshw-gtk.desktop create mode 100644 talimatname/genel/l/lshw/lshw-gtk.xpm create mode 100644 talimatname/genel/l/lshw/talimat create mode 100644 talimatname/genel/l/lsof/talimat create mode 100644 talimatname/genel/l/lua-alt-getopt/talimat create mode 100644 talimatname/genel/l/lua-filesystem/talimat create mode 100644 talimatname/genel/l/lua-lgi/talimat create mode 100644 talimatname/genel/l/lua/LICENSE create mode 100644 talimatname/genel/l/lua/liblua.so.patch create mode 100644 talimatname/genel/l/lua/lua.pc create mode 100644 talimatname/genel/l/lua/talimat create mode 100644 talimatname/genel/l/lua51/talimat create mode 100644 talimatname/genel/l/lua52/lua-5.2-cflags.diff create mode 100644 talimatname/genel/l/lua52/lua.diff create mode 100644 talimatname/genel/l/lua52/lua.pc create mode 100644 talimatname/genel/l/lua52/talimat create mode 100644 talimatname/genel/l/luajit/talimat create mode 100644 talimatname/genel/l/luarocks-51/talimat create mode 100644 talimatname/genel/l/luarocks-52/talimat create mode 100644 talimatname/genel/l/luarocks-53/talimat create mode 100644 talimatname/genel/l/lucenepp/talimat create mode 100644 talimatname/genel/l/lumina-desktop/talimat create mode 100644 talimatname/genel/l/lxc/lxc.tmpfiles.d create mode 100644 talimatname/genel/l/lxc/talimat create mode 100755 talimatname/genel/l/lxde-appearance-obconf/talimat create mode 100755 talimatname/genel/l/lxde-appearance/talimat create mode 100644 talimatname/genel/l/lxde-common/chrystal_red_root.png create mode 100644 talimatname/genel/l/lxde-common/lxde-common.kur-kos create mode 100755 talimatname/genel/l/lxde-common/lxde.desktop create mode 100644 talimatname/genel/l/lxde-common/okubeni create mode 100755 talimatname/genel/l/lxde-common/talimat create mode 100755 talimatname/genel/l/lxde-gpicview/talimat create mode 100644 talimatname/genel/l/lxde-icon-theme/lxde-icon-theme.kur-kos create mode 100644 talimatname/genel/l/lxde-icon-theme/talimat create mode 100755 talimatname/genel/l/lxde-input/talimat create mode 100644 talimatname/genel/l/lxde-menu-data/talimat create mode 100644 talimatname/genel/l/lxde-panel/fix-crash.patch create mode 100755 talimatname/genel/l/lxde-panel/talimat create mode 100755 talimatname/genel/l/lxde-randr/talimat create mode 100755 talimatname/genel/l/lxde-session/talimat create mode 100755 talimatname/genel/l/lxde-task/talimat create mode 100755 talimatname/genel/l/lxde-terminal/lxde-terminal.kur-kos create mode 100755 talimatname/genel/l/lxde-terminal/talimat create mode 100644 talimatname/genel/l/lxdm-tema/talimat create mode 100755 talimatname/genel/l/lxdm/Xsession create mode 100644 talimatname/genel/l/lxdm/lxdm.conf.in.patch create mode 100644 talimatname/genel/l/lxdm/lxdm.in.patch create mode 100644 talimatname/genel/l/lxdm/lxdm.kur-kos create mode 100644 talimatname/genel/l/lxdm/lxdm.pam create mode 100644 talimatname/genel/l/lxdm/talimat create mode 100644 talimatname/genel/l/lximage-qt/talimat create mode 100644 talimatname/genel/l/lxqt-about/talimat create mode 100644 talimatname/genel/l/lxqt-admin/talimat create mode 100644 talimatname/genel/l/lxqt-build-tools/talimat create mode 100644 talimatname/genel/l/lxqt-common/talimat create mode 100644 talimatname/genel/l/lxqt-config/talimat create mode 100644 talimatname/genel/l/lxqt-globalkeys/talimat create mode 100644 talimatname/genel/l/lxqt-l10n/talimat create mode 100644 talimatname/genel/l/lxqt-notificationd/talimat create mode 100644 talimatname/genel/l/lxqt-openssh-askpass/talimat create mode 100644 talimatname/genel/l/lxqt-panel/talimat create mode 100644 talimatname/genel/l/lxqt-policykit/talimat create mode 100644 talimatname/genel/l/lxqt-powermanagement/talimat create mode 100644 talimatname/genel/l/lxqt-qtermwidget/talimat create mode 100644 talimatname/genel/l/lxqt-qtplugin/lxqt-qtplugin.kur-kos create mode 100644 talimatname/genel/l/lxqt-qtplugin/talimat create mode 100644 talimatname/genel/l/lxqt-runner/talimat create mode 100644 talimatname/genel/l/lxqt-session/talimat create mode 100644 talimatname/genel/l/lxqt-sudo/talimat create mode 100644 talimatname/genel/l/lxqt/lxqt.sira create mode 100644 talimatname/genel/l/lxqt/talimat create mode 100644 talimatname/genel/l/lynx/talimat create mode 100644 talimatname/genel/l/lziprecover/talimat create mode 100644 talimatname/genel/l/lzop/talimat create mode 100644 talimatname/genel/m/maclookup/talimat create mode 100644 talimatname/genel/m/macos-simge-tema/talimat create mode 100644 talimatname/genel/m/mailcommon/talimat create mode 100644 talimatname/genel/m/mailimporter/talimat create mode 100644 talimatname/genel/m/mailx/talimat create mode 100644 talimatname/genel/m/maim/talimat create mode 100644 talimatname/genel/m/makemkv/makemkv.1 create mode 100644 talimatname/genel/m/makemkv/makemkv.kur-kos create mode 100644 talimatname/genel/m/makemkv/makemkvcon.1 create mode 100644 talimatname/genel/m/makemkv/mmdtsdec.1 create mode 100644 talimatname/genel/m/makemkv/talimat create mode 100644 talimatname/genel/m/maltego/talimat create mode 100644 talimatname/genel/m/manokwari/talimat create mode 100644 talimatname/genel/m/marble/talimat create mode 100755 talimatname/genel/m/marco/marco.kur-kos create mode 100644 talimatname/genel/m/marco/talimat create mode 100644 talimatname/genel/m/mariadb/mariadb.kur-kos create mode 100644 talimatname/genel/m/mariadb/mariadb.okubeni create mode 100644 talimatname/genel/m/mariadb/talimat create mode 100644 talimatname/genel/m/masscan/talimat create mode 100755 talimatname/genel/m/mate-applets/mate-applets.kur-kos create mode 100644 talimatname/genel/m/mate-applets/talimat create mode 100644 talimatname/genel/m/mate-backgrounds/talimat create mode 100755 talimatname/genel/m/mate-calc/mate-calc.kur-kos create mode 100644 talimatname/genel/m/mate-calc/talimat create mode 100644 talimatname/genel/m/mate-common/talimat create mode 100755 talimatname/genel/m/mate-control-center/mate-control-center.kur-kos create mode 100644 talimatname/genel/m/mate-control-center/talimat create mode 100755 talimatname/genel/m/mate-desktop/mate-desktop.kur-kos create mode 100644 talimatname/genel/m/mate-desktop/talimat create mode 100755 talimatname/genel/m/mate-icon-theme-faenza/mate-icon-theme-faenza.kur-kos create mode 100644 talimatname/genel/m/mate-icon-theme-faenza/talimat create mode 100755 talimatname/genel/m/mate-icon-theme/mate-icon-theme.kur-kos create mode 100644 talimatname/genel/m/mate-icon-theme/talimat create mode 100755 talimatname/genel/m/mate-indicator-applet/mate-indicator-applet.kur-kos create mode 100644 talimatname/genel/m/mate-indicator-applet/talimat create mode 100755 talimatname/genel/m/mate-media/mate-media.kur-kos create mode 100644 talimatname/genel/m/mate-media/talimat create mode 100644 talimatname/genel/m/mate-menus/talimat create mode 100644 talimatname/genel/m/mate-netbook/mate-netbook.kur-kos create mode 100644 talimatname/genel/m/mate-netbook/talimat create mode 100755 talimatname/genel/m/mate-notification-daemon/mate-notification-daemon.kur-kos create mode 100644 talimatname/genel/m/mate-notification-daemon/talimat create mode 100755 talimatname/genel/m/mate-panel/mate-panel.kur-kos create mode 100644 talimatname/genel/m/mate-panel/talimat create mode 100644 talimatname/genel/m/mate-polkit/talimat create mode 100755 talimatname/genel/m/mate-power-manager/mate-power-manager.kur-kos create mode 100644 talimatname/genel/m/mate-power-manager/talimat create mode 100644 talimatname/genel/m/mate-screensaver-hacks/LICENSE create mode 100644 talimatname/genel/m/mate-screensaver-hacks/migrate-xscreensaver-config.sh create mode 100644 talimatname/genel/m/mate-screensaver-hacks/talimat create mode 100644 talimatname/genel/m/mate-screensaver-hacks/xscreensaver-config.xsl create mode 100755 talimatname/genel/m/mate-screensaver/mate-screensaver.kur-kos create mode 100644 talimatname/genel/m/mate-screensaver/talimat create mode 100755 talimatname/genel/m/mate-sensors-applet/mate-sensors-applet.kur-kos create mode 100644 talimatname/genel/m/mate-sensors-applet/talimat create mode 100755 talimatname/genel/m/mate-session-manager/mate-session-manager.kur-kos create mode 100644 talimatname/genel/m/mate-session-manager/talimat create mode 100755 talimatname/genel/m/mate-settings-daemon/mate-settings-daemon.kur-kos create mode 100644 talimatname/genel/m/mate-settings-daemon/talimat create mode 100755 talimatname/genel/m/mate-system-monitor/mate-system-monitor.kur-kos create mode 100644 talimatname/genel/m/mate-system-monitor/talimat create mode 100755 talimatname/genel/m/mate-terminal/mate-terminal.kur-kos create mode 100644 talimatname/genel/m/mate-terminal/talimat create mode 100644 talimatname/genel/m/mate-themes/mate-themes.kur-kos create mode 100644 talimatname/genel/m/mate-themes/talimat create mode 100644 talimatname/genel/m/mate-user-guide/talimat create mode 100644 talimatname/genel/m/mate-user-share/mate-user-share.kur-kos create mode 100644 talimatname/genel/m/mate-user-share/talimat create mode 100755 talimatname/genel/m/mate-utils/mate-utils.kur-kos create mode 100644 talimatname/genel/m/mate-utils/talimat create mode 100644 talimatname/genel/m/mate/talimat create mode 100644 talimatname/genel/m/maven/maven.sh create mode 100644 talimatname/genel/m/maven/talimat create mode 100644 talimatname/genel/m/mbedtls/talimat create mode 100644 talimatname/genel/m/mc/talimat create mode 100644 talimatname/genel/m/mdadm/talimat create mode 100644 talimatname/genel/m/mdds/talimat create mode 100644 talimatname/genel/m/mdm/defaults.conf create mode 100644 talimatname/genel/m/mdm/mdm-autologin.pam create mode 100644 talimatname/genel/m/mdm/mdm.kur-kos create mode 100644 talimatname/genel/m/mdm/mdm.pam create mode 100644 talimatname/genel/m/mdm/mdm.sil-kos create mode 100644 talimatname/genel/m/mdm/org.cinnamon.pkexec.mdmsetup.policy create mode 100644 talimatname/genel/m/mdm/resim-1.jpg create mode 100644 talimatname/genel/m/mdm/talimat create mode 100644 talimatname/genel/m/media-player-info/talimat create mode 100644 talimatname/genel/m/mediainfo/talimat create mode 100644 talimatname/genel/m/meld/meld.kur-kos create mode 100644 talimatname/genel/m/meld/talimat create mode 100644 talimatname/genel/m/menu-cache/talimat create mode 100644 talimatname/genel/m/menulibre/talimat create mode 100644 talimatname/genel/m/mercurial/mercurial.profile create mode 100644 talimatname/genel/m/mercurial/talimat create mode 100644 talimatname/genel/m/meson/milis-meson create mode 100644 talimatname/genel/m/meson/talimat create mode 100644 talimatname/genel/m/messagelib/talimat create mode 100644 talimatname/genel/m/metasploit/talimat create mode 100644 talimatname/genel/m/mhash/talimat create mode 100644 talimatname/genel/m/miam-player/talimat create mode 100644 talimatname/genel/m/midori/midori.kur-kos create mode 100644 talimatname/genel/m/midori/talimat create mode 100644 talimatname/genel/m/mikrolock/mikrolock_tr_TR.ts create mode 100644 talimatname/genel/m/mikrolock/talimat create mode 100644 talimatname/genel/m/milis-yukleyici/talimat create mode 100644 talimatname/genel/m/milis-yukleyici/yukleyici.desktop create mode 100755 talimatname/genel/m/milislinux-saat/kk_milislinux-saat create mode 100644 talimatname/genel/m/milislinux-saat/milislinux-saat.desktop create mode 100644 talimatname/genel/m/milislinux-saat/milislinux-saat.xpm create mode 100644 talimatname/genel/m/milislinux-saat/talimat create mode 100644 talimatname/genel/m/minidlna/minidlna create mode 100644 talimatname/genel/m/minidlna/talimat create mode 100644 talimatname/genel/m/mininet/talimat create mode 100644 talimatname/genel/m/miniupnpc/talimat create mode 100644 talimatname/genel/m/minizip/talimat create mode 100644 talimatname/genel/m/mixxx/talimat create mode 100644 talimatname/genel/m/mlocate/mlocate.kur-kos create mode 100644 talimatname/genel/m/mlocate/talimat create mode 100644 talimatname/genel/m/mlocate/updatedb.conf create mode 100644 talimatname/genel/m/mlt/talimat create mode 100644 talimatname/genel/m/mlton/talimat create mode 100644 talimatname/genel/m/mobile-broadband-provider-info/talimat create mode 100644 talimatname/genel/m/moc/talimat create mode 100644 talimatname/genel/m/mod-dnssd/fix_undefined_reference.patch create mode 100644 talimatname/genel/m/mod-dnssd/talimat create mode 100644 talimatname/genel/m/modemmanager/talimat create mode 100644 talimatname/genel/m/moka-icon-theme/moka-icon-theme.kur-kos create mode 100644 talimatname/genel/m/moka-icon-theme/talimat create mode 100644 talimatname/genel/m/mono-addins/talimat create mode 100644 talimatname/genel/m/mono/mono.binfmt.d create mode 100644 talimatname/genel/m/mono/mono.kur-kos create mode 100644 talimatname/genel/m/mono/talimat create mode 100644 talimatname/genel/m/moreutils/talimat create mode 100644 talimatname/genel/m/mosh/talimat create mode 100644 talimatname/genel/m/mosquitto-php/talimat create mode 100644 talimatname/genel/m/mosquitto/talimat create mode 100644 talimatname/genel/m/mousepad/mousepad.kur-kos create mode 100644 talimatname/genel/m/mousepad/talimat create mode 100644 talimatname/genel/m/movit/talimat create mode 100755 talimatname/genel/m/mozo/mozo.kur-kos create mode 100644 talimatname/genel/m/mozo/talimat create mode 100644 talimatname/genel/m/mpd/servis create mode 100644 talimatname/genel/m/mpd/talimat create mode 100644 talimatname/genel/m/mpg123/talimat create mode 100644 talimatname/genel/m/mplayer/mplayer.conf create mode 100644 talimatname/genel/m/mplayer/mplayer.kur-kos create mode 100644 talimatname/genel/m/mplayer/talimat create mode 100644 talimatname/genel/m/mpsweb/talimat create mode 100644 talimatname/genel/m/mpv/talimat create mode 100644 talimatname/genel/m/mruby/talimat create mode 100644 talimatname/genel/m/msgpack-c/talimat create mode 100644 talimatname/genel/m/mtdev/talimat create mode 100644 talimatname/genel/m/mtools/talimat create mode 100644 talimatname/genel/m/mtr/talimat create mode 100644 talimatname/genel/m/muffin/talimat create mode 100644 talimatname/genel/m/mugshot-milis/talimat create mode 100644 talimatname/genel/m/mugshot/missing_default_face.patch create mode 100644 talimatname/genel/m/mugshot/office-phone.patch create mode 100644 talimatname/genel/m/mugshot/talimat create mode 100644 talimatname/genel/m/multibootusb/multibootusb.desktop create mode 100644 talimatname/genel/m/multibootusb/talimat create mode 100644 talimatname/genel/m/mumble-client/talimat create mode 100644 talimatname/genel/m/mumble/talimat create mode 100644 talimatname/genel/m/muparser/talimat create mode 100644 talimatname/genel/m/mupdf/talimat create mode 100644 talimatname/genel/m/murrine/talimat create mode 100644 talimatname/genel/m/musl/talimat create mode 100644 talimatname/genel/m/mutagen/talimat create mode 100644 talimatname/genel/m/mutt/mutt.kos-kur create mode 100644 talimatname/genel/m/mutt/talimat create mode 100644 talimatname/genel/m/mutter/mutter.kur-kos create mode 100644 talimatname/genel/m/mutter/talimat create mode 100644 talimatname/genel/m/mygpoclient/talimat create mode 100644 talimatname/genel/m/mygui/talimat create mode 100644 talimatname/genel/m/mypaint-brushes/talimat create mode 100644 talimatname/genel/m/mypaint/talimat create mode 100644 talimatname/genel/m/myrddin/talimat create mode 100644 talimatname/genel/m/mythes/talimat create mode 100644 talimatname/genel/n/nana/talimat create mode 100644 talimatname/genel/n/nautilus/nautilus.kur-kos create mode 100644 talimatname/genel/n/nautilus/talimat create mode 100644 talimatname/genel/n/nbd/allow create mode 100644 talimatname/genel/n/nbd/nbd-server create mode 100644 talimatname/genel/n/nbd/talimat create mode 100644 talimatname/genel/n/ncftp/talimat create mode 100644 talimatname/genel/n/nemo/nemo.kur-kos create mode 100644 talimatname/genel/n/nemo/org.nemo.root.policy create mode 100644 talimatname/genel/n/nemo/talimat create mode 100644 talimatname/genel/n/neofetch/linux create mode 100644 talimatname/genel/n/neofetch/talimat create mode 100644 talimatname/genel/n/neomutt/talimat create mode 100644 talimatname/genel/n/neon/talimat create mode 100644 talimatname/genel/n/net-snmp/talimat create mode 100644 talimatname/genel/n/net-tools/net-tools-CVS_20101030-remove_dups-1.patch create mode 100644 talimatname/genel/n/net-tools/talimat create mode 100644 talimatname/genel/n/netbeans/netbeans.conf create mode 100644 talimatname/genel/n/netbeans/netbeans.desktop create mode 100755 talimatname/genel/n/netbeans/netbeans.sh create mode 100644 talimatname/genel/n/netbeans/talimat create mode 100644 talimatname/genel/n/netcat/talimat create mode 100644 talimatname/genel/n/netdata/netdata.kur-kos create mode 100644 talimatname/genel/n/netdata/talimat create mode 100644 talimatname/genel/n/netdiscover/talimat create mode 100644 talimatname/genel/n/nethogs-qt/nethogs-qt.desktop create mode 100644 talimatname/genel/n/nethogs-qt/talimat create mode 100644 talimatname/genel/n/nethogs/talimat create mode 100644 talimatname/genel/n/netpbm/netpbm-noppmtompeg.patch create mode 100644 talimatname/genel/n/netpbm/talimat create mode 100644 talimatname/genel/n/netsniff-ng/talimat create mode 100644 talimatname/genel/n/nettle/talimat create mode 100644 talimatname/genel/n/nettle/talimat.E create mode 100644 talimatname/genel/n/network-manager-applet/network-manager-applet.kur-kos create mode 100644 talimatname/genel/n/network-manager-applet/talimat create mode 100644 talimatname/genel/n/networkmanager/networkmanager.kos-sil create mode 100644 talimatname/genel/n/networkmanager/talimat create mode 100644 talimatname/genel/n/neverball/neverball.po create mode 100644 talimatname/genel/n/neverball/talimat create mode 100644 talimatname/genel/n/newt/talimat create mode 100644 talimatname/genel/n/nfs-utils/nfs-utils.kos-kur create mode 100644 talimatname/genel/n/nfs-utils/nfs-utils.kur-kos create mode 100644 talimatname/genel/n/nfs-utils/talimat create mode 100644 talimatname/genel/n/nftables/talimat create mode 100644 talimatname/genel/n/nginx-mod-nchan/talimat create mode 100644 talimatname/genel/n/nginx/nginx.kos-kur create mode 100644 talimatname/genel/n/nginx/nginx.logrotate create mode 100644 talimatname/genel/n/nginx/nginx.servis create mode 100644 talimatname/genel/n/nginx/talimat create mode 100644 talimatname/genel/n/nicotine-plus/talimat create mode 100644 talimatname/genel/n/nikto/talimat create mode 100644 talimatname/genel/n/nim/talimat create mode 100644 talimatname/genel/n/nimble/talimat create mode 100644 talimatname/genel/n/ninja/talimat create mode 100644 talimatname/genel/n/ninvaders/talimat create mode 100644 talimatname/genel/n/nitroshare/talimat create mode 100644 talimatname/genel/n/nlohmann-json/talimat create mode 100644 talimatname/genel/n/nmap/talimat create mode 100644 talimatname/genel/n/nnn/talimat create mode 100644 talimatname/genel/n/node/node.npm.sh create mode 100644 talimatname/genel/n/node/talimat create mode 100644 talimatname/genel/n/nodm/nodm.conf create mode 100644 talimatname/genel/n/nodm/talimat create mode 100644 talimatname/genel/n/nomacs/talimat create mode 100644 talimatname/genel/n/notepadqq/talimat create mode 100644 talimatname/genel/n/notification-daemon/talimat create mode 100644 talimatname/genel/n/noto-fonts/talimat create mode 100644 talimatname/genel/n/npapi-sdk/talimat create mode 100644 talimatname/genel/n/npth/talimat create mode 100644 talimatname/genel/n/nspr/talimat create mode 100644 talimatname/genel/n/nss-mdns/talimat create mode 100644 talimatname/genel/n/nss/nss-config.in create mode 100644 talimatname/genel/n/nss/nss-softokn.pc.in create mode 100644 talimatname/genel/n/nss/nss-util.pc.in create mode 100644 talimatname/genel/n/nss/nss.pc.in create mode 100644 talimatname/genel/n/nss/talimat create mode 100644 talimatname/genel/n/ntfs-3g/ntfs-3g.okubeni create mode 100644 talimatname/genel/n/ntfs-3g/talimat create mode 100644 talimatname/genel/n/ntp/talimat create mode 100644 talimatname/genel/n/numix-gtk-theme/numix-gtk-theme.kur-kos create mode 100644 talimatname/genel/n/numix-gtk-theme/talimat create mode 100644 talimatname/genel/n/numlockx/talimat create mode 100644 talimatname/genel/n/nvidia/90-nvidia-uvm.rules create mode 100644 talimatname/genel/n/nvidia/nvidia.kur-kos create mode 100644 talimatname/genel/n/nvidia/talimat create mode 100644 talimatname/genel/o/obconf-qt/talimat create mode 100644 talimatname/genel/o/obconf/talimat create mode 100644 talimatname/genel/o/obex-data-server/talimat create mode 100644 talimatname/genel/o/obexd/talimat create mode 100644 talimatname/genel/o/obmenu-generator/talimat create mode 100644 talimatname/genel/o/obmenu/talimat create mode 100644 talimatname/genel/o/obs-studio/obs.desktop create mode 100644 talimatname/genel/o/obs-studio/talimat create mode 100644 talimatname/genel/o/ocaml-batteries/talimat create mode 100644 talimatname/genel/o/ocaml-biniou/talimat create mode 100644 talimatname/genel/o/ocaml-easy-format/talimat create mode 100644 talimatname/genel/o/ocaml-findlib/talimat create mode 100644 talimatname/genel/o/ocaml-lablgl/talimat create mode 100644 talimatname/genel/o/ocaml-lablgtk/talimat create mode 100644 talimatname/genel/o/ocaml-menhir/talimat create mode 100644 talimatname/genel/o/ocaml-ocamlsdl/talimat create mode 100644 talimatname/genel/o/ocaml-pprint/talimat create mode 100644 talimatname/genel/o/ocaml-stdint/talimat create mode 100644 talimatname/genel/o/ocaml-yojson/talimat create mode 100644 talimatname/genel/o/ocaml/talimat create mode 100644 talimatname/genel/o/ocamlbuild/talimat create mode 100644 talimatname/genel/o/ocrfeeder/talimat create mode 100644 talimatname/genel/o/ode/talimat create mode 100644 talimatname/genel/o/ogre/talimat create mode 100644 talimatname/genel/o/ois/gcc47.patch create mode 100644 talimatname/genel/o/ois/talimat create mode 100644 talimatname/genel/o/okular/talimat create mode 100644 talimatname/genel/o/olsrd/talimat create mode 100644 talimatname/genel/o/omnikey_ifdokccid/talimat create mode 100644 talimatname/genel/o/opal/talimat create mode 100644 talimatname/genel/o/opam/talimat create mode 100644 talimatname/genel/o/open-vm-tools-kernel/0001-Fix-vmxnet-module-on-kernels-3.16.patch create mode 100644 talimatname/genel/o/open-vm-tools-kernel/0004-Support-backing-dev-info-kernel-4.0.patch create mode 100644 talimatname/genel/o/open-vm-tools-kernel/0005-Remove-new_sync-for-Linux-4.1.patch create mode 100644 talimatname/genel/o/open-vm-tools-kernel/0006-vmhgfs-support-linux-4.2.x-kernel.patch create mode 100644 talimatname/genel/o/open-vm-tools-kernel/talimat create mode 100644 talimatname/genel/o/open-vm-tools/0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch create mode 100644 talimatname/genel/o/open-vm-tools/README create mode 100644 talimatname/genel/o/open-vm-tools/talimat create mode 100644 talimatname/genel/o/open-vm-tools/tools.conf create mode 100755 talimatname/genel/o/open-vm-tools/vmtools.rc create mode 100644 talimatname/genel/o/openal/talimat create mode 100644 talimatname/genel/o/openboard/openboard.desktop create mode 100644 talimatname/genel/o/openboard/qchar.patch create mode 100644 talimatname/genel/o/openboard/qtmultimediadefs.patch create mode 100644 talimatname/genel/o/openboard/ssl10.patch create mode 100644 talimatname/genel/o/openboard/talimat create mode 100755 talimatname/genel/o/openbox/openbox.kur-kos create mode 100644 talimatname/genel/o/openbox/openbox.xinitrc create mode 100644 talimatname/genel/o/openbox/talimat create mode 100644 talimatname/genel/o/opencolorio/talimat create mode 100644 talimatname/genel/o/openconnect/talimat create mode 100644 talimatname/genel/o/opencore-amr/talimat create mode 100644 talimatname/genel/o/openct/talimat create mode 100644 talimatname/genel/o/openct/udev-sleep.patch create mode 100644 talimatname/genel/o/opencv/talimat create mode 100644 talimatname/genel/o/opendht/talimat create mode 100644 talimatname/genel/o/openexr/talimat create mode 100644 talimatname/genel/o/openh264/talimat create mode 100644 talimatname/genel/o/openimageio/talimat create mode 100644 talimatname/genel/o/openjade/iostream.patch create mode 100644 talimatname/genel/o/openjade/msggen.pl.patch create mode 100644 talimatname/genel/o/openjade/openjade.kur-kos create mode 100644 talimatname/genel/o/openjade/talimat create mode 100644 talimatname/genel/o/openjdk/openjdk.kur-kos create mode 100644 talimatname/genel/o/openjdk/talimat create mode 100644 talimatname/genel/o/openjdk8/talimat create mode 100644 talimatname/genel/o/openjpeg/talimat create mode 100644 talimatname/genel/o/openjpeg2/talimat create mode 100644 talimatname/genel/o/openldap/bdb.yama create mode 100644 talimatname/genel/o/openldap/openldap-config.patch create mode 100644 talimatname/genel/o/openldap/slapd create mode 100644 talimatname/genel/o/openldap/talimat create mode 100644 talimatname/genel/o/openmpi/talimat create mode 100644 talimatname/genel/o/openmw/talimat create mode 100644 talimatname/genel/o/openobex/talimat create mode 100644 talimatname/genel/o/openra/talimat create mode 100644 talimatname/genel/o/opensc-openct/talimat create mode 100644 talimatname/genel/o/opensc/talimat create mode 100644 talimatname/genel/o/openscenegraph/talimat create mode 100644 talimatname/genel/o/opensp/opensp.kur-kos create mode 100644 talimatname/genel/o/opensp/talimat create mode 100644 talimatname/genel/o/opensubdiv/talimat create mode 100644 talimatname/genel/o/openttd-opengfx/talimat create mode 100644 talimatname/genel/o/openttd-opensfx/talimat create mode 100644 talimatname/genel/o/openttd/openttd.kur-kos create mode 100644 talimatname/genel/o/openttd/talimat create mode 100644 talimatname/genel/o/openvpn/openvpnd create mode 100644 talimatname/genel/o/openvpn/talimat create mode 100644 talimatname/genel/o/openvswitch/openvswitch.tmpfiles create mode 100644 talimatname/genel/o/openvswitch/talimat create mode 100644 talimatname/genel/o/opera/default create mode 100644 talimatname/genel/o/opera/opera create mode 100644 talimatname/genel/o/opera/opera.kur-kos create mode 100644 talimatname/genel/o/opera/talimat create mode 100644 talimatname/genel/o/opmsg/talimat create mode 100644 talimatname/genel/o/optipng/talimat create mode 100644 talimatname/genel/o/opus/talimat create mode 100644 talimatname/genel/o/opusfile/talimat create mode 100644 talimatname/genel/o/orage/orage.kur-kos create mode 100644 talimatname/genel/o/orage/talimat create mode 100644 talimatname/genel/o/os-installer/talimat create mode 100644 talimatname/genel/o/os-prober/talimat create mode 100644 talimatname/genel/o/ostree/talimat create mode 100644 talimatname/genel/o/owncloud-cli/talimat create mode 100644 talimatname/genel/o/oxygen-fonts/talimat create mode 100644 talimatname/genel/o/oxygen-gtk2/talimat create mode 100644 talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.kur-kos create mode 100644 talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.okubeni create mode 100644 talimatname/genel/o/oxygen-gtk3/talimat create mode 100644 talimatname/genel/p/p0f/talimat create mode 100644 talimatname/genel/p/p11-kit/libnssckbi-compat.patch create mode 100644 talimatname/genel/p/p11-kit/talimat create mode 100644 talimatname/genel/p/p7zip/CVE-2016-9296.patch create mode 100644 talimatname/genel/p/p7zip/talimat create mode 100644 talimatname/genel/p/pa-applet/pa-applet.desktop create mode 100644 talimatname/genel/p/pa-applet/talimat create mode 100644 talimatname/genel/p/packit/talimat create mode 100644 talimatname/genel/p/pamsshagentauth/talimat create mode 100644 talimatname/genel/p/pango-perl/talimat create mode 100644 talimatname/genel/p/pango/talimat create mode 100644 talimatname/genel/p/pangomm/talimat create mode 100644 talimatname/genel/p/pangox-compat/talimat create mode 100644 talimatname/genel/p/parole/talimat create mode 100644 talimatname/genel/p/partclone/talimat create mode 100644 talimatname/genel/p/parted/talimat create mode 100644 talimatname/genel/p/partitionmanager/talimat create mode 100644 talimatname/genel/p/patchutils/talimat create mode 100644 talimatname/genel/p/pavucontrol-qt/talimat create mode 100644 talimatname/genel/p/pavucontrol/pavucontrol-gtk2.patch create mode 100644 talimatname/genel/p/pavucontrol/talimat create mode 100644 talimatname/genel/p/pax-utils/libcap.pc create mode 100644 talimatname/genel/p/pax-utils/talimat create mode 100644 talimatname/genel/p/pax/talimat create mode 100644 talimatname/genel/p/paxtest/talimat create mode 100644 talimatname/genel/p/pcmanfm-qt/talimat create mode 100755 talimatname/genel/p/pcmanfm/talimat create mode 100644 talimatname/genel/p/pcre/talimat create mode 100644 talimatname/genel/p/pcre2/talimat create mode 100644 talimatname/genel/p/pcsc-lite/talimat create mode 100644 talimatname/genel/p/pcsc-perl/talimat create mode 100644 talimatname/genel/p/pcsc-tools/talimat create mode 100644 talimatname/genel/p/pdfshuffler/pdfshuffler-tr.po create mode 100644 talimatname/genel/p/pdfshuffler/talimat create mode 100644 talimatname/genel/p/peek/talimat create mode 100644 talimatname/genel/p/pencilsheep/pencilsheep.sh create mode 100644 talimatname/genel/p/pencilsheep/talimat create mode 100644 talimatname/genel/p/peony/peony.kur-kos create mode 100644 talimatname/genel/p/peony/talimat create mode 100644 talimatname/genel/p/perl-anyevent/talimat create mode 100644 talimatname/genel/p/perl-archive-zip/talimat create mode 100644 talimatname/genel/p/perl-carp-always/talimat create mode 100644 talimatname/genel/p/perl-carp/talimat create mode 100644 talimatname/genel/p/perl-cgi-carp/talimat create mode 100644 talimatname/genel/p/perl-class-accessor/talimat create mode 100644 talimatname/genel/p/perl-class-inspector/talimat create mode 100644 talimatname/genel/p/perl-convert-asn1/talimat create mode 100644 talimatname/genel/p/perl-crypt-le/talimat create mode 100644 talimatname/genel/p/perl-crypt-openssl-bignum/talimat create mode 100644 talimatname/genel/p/perl-crypt-openssl-random/talimat create mode 100644 talimatname/genel/p/perl-crypt-openssl-rsa/0001-Adapt-to-OpenSSL-1.1.0.patch create mode 100644 talimatname/genel/p/perl-crypt-openssl-rsa/talimat create mode 100644 talimatname/genel/p/perl-crypt-ssleay/talimat create mode 100644 talimatname/genel/p/perl-curses-ui/talimat create mode 100644 talimatname/genel/p/perl-curses/talimat create mode 100644 talimatname/genel/p/perl-data-dump/talimat create mode 100644 talimatname/genel/p/perl-dbi/talimat create mode 100644 talimatname/genel/p/perl-devel-leak/talimat create mode 100644 talimatname/genel/p/perl-devel-symdump/talimat create mode 100644 talimatname/genel/p/perl-digest-hmac/talimat create mode 100644 talimatname/genel/p/perl-digest-nilsimsa/talimat create mode 100644 talimatname/genel/p/perl-digest-sha1/talimat create mode 100644 talimatname/genel/p/perl-encode-locale/talimat create mode 100644 talimatname/genel/p/perl-error/talimat create mode 100644 talimatname/genel/p/perl-extutils-depends/talimat create mode 100644 talimatname/genel/p/perl-extutils-makemaker/talimat create mode 100644 talimatname/genel/p/perl-extutils-pkgconfig/talimat create mode 100644 talimatname/genel/p/perl-file-listing/talimat create mode 100644 talimatname/genel/p/perl-file-sharedir/talimat create mode 100644 talimatname/genel/p/perl-glib/talimat create mode 100644 talimatname/genel/p/perl-html-parser/talimat create mode 100644 talimatname/genel/p/perl-html-tagset/talimat create mode 100644 talimatname/genel/p/perl-http-cookies/talimat create mode 100644 talimatname/genel/p/perl-http-daemon/talimat create mode 100644 talimatname/genel/p/perl-http-date/talimat create mode 100644 talimatname/genel/p/perl-http-message/talimat create mode 100644 talimatname/genel/p/perl-http-negotiate/talimat create mode 100644 talimatname/genel/p/perl-image-exiftool/talimat create mode 100644 talimatname/genel/p/perl-io-socket-inet6/talimat create mode 100644 talimatname/genel/p/perl-io-socket-ssl/talimat create mode 100644 talimatname/genel/p/perl-io-tty/talimat create mode 100644 talimatname/genel/p/perl-ipc-run/talimat create mode 100644 talimatname/genel/p/perl-json-maybexs/talimat create mode 100644 talimatname/genel/p/perl-json/talimat create mode 100644 talimatname/genel/p/perl-libwww/talimat create mode 100644 talimatname/genel/p/perl-linux-desktopfiles/talimat create mode 100644 talimatname/genel/p/perl-locale-gettext/talimat create mode 100644 talimatname/genel/p/perl-log-log4perl/talimat create mode 100644 talimatname/genel/p/perl-lwp-mediatypes/talimat create mode 100644 talimatname/genel/p/perl-lwp-protocol-https/talimat create mode 100644 talimatname/genel/p/perl-mail-dkim/talimat create mode 100644 talimatname/genel/p/perl-mail-spf/talimat create mode 100644 talimatname/genel/p/perl-mailtools/talimat create mode 100644 talimatname/genel/p/perl-module-build/talimat create mode 100644 talimatname/genel/p/perl-mozilla-ca/talimat create mode 100644 talimatname/genel/p/perl-net-dns-resolver-programmable/talimat create mode 100644 talimatname/genel/p/perl-net-dns/talimat create mode 100644 talimatname/genel/p/perl-net-http/talimat create mode 100644 talimatname/genel/p/perl-net-ip/talimat create mode 100644 talimatname/genel/p/perl-net-ssleay/talimat create mode 100644 talimatname/genel/p/perl-netaddr-ip/talimat create mode 100644 talimatname/genel/p/perl-path-class/talimat create mode 100644 talimatname/genel/p/perl-pod-coverage/talimat create mode 100644 talimatname/genel/p/perl-socket6/talimat create mode 100644 talimatname/genel/p/perl-term-readkey/talimat create mode 100644 talimatname/genel/p/perl-test-pod-coverage/talimat create mode 100644 talimatname/genel/p/perl-test-pod/talimat create mode 100644 talimatname/genel/p/perl-time-duration/talimat create mode 100644 talimatname/genel/p/perl-timedate/talimat create mode 100644 talimatname/genel/p/perl-tk/talimat create mode 100644 talimatname/genel/p/perl-try-tiny/talimat create mode 100644 talimatname/genel/p/perl-uri/talimat create mode 100644 talimatname/genel/p/perl-www-robotrules/talimat create mode 100644 talimatname/genel/p/perl-xml-namespacesupport/talimat create mode 100644 talimatname/genel/p/perl-xml-parser/talimat create mode 100644 talimatname/genel/p/perl-xml-sax-base/talimat create mode 100644 talimatname/genel/p/perl-xml-sax/perl-xml-sax.patch create mode 100644 talimatname/genel/p/perl-xml-sax/talimat create mode 100644 talimatname/genel/p/perl-xml-simple/talimat create mode 100644 talimatname/genel/p/perldoc/perldoc.desktop create mode 100644 talimatname/genel/p/perldoc/perldoc.png create mode 100644 talimatname/genel/p/perldoc/talimat create mode 100644 talimatname/genel/p/pgadmin3/pgadmin3-fix-segfault.patch create mode 100644 talimatname/genel/p/pgadmin3/talimat create mode 100644 talimatname/genel/p/phonon-backend-gstreamer-qt5/talimat create mode 100644 talimatname/genel/p/phonon-backend-vlc-qt5/talimat create mode 100644 talimatname/genel/p/phonon-qt4/talimat create mode 100644 talimatname/genel/p/phonon-qt5/talimat create mode 100644 talimatname/genel/p/php-gd/talimat create mode 100644 talimatname/genel/p/php-gettext/talimat create mode 100644 talimatname/genel/p/php-mysql/talimat create mode 100644 talimatname/genel/p/php-xsl/talimat create mode 100644 talimatname/genel/p/php/php.kos-kur create mode 100644 talimatname/genel/p/php/talimat create mode 100644 talimatname/genel/p/php7-apache/apache.conf create mode 100644 talimatname/genel/p/php7-apache/talimat create mode 100644 talimatname/genel/p/php7/php7.kos-kur create mode 100644 talimatname/genel/p/php7/php7.kur-kos create mode 100644 talimatname/genel/p/php7/talimat create mode 100644 talimatname/genel/p/physfs/talimat create mode 100644 talimatname/genel/p/picolisp/talimat create mode 100644 talimatname/genel/p/pidgin/pidgin.kur-kos create mode 100644 talimatname/genel/p/pidgin/talimat create mode 100644 talimatname/genel/p/pimcommon/talimat create mode 100644 talimatname/genel/p/pinentry/talimat create mode 100644 talimatname/genel/p/pingus/missing-header.patch create mode 100644 talimatname/genel/p/pingus/pingus-0.7.6-gcc470-udl.patch create mode 100644 talimatname/genel/p/pingus/pingus.desktop create mode 100644 talimatname/genel/p/pingus/talimat create mode 100644 talimatname/genel/p/pinta/talimat create mode 100644 talimatname/genel/p/pix/talimat create mode 100644 talimatname/genel/p/pjproject-ring/add_dtls_transport.patch create mode 100644 talimatname/genel/p/pjproject-ring/endianness.patch create mode 100644 talimatname/genel/p/pjproject-ring/fix_base64.patch create mode 100644 talimatname/genel/p/pjproject-ring/fix_ioqueue_ipv6_sendto.patch create mode 100644 talimatname/genel/p/pjproject-ring/fix_turn_fallback.patch create mode 100644 talimatname/genel/p/pjproject-ring/gnutls.patch create mode 100644 talimatname/genel/p/pjproject-ring/ice_config.patch create mode 100644 talimatname/genel/p/pjproject-ring/ipv6.patch create mode 100644 talimatname/genel/p/pjproject-ring/multiple_listeners.patch create mode 100644 talimatname/genel/p/pjproject-ring/notestsapps.patch create mode 100644 talimatname/genel/p/pjproject-ring/pj_ice_sess.patch create mode 100644 talimatname/genel/p/pjproject-ring/talimat create mode 100644 talimatname/genel/p/plank/talimat create mode 100644 talimatname/genel/p/plasma-bluedevil/talimat create mode 100644 talimatname/genel/p/plasma-breeze-gtk/talimat create mode 100644 talimatname/genel/p/plasma-breeze/talimat create mode 100644 talimatname/genel/p/plasma-desktop/plasma-desktop.kur-kos create mode 100644 talimatname/genel/p/plasma-desktop/talimat create mode 100644 talimatname/genel/p/plasma-integration/talimat create mode 100644 talimatname/genel/p/plasma-kactivitymanagerd/talimat create mode 100644 talimatname/genel/p/plasma-kde-cli-tools/talimat create mode 100644 talimatname/genel/p/plasma-kde-gtk-config/talimat create mode 100644 talimatname/genel/p/plasma-kdecoration/talimat create mode 100644 talimatname/genel/p/plasma-kdeplasma-addons/plasma-kdeplasma-addons.kur-kos create mode 100644 talimatname/genel/p/plasma-kdeplasma-addons/talimat create mode 100644 talimatname/genel/p/plasma-kgamma5/talimat create mode 100644 talimatname/genel/p/plasma-khotkeys/talimat create mode 100644 talimatname/genel/p/plasma-kinfocenter/talimat create mode 100644 talimatname/genel/p/plasma-kmenuedit/plasma-kmenuedit.kur-kos create mode 100644 talimatname/genel/p/plasma-kmenuedit/talimat create mode 100644 talimatname/genel/p/plasma-kscreen/plasma-kscreen.kur-kos create mode 100644 talimatname/genel/p/plasma-kscreen/talimat create mode 100644 talimatname/genel/p/plasma-kscreenlocker/talimat create mode 100644 talimatname/genel/p/plasma-ksshaskpass/talimat create mode 100644 talimatname/genel/p/plasma-ksysguard/plasma-ksysguard.kur-kos create mode 100644 talimatname/genel/p/plasma-ksysguard/talimat create mode 100644 talimatname/genel/p/plasma-kwallet-pam/talimat create mode 100644 talimatname/genel/p/plasma-kwayland-integration/talimat create mode 100644 talimatname/genel/p/plasma-kwin/plasma-kwin.kur-kos create mode 100644 talimatname/genel/p/plasma-kwin/talimat create mode 100644 talimatname/genel/p/plasma-kwrited/talimat create mode 100644 talimatname/genel/p/plasma-libkscreen/talimat create mode 100644 talimatname/genel/p/plasma-libksysguard/libksysguard-5.5.5-glibc2.23-1.patch create mode 100644 talimatname/genel/p/plasma-libksysguard/talimat create mode 100644 talimatname/genel/p/plasma-milou/talimat create mode 100644 talimatname/genel/p/plasma-nm/talimat create mode 100644 talimatname/genel/p/plasma-oxygen/talimat create mode 100644 talimatname/genel/p/plasma-pa/talimat create mode 100644 talimatname/genel/p/plasma-polkit-kde-agent/talimat create mode 100644 talimatname/genel/p/plasma-powerdevil/talimat create mode 100644 talimatname/genel/p/plasma-sddm-kcm/talimat create mode 100644 talimatname/genel/p/plasma-sdk/talimat create mode 100644 talimatname/genel/p/plasma-systemsettings/talimat create mode 100644 talimatname/genel/p/plasma-user-manager/talimat create mode 100644 talimatname/genel/p/plasma-workspace-wallpapers/talimat create mode 100644 talimatname/genel/p/plasma-workspace/kscreensaver.pam create mode 100644 talimatname/genel/p/plasma-workspace/talimat create mode 100644 talimatname/genel/p/plasma/talimat create mode 100644 talimatname/genel/p/plib/talimat create mode 100755 talimatname/genel/p/pluma/pluma.kur-kos create mode 100644 talimatname/genel/p/pluma/talimat create mode 100644 talimatname/genel/p/plymouth/plymouthd.conf create mode 100644 talimatname/genel/p/plymouth/talimat create mode 100644 talimatname/genel/p/pm-quirks/talimat create mode 100644 talimatname/genel/p/pm-utils/talimat create mode 100644 talimatname/genel/p/podofo/talimat create mode 100644 talimatname/genel/p/poedit/talimat create mode 100644 talimatname/genel/p/polkit-gnome/talimat create mode 100644 talimatname/genel/p/polkit-qt5/talimat create mode 100644 talimatname/genel/p/polkit/polkit.okubeni create mode 100644 talimatname/genel/p/polkit/talimat create mode 100644 talimatname/genel/p/polyml/talimat create mode 100644 talimatname/genel/p/ponyc/talimat create mode 100644 talimatname/genel/p/poppler-glib/talimat create mode 100644 talimatname/genel/p/poppler-qt4/talimat create mode 100644 talimatname/genel/p/poppler-qt5/talimat create mode 100644 talimatname/genel/p/poppler/talimat create mode 100644 talimatname/genel/p/popt/talimat create mode 100644 talimatname/genel/p/portaudio/talimat create mode 100644 talimatname/genel/p/portmidi/portmidi-217-build-fix.patch create mode 100644 talimatname/genel/p/portmidi/talimat create mode 100644 talimatname/genel/p/postfix/postfix.kos-kur create mode 100644 talimatname/genel/p/postfix/talimat create mode 100644 talimatname/genel/p/postgresql/postgresql.kurulum create mode 100644 talimatname/genel/p/postgresql/talimat create mode 100644 talimatname/genel/p/ppp/ppp.kos-kur create mode 100644 talimatname/genel/p/ppp/pppd.servis create mode 100644 talimatname/genel/p/ppp/talimat create mode 100644 talimatname/genel/p/pptp/talimat create mode 100644 talimatname/genel/p/premake/talimat create mode 100644 talimatname/genel/p/print-manager/talimat create mode 100644 talimatname/genel/p/privoxy/privoxy.logrotate.d create mode 100644 talimatname/genel/p/privoxy/privoxy.sysusers create mode 100644 talimatname/genel/p/privoxy/talimat create mode 100644 talimatname/genel/p/procmail/talimat create mode 100644 talimatname/genel/p/proftpd/proftpd.conf create mode 100644 talimatname/genel/p/proftpd/proftpd.kos-kur create mode 100644 talimatname/genel/p/proftpd/talimat create mode 100644 talimatname/genel/p/proj/talimat create mode 100644 talimatname/genel/p/proot/talimat create mode 100644 talimatname/genel/p/protobuf-c/talimat create mode 100644 talimatname/genel/p/protobuf/talimat create mode 100644 talimatname/genel/p/prun/talimat create mode 100644 talimatname/genel/p/psi/talimat create mode 100644 talimatname/genel/p/psutil/talimat create mode 100644 talimatname/genel/p/pth/talimat create mode 100644 talimatname/genel/p/ptlib/talimat create mode 100644 talimatname/genel/p/pugixml/talimat create mode 100644 talimatname/genel/p/pulseaudio/pulseaudio.desktop create mode 100644 talimatname/genel/p/pulseaudio/pulseaudio.kur-kos create mode 100644 talimatname/genel/p/pulseaudio/talimat create mode 100644 talimatname/genel/p/pv/talimat create mode 100644 talimatname/genel/p/pyattrs/talimat create mode 100644 talimatname/genel/p/pybitmessage/talimat create mode 100644 talimatname/genel/p/pycertifi/talimat create mode 100644 talimatname/genel/p/pychardet/talimat create mode 100644 talimatname/genel/p/pycharm/talimat create mode 100644 talimatname/genel/p/pycparser/talimat create mode 100644 talimatname/genel/p/pycups/talimat create mode 100644 talimatname/genel/p/pycurl/talimat create mode 100644 talimatname/genel/p/pydateutil/talimat create mode 100644 talimatname/genel/p/pydbus/talimat create mode 100644 talimatname/genel/p/pydecorator/talimat create mode 100644 talimatname/genel/p/pyenchant/talimat create mode 100644 talimatname/genel/p/pygments/talimat create mode 100644 talimatname/genel/p/pyidna/talimat create mode 100644 talimatname/genel/p/pyjinja/talimat create mode 100644 talimatname/genel/p/pymarkupsafe/talimat create mode 100644 talimatname/genel/p/pympv/talimat create mode 100644 talimatname/genel/p/pynetworkx/talimat create mode 100644 talimatname/genel/p/pypam/talimat create mode 100644 talimatname/genel/p/pypdf/talimat create mode 100644 talimatname/genel/p/pypeg2/talimat create mode 100644 talimatname/genel/p/pyprctl/talimat create mode 100644 talimatname/genel/p/pypy/talimat create mode 100644 talimatname/genel/p/pyrdflib/talimat create mode 100644 talimatname/genel/p/pyreportlab/talimat create mode 100644 talimatname/genel/p/pyrequests/talimat create mode 100644 talimatname/genel/p/pysensors/talimat create mode 100644 talimatname/genel/p/python-apsw/talimat create mode 100644 talimatname/genel/p/python-atspi/talimat create mode 100644 talimatname/genel/p/python-beautifulsoup3/talimat create mode 100644 talimatname/genel/p/python-cairo/talimat create mode 100644 talimatname/genel/p/python-caja/talimat create mode 100644 talimatname/genel/p/python-cffi/talimat create mode 100644 talimatname/genel/p/python-chardet/talimat create mode 100644 talimatname/genel/p/python-cherrypy/talimat create mode 100644 talimatname/genel/p/python-cparser/talimat create mode 100644 talimatname/genel/p/python-crypto/talimat create mode 100644 talimatname/genel/p/python-cryptography/talimat create mode 100644 talimatname/genel/p/python-cssselect/talimat create mode 100644 talimatname/genel/p/python-cssutils/talimat create mode 100644 talimatname/genel/p/python-cups/talimat create mode 100644 talimatname/genel/p/python-distutils-extra/talimat create mode 100644 talimatname/genel/p/python-django/talimat create mode 100644 talimatname/genel/p/python-dnspython/talimat create mode 100644 talimatname/genel/p/python-docutils/talimat create mode 100644 talimatname/genel/p/python-ecdsa/talimat create mode 100644 talimatname/genel/p/python-enum34/talimat create mode 100644 talimatname/genel/p/python-fonttools/talimat create mode 100644 talimatname/genel/p/python-gconf/talimat create mode 100644 talimatname/genel/p/python-geoip/talimat create mode 100644 talimatname/genel/p/python-gitdb/talimat create mode 100644 talimatname/genel/p/python-gitpython/talimat create mode 100644 talimatname/genel/p/python-gobject/talimat create mode 100644 talimatname/genel/p/python-gobject2/pygobject-2.16.1-fixdetection.patch create mode 100644 talimatname/genel/p/python-gobject2/pygobject-2.28.6-fixes-1.patch create mode 100644 talimatname/genel/p/python-gobject2/talimat create mode 100644 talimatname/genel/p/python-gtk/talimat create mode 100644 talimatname/genel/p/python-gtksourceview2/talimat create mode 100644 talimatname/genel/p/python-httplib2/python-httplib2.cert.patch create mode 100644 talimatname/genel/p/python-httplib2/python-httplib2.ssl_hostname.patch create mode 100644 talimatname/genel/p/python-httplib2/talimat create mode 100644 talimatname/genel/p/python-keybinder/talimat create mode 100644 talimatname/genel/p/python-levenshtein/talimat create mode 100644 talimatname/genel/p/python-lxml/talimat create mode 100644 talimatname/genel/p/python-magic/talimat create mode 100644 talimatname/genel/p/python-mako/talimat create mode 100644 talimatname/genel/p/python-msgpack/talimat create mode 100644 talimatname/genel/p/python-nassl/talimat create mode 100644 talimatname/genel/p/python-netifaces/talimat create mode 100644 talimatname/genel/p/python-notify/talimat create mode 100644 talimatname/genel/p/python-numpy/talimat create mode 100644 talimatname/genel/p/python-oauth2/talimat create mode 100644 talimatname/genel/p/python-opengl/talimat create mode 100644 talimatname/genel/p/python-openssl/talimat create mode 100644 talimatname/genel/p/python-paramiko/talimat create mode 100644 talimatname/genel/p/python-parted/talimat create mode 100644 talimatname/genel/p/python-pcapy/talimat create mode 100644 talimatname/genel/p/python-pexpect/talimat create mode 100644 talimatname/genel/p/python-pillow/talimat create mode 100644 talimatname/genel/p/python-pip/talimat create mode 100644 talimatname/genel/p/python-polib/talimat create mode 100644 talimatname/genel/p/python-poppler/pypoppler-0.12.1-poppler-0.16.0.patch create mode 100644 talimatname/genel/p/python-poppler/python-poppler-0.12.1-poppler-0.39.0-changes.patch create mode 100644 talimatname/genel/p/python-poppler/talimat create mode 100644 talimatname/genel/p/python-protobuf/talimat create mode 100644 talimatname/genel/p/python-psutil/talimat create mode 100644 talimatname/genel/p/python-ptyprocess/talimat create mode 100644 talimatname/genel/p/python-pyasn1/talimat create mode 100644 talimatname/genel/p/python-pyaudio/talimat create mode 100644 talimatname/genel/p/python-pycountry/talimat create mode 100644 talimatname/genel/p/python-pygame/talimat create mode 100644 talimatname/genel/p/python-pygments/talimat create mode 100644 talimatname/genel/p/python-pyinotify/talimat create mode 100644 talimatname/genel/p/python-pyrex/talimat create mode 100644 talimatname/genel/p/python-pythondialog/talimat create mode 100644 talimatname/genel/p/python-pytz/talimat create mode 100644 talimatname/genel/p/python-pyxml/talimat create mode 100644 talimatname/genel/p/python-pyyaml/talimat create mode 100644 talimatname/genel/p/python-qt4/talimat create mode 100644 talimatname/genel/p/python-qt5/talimat create mode 100644 talimatname/genel/p/python-reportlab/talimat create mode 100644 talimatname/genel/p/python-rsvg/talimat create mode 100644 talimatname/genel/p/python-setproctitle/talimat create mode 100644 talimatname/genel/p/python-setuptools-scm/talimat create mode 100644 talimatname/genel/p/python-setuptools/talimat create mode 100644 talimatname/genel/p/python-simplejson/talimat create mode 100644 talimatname/genel/p/python-sip/talimat create mode 100644 talimatname/genel/p/python-six/talimat create mode 100644 talimatname/genel/p/python-smmap/talimat create mode 100644 talimatname/genel/p/python-tweepy/talimat create mode 100644 talimatname/genel/p/python-twisted/talimat create mode 100644 talimatname/genel/p/python-typing/talimat create mode 100644 talimatname/genel/p/python-urwid/talimat create mode 100644 talimatname/genel/p/python-virtualenv/talimat create mode 100644 talimatname/genel/p/python-vte/talimat create mode 100644 talimatname/genel/p/python-xdg/talimat create mode 100644 talimatname/genel/p/python-xlib/talimat create mode 100644 talimatname/genel/p/python-yaml/talimat create mode 100644 talimatname/genel/p/python-zope_interface/talimat create mode 100644 talimatname/genel/p/python/python.okubeni create mode 100644 talimatname/genel/p/python/python.png create mode 100644 talimatname/genel/p/python/talimat create mode 100644 talimatname/genel/p/python3-astroid/talimat create mode 100644 talimatname/genel/p/python3-beautifulsoup4/talimat create mode 100644 talimatname/genel/p/python3-cairo/python3-cairo-1.10.0-waf-python3.4.patch create mode 100644 talimatname/genel/p/python3-cairo/talimat create mode 100644 talimatname/genel/p/python3-cffi/talimat create mode 100644 talimatname/genel/p/python3-cparser/talimat create mode 100644 talimatname/genel/p/python3-cryptography/talimat create mode 100644 talimatname/genel/p/python3-cssselect/talimat create mode 100644 talimatname/genel/p/python3-distutils-extra/talimat create mode 100644 talimatname/genel/p/python3-django/talimat create mode 100644 talimatname/genel/p/python3-enum34/talimat create mode 100644 talimatname/genel/p/python3-geoip/talimat create mode 100644 talimatname/genel/p/python3-gitdb/talimat create mode 100644 talimatname/genel/p/python3-gitpython/talimat create mode 100644 talimatname/genel/p/python3-gobject/talimat create mode 100644 talimatname/genel/p/python3-lxml/talimat create mode 100644 talimatname/genel/p/python3-magic/talimat create mode 100644 talimatname/genel/p/python3-mprpc/talimat create mode 100644 talimatname/genel/p/python3-multipledispatch/talimat create mode 100644 talimatname/genel/p/python3-numpy/talimat create mode 100644 talimatname/genel/p/python3-opengl/talimat create mode 100644 talimatname/genel/p/python3-openssl/talimat create mode 100644 talimatname/genel/p/python3-parted/talimat create mode 100644 talimatname/genel/p/python3-pexpect/talimat create mode 100644 talimatname/genel/p/python3-pillow/talimat create mode 100644 talimatname/genel/p/python3-pip/talimat create mode 100644 talimatname/genel/p/python3-psutil/talimat create mode 100644 talimatname/genel/p/python3-pyasn1/talimat create mode 100644 talimatname/genel/p/python3-pyaudio/talimat create mode 100644 talimatname/genel/p/python3-pylint/talimat create mode 100644 talimatname/genel/p/python3-pyrr/talimat create mode 100644 talimatname/genel/p/python3-pythondialog/talimat create mode 100644 talimatname/genel/p/python3-pytz/talimat create mode 100644 talimatname/genel/p/python3-qt5/talimat create mode 100644 talimatname/genel/p/python3-reportlab/talimat create mode 100644 talimatname/genel/p/python3-setuptools-scm/talimat create mode 100644 talimatname/genel/p/python3-setuptools/talimat create mode 100644 talimatname/genel/p/python3-sip/talimat create mode 100644 talimatname/genel/p/python3-six/talimat create mode 100644 talimatname/genel/p/python3-smmap/talimat create mode 100644 talimatname/genel/p/python3-thrift/talimat create mode 100644 talimatname/genel/p/python3-virtualenv/talimat create mode 100644 talimatname/genel/p/python3-xdg/talimat create mode 100644 talimatname/genel/p/python3-yaml/talimat create mode 100644 talimatname/genel/p/python3/python3.okubeni create mode 100644 talimatname/genel/p/python3/python3.png create mode 100644 talimatname/genel/p/python3/talimat create mode 100644 talimatname/genel/p/pytwodict/talimat create mode 100644 talimatname/genel/p/pyurllibs/talimat create mode 100644 talimatname/genel/p/pywget/talimat create mode 100644 talimatname/genel/p/pyxapp/talimat create mode 100644 talimatname/genel/q/qbs/talimat create mode 100644 talimatname/genel/q/qca-qt5/talimat create mode 100644 talimatname/genel/q/qca/talimat create mode 100644 talimatname/genel/q/qemu-all/talimat create mode 100644 talimatname/genel/q/qjson/talimat create mode 100644 talimatname/genel/q/qlibc/talimat create mode 100644 talimatname/genel/q/qmmp/talimat create mode 100644 talimatname/genel/q/qpdf/talimat create mode 100644 talimatname/genel/q/qps/qps.desktop create mode 100644 talimatname/genel/q/qps/talimat create mode 100644 talimatname/genel/q/qqwing/talimat create mode 100644 talimatname/genel/q/qrencode/talimat create mode 100644 talimatname/genel/q/qt4/talimat create mode 100644 talimatname/genel/q/qt5-gstreamer/qt5-gstreamer-1.6.patch create mode 100644 talimatname/genel/q/qt5-gstreamer/talimat create mode 100644 talimatname/genel/q/qt5-pas/talimat create mode 100644 talimatname/genel/q/qt5-styleplugins/talimat create mode 100644 talimatname/genel/q/qt5-webengine/clip-ft-glyph.diff create mode 100644 talimatname/genel/q/qt5-webengine/gzip_string.py create mode 100644 talimatname/genel/q/qt5-webengine/harmony-fix.diff create mode 100644 talimatname/genel/q/qt5-webengine/last-commit-position.patch create mode 100644 talimatname/genel/q/qt5-webengine/talimat create mode 100644 talimatname/genel/q/qt5-webkit/qt5-webkit-icu59.patch create mode 100644 talimatname/genel/q/qt5-webkit/talimat create mode 100644 talimatname/genel/q/qt5/qt5-logo.png create mode 100644 talimatname/genel/q/qt5/talimat create mode 100644 talimatname/genel/q/qtav/talimat create mode 100644 talimatname/genel/q/qtchess/qtchess.desktop create mode 100644 talimatname/genel/q/qtchess/talimat create mode 100644 talimatname/genel/q/qtcreator/talimat create mode 100644 talimatname/genel/q/qterminal/talimat create mode 100644 talimatname/genel/q/qtermwidget/talimat create mode 100644 talimatname/genel/q/qtkeychain-qt5/talimat create mode 100644 talimatname/genel/q/qtox/talimat create mode 100644 talimatname/genel/q/qtwebkit/talimat create mode 100644 talimatname/genel/q/quadrapassel/quadrapassel.kur-kos create mode 100644 talimatname/genel/q/quadrapassel/talimat create mode 100644 talimatname/genel/q/quicklisp/talimat create mode 100644 talimatname/genel/q/qutebrowser/talimat create mode 100644 talimatname/genel/q/quvi/talimat create mode 100644 talimatname/genel/r/rabbitmq/rabbitmq-env.conf create mode 100644 talimatname/genel/r/rabbitmq/rabbitmq-script-wrapper create mode 100644 talimatname/genel/r/rabbitmq/rabbitmq.logrotate create mode 100644 talimatname/genel/r/rabbitmq/rabbitmq.sysusers create mode 100644 talimatname/genel/r/rabbitmq/rabbitmq.tmpfiles create mode 100644 talimatname/genel/r/rabbitmq/talimat create mode 100644 talimatname/genel/r/racket/talimat create mode 100644 talimatname/genel/r/radare2/talimat create mode 100644 talimatname/genel/r/ragel/talimat create mode 100644 talimatname/genel/r/ranger/ranger.okubeni create mode 100644 talimatname/genel/r/ranger/talimat create mode 100644 talimatname/genel/r/raptor/talimat create mode 100644 talimatname/genel/r/rarian/talimat create mode 100644 talimatname/genel/r/rasqal/talimat create mode 100644 talimatname/genel/r/ratpoison/ratpoison.desktop create mode 100644 talimatname/genel/r/ratpoison/ratpoison.okubeni create mode 100644 talimatname/genel/r/ratpoison/talimat create mode 100644 talimatname/genel/r/razor/razor-2.85-cosmetic-pv-fix.patch create mode 100644 talimatname/genel/r/razor/talimat create mode 100644 talimatname/genel/r/rdesktop/rdesktop-send_physical_buttons.diff create mode 100644 talimatname/genel/r/rdesktop/talimat create mode 100644 talimatname/genel/r/re-alpine/talimat create mode 100644 talimatname/genel/r/re2/talimat create mode 100644 talimatname/genel/r/re2c/talimat create mode 100644 talimatname/genel/r/rebar3/talimat create mode 100644 talimatname/genel/r/recordmydesktop/talimat create mode 100644 talimatname/genel/r/recoverjpeg/talimat create mode 100644 talimatname/genel/r/redland/rpath.diff create mode 100644 talimatname/genel/r/redland/talimat create mode 100644 talimatname/genel/r/reflex/talimat create mode 100644 talimatname/genel/r/reiserfsprogs/talimat create mode 100644 talimatname/genel/r/remake/talimat create mode 100644 talimatname/genel/r/remmina/talimat create mode 100644 talimatname/genel/r/reptyr/talimat create mode 100644 talimatname/genel/r/restbed/strand.patch create mode 100644 talimatname/genel/r/restbed/talimat create mode 100644 talimatname/genel/r/retroshare/talimat create mode 100644 talimatname/genel/r/rfkill/talimat create mode 100644 talimatname/genel/r/rhash/talimat create mode 100644 talimatname/genel/r/rhino/talimat create mode 100644 talimatname/genel/r/rhythmbox/rhythmbox.kur-kos create mode 100644 talimatname/genel/r/rhythmbox/talimat create mode 100644 talimatname/genel/r/ricin/talimat create mode 100644 talimatname/genel/r/ring-daemon/talimat create mode 100644 talimatname/genel/r/ristretto/talimat create mode 100644 talimatname/genel/r/rlog/rlog-section.patch create mode 100644 talimatname/genel/r/rlog/talimat create mode 100644 talimatname/genel/r/rlwrap/talimat create mode 100644 talimatname/genel/r/rofi/talimat create mode 100644 talimatname/genel/r/rosa-imagewriter/imagewriter-tr_TR.ts create mode 100644 talimatname/genel/r/rosa-imagewriter/logo-rosa.png create mode 100644 talimatname/genel/r/rosa-imagewriter/talimat create mode 100644 talimatname/genel/r/rox-filer/talimat create mode 100644 talimatname/genel/r/roxterm/talimat create mode 100644 talimatname/genel/r/rpcbind/talimat create mode 100644 talimatname/genel/r/rsound/talimat create mode 100644 talimatname/genel/r/rssguard/talimat create mode 100644 talimatname/genel/r/rtmpdump/talimat create mode 100644 talimatname/genel/r/ruby-bundler/talimat create mode 100644 talimatname/genel/r/ruby/gemrc create mode 100644 talimatname/genel/r/ruby/talimat create mode 100644 talimatname/genel/r/ruby23-bundler/talimat create mode 100644 talimatname/genel/r/ruby23/gemrc create mode 100644 talimatname/genel/r/ruby23/talimat create mode 100644 talimatname/genel/r/rust/0001-librustc_llvm-build-Force-link-against-libffi.patch create mode 100644 talimatname/genel/r/rust/bootstrap-config.toml create mode 100644 talimatname/genel/r/rust/talimat create mode 100644 talimatname/genel/r/rxvt-unicode/rxvt-unicode.desktop create mode 100644 talimatname/genel/r/rxvt-unicode/rxvt-unicode.svg create mode 100644 talimatname/genel/r/rxvt-unicode/talimat create mode 100644 talimatname/genel/s/samba/samba.conf create mode 100644 talimatname/genel/s/samba/talimat create mode 100644 talimatname/genel/s/samsung-printer/talimat create mode 100644 talimatname/genel/s/samsung-printer/xerox_mfp-smfp.conf create mode 100644 talimatname/genel/s/sane/sane.kur-kos create mode 100644 talimatname/genel/s/sane/talimat create mode 100644 talimatname/genel/s/sayonara-player/talimat create mode 100644 talimatname/genel/s/sbc/talimat create mode 100644 talimatname/genel/s/sbcl/arch-fixes.lisp create mode 100644 talimatname/genel/s/sbcl/customize-target-features.lisp create mode 100644 talimatname/genel/s/sbcl/talimat create mode 100644 talimatname/genel/s/scons/talimat create mode 100644 talimatname/genel/s/scratch/scratch.desktop create mode 100644 talimatname/genel/s/scratch/talimat create mode 100644 talimatname/genel/s/screen/talimat create mode 100644 talimatname/genel/s/scribus/talimat create mode 100644 talimatname/genel/s/scrot/talimat create mode 100644 talimatname/genel/s/sddm/10-backlight.rules create mode 100644 talimatname/genel/s/sddm/ecb903e4.patch create mode 100644 talimatname/genel/s/sddm/sddm-0.14.0-consolekit.patch create mode 100644 talimatname/genel/s/sddm/sddm.conf create mode 100644 talimatname/genel/s/sddm/sddm.kos-kur create mode 100644 talimatname/genel/s/sddm/sddm.kur-kos create mode 100644 talimatname/genel/s/sddm/talimat create mode 100644 talimatname/genel/s/sdl-image/talimat create mode 100644 talimatname/genel/s/sdl-mixer/talimat create mode 100644 talimatname/genel/s/sdl-net/talimat create mode 100644 talimatname/genel/s/sdl-pango/SDL_Pango-0.1.2-API-adds.patch create mode 100644 talimatname/genel/s/sdl-pango/matrix_declarations.patch create mode 100644 talimatname/genel/s/sdl-pango/talimat create mode 100644 talimatname/genel/s/sdl-ttf/talimat create mode 100644 talimatname/genel/s/sdl/talimat create mode 100644 talimatname/genel/s/sdl2-image/talimat create mode 100644 talimatname/genel/s/sdl2-mixer/talimat create mode 100644 talimatname/genel/s/sdl2-ttf/talimat create mode 100644 talimatname/genel/s/sdl2/talimat create mode 100644 talimatname/genel/s/sdl2_gfx/talimat create mode 100644 talimatname/genel/s/sdl2_net/talimat create mode 100644 talimatname/genel/s/sdl_gfx/talimat create mode 100644 talimatname/genel/s/seahorse-nautilus/seahorse-nautilus.kur-kos create mode 100644 talimatname/genel/s/seahorse-nautilus/talimat create mode 100644 talimatname/genel/s/seahorse/seahorse.kur-kos create mode 100644 talimatname/genel/s/seahorse/talimat create mode 100644 talimatname/genel/s/sendmail/sendmail.kos-kur create mode 100644 talimatname/genel/s/sendmail/sendmail.sil-kos create mode 100644 talimatname/genel/s/sendmail/site.config.m4 create mode 100644 talimatname/genel/s/sendmail/talimat create mode 100644 talimatname/genel/s/serf/talimat create mode 100644 talimatname/genel/s/setconf/talimat create mode 100644 talimatname/genel/s/seyhan/seyhan-logo.png create mode 100644 talimatname/genel/s/seyhan/talimat create mode 100644 talimatname/genel/s/sfml-python/talimat create mode 100644 talimatname/genel/s/sfml/talimat create mode 100644 talimatname/genel/s/sg3-utils/talimat create mode 100644 talimatname/genel/s/sgml-common/talimat create mode 100644 talimatname/genel/s/shared-color-targets/talimat create mode 100644 talimatname/genel/s/shared-mime-info/shared-mime-info.kur-kos create mode 100644 talimatname/genel/s/shared-mime-info/talimat create mode 100644 talimatname/genel/s/sharutils/talimat create mode 100644 talimatname/genel/s/shashlik/shashlik-gui.sh create mode 100644 talimatname/genel/s/shashlik/shashlik.desktop create mode 100644 talimatname/genel/s/shashlik/talimat create mode 100644 talimatname/genel/s/shotcut/talimat create mode 100644 talimatname/genel/s/shotwell/shotwell.kur-kos create mode 100644 talimatname/genel/s/shotwell/talimat create mode 100644 talimatname/genel/s/siege/talimat create mode 100644 talimatname/genel/s/sielo-navigateur/talimat create mode 100644 talimatname/genel/s/signon-kwallet-extension/talimat create mode 100644 talimatname/genel/s/signon-plugin-oauth2/talimat create mode 100644 talimatname/genel/s/signon-ui/talimat create mode 100644 talimatname/genel/s/signond/talimat create mode 100644 talimatname/genel/s/simple-mtpfs/talimat create mode 100644 talimatname/genel/s/simple-scan/simple-scan.kur-kos create mode 100644 talimatname/genel/s/simple-scan/talimat create mode 100644 talimatname/genel/s/simplescreenrecorder/simplescreenrecorder.desktop create mode 100644 talimatname/genel/s/simplescreenrecorder/simplescreenrecorder_tr.qm create mode 100644 talimatname/genel/s/simplescreenrecorder/talimat create mode 100644 talimatname/genel/s/slack/slack.desktop create mode 100644 talimatname/genel/s/slack/talimat create mode 100644 talimatname/genel/s/slang/talimat create mode 100644 talimatname/genel/s/slim/CMakeLists.txt.patch create mode 120000 talimatname/genel/s/slim/background.png create mode 100644 talimatname/genel/s/slim/panel.png create mode 100644 talimatname/genel/s/slim/slim-1.3.6_freetype-2.5.1.diff create mode 100644 talimatname/genel/s/slim/slim.conf create mode 100644 talimatname/genel/s/slim/slim.kur-kos create mode 100644 talimatname/genel/s/slim/slim.logrotate create mode 100644 talimatname/genel/s/slim/slim.theme create mode 100644 talimatname/genel/s/slim/talimat create mode 100644 talimatname/genel/s/slop/talimat create mode 100644 talimatname/genel/s/slowloris/talimat create mode 100644 talimatname/genel/s/smartmontools/talimat create mode 100644 talimatname/genel/s/smpeg/smpeg-0.4.4_m4.patch create mode 100644 talimatname/genel/s/smpeg/smpeg-mpegaudiosdl.patch create mode 100644 talimatname/genel/s/smpeg/talimat create mode 100644 talimatname/genel/s/smpeg2/talimat create mode 100644 talimatname/genel/s/smplayer/talimat create mode 100644 talimatname/genel/s/snappy-player/0001-Set-windowing-backend-to-X11.patch create mode 100644 talimatname/genel/s/snappy-player/clutter-gst3.patch create mode 100644 talimatname/genel/s/snappy-player/talimat create mode 100644 talimatname/genel/s/snappy/talimat create mode 100644 talimatname/genel/s/sndio/talimat create mode 100644 talimatname/genel/s/sni-qt/sni-qt.conf create mode 100644 talimatname/genel/s/sni-qt/talimat create mode 100644 talimatname/genel/s/snownews/talimat create mode 100644 talimatname/genel/s/socat/libressl.patch create mode 100644 talimatname/genel/s/socat/talimat create mode 100644 talimatname/genel/s/sound-theme-freedesktop/talimat create mode 100644 talimatname/genel/s/soundtouch/talimat create mode 100644 talimatname/genel/s/sox/sox-dynamic.patch create mode 100644 talimatname/genel/s/sox/talimat create mode 100644 talimatname/genel/s/soxr/talimat create mode 100644 talimatname/genel/s/spacefm/spacefm.kur-kos create mode 100644 talimatname/genel/s/spacefm/talimat create mode 100644 talimatname/genel/s/spacenavd/talimat create mode 100644 talimatname/genel/s/spamassassin/spamassassin-net-dns-01.patch create mode 100644 talimatname/genel/s/spamassassin/spamassassin.service create mode 100644 talimatname/genel/s/spamassassin/talimat create mode 100644 talimatname/genel/s/sparsehash/talimat create mode 100644 talimatname/genel/s/spectacle/talimat create mode 100644 talimatname/genel/s/speedcrunch/talimat create mode 100644 talimatname/genel/s/speex/talimat create mode 100644 talimatname/genel/s/speexdsp/talimat create mode 100644 talimatname/genel/s/splix/splix-deviceID.patch create mode 100644 talimatname/genel/s/splix/talimat create mode 100644 talimatname/genel/s/sqlcipher/talimat create mode 100644 talimatname/genel/s/sqlite/talimat create mode 100644 talimatname/genel/s/sqlitebrowser/talimat create mode 100644 talimatname/genel/s/sqlmap/talimat create mode 100644 talimatname/genel/s/squeak-vm/talimat create mode 100644 talimatname/genel/s/squid/squid.kur-kos create mode 100644 talimatname/genel/s/squid/squid_servisi create mode 100644 talimatname/genel/s/squid/talimat create mode 100644 talimatname/genel/s/ssh-askpass/ssh-askpass.kur-kos create mode 100644 talimatname/genel/s/ssh-askpass/talimat create mode 100644 talimatname/genel/s/sshfs-fuse/talimat create mode 100644 talimatname/genel/s/sshuttle/prefixes.conf create mode 100644 talimatname/genel/s/sshuttle/talimat create mode 100644 talimatname/genel/s/sshuttle/tunnel.conf create mode 100644 talimatname/genel/s/sslyze/talimat create mode 100644 talimatname/genel/s/st/talimat create mode 100644 talimatname/genel/s/stacer/talimat create mode 100644 talimatname/genel/s/start-stop-daemon/makefile create mode 100644 talimatname/genel/s/start-stop-daemon/ornek_servis create mode 100644 talimatname/genel/s/start-stop-daemon/start-stop-daemon.8 create mode 100644 talimatname/genel/s/start-stop-daemon/start-stop-daemon.c create mode 100644 talimatname/genel/s/start-stop-daemon/talimat create mode 100644 talimatname/genel/s/startup-notification/talimat create mode 100644 talimatname/genel/s/steghide/climit.diff create mode 100644 talimatname/genel/s/steghide/float-constexpr.diff create mode 100644 talimatname/genel/s/steghide/talimat create mode 100644 talimatname/genel/s/steghide/template-headers.diff create mode 100644 talimatname/genel/s/stfl/talimat create mode 100644 talimatname/genel/s/stopwatch/talimat create mode 100644 talimatname/genel/s/strace/talimat create mode 100644 talimatname/genel/s/strigi/talimat create mode 100644 talimatname/genel/s/stunnel/cert-openssl.patch create mode 100644 talimatname/genel/s/stunnel/stunnel.conf create mode 100644 talimatname/genel/s/stunnel/stunnel.kos-kur create mode 100644 talimatname/genel/s/stunnel/stunnel.kur-kos create mode 100644 talimatname/genel/s/stunnel/talimat create mode 100644 talimatname/genel/s/sublime-text/talimat create mode 100644 talimatname/genel/s/subversion/talimat create mode 100644 talimatname/genel/s/supercat/talimat create mode 100644 talimatname/genel/s/supertux/talimat create mode 100644 talimatname/genel/s/supertuxkart/talimat create mode 100644 talimatname/genel/s/sweeper/talimat create mode 100644 talimatname/genel/s/sweethome3d/talimat create mode 100644 talimatname/genel/s/swi-prolog/talimat create mode 100644 talimatname/genel/s/swig/talimat create mode 100644 talimatname/genel/s/sxhkd/sxhkd.kurkos create mode 100644 talimatname/genel/s/sxhkd/sxhkdrc create mode 100644 talimatname/genel/s/sxhkd/talimat create mode 100644 talimatname/genel/s/sxiv/sxiv.giflib.patch create mode 100644 talimatname/genel/s/sxiv/talimat create mode 100644 talimatname/genel/s/sylpheed/sylpheed.kur-kos create mode 100644 talimatname/genel/s/sylpheed/talimat create mode 100644 talimatname/genel/s/syndication/talimat create mode 100644 talimatname/genel/s/syntax-highlighting/talimat create mode 100644 talimatname/genel/s/sysfsutils/talimat create mode 100644 talimatname/genel/s/syslinux/talimat create mode 100644 talimatname/genel/s/sysstat/talimat create mode 100644 talimatname/genel/s/system-config-printer/0001-Fix-constructing-the-auth-dialog.patch create mode 100644 talimatname/genel/s/system-config-printer/talimat create mode 100644 talimatname/genel/s/system-tools-backends/talimat create mode 100644 talimatname/genel/s/systemtap/talimat create mode 100755 talimatname/genel/s/sysv-rc-conf/sysv-rc-conf.pl create mode 100644 talimatname/genel/s/sysv-rc-conf/talimat create mode 100644 talimatname/genel/t/t4k-common/libpng15.patch create mode 100644 talimatname/genel/t/t4k-common/talimat create mode 100644 talimatname/genel/t/taglib-extras/talimat create mode 100644 talimatname/genel/t/taglib/talimat create mode 100644 talimatname/genel/t/talloc/talimat create mode 100644 talimatname/genel/t/tango-icon-theme-extras/talimat create mode 100644 talimatname/genel/t/tango-icon-theme/talimat create mode 100644 talimatname/genel/t/tcl/talimat create mode 100644 talimatname/genel/t/tcpdump/talimat create mode 100644 talimatname/genel/t/tcptraceroute/talimat create mode 100644 talimatname/genel/t/tdb/talimat create mode 100644 talimatname/genel/t/telegram-bin/talimat create mode 100644 talimatname/genel/t/telegram-cli/talimat create mode 100644 talimatname/genel/t/telegram-cli/telegram-cli.patch create mode 100644 talimatname/genel/t/telepathy-accounts-signon/talimat create mode 100644 talimatname/genel/t/telepathy-farstream/talimat create mode 100644 talimatname/genel/t/telepathy-gabble/talimat create mode 100644 talimatname/genel/t/telepathy-glib/talimat create mode 100644 talimatname/genel/t/telepathy-idle/talimat create mode 100644 talimatname/genel/t/telepathy-kde-accounts-kcm/talimat create mode 100644 talimatname/genel/t/telepathy-kde-approver/talimat create mode 100644 talimatname/genel/t/telepathy-kde-auth-handler/talimat create mode 100644 talimatname/genel/t/telepathy-kde-call-ui/talimat create mode 100644 talimatname/genel/t/telepathy-kde-common-internals/talimat create mode 100644 talimatname/genel/t/telepathy-kde-contact-list/talimat create mode 100644 talimatname/genel/t/telepathy-kde-contact-runner/talimat create mode 100644 talimatname/genel/t/telepathy-kde-desktop-applets/talimat create mode 100644 talimatname/genel/t/telepathy-kde-filetransfer-handler/talimat create mode 100644 talimatname/genel/t/telepathy-kde-integration-module/talimat create mode 100644 talimatname/genel/t/telepathy-kde-send-file/talimat create mode 100644 talimatname/genel/t/telepathy-kde-text-ui/talimat create mode 100644 talimatname/genel/t/telepathy-logger-qt/talimat create mode 100644 talimatname/genel/t/telepathy-logger/talimat create mode 100644 talimatname/genel/t/telepathy-mission-control/talimat create mode 100644 talimatname/genel/t/telepathy-python/talimat create mode 100644 talimatname/genel/t/telepathy-qt5/talimat create mode 100644 talimatname/genel/t/telepathy/talimat create mode 100644 talimatname/genel/t/termcap/talimat create mode 100644 talimatname/genel/t/terminology/talimat create mode 100644 talimatname/genel/t/terminus-font/talimat create mode 100644 talimatname/genel/t/terminus-font/terminus-font.kur-kos create mode 100644 talimatname/genel/t/tesseract/talimat create mode 100644 talimatname/genel/t/testdisk/talimat create mode 100644 talimatname/genel/t/tevent/talimat create mode 100644 talimatname/genel/t/tex-gyre-fonts/talimat create mode 100644 talimatname/genel/t/texi2html/talimat create mode 100644 talimatname/genel/t/the_silver_searcher/talimat create mode 100644 talimatname/genel/t/theharvester/talimat create mode 100644 talimatname/genel/t/theharvester/theharvester.kur-kos create mode 100644 talimatname/genel/t/thrift/talimat create mode 100644 talimatname/genel/t/thunar-archive-plugin/talimat create mode 100644 talimatname/genel/t/thunar-vcs-plugin/talimat create mode 100644 talimatname/genel/t/thunar-vcs-plugin/thunar-vcs-plugin.kur-kos create mode 100644 talimatname/genel/t/thunar-volman/talimat create mode 100644 talimatname/genel/t/thunar-volman/thunar-volman.kur-kos create mode 100644 talimatname/genel/t/thunar/no-root-warning.patch create mode 100644 talimatname/genel/t/thunar/talimat create mode 100644 talimatname/genel/t/thunar/thunar.kur-kos create mode 100644 talimatname/genel/t/thunderbird/talimat create mode 100644 talimatname/genel/t/thunderbird/thunderbird.desktop create mode 100644 talimatname/genel/t/thunderbird/thunderbird.kur-kos create mode 100644 talimatname/genel/t/tidy-html5/talimat create mode 100644 talimatname/genel/t/tidy/talimat create mode 100644 talimatname/genel/t/tig/talimat create mode 100644 talimatname/genel/t/tigervnc/talimat create mode 100644 talimatname/genel/t/tilda/talimat create mode 100644 talimatname/genel/t/tilde/talimat create mode 100644 talimatname/genel/t/time/talimat create mode 100644 talimatname/genel/t/tinc/talimat create mode 100644 talimatname/genel/t/tint2-extras/talimat create mode 100644 talimatname/genel/t/tint2/add-power-now-support.patch create mode 100644 talimatname/genel/t/tint2/clock.patch create mode 100644 talimatname/genel/t/tint2/talimat create mode 100644 talimatname/genel/t/tinyxml/entity.patch create mode 100644 talimatname/genel/t/tinyxml/talimat create mode 100644 talimatname/genel/t/tinyxml/tinyxml-use-stl.patch create mode 100644 talimatname/genel/t/tk/talimat create mode 100644 talimatname/genel/t/tmux/talimat create mode 100644 talimatname/genel/t/tolua++/talimat create mode 100644 talimatname/genel/t/tomb/talimat create mode 100644 talimatname/genel/t/totem-pl-parser/talimat create mode 100644 talimatname/genel/t/totem/talimat create mode 100644 talimatname/genel/t/totem/totem.kur-kos create mode 100644 talimatname/genel/t/toxcore/talimat create mode 100644 talimatname/genel/t/toxcore/toxcore.kur-kos create mode 100644 talimatname/genel/t/toybox/talimat create mode 100644 talimatname/genel/t/traceroute/talimat create mode 100644 talimatname/genel/t/tracker/talimat create mode 100644 talimatname/genel/t/tracker/tracker.kur-kos create mode 100644 talimatname/genel/t/transmission/talimat create mode 100644 talimatname/genel/t/transmission/transmission.kur-kos create mode 100644 talimatname/genel/t/trayer/manpage.diff create mode 100644 talimatname/genel/t/trayer/talimat create mode 100644 talimatname/genel/t/trayer/trayer.diff create mode 100644 talimatname/genel/t/tree/talimat create mode 100644 talimatname/genel/t/trinity/talimat create mode 100644 talimatname/genel/t/tripwire/talimat create mode 100644 talimatname/genel/t/tripwire/twcfg.txt create mode 100644 talimatname/genel/t/tripwire/twpol.txt create mode 100644 talimatname/genel/t/trojita/talimat create mode 100644 talimatname/genel/t/tslib/talimat create mode 100644 talimatname/genel/t/tsocks/fix-mkinstalldirs.patch create mode 100644 talimatname/genel/t/tsocks/talimat create mode 100644 talimatname/genel/t/ttf-liberation/talimat create mode 100644 talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-mono.conf create mode 100644 talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-sans.conf create mode 100644 talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-serif.conf create mode 100644 talimatname/genel/t/ttf-liberation/ttf-liberation.kur-kos create mode 100644 talimatname/genel/t/ttf-linux-libertine/talimat create mode 100644 talimatname/genel/t/ttf-ms-fonts/talimat create mode 100644 talimatname/genel/t/tumbler/talimat create mode 100644 talimatname/genel/t/tuntox/shared-build.patch create mode 100644 talimatname/genel/t/tuntox/talimat create mode 100644 talimatname/genel/t/tup/talimat create mode 100644 talimatname/genel/t/turses/talimat create mode 100644 talimatname/genel/t/tuxmath/talimat create mode 100644 talimatname/genel/t/tuxmath/tuxmath.desktop create mode 100644 talimatname/genel/t/tuxpaint/talimat create mode 100644 talimatname/genel/t/txt2tags/talimat create mode 100644 talimatname/genel/u/uchardet/talimat create mode 100644 talimatname/genel/u/ucspi-tcp/head-1.patch create mode 100644 talimatname/genel/u/ucspi-tcp/talimat create mode 100644 talimatname/genel/u/ucspi-tcp/ucspi-tcp-0.88-ipv6.patch create mode 100644 talimatname/genel/u/udevil/talimat create mode 100644 talimatname/genel/u/udisks/talimat create mode 100644 talimatname/genel/u/udisks2/talimat create mode 100644 talimatname/genel/u/udisks2/udisk2-2.1.5-policy-1.patch create mode 100644 talimatname/genel/u/ufsutils/talimat create mode 100644 talimatname/genel/u/uget/talimat create mode 100644 talimatname/genel/u/uhttpmock/talimat create mode 100644 talimatname/genel/u/ulib/talimat create mode 100644 talimatname/genel/u/umurmur/talimat create mode 100644 talimatname/genel/u/umurmur/umurmur.sysusers create mode 100644 talimatname/genel/u/unco/talimat create mode 100644 talimatname/genel/u/unison/talimat create mode 100644 talimatname/genel/u/unixodbc/talimat create mode 100644 talimatname/genel/u/unpaper/talimat create mode 100644 talimatname/genel/u/unrar/talimat create mode 100644 talimatname/genel/u/unshield/talimat create mode 100644 talimatname/genel/u/unzip/talimat create mode 100644 talimatname/genel/u/upower/fix-critical-action.patch create mode 100644 talimatname/genel/u/upower/talimat create mode 100644 talimatname/genel/u/urbanterror/talimat create mode 100644 talimatname/genel/u/urbanterror/urbanterror-server.sh create mode 100644 talimatname/genel/u/urbanterror/urbanterror.desktop create mode 100644 talimatname/genel/u/urbanterror/urbanterror.png create mode 100644 talimatname/genel/u/urbanterror/urbanterror.sh create mode 100644 talimatname/genel/u/urho3d/talimat create mode 100644 talimatname/genel/u/urlmatch/talimat create mode 100644 talimatname/genel/u/urweb/talimat create mode 100644 talimatname/genel/u/urweb/use-system-uthash.patch create mode 100644 talimatname/genel/u/usbutils/talimat create mode 100644 talimatname/genel/u/usbutils/usbutils.kur-kos create mode 100644 talimatname/genel/u/uthash/talimat create mode 100644 talimatname/genel/u/utox/talimat create mode 100644 talimatname/genel/u/uwebsockets/talimat create mode 100644 talimatname/genel/u/uyap/product_logo_32.xpm create mode 100644 talimatname/genel/u/uyap/talimat create mode 100644 talimatname/genel/u/uyap/uyap-editor.png create mode 100644 talimatname/genel/v/v4l-utils/talimat create mode 100644 talimatname/genel/v/vala/talimat create mode 100644 talimatname/genel/v/vala/vala.kos-sil create mode 100644 talimatname/genel/v/valgrind/talimat create mode 100644 talimatname/genel/v/vamp-plugin-sdk/talimat create mode 100644 talimatname/genel/v/varnish/talimat create mode 100755 talimatname/genel/v/varnish/varnish.service create mode 100644 talimatname/genel/v/vcdimager/talimat create mode 100644 talimatname/genel/v/vdrift/talimat create mode 100644 talimatname/genel/v/vdrift/vdrift-gcc6.patch create mode 100644 talimatname/genel/v/vdrift/vdrift-sconscript.patch create mode 100644 talimatname/genel/v/vdrift/vdrift-sconstruct.patch create mode 100644 talimatname/genel/v/vice/icons.tar.gz create mode 100644 talimatname/genel/v/vice/talimat create mode 100644 talimatname/genel/v/vice/vice create mode 100644 talimatname/genel/v/vice/vice-2.4-64bit.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-giflib.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-no-fc-cache.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-notexi-notxt.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-texi2html.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-vice.texi.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-x11video.patch create mode 100644 talimatname/genel/v/vice/vice-2.4-zlib-1.2.7.patch create mode 100644 talimatname/genel/v/vice/vice.desktop create mode 100644 talimatname/genel/v/vid-stab/talimat create mode 100644 talimatname/genel/v/viewnior/talimat create mode 100644 talimatname/genel/v/vile/talimat create mode 100644 talimatname/genel/v/vim/talimat create mode 100644 talimatname/genel/v/vim/vim-7.4-locale-1.patch create mode 100644 talimatname/genel/v/vimb/talimat create mode 100644 talimatname/genel/v/vino/talimat create mode 100644 talimatname/genel/v/vino/vino.kur-kos create mode 100644 talimatname/genel/v/virtualbox-cli/talimat create mode 100644 talimatname/genel/v/virtualbox-cli/talimat~ create mode 100644 talimatname/genel/v/virtualbox-cli/virtualbox-cli.kos-kur create mode 100644 talimatname/genel/v/virtualbox/talimat create mode 100644 talimatname/genel/v/virtualbox/virtualbox.60-vboxdrv.rules create mode 100644 talimatname/genel/v/virtualbox/virtualbox.kur-kos create mode 100644 talimatname/genel/v/virtualbox/virtualbox.okubeni create mode 100644 talimatname/genel/v/virtualgl/talimat create mode 100644 talimatname/genel/v/vlc/lua53_compat.patch create mode 100644 talimatname/genel/v/vlc/talimat create mode 100644 talimatname/genel/v/vlc/vlc.kur-kos create mode 100644 talimatname/genel/v/vmware/Makefile create mode 100644 talimatname/genel/v/vmware/bootstrap create mode 100644 talimatname/genel/v/vmware/config create mode 100644 talimatname/genel/v/vmware/config.xml create mode 100644 talimatname/genel/v/vmware/datastores.xml create mode 100644 talimatname/genel/v/vmware/environments.xml create mode 100644 talimatname/genel/v/vmware/pam.d-vmware-authd create mode 100644 talimatname/genel/v/vmware/proxy.xml create mode 100644 talimatname/genel/v/vmware/talimat create mode 100644 talimatname/genel/v/vmware/vmmon.patch create mode 100644 talimatname/genel/v/vmware/vmnet.patch create mode 100644 talimatname/genel/v/vmware/vmware-environment.sh create mode 100644 talimatname/genel/v/vmware/vmware-vix-bootstrap create mode 100644 talimatname/genel/v/vmware/vmware.kur-kos create mode 100644 talimatname/genel/v/vokoscreen/desktop_file.patch create mode 100644 talimatname/genel/v/vokoscreen/fix_lrelease.patch create mode 100644 talimatname/genel/v/vokoscreen/talimat create mode 100644 talimatname/genel/v/vpnc/talimat create mode 100644 talimatname/genel/v/vte/talimat create mode 100644 talimatname/genel/v/vte3/talimat create mode 100644 talimatname/genel/v/vue/talimat create mode 100644 talimatname/genel/v/vuurmuur/talimat create mode 100644 talimatname/genel/w/w3af/talimat create mode 100644 talimatname/genel/w/w3af/w3af.desktop create mode 100644 talimatname/genel/w/w3af/w3af.kur-kos create mode 100644 talimatname/genel/w/w3m/talimat create mode 100644 talimatname/genel/w/wavpack/talimat create mode 100644 talimatname/genel/w/wayland-protocols/talimat create mode 100644 talimatname/genel/w/wayland/talimat create mode 100644 talimatname/genel/w/wbar/talimat create mode 100644 talimatname/genel/w/wcgbrowser/talimat create mode 100644 talimatname/genel/w/weather/talimat create mode 100644 talimatname/genel/w/webkit2gtk3/talimat create mode 100644 talimatname/genel/w/webkitfltk/talimat create mode 100644 talimatname/genel/w/webkitgtk2/icu59.patch create mode 100644 talimatname/genel/w/webkitgtk2/talimat create mode 100644 talimatname/genel/w/webkitgtk2/webkitgtk-2.4.9-abs.patch create mode 100644 talimatname/genel/w/webkitgtk3/icu59.patch create mode 100644 talimatname/genel/w/webkitgtk3/talimat create mode 100644 talimatname/genel/w/webkitgtk3/webkitgtk-2.4.9-abs.patch create mode 100644 talimatname/genel/w/websocketd/talimat create mode 100644 talimatname/genel/w/websocketpp/talimat create mode 100644 talimatname/genel/w/webtorrent-desktop/talimat create mode 100644 talimatname/genel/w/webtorrent-desktop/webtorrent-desktop.desktop create mode 100644 talimatname/genel/w/weechat/talimat create mode 100644 talimatname/genel/w/weka/talimat create mode 100644 talimatname/genel/w/weka/weka.desktop create mode 100644 talimatname/genel/w/weka/weka.sh create mode 100644 talimatname/genel/w/wfuzz/talimat create mode 100644 talimatname/genel/w/whatsapp-desktop/talimat create mode 100644 talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.desktop create mode 100644 talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.png create mode 100644 talimatname/genel/w/whatsie/talimat create mode 100644 talimatname/genel/w/whois/talimat create mode 100644 talimatname/genel/w/wicd/talimat create mode 100644 talimatname/genel/w/wicd/wicd.rc create mode 100644 talimatname/genel/w/widgetci/talimat create mode 100644 talimatname/genel/w/wifite/talimat create mode 100644 talimatname/genel/w/wildmidi/talimat create mode 100644 talimatname/genel/w/wireguard-kernel/talimat create mode 100644 talimatname/genel/w/wireguard-kernel/wireguard-kernel.hash create mode 100644 talimatname/genel/w/wireguard-kernel/wireguard-kernel.kur-kos create mode 100644 talimatname/genel/w/wireguard-tools/talimat create mode 100644 talimatname/genel/w/wireguard-tools/wireguard-tools.hash create mode 100644 talimatname/genel/w/wireless-tools/talimat create mode 100644 talimatname/genel/w/wireshark/talimat create mode 100644 talimatname/genel/w/wireshark/wireshark.kur-kos create mode 100644 talimatname/genel/w/wmctrl/talimat create mode 100644 talimatname/genel/w/wmfs2/talimat create mode 100644 talimatname/genel/w/woeusb/talimat create mode 100644 talimatname/genel/w/woeusb/trad.mo create mode 100644 talimatname/genel/w/worker/ornek-ayar_by_frusen create mode 100644 talimatname/genel/w/worker/talimat create mode 100644 talimatname/genel/w/wpa-supplicant/talimat create mode 100644 talimatname/genel/w/wpa-supplicant/wpa-supplicant.okubeni create mode 100644 talimatname/genel/w/wps-office/WEBDINGS.ttf create mode 100644 talimatname/genel/w/wps-office/WINGDNG2.ttf create mode 100644 talimatname/genel/w/wps-office/WINGDNG3.ttf create mode 100644 talimatname/genel/w/wps-office/mtextra.ttf create mode 100644 talimatname/genel/w/wps-office/symbol.ttf create mode 100644 talimatname/genel/w/wps-office/talimat create mode 100644 talimatname/genel/w/wps-office/wingding.ttf create mode 100644 talimatname/genel/w/wpscan/talimat create mode 100644 talimatname/genel/w/wpscan/wpscan.kur-kos create mode 100644 talimatname/genel/w/wren/talimat create mode 100644 talimatname/genel/w/wv/talimat create mode 100644 talimatname/genel/w/wxgtk/make-abicheck-non-fatal.patch create mode 100644 talimatname/genel/w/wxgtk/talimat create mode 100644 talimatname/genel/w/wxgtk/wxgtk-webkit-infinite-loop.patch create mode 100644 talimatname/genel/w/wxgtk28/make-abicheck-non-fatal.patch create mode 100644 talimatname/genel/w/wxgtk28/talimat create mode 100644 talimatname/genel/w/wxgtk28/wxGTK-collision.patch create mode 100644 talimatname/genel/w/wxpython/talimat create mode 100644 talimatname/genel/x/x11vnc/talimat create mode 100644 talimatname/genel/x/x264/talimat create mode 100644 talimatname/genel/x/x265/talimat create mode 100644 talimatname/genel/x/xapian/talimat create mode 100644 talimatname/genel/x/xapps/talimat create mode 100644 talimatname/genel/x/xarchiver/talimat create mode 100644 talimatname/genel/x/xcb-proto/talimat create mode 100644 talimatname/genel/x/xcb-util-cursor/talimat create mode 100644 talimatname/genel/x/xcb-util-image/talimat create mode 100644 talimatname/genel/x/xcb-util-keysyms/talimat create mode 100644 talimatname/genel/x/xcb-util-renderutil/talimat create mode 100644 talimatname/genel/x/xcb-util-wm/talimat create mode 100644 talimatname/genel/x/xcb-util-xrm/talimat create mode 100644 talimatname/genel/x/xcb-util/talimat create mode 100644 talimatname/genel/x/xcfa/talimat create mode 100644 talimatname/genel/x/xchat/talimat create mode 100644 talimatname/genel/x/xclip/talimat create mode 100644 talimatname/genel/x/xcompmgr/fix_broken_shadows.diff create mode 100644 talimatname/genel/x/xcompmgr/talimat create mode 100644 talimatname/genel/x/xdg-user-dirs/talimat create mode 100644 talimatname/genel/x/xdg-user-dirs/xdg-user-dirs-src create mode 100644 talimatname/genel/x/xdg-user-dirs/xdg-user-dirs.kur-kos create mode 100644 talimatname/genel/x/xdg-utils/talimat create mode 100644 talimatname/genel/x/xdialog/talimat create mode 100644 talimatname/genel/x/xdotool/talimat create mode 100644 talimatname/genel/x/xed/talimat create mode 100644 talimatname/genel/x/xed/xed.kur-kos create mode 100644 talimatname/genel/x/xf86-video-openchrome/talimat create mode 100644 talimatname/genel/x/xfce-theme-blackbird/talimat create mode 100644 talimatname/genel/x/xfce-theme-bluebird/talimat create mode 100644 talimatname/genel/x/xfce-theme-graybird/talimat create mode 100644 talimatname/genel/x/xfce4-appfinder/appfinder-preferences-ui.h create mode 100644 talimatname/genel/x/xfce4-appfinder/talimat create mode 100644 talimatname/genel/x/xfce4-appfinder/xfce4-appfinder.kur-kos create mode 100644 talimatname/genel/x/xfce4-artwork/talimat create mode 100644 talimatname/genel/x/xfce4-battery-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-battery-plugin/xfce4-battery-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-burn/talimat create mode 100644 talimatname/genel/x/xfce4-burn/xfce4-burn.kur-kos create mode 100644 talimatname/genel/x/xfce4-calculator-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-clipman-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-clipman-plugin/xfce4-clipman-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-conf/talimat create mode 100644 talimatname/genel/x/xfce4-cpufreq-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-cpufreq-plugin/xfce4-cpufreq-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-cpugraph-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-cpugraph-plugin/xfce4-cpugraph-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-datetime-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-desktop/talimat create mode 100644 talimatname/genel/x/xfce4-desktop/xfce4-desktop.kur-kos create mode 100644 talimatname/genel/x/xfce4-dev-tools/talimat create mode 100644 talimatname/genel/x/xfce4-diskperf-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-elementary-icon-theme/talimat create mode 100644 talimatname/genel/x/xfce4-elementary-icon-theme/xfce4-elementary-icon-theme.kur-kos create mode 100644 talimatname/genel/x/xfce4-fsguard-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-fsguard-plugin/xfce4-fsguard-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-garcon/talimat create mode 100644 talimatname/genel/x/xfce4-gtk-engine/talimat create mode 100644 talimatname/genel/x/xfce4-hardware-monitor-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-indicator-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-libui/talimat create mode 100644 talimatname/genel/x/xfce4-libui/xfce4-libui.kos-kur create mode 100644 talimatname/genel/x/xfce4-libui/xfce4-libui.kos-sil create mode 100644 talimatname/genel/x/xfce4-libutil/talimat create mode 100644 talimatname/genel/x/xfce4-libutil/xfce4-libutil.kos-sil create mode 100644 talimatname/genel/x/xfce4-linelight-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-mailwatch-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-mixer/talimat create mode 100644 talimatname/genel/x/xfce4-mixer/xfce4-mixer.kur-kos create mode 100644 talimatname/genel/x/xfce4-netload-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-netload-plugin/xfce4-netload-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-notes-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-notifyd/talimat create mode 100644 talimatname/genel/x/xfce4-notifyd/xfce4-notifyd.kur-kos create mode 100644 talimatname/genel/x/xfce4-panel/talimat create mode 100644 talimatname/genel/x/xfce4-panel/xfce4-panel.kos-sil create mode 100644 talimatname/genel/x/xfce4-panel/xfce4-panel.kur-kos create mode 100644 talimatname/genel/x/xfce4-places-plugin/mounts.patch create mode 100644 talimatname/genel/x/xfce4-places-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-places-plugin/undefined-symbol.patch create mode 100644 talimatname/genel/x/xfce4-power-manager/talimat create mode 100644 talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kos-sil create mode 100644 talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kur-kos create mode 100644 talimatname/genel/x/xfce4-pulseaudio-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-screenshooter/talimat create mode 100644 talimatname/genel/x/xfce4-screenshooter/xfce4-screenshooter.kur-kos create mode 100644 talimatname/genel/x/xfce4-sensors-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-sensors-plugin/xfce4-sensors-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-session/0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch create mode 100644 talimatname/genel/x/xfce4-session/talimat create mode 100644 talimatname/genel/x/xfce4-session/xfce-polkit-gnome-authentication-agent-1.desktop create mode 100644 talimatname/genel/x/xfce4-session/xfce4-session.kur-kos create mode 100644 talimatname/genel/x/xfce4-settings/talimat create mode 100644 talimatname/genel/x/xfce4-settings/xfce4-settings.kur-kos create mode 100644 talimatname/genel/x/xfce4-statusnotifier-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-systemload-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-systemload-plugin/xfce4-systemload-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-taskmanager/talimat create mode 100644 talimatname/genel/x/xfce4-terminal/talimat create mode 100644 talimatname/genel/x/xfce4-terminal/xfce4-terminal.kur-kos create mode 100644 talimatname/genel/x/xfce4-verve-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-volumed-pulse/talimat create mode 100644 talimatname/genel/x/xfce4-volumed/talimat create mode 100644 talimatname/genel/x/xfce4-weather-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-weather-plugin/xfce4-weather-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-whiskermenu-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.sil-kos create mode 100644 talimatname/genel/x/xfce4-windowck-plugin/talimat create mode 100644 talimatname/genel/x/xfce4-windowck-plugin/xfce4-windowck-plugin.kur-kos create mode 100644 talimatname/genel/x/xfce4-wm/talimat create mode 100644 talimatname/genel/x/xfce4-wm/xfce4-wm.kur-kos create mode 100644 talimatname/genel/x/xfce4-xkb-plugin/talimat create mode 100644 talimatname/genel/x/xfce4/surumler create mode 100644 talimatname/genel/x/xfce4/surumler_test create mode 100644 talimatname/genel/x/xfce4/talimat create mode 100644 talimatname/genel/x/xfdashboard/talimat create mode 100644 talimatname/genel/x/xfe/talimat create mode 100644 talimatname/genel/x/xfsprogs/talimat create mode 100644 talimatname/genel/x/xine-lib/talimat create mode 100644 talimatname/genel/x/xine-ui/talimat create mode 100644 talimatname/genel/x/xinetd/chargen create mode 100644 talimatname/genel/x/xinetd/daytime create mode 100644 talimatname/genel/x/xinetd/echo create mode 100644 talimatname/genel/x/xinetd/systat create mode 100644 talimatname/genel/x/xinetd/talimat create mode 100644 talimatname/genel/x/xinetd/xined_time create mode 100644 talimatname/genel/x/xinetd/xinetd.conf create mode 100644 talimatname/genel/x/xli/talimat create mode 100644 talimatname/genel/x/xli/xli.okubeni create mode 100644 talimatname/genel/x/xlockmore/talimat create mode 100644 talimatname/genel/x/xmlsec/talimat create mode 100644 talimatname/genel/x/xmlto/talimat create mode 100644 talimatname/genel/x/xmoto/lua52_compat.patch create mode 100644 talimatname/genel/x/xmoto/talimat create mode 100644 talimatname/genel/x/xneur/talimat create mode 100644 talimatname/genel/x/xnviewmp/talimat create mode 100644 talimatname/genel/x/xnviewmp/xnviewmp.desktop create mode 100644 talimatname/genel/x/xombrero/talimat create mode 100644 talimatname/genel/x/xonotic/talimat create mode 100644 talimatname/genel/x/xorg-app/talimat create mode 100644 talimatname/genel/x/xorg-cf-files/talimat create mode 100644 talimatname/genel/x/xorg-compositeproto/talimat create mode 100644 talimatname/genel/x/xorg-dri2proto/talimat create mode 100644 talimatname/genel/x/xorg-encodings/talimat create mode 100644 talimatname/genel/x/xorg-font-util/talimat create mode 100644 talimatname/genel/x/xorg-font/talimat create mode 100644 talimatname/genel/x/xorg-font/xorg-font.kur-kos create mode 100644 talimatname/genel/x/xorg-fontconfig/talimat create mode 100644 talimatname/genel/x/xorg-fontconfig/xorg-fontconfig.kos-sil.kos-sil create mode 100644 talimatname/genel/x/xorg-gccmakedep/talimat create mode 100644 talimatname/genel/x/xorg-glu/talimat create mode 100644 talimatname/genel/x/xorg-imake/talimat create mode 100644 talimatname/genel/x/xorg-libdmx/talimat create mode 100644 talimatname/genel/x/xorg-libdrm/talimat create mode 100644 talimatname/genel/x/xorg-libfontenc/talimat create mode 100644 talimatname/genel/x/xorg-libfs/talimat create mode 100644 talimatname/genel/x/xorg-libice/talimat create mode 100644 talimatname/genel/x/xorg-libpciaccess/talimat create mode 100644 talimatname/genel/x/xorg-libsm/talimat create mode 100644 talimatname/genel/x/xorg-libx11/talimat create mode 100644 talimatname/genel/x/xorg-libxau/talimat create mode 100644 talimatname/genel/x/xorg-libxaw/talimat create mode 100644 talimatname/genel/x/xorg-libxaw3d/talimat create mode 100644 talimatname/genel/x/xorg-libxcomposite/talimat create mode 100644 talimatname/genel/x/xorg-libxcursor/talimat create mode 100644 talimatname/genel/x/xorg-libxdamage/talimat create mode 100644 talimatname/genel/x/xorg-libxdmcp/talimat create mode 100644 talimatname/genel/x/xorg-libxext/talimat create mode 100644 talimatname/genel/x/xorg-libxfixes/talimat create mode 100644 talimatname/genel/x/xorg-libxfont/talimat create mode 100644 talimatname/genel/x/xorg-libxft/talimat create mode 100644 talimatname/genel/x/xorg-libxi/talimat create mode 100644 talimatname/genel/x/xorg-libxinerama/talimat create mode 100644 talimatname/genel/x/xorg-libxkbfile/talimat create mode 100644 talimatname/genel/x/xorg-libxklavier/talimat create mode 100644 talimatname/genel/x/xorg-libxmu/talimat create mode 100644 talimatname/genel/x/xorg-libxp/talimat create mode 100644 talimatname/genel/x/xorg-libxpm/talimat create mode 100644 talimatname/genel/x/xorg-libxrandr/talimat create mode 100644 talimatname/genel/x/xorg-libxrender/talimat create mode 100644 talimatname/genel/x/xorg-libxres/talimat create mode 100644 talimatname/genel/x/xorg-libxscrnsaver/talimat create mode 100644 talimatname/genel/x/xorg-libxshmfence/talimat create mode 100644 talimatname/genel/x/xorg-libxt/talimat create mode 100644 talimatname/genel/x/xorg-libxtst/talimat create mode 100644 talimatname/genel/x/xorg-libxv/talimat create mode 100644 talimatname/genel/x/xorg-libxvmc/talimat create mode 100644 talimatname/genel/x/xorg-libxxf86dga/talimat create mode 100644 talimatname/genel/x/xorg-libxxf86vm/talimat create mode 100644 talimatname/genel/x/xorg-mesa/talimat create mode 100644 talimatname/genel/x/xorg-pixman/talimat create mode 100644 talimatname/genel/x/xorg-proto/talimat create mode 100644 talimatname/genel/x/xorg-server/talimat create mode 100644 talimatname/genel/x/xorg-server/xorg-server.kur-kos create mode 100644 talimatname/genel/x/xorg-server/xorg-server.okubeni create mode 100644 talimatname/genel/x/xorg-term/talimat create mode 100644 talimatname/genel/x/xorg-term/xorg-term.list create mode 100644 talimatname/genel/x/xorg-twm/talimat create mode 100644 talimatname/genel/x/xorg-util-macros/talimat create mode 100644 talimatname/genel/x/xorg-xauth/talimat create mode 100644 talimatname/genel/x/xorg-xbitmaps/talimat create mode 100644 talimatname/genel/x/xorg-xcb-util-keysyms/talimat create mode 100644 talimatname/genel/x/xorg-xclock/talimat create mode 100644 talimatname/genel/x/xorg-xcursor-themes/talimat create mode 100644 talimatname/genel/x/xorg-xinit/talimat create mode 100644 talimatname/genel/x/xorg-xkeyboard-config/talimat create mode 100644 talimatname/genel/x/xorg-xtrans/talimat create mode 100644 talimatname/genel/x/xorg/talimat create mode 100755 talimatname/genel/x/xorg/xorg.kur-kos create mode 100644 talimatname/genel/x/xorriso/talimat create mode 100644 talimatname/genel/x/xpad/talimat create mode 100644 talimatname/genel/x/xpdf/talimat create mode 100644 talimatname/genel/x/xquisite/talimat create mode 100644 talimatname/genel/x/xreader/talimat create mode 100644 talimatname/genel/x/xreader/xreader.kur-kos create mode 100644 talimatname/genel/x/xsane/talimat create mode 100644 talimatname/genel/x/xscreensaver/talimat create mode 100644 talimatname/genel/x/xtables-addons/talimat create mode 100644 talimatname/genel/x/xulrunner/talimat create mode 100644 talimatname/genel/x/xvid/talimat create mode 100644 talimatname/genel/x/xviewer/talimat create mode 100644 talimatname/genel/x/xviewer/xviewer.kur-kos create mode 100644 talimatname/genel/x/xzoom/talimat create mode 100644 talimatname/genel/y/yacy/talimat create mode 100644 talimatname/genel/y/yacy/yacy.rc create mode 100644 talimatname/genel/y/yad/talimat create mode 100644 talimatname/genel/y/yajl/talimat create mode 100644 talimatname/genel/y/yakuake/talimat create mode 100644 talimatname/genel/y/yaml-cpp/1f4b6d5c855b59e849b7228090981c520928c2a4.patch create mode 100644 talimatname/genel/y/yaml-cpp/500db60f899ae6845039d4eca503133d0db81dbd.patch create mode 100644 talimatname/genel/y/yaml-cpp/talimat create mode 100644 talimatname/genel/y/yaml/talimat create mode 100644 talimatname/genel/y/yarn/talimat create mode 100644 talimatname/genel/y/yasm/talimat create mode 100644 talimatname/genel/y/yate/talimat create mode 100644 talimatname/genel/y/yelp-tools/talimat create mode 100644 talimatname/genel/y/yelp-xsl/talimat create mode 100644 talimatname/genel/y/yelp/talimat create mode 100644 talimatname/genel/y/yelp/yelp.kur-kos create mode 100644 talimatname/genel/y/you-get/talimat create mode 100644 talimatname/genel/y/youtube-dl-gui/talimat create mode 100644 talimatname/genel/y/youtube-dl-gui/youtube-dl-gui.desktop create mode 100644 talimatname/genel/y/youtube-dl-gui/youtube_dl_gui.po create mode 100644 talimatname/genel/y/youtube-dl/talimat create mode 100644 talimatname/genel/y/youtube-viewer/gtk-youtube-viewer.desktop create mode 100644 talimatname/genel/y/youtube-viewer/talimat create mode 100644 talimatname/genel/y/yubico-c-client/talimat create mode 100644 talimatname/genel/z/zarith/talimat create mode 100644 talimatname/genel/z/zenity/talimat create mode 100644 talimatname/genel/z/zeromq/talimat create mode 100644 talimatname/genel/z/zig/talimat create mode 100644 talimatname/genel/z/zile/talimat create mode 100644 talimatname/genel/z/zim/talimat create mode 100644 talimatname/genel/z/zim/zim.kur-kos create mode 100644 talimatname/genel/z/zimg/talimat create mode 100644 talimatname/genel/z/zip/talimat create mode 100644 talimatname/genel/z/zsh/talimat create mode 100644 talimatname/genel/z/zsh/zsh.kur-kos create mode 100644 talimatname/genel/z/zzuf/talimat create mode 100644 talimatname/temel/acl/talimat create mode 100644 talimatname/temel/attr/talimat create mode 100644 talimatname/temel/autoconf/talimat create mode 100644 talimatname/temel/automake/talimat create mode 100644 talimatname/temel/bash/talimat create mode 100755 talimatname/temel/bc/talimat create mode 100644 talimatname/temel/binutils/talimat create mode 100644 talimatname/temel/bison/talimat create mode 100644 talimatname/temel/bzip2/talimat create mode 100644 talimatname/temel/ca-certificates/ca-certificates.kos-kur create mode 100644 talimatname/temel/ca-certificates/ca-certificates.okubeni create mode 100755 talimatname/temel/ca-certificates/talimat create mode 100644 talimatname/temel/coreutils/talimat create mode 100644 talimatname/temel/cpio/talimat create mode 100644 talimatname/temel/curl/talimat create mode 100644 talimatname/temel/derleme.sira create mode 100644 talimatname/temel/dhcpcd/dhcpcd.kur-kos create mode 100755 talimatname/temel/dhcpcd/talimat create mode 100644 talimatname/temel/dialog/talimat create mode 100644 talimatname/temel/diffutils/talimat create mode 100644 talimatname/temel/e2fsprogs/talimat create mode 100644 talimatname/temel/eudev/eudev.kos-kur create mode 100644 talimatname/temel/eudev/talimat create mode 100644 talimatname/temel/expat/talimat create mode 100644 talimatname/temel/file/talimat create mode 100644 talimatname/temel/findutils/talimat create mode 100644 talimatname/temel/flex/talimat create mode 100644 talimatname/temel/gawk/talimat create mode 100644 talimatname/temel/gcc/talimat create mode 100644 talimatname/temel/gdbm/talimat create mode 100644 talimatname/temel/gettext/talimat create mode 100644 talimatname/temel/glibc/glibc.locales.supported create mode 100644 talimatname/temel/glibc/talimat create mode 100644 talimatname/temel/gmp/talimat create mode 100644 talimatname/temel/gperf/talimat create mode 100644 talimatname/temel/gpm/gpm.service.kur-kos create mode 100644 talimatname/temel/gpm/talimat create mode 100644 talimatname/temel/grep/talimat create mode 100644 talimatname/temel/groff/talimat create mode 100644 talimatname/temel/gzip/talimat create mode 100644 talimatname/temel/iana-etc/talimat create mode 100644 talimatname/temel/inetutils/talimat create mode 100644 talimatname/temel/iproute2/talimat create mode 100644 talimatname/temel/kbd/talimat create mode 100644 talimatname/temel/kmod/talimat create mode 100644 talimatname/temel/less/talimat create mode 100644 talimatname/temel/libarchive/talimat create mode 100644 talimatname/temel/libcap/talimat create mode 100644 talimatname/temel/libpipeline/talimat create mode 100644 talimatname/temel/libtool/talimat create mode 100644 talimatname/temel/lvm2/lvm2.okubeni create mode 100644 talimatname/temel/lvm2/talimat create mode 100644 talimatname/temel/lz4/talimat create mode 100644 talimatname/temel/lzip/talimat create mode 100644 talimatname/temel/lzo/talimat create mode 100644 talimatname/temel/m4/talimat create mode 100644 talimatname/temel/make/talimat create mode 100644 talimatname/temel/man-db/talimat create mode 100644 talimatname/temel/mpc/talimat create mode 100644 talimatname/temel/mpfr/talimat create mode 100644 talimatname/temel/nano/talimat create mode 100755 talimatname/temel/nasm/talimat create mode 100644 talimatname/temel/ncurses/talimat create mode 100644 talimatname/temel/openssh/openssh.okubeni create mode 100644 talimatname/temel/openssh/talimat create mode 100644 talimatname/temel/openssl/talimat create mode 100644 talimatname/temel/pam/talimat create mode 100644 talimatname/temel/patch/talimat create mode 100644 talimatname/temel/pciutils/pciutils.kur-kos create mode 100644 talimatname/temel/pciutils/talimat create mode 100644 talimatname/temel/perl/talimat create mode 100644 talimatname/temel/pkg-config/talimat create mode 100644 talimatname/temel/procps-ng/talimat create mode 100644 talimatname/temel/psmisc/talimat create mode 100644 talimatname/temel/readline/talimat create mode 100644 talimatname/temel/rsync/rsync.kur-kos create mode 100644 talimatname/temel/rsync/rsync.okubeni create mode 100644 talimatname/temel/rsync/talimat create mode 100644 talimatname/temel/sed/talimat create mode 100644 talimatname/temel/shadow/talimat create mode 100644 talimatname/temel/squashfs/talimat create mode 100644 talimatname/temel/sudo/talimat create mode 100644 talimatname/temel/sysklogd/talimat create mode 100644 talimatname/temel/sysvinit/talimat create mode 100644 talimatname/temel/tar/talimat create mode 100644 talimatname/temel/texinfo/talimat create mode 100644 talimatname/temel/tzdata/talimat create mode 100644 talimatname/temel/util-linux/talimat create mode 100644 talimatname/temel/wget/talimat create mode 100644 talimatname/temel/xz/talimat create mode 100644 talimatname/temel/zlib/talimat diff --git a/talimatname/genel/8/8cc/fix_cflags.patch b/talimatname/genel/8/8cc/fix_cflags.patch new file mode 100644 index 000000000..472bfc9f5 --- /dev/null +++ b/talimatname/genel/8/8cc/fix_cflags.patch @@ -0,0 +1,10 @@ +diff --git a/Makefile b/Makefile +index 98d3b4d..ff1b937 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,4 +1,4 @@ +-CFLAGS=-Wall -Wno-strict-aliasing -std=gnu11 -g -I. -O0 ++CFLAGS+=-Wall -Wno-strict-aliasing -std=gnu11 -I. + OBJS=cpp.o debug.o dict.o gen.o lex.o vector.o parse.o buffer.o map.o \ + error.o path.o file.o set.o + TESTS := $(patsubst %.c,%.bin,$(filter-out test/testmain.c,$(wildcard test/*.c))) diff --git a/talimatname/genel/8/8cc/talimat b/talimatname/genel/8/8cc/talimat new file mode 100644 index 000000000..b82cee2d3 --- /dev/null +++ b/talimatname/genel/8/8cc/talimat @@ -0,0 +1,21 @@ +# Tanım: Basit bir c11 derleyici +# URL: https://github.com/rui314/8cc +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: geliştirme + +isim=8cc +surum=git +devir=1 + +kaynak=(fix_cflags.patch) + +derle() { + git_indir https://github.com/rui314/$isim $isim + cd $SRC/$isim + patch -p1 < ../fix_cflags.patch + make + install -Dm755 8cc "$PKG/usr/bin/8cc" + cp -rf $SRC/$isim/include $PKG/usr/ + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/9/9base/9 b/talimatname/genel/9/9base/9 new file mode 100644 index 000000000..de6a2d070 --- /dev/null +++ b/talimatname/genel/9/9base/9 @@ -0,0 +1,13 @@ +#!/bin/sh + +PLAN9=${PLAN9:-/opt/plan9} +export PLAN9 + +case "$PATH" in + $PLAN9/bin:*) ;; + *) export PATH=$PLAN9/bin:$PATH ;; +esac + +if [ $# -gt 0 ]; then + exec "$@" +fi diff --git a/talimatname/genel/9/9base/plan9.sh b/talimatname/genel/9/9base/plan9.sh new file mode 100644 index 000000000..3fb0b9813 --- /dev/null +++ b/talimatname/genel/9/9base/plan9.sh @@ -0,0 +1,4 @@ +export PLAN9=/opt/plan9 +export PATH=$PATH:$PLAN9/bin +export MANPATH=$MANPATH:$PLAN9/man + diff --git a/talimatname/genel/9/9base/talimat b/talimatname/genel/9/9base/talimat new file mode 100644 index 000000000..846f88b49 --- /dev/null +++ b/talimatname/genel/9/9base/talimat @@ -0,0 +1,33 @@ +# Tanım: Plan9 araçlarının unix uyarlaması +# URL: http://tools.suckless.org/9base +# Paketçi: Cihan_Alkan +# Gerekler: python +# Grup: sistem + + +isim=9base +surum=6 +devir=1 +kaynak=(http://dl.suckless.org/tools/$isim-$surum.tar.gz + 9 + plan9.sh) + +derle() { + + cd $isim-$surum + sed -i 's#^OBJTYPE\s.*$#OBJTYPE = x86_64#' config.mk + + sed -i 's#^PREFIX\s.*$#PREFIX = /opt/plan9#' config.mk + sed -i 's#^CFLAGS\s*+=#CFLAGS += -DPLAN9PORT #' config.mk + + # Force dynamic linking. Several of the programs in 9base won't work + # when statically linked against the latest glibc. + sed -i '/-static/d' config.mk + + make + + make DESTDIR="$PKG" install + install -m755 ../9 "$PKG/opt/plan9/bin/" + install -D -m755 ../plan9.sh "$PKG/etc/profile.d/plan9.sh" + install -D -m644 LICENSE "$PKG/usr/share/licenses/9base/LICENSE" +} diff --git a/talimatname/genel/g/geos/talimat b/talimatname/genel/g/geos/talimat new file mode 100644 index 000000000..2c596cc93 --- /dev/null +++ b/talimatname/genel/g/geos/talimat @@ -0,0 +1,20 @@ +# Tanım: Java Topology Suite'in C++ portu +# URL: http://trac.osgeo.org/geos/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: geliştirme + +isim=geos +surum=3.6.2 +devir=1 + +kaynak=(http://download.osgeo.org/$isim/$isim-$surum.tar.bz2) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/g/gnet/talimat b/talimatname/genel/g/gnet/talimat new file mode 100644 index 000000000..2268de3a1 --- /dev/null +++ b/talimatname/genel/g/gnet/talimat @@ -0,0 +1,18 @@ +# Tanım: Basit bir ağ küt/üphanesi +# URL: http://live.gnome.org/GNetLibrary +# Paketçi: milisarge +# Gerekler: glib +# Grup: kütüphane + +isim=gnet +surum=2.0.8 +devir=1 +kaynak=(http://ftp.gnome.org/pub/GNOME/sources/gnet/${surum%.*}/gnet-2.0.8.tar.bz2) + +derle() { + cd ${isim}-${surum} + LIBS+="-lglib-2.0" ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/g/gocr/talimat b/talimatname/genel/g/gocr/talimat new file mode 100644 index 000000000..0ccdef7c2 --- /dev/null +++ b/talimatname/genel/g/gocr/talimat @@ -0,0 +1,26 @@ +# Tanım: Açık kaynaklı karakter tanıma (OCR) +# URL: http://jocr.sourceforge.net/index.html +# Paketçi: Cihan_Alkan +# Gerekler: netpbm +# Grup: ofis_düzenleyici + +isim=gocr +surum=0.51 +devir=1 +kaynak=(https://www-e.uni-magdeburg.de/jschulen/ocr/gocr-${surum}.tar.gz) + +derle() { + + cd "$SRC"/$isim-$surum + export CFLAGS=-fPIC + ./configure --prefix=/usr --mandir=/usr/share/man --libdir=/usr/lib + make -j1 all libs + + mkdir -p "$PKG"/usr/lib + make DESTDIR="$PKG" libdir=/usr/lib/ bindir=/usr/bin install + (cd "$PKG"/usr/lib/ && rm -f libPgm2asc.so && ln -s `echo libPgm2asc*.so` libPgm2asc.so) + install -D -m644 doc/gocr.html "$PKG"/usr/share/doc/gocr/gocr.html + for i in pgm2asc.h gocr.h; do + install -D -m644 src/$i "$PKG"/usr/include/gocr/$i + done +} diff --git a/talimatname/genel/g/goocanvas/talimat b/talimatname/genel/g/goocanvas/talimat new file mode 100644 index 000000000..b4c7bddae --- /dev/null +++ b/talimatname/genel/g/goocanvas/talimat @@ -0,0 +1,30 @@ +# Tanım: GTK + için bir cairo canvas widget'ı +# URL: https://wiki.gnome.org/Projects/GooCanvas +# Paketçi: Cihan_Alkan +# Gerekler: gobject-introspection python-gobject python3-gobject cairo glib2 gtk3 +# Grup: kütüphane + +isim=goocanvas +surum=2.0.4 +devir=1 +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + + cp -r $isim-$surum python2 + + cd $isim-$surum + ./configure --prefix=/usr PYTHON=python3 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + + cd "$SRC/python2" + ./configure --prefix=/usr PYTHON=python + + cd $SRC/$isim-$surum + make DESTDIR="$PKG" install + + cd "$SRC/python2" + make -C bindings/python DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/g/gpicview/0001-Fix-displaying-images-with-GTK3.patch b/talimatname/genel/g/gpicview/0001-Fix-displaying-images-with-GTK3.patch new file mode 100644 index 000000000..f82c5c1ce --- /dev/null +++ b/talimatname/genel/g/gpicview/0001-Fix-displaying-images-with-GTK3.patch @@ -0,0 +1,173 @@ +From 2a497a06d9297712778b9bfde3f21a2bd867967c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= +Date: Tue, 21 Feb 2017 01:06:06 +0100 +Subject: [PATCH] Fix displaying images with GTK3 + +We have to use the cairo context provided by the draw event, otherwise the scrolling does not work properly. + +Don't paint the whole image when scale == 1, it's unneeded and slow. +--- + src/image-view.c | 86 +++++++++++++++++++++++++++++--------------------------- + 1 file changed, 44 insertions(+), 42 deletions(-) + +diff --git a/src/image-view.c b/src/image-view.c +index b367f2a..820b843 100644 +--- a/src/image-view.c ++++ b/src/image-view.c +@@ -24,11 +24,10 @@ + static void image_view_finalize(GObject *iv); + + static void image_view_clear( ImageView* iv ); +-static gboolean on_idle( ImageView* iv ); + static void calc_image_area( ImageView* iv ); +-static void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ); + + #if GTK_CHECK_VERSION(3, 0, 0) ++static void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type, cairo_t* cr ); + + static void image_view_paint( ImageView* iv, cairo_t* cr ); + +@@ -37,6 +36,8 @@ static void on_get_preferred_height( GtkWidget* widget, gint* minimal_height, gi + static gboolean on_draw_event(GtkWidget* widget, cairo_t* cr); + + #else // GTK2 ++static gboolean on_idle( ImageView* iv ); ++static void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ); + + static void image_view_paint( ImageView* iv, GdkEventExpose* evt ); + +@@ -268,16 +269,13 @@ void image_view_paint( ImageView* iv, cairo_t *cr ) + { + cairo_rectangle_int_t rectangle; + cairo_region_get_rectangle(region, i, &rectangle); +- paint( iv, &rectangle, GDK_INTERP_NEAREST ); ++ paint( iv, &rectangle, GDK_INTERP_NEAREST, cr ); + } + + cairo_region_destroy (region); +- +- if( 0 == iv->idle_handler ) +- iv->idle_handler = g_idle_add( (GSourceFunc)on_idle, iv ); + } + } +-#else ++#else // GTK2 + + gboolean on_expose_event( GtkWidget* widget, GdkEventExpose* evt ) + { +@@ -390,6 +388,8 @@ void image_view_set_scale( ImageView* iv, gdouble new_scale, GdkInterpType type + } + } + ++#if GTK_CHECK_VERSION(3, 0, 0) ++#else // GTK2 + gboolean on_idle( ImageView* iv ) + { + GDK_THREADS_ENTER(); +@@ -435,6 +435,7 @@ gboolean on_idle( ImageView* iv ) + iv->idle_handler = 0; + return FALSE; + } ++#endif + + void calc_image_area( ImageView* iv ) + { +@@ -460,7 +461,11 @@ void calc_image_area( ImageView* iv ) + } + } + ++#if GTK_CHECK_VERSION(3, 0, 0) ++void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type, cairo_t* cr ) ++#else // GTK2 + void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ) ++#endif + { + GdkRectangle rect; + if( ! gdk_rectangle_intersect( invalid_rect, &iv->img_area, &rect ) ) +@@ -470,51 +475,48 @@ void paint( ImageView* iv, GdkRectangle* invalid_rect, GdkInterpType type ) + int dest_y; + + GdkPixbuf* src_pix = NULL; +- if( iv->scale == 1.0 ) // original size +- { +- src_pix = (GdkPixbuf*)g_object_ref( iv->pix ); +- dest_x = iv->img_area.x; +- dest_y = iv->img_area.y; +- } +- else // scaling is needed ++ GdkPixbuf* scaled_pix = NULL; ++ ++ dest_x = rect.x; ++ dest_y = rect.y; ++ ++ rect.x -= iv->img_area.x; ++ rect.y -= iv->img_area.y; ++ ++ int src_x = (int)floor( ((gdouble)rect.x) / iv->scale + 0.5 ); ++ int src_y = (int)floor( ((gdouble)rect.y) / iv->scale + 0.5 ); ++ int src_w = (int)floor( ((gdouble)rect.width) / iv->scale + 0.5 ); ++ int src_h = (int)floor( ((gdouble)rect.height) / iv->scale + 0.5 ); ++ if( src_y > gdk_pixbuf_get_height( iv->pix ) ) ++ src_y = gdk_pixbuf_get_height( iv->pix ); ++ if( src_x + src_w > gdk_pixbuf_get_width( iv->pix ) ) ++ src_w = gdk_pixbuf_get_width( iv->pix ) - src_x; ++ if( src_y + src_h > gdk_pixbuf_get_height( iv->pix ) ) ++ src_h = gdk_pixbuf_get_height( iv->pix ) - src_y; ++ //g_debug("orig src: x=%d, y=%d, w=%d, h=%d", ++ // src_x, src_y, src_w, src_h ); ++ ++ if ((src_w > 0) && (src_h > 0)) + { +- dest_x = rect.x; +- dest_y = rect.y; +- +- rect.x -= iv->img_area.x; +- rect.y -= iv->img_area.y; +- +- GdkPixbuf* scaled_pix = NULL; +- int src_x = (int)floor( ((gdouble)rect.x) / iv->scale + 0.5 ); +- int src_y = (int)floor( ((gdouble)rect.y) / iv->scale + 0.5 ); +- int src_w = (int)floor( ((gdouble)rect.width) / iv->scale + 0.5 ); +- int src_h = (int)floor( ((gdouble)rect.height) / iv->scale + 0.5 ); +- if( src_y > gdk_pixbuf_get_height( iv->pix ) ) +- src_y = gdk_pixbuf_get_height( iv->pix ); +- if( src_x + src_w > gdk_pixbuf_get_width( iv->pix ) ) +- src_w = gdk_pixbuf_get_width( iv->pix ) - src_x; +- if( src_y + src_h > gdk_pixbuf_get_height( iv->pix ) ) +- src_h = gdk_pixbuf_get_height( iv->pix ) - src_y; +- //g_debug("orig src: x=%d, y=%d, w=%d, h=%d", +- // src_x, src_y, src_w, src_h ); +- +- if ((src_w > 0) && (src_h > 0)) +- { +- src_pix = gdk_pixbuf_new_subpixbuf( iv->pix, src_x, src_y, src_w, src_h ); +- scaled_pix = gdk_pixbuf_scale_simple( src_pix, rect.width, rect.height, type ); +- g_object_unref( src_pix ); +- src_pix = scaled_pix; +- } +- ++ src_pix = gdk_pixbuf_new_subpixbuf( iv->pix, src_x, src_y, src_w, src_h ); ++ scaled_pix = gdk_pixbuf_scale_simple( src_pix, rect.width, rect.height, type ); ++ g_object_unref( src_pix ); ++ src_pix = scaled_pix; + } + + if( G_LIKELY(src_pix) ) + { + GtkWidget* widget = (GtkWidget*)iv; ++#if GTK_CHECK_VERSION(3, 0, 0) ++#else // GTK2 + cairo_t *cr = gdk_cairo_create (gtk_widget_get_window(widget)); ++#endif + gdk_cairo_set_source_pixbuf (cr, src_pix, dest_x, dest_y); + cairo_paint (cr); ++#if GTK_CHECK_VERSION(3, 0, 0) ++#else // GTK2 + cairo_destroy (cr); ++#endif + + g_object_unref( src_pix ); + } +-- +2.11.1 + diff --git a/talimatname/genel/g/gpicview/talimat b/talimatname/genel/g/gpicview/talimat new file mode 100644 index 000000000..3e0691092 --- /dev/null +++ b/talimatname/genel/g/gpicview/talimat @@ -0,0 +1,27 @@ +# Tanım: Hafif resim görüntüleyici +# URL: https://lxde.org/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk3 intltool +# Grup: medya + +isim=gpicview +surum=0.2.5 +devir=1 +kaynak=(https://downloads.sourceforge.net/lxde/$isim-$surum.tar.xz + 0001-Fix-displaying-images-with-GTK3.patch) + +derle() { + + cd $isim-$surum + + # Fix displaying images with GTK3 + # https://sourceforge.net/p/lxde/patches/542/ + patch -Np1 -i ../0001-Fix-displaying-images-with-GTK3.patch + + # Apply only one main category + sed -i '/^Categories=/ s/Utility;//' gpicview.desktop.in + + ./configure --sysconfdir=/etc --prefix=/usr --enable-gtk3 + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/g/gradle/gradle.sh b/talimatname/genel/g/gradle/gradle.sh new file mode 100644 index 000000000..dc03c9ad2 --- /dev/null +++ b/talimatname/genel/g/gradle/gradle.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +export GRADLE_HOME=/usr/share/java/gradle diff --git a/talimatname/genel/g/gradle/talimat b/talimatname/genel/g/gradle/talimat new file mode 100644 index 000000000..a0c3b29c2 --- /dev/null +++ b/talimatname/genel/g/gradle/talimat @@ -0,0 +1,49 @@ +# Tanım: JVM için güçlü yapı sistemi +# URL: https://gradle.org/ +# Paketçi: Cihan_Alkan +# Gerekler: openjdk +# Grup: geliştirme + +isim=gradle +surum=4.4.1 +devir=1 +kaynak=(https://services.gradle.org/distributions/${isim}-${surum}-all.zip + $isim.sh) +derle() { + + cd ${isim}-${surum} + + # install profile.d script + install -Dm 755 "${SRC}/${isim}.sh" "${PKG}/etc/profile.d/${isim}.sh" + + # create the necessary directory structure + install -d "${PKG}/usr/share/java/${isim}/bin" + install -d "${PKG}/usr/share/java/${isim}/lib/plugins" + install -d "${PKG}/usr/share/java/${isim}/init.d" + install -d "${PKG}/usr/bin" + + # copy across jar files + install -Dm 644 lib/*.jar "${PKG}/usr/share/java/${isim}/lib" + install -Dm 644 lib/plugins/*.jar "${PKG}/usr/share/java/${isim}/lib/plugins" + + # copy across supporting text documentation and scripts + install -m 644 NOTICE "${PKG}/usr/share/java/${isim}" + install -m 644 LICENSE "${PKG}/usr/share/java/${isim}" + install -m 644 *.html "${PKG}/usr/share/java/${isim}" + install -m 755 bin/gradle "${PKG}/usr/share/java/${isim}/bin" + install -m 644 init.d/*.* "${PKG}/usr/share/java/${isim}/init.d" + + # link gradle script to /usr/bin + ln -s /usr/share/java/${isim}/bin/${isim} "${PKG}/usr/bin" + + # create the necessary directory structure + install -d "${PKG}/usr/share/java/gradle/docs" + install -d "${PKG}/usr/share/java/gradle/samples" + + # copy across documentation and samples + cp -r docs/* "${PKG}/usr/share/java/gradle/docs" + cp -r samples/* "${PKG}/usr/share/java/gradle/samples" + + install -d "${PKG}/usr/share/java/gradle/src" + cp -r src/* "${PKG}/usr/share/java/gradle/src" +} diff --git a/talimatname/genel/g/gssdp/talimat b/talimatname/genel/g/gssdp/talimat new file mode 100755 index 000000000..bbea82d31 --- /dev/null +++ b/talimatname/genel/g/gssdp/talimat @@ -0,0 +1,17 @@ +# Tanım: SSDP üzerinden kaynak keşif ve duyurunun taşınması için bir GObject tabanlı API +# URL: http://gupnp.org/ +# Paketçi: milisarge +# Gerekler: libsoup + +isim=gssdp +surum=0.14.11 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/${isim}/${version:0:4}/${isim}-${surum}.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-bad/gstreamer-plugins-bad-0.10.23-compatibility-1.patch b/talimatname/genel/g/gstreamer-plugins-bad/gstreamer-plugins-bad-0.10.23-compatibility-1.patch new file mode 100644 index 000000000..f885cee30 --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-bad/gstreamer-plugins-bad-0.10.23-compatibility-1.patch @@ -0,0 +1,29 @@ +--- a/ext/vp8/gstvp8utils.h ++++ b/ext/vp8/gstvp8utils.h +@@ -25,23 +25,6 @@ + + G_BEGIN_DECLS + +-/* Some compatibility defines for older libvpx versions */ +-#ifndef VPX_IMG_FMT_I420 +-#define VPX_IMG_FMT_I420 IMG_FMT_I420 +-#endif +- +-#ifndef VPX_PLANE_Y +-#define VPX_PLANE_Y PLANE_Y +-#endif +- +-#ifndef VPX_PLANE_U +-#define VPX_PLANE_U PLANE_U +-#endif +- +-#ifndef VPX_PLANE_V +-#define VPX_PLANE_V PLANE_V +-#endif +- + const char * gst_vpx_error_name (vpx_codec_err_t status); + + G_END_DECLS +-- +2.1.2 + diff --git a/talimatname/genel/g/gstreamer-plugins-bad/talimat b/talimatname/genel/g/gstreamer-plugins-bad/talimat new file mode 100644 index 000000000..22ee1d414 --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-bad/talimat @@ -0,0 +1,24 @@ +# Tanım: GStreamer Bad Plug-ins, diğerlerine kıyasla eşit olmayan bir dizi eklentidir. +# URL: https://gstreamer.freedesktop.org/modules/gst-plugins-bad.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer-plugins-base faac faad2 libmms libpng libvpx xvid jasper + +isim=gstreamer-plugins-bad +surum=0.10.23 +devir=1 +_isim=gst-plugins-bad +kaynak=(http://gstreamer.freedesktop.org/src/$_name/$_name-$surum.tar.bz2 + $isim-$surum-compatibility-1.patch) + +derle() { +cd $_name-$surum +patch -Np1 -i ../$isim-$surum-compatibility-1.patch +./configure --prefix=/usr \ +--with-gtk=3.0 \ +--disable-examples \ +--with-package-isim='Milis gstreamer-plugins-bad package' \ +--with-package-origin='https://milis.gungre.ch/' + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-base/talimat b/talimatname/genel/g/gstreamer-plugins-base/talimat new file mode 100644 index 000000000..376003404 --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-base/talimat @@ -0,0 +1,22 @@ +# Tanım: GStreamer multimedya çerçevesi taban eklentileri +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-base.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer alsa-lib pango cdparanoia libogg libtheora libvorbis xorg-libxv xorg-libxcursor xorg-libxdamage xorg-libxrandr xorg-libxinerama + +isim=gstreamer-plugins-base +surum=0.10.36 +devir=1 +_isim=gst-plugins-base +kaynak=(https://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz + http://www.linuxfromscratch.org/patches/downloads/gst-plugins-base/gst-plugins-base-0.10.36-gcc_4_9_0_i686-1.patch) + +derle() { +cd ${_name}-$surum +[ "`uname -m`" == "i686" ] && patch -Np1 -i ../gst-plugins-base-0.10.36-gcc_4_9_0_i686-1.patch +./configure --prefix=/usr \ +--with-package-isim='Milis gstreamer-plugins-base package' \ +--with-package-origin='https://milis.gungre.ch/' + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-ffmpeg/talimat b/talimatname/genel/g/gstreamer-plugins-ffmpeg/talimat new file mode 100644 index 000000000..dd2d1f15d --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-ffmpeg/talimat @@ -0,0 +1,28 @@ +# Tanım: GStreamer multimedya çerçevesi ffmpeg eklentileri +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-base.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer gstreamer-plugins-base yasm sdl + +isim=gstreamer-plugins-ffmpeg +surum=0.10.13 +devir=1 +_isim=gst-ffmpeg +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.bz2 + http://downloads.nutyx.org/files/patchs/$isim/h264_qpel_mmx.patch) + +derle() { +unset CFLAGS +unset CXXFLAGS + +cd ${_name}-$surum +patch -Np1 -i ../h264_qpel_mmx.patch +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--localstatedir=/var \ +--with-ffmpeg-extra-configure="--enable-runtime-cpudetect" \ +--with-package-isim='PisiLinux gstreamer-ffmpeg package' \ +--with-package-origin='https://milis.gungre.ch/' + +make || make -j1 +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-good/talimat b/talimatname/genel/g/gstreamer-plugins-good/talimat new file mode 100644 index 000000000..17aba674e --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-good/talimat @@ -0,0 +1,23 @@ +# Tanım: GStreamer İyi Eklentileri, kaliteli kod, doğru işlevsellik ve tercih edilen lisansımız (eklenti kodu için LGPL, destekleyici kitaplık için LGPL veya LGPL uyumlu) olması düşünülen eklentiler dizisidir. +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-good.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer-plugins-base cairo flac libjpeg-turbo libpng xorg-libx11 libsoup speex aalib taglib libcdio + +isim=gstreamer-plugins-good +surum=0.10.31 +devir=1 +_isim=gst-plugins-good +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +sed -i -e '/input:/d' sys/v4l2/gstv4l2bufferpool.c +sed -i -e "/case V4L2_CID_HCENTER/d" -e "/case V4L2_CID_VCENTER/d" sys/v4l2/v4l2_calls.c +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --with-gtk=3.0 \ + --with-package-isim='Milis gstreamer-plugins-good package' \ + --with-package-origin='https://milis.gungre.ch/' +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-python/talimat b/talimatname/genel/g/gstreamer-plugins-python/talimat new file mode 100644 index 000000000..e91b0f7e7 --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-python/talimat @@ -0,0 +1,18 @@ +# Tanım: GStreamer multimedya çerçevesi python eklentileri +# URL: http://gstreamer.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: gstreamer gstreamer-plugins-base python-gobject2 + +isim=gstreamer-plugins-python +surum=0.10.22 +devir=1 +_isim=gst-python +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer-plugins-ugly/talimat b/talimatname/genel/g/gstreamer-plugins-ugly/talimat new file mode 100644 index 000000000..9eb3387e8 --- /dev/null +++ b/talimatname/genel/g/gstreamer-plugins-ugly/talimat @@ -0,0 +1,22 @@ +# Tanım: GStreamer Çirkin Eklentileri, kaliteli ve doğru işlevsellikleri olan bir takım eklentilerdir ancak bunları dağıtmak sorun yaratabilir. +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-ugly.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer-plugins-base lame libdvdnav libdvdread libdvdcss liba52 libmad libmpeg2 + +isim=gstreamer-plugins-ugly +surum=0.10.19 +devir=1 +_isim=gst-plugins-ugly +kaynak=( http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz + http://www.linuxfromscratch.org/patches/downloads/gst-plugins-ugly/gst-plugins-ugly-$surum-libcdio_fixes-1.patch ) + +derle() { + cd ${_name}-$surum + patch -Np1 -i ../gst-plugins-ugly-$surum-libcdio_fixes-1.patch + ./configure --prefix=/usr \ + --with-package-isim="Milis gstreamer-plugins-ugly" \ + --with-package-origin="https://milis.gungre.ch/" + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer/talimat b/talimatname/genel/g/gstreamer/talimat new file mode 100644 index 000000000..e1f62cd41 --- /dev/null +++ b/talimatname/genel/g/gstreamer/talimat @@ -0,0 +1,25 @@ +# Tanım: GStreamer ana kütüphanedir. Başlıkları, temel kitaplık dosyalarını ve temel öğeleri içerir. +# URL: https://gstreamer.freedesktop.org/modules/gstreamer.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: glib libxml2 gsl gobject-introspection + +isim=gstreamer +surum=0.10.36 +devir=1 +kaynak=(http://gstreamer.freedesktop.org/src/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +sed -i -e '/YYLEX_PARAM/d' \ + -e '/parse-param.*scanner/i %lex-param { void *scanner }' \ + gst/parse/grammar.y + +./configure --prefix=/usr \ +--disable-static \ +--with-package-isim="GStreamer for Milis" \ +--with-package-origin="https://milis.gungre.ch/" \ + +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/g/gstreamer1-plugins-bad/talimat b/talimatname/genel/g/gstreamer1-plugins-bad/talimat new file mode 100644 index 000000000..36d6a095c --- /dev/null +++ b/talimatname/genel/g/gstreamer1-plugins-bad/talimat @@ -0,0 +1,20 @@ +# Tanım: GStreamer Bad Plug-ins, diğerlerine kıyasla eşit olmayan bir dizi eklentidir. +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-bad.html +# Paketçi: milisarge +# Gerekler: gstreamer1-plugins-base libdvdread libdvdnav faac faad2 libexif libmpeg2 mpg123 + +isim=gstreamer1-plugins-bad +surum=1.6.3 +devir=1 +_isim=gst-plugins-bad +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz ) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--with-package-isim="Gstreamer Plugins Bad for Milis" \ +--with-package-origin="https://milis.gungre.ch/" + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer1-plugins-base/talimat b/talimatname/genel/g/gstreamer1-plugins-base/talimat new file mode 100644 index 000000000..fab27b613 --- /dev/null +++ b/talimatname/genel/g/gstreamer1-plugins-base/talimat @@ -0,0 +1,20 @@ +# Tanım: GStreamer multimedya çerçevesi taban eklentileri +# URL: http://gstreamer.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer1 alsa-lib gobject-introspection iso-codes libtheora libvorbis pango + +isim=gstreamer1-plugins-base +surum=1.6.3 +devir=1 +_isim=gst-plugins-base +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--with-package-isim="GStreamer Base Plugins for Milis" \ +--with-package-origin="https://milis.gungre.ch/" + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer1-plugins-good/talimat b/talimatname/genel/g/gstreamer1-plugins-good/talimat new file mode 100644 index 000000000..154b44005 --- /dev/null +++ b/talimatname/genel/g/gstreamer1-plugins-good/talimat @@ -0,0 +1,20 @@ +# Tanım: GStreamer İyi Eklentileri, kaliteli kod, doğru işlevsellik ve tercih edilen lisansımız (eklenti kodu için LGPL, destekleyici kitaplık için LGPL veya LGPL uyumlu) olması düşünülen eklentiler dizisidir. +# URL: http://gstreamer.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: gstreamer1-plugins-base flac gdk-pixbuf libjpeg-turbo libpng libsoup libvpx + +isim=gstreamer1-plugins-good +surum=1.6.3 +devir=1 +_isim=gst-plugins-good +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--with-package-isim="GStreamer Good Plugins Milis" \ +--with-package-origin="https://milis.gungre.ch/" + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer1-plugins-libav/talimat b/talimatname/genel/g/gstreamer1-plugins-libav/talimat new file mode 100644 index 000000000..699f4151b --- /dev/null +++ b/talimatname/genel/g/gstreamer1-plugins-libav/talimat @@ -0,0 +1,20 @@ +# Tanım: Birçok kod çözücü ve kodlayıcı içeren Libav tabanlı eklenti +# URL: http://gstreamer.freedesktop.org/modules/gst-libav.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gstreamer1-plugins-base yasm + +isim=gstreamer1-plugins-libav +surum=1.6.3 +devir=1 +_isim=gst-libav +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz ) + +derle() { +cd ${_name}-$surum + +./configure --prefix=/usr \ +--with-package-isim="GStreamer Libav Plugins Milis" \ +--with-package-origin="https://milis.gungre.ch/" +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer1-plugins-ugly/talimat b/talimatname/genel/g/gstreamer1-plugins-ugly/talimat new file mode 100644 index 000000000..bf7cbfaaa --- /dev/null +++ b/talimatname/genel/g/gstreamer1-plugins-ugly/talimat @@ -0,0 +1,21 @@ +# Tanım: GStreamer Çirkin Eklentileri, kaliteli ve doğru işlevsellikleri olan bir takım eklentilerdir ancak bunları dağıtmak sorun yaratabilir. +# URL: http://gstreamer.freedesktop.org/modules/gst-plugins-ugly.html +# Paketçi: milisarge +# Gerekler: gstreamer1-plugins-base lame libdvdread liba52 libmad libmpeg2 + +isim=gstreamer1-plugins-ugly +surum=1.6.3 +devir=1 +_isim=gst-plugins-ugly +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz ) + +derle() { +cd ${_name}-$surum + +./configure --prefix=/usr \ +--with-package-isim="GStreamer Ugly Plugins Milis" \ +--with-package-origin="https://milis.gungre.ch/" + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gstreamer1/talimat b/talimatname/genel/g/gstreamer1/talimat new file mode 100644 index 000000000..75c58ea54 --- /dev/null +++ b/talimatname/genel/g/gstreamer1/talimat @@ -0,0 +1,20 @@ +# Tanım: GStreamer ana kütüphanedir. Başlıkları, temel kitaplık dosyalarını ve temel öğeleri içerir. +# URL: http://gstreamer.freedesktop.org/ +# Paketçi: alihan-ozturk8@hotmail.com +# Gerekler: glib libxml2 gsl gobject-introspection + +isim=gstreamer1 +surum=1.6.3 +devir=1 +_isim=gstreamer +kaynak=(http://gstreamer.freedesktop.org/src/${_name}/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--with-package-isim="GStreamer for Milis" \ +--with-package-origin="https://milis.gungre.ch/" + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtest/talimat b/talimatname/genel/g/gtest/talimat new file mode 100644 index 000000000..55eedd219 --- /dev/null +++ b/talimatname/genel/g/gtest/talimat @@ -0,0 +1,28 @@ +# Tanım: Google Test - xUnit çerçevesine dayalı (JUnit gibi) C ++ test yardımcı programı +# URL: http://code.google.com/p/googletest +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake + +isim=gtest +surum=1.7.0 +devir=1 +kaynak=(http://googletest.googlecode.com/files/$isim-$surum.zip) + +derle() { + cd $isim-$surum + mkdir build + cd build + + cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_SKIP_RPATH=ON .. + make + + cd $SRC/$isim-$surum + mkdir -pm 0755 $PKG/usr/{lib,include/gtest/internal,share/licenses/$isim,src/gtest/src,src/gtest/cmake} + install -m 0644 build/libgtest{,_main}.so $PKG/usr/lib + install -m 0644 include/gtest/*.h $PKG/usr/include/gtest + install -m 0644 include/gtest/internal/*.h $PKG/usr/include/gtest/internal/ + install -m 0644 LICENSE $PKG/usr/share/licenses/$isim/ + install -m 0644 fused-src/gtest/* $PKG/usr/src/gtest/src/ + install -m 0644 CMakeLists.txt $PKG/usr/src/gtest/ + install -m 0644 cmake/* $PKG/usr/src/gtest/cmake/ +} diff --git a/talimatname/genel/g/gthumb/gthumb.kur-kos b/talimatname/genel/g/gthumb/gthumb.kur-kos new file mode 100644 index 000000000..6ba5ccf8f --- /dev/null +++ b/talimatname/genel/g/gthumb/gthumb.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/g/gthumb/talimat b/talimatname/genel/g/gthumb/talimat new file mode 100644 index 000000000..725c82c81 --- /dev/null +++ b/talimatname/genel/g/gthumb/talimat @@ -0,0 +1,24 @@ +# Tanım: GNOME Masaüstü için resim tarayıcı ve görüntüleyici +# URL: https://wiki.gnome.org/Apps/gthumb +# Paketçi: Cihan_Alkan +# Gerekler: dconf librsvg clutter-gtk gstreamer-plugins-base gsettings-desktop-schemas libwebp libsecret libsoup webkit2gtk3 json-glib intltool libchamplain exiv2 itstool brasero libraw liboauth docbook-xsl yelp flex gnome-common +# Grup: + +isim=gthumb +surum=3.6.0 +devir=1 +kaynak=(https://git.gnome.org/browse/gthumb/snapshot/gthumb-3.6.0.tar.xz) + +derle() { + + cd $isim-$surum + NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var --disable-static \ + --enable-libchamplain + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + + make DESTDIR="$PKG" install +} + diff --git a/talimatname/genel/g/gtk-doc/talimat b/talimatname/genel/g/gtk-doc/talimat new file mode 100644 index 000000000..d28fbe2f6 --- /dev/null +++ b/talimatname/genel/g/gtk-doc/talimat @@ -0,0 +1,16 @@ +# Tanım: GTK-Doc, C koduna eklenen yorumlardan API dokümantasyonu üretmeye başlayan bir projedir. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: docbook-xml docbook-xsl itstool libxslt + +isim=gtk-doc +surum=1.25 +devir=1 +kaynak=( http://ftp.gnome.org/pub/gnome/sources/$isim/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtk-engine-murrine/talimat b/talimatname/genel/g/gtk-engine-murrine/talimat new file mode 100644 index 000000000..86a68c008 --- /dev/null +++ b/talimatname/genel/g/gtk-engine-murrine/talimat @@ -0,0 +1,21 @@ +# Tanım: Cairo tabanlı GTK tema motoru +# URL: https://launchpad.net/murrine +# Paketçi: milisarge +# Gerekler: gtk2 intltool + +isim=gtk-engine-murrine +surum=0.98.2 +devir=1 +kaynak=(http://ftp.gnome.org/pub/GNOME/sources/murrine/${version::4}/murrine-$surum.tar.xz) + +derle() { + cd murrine-$surum + + ./configure \ + --prefix=/usr \ + --enable-animation \ + --enable-animationrtl + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtk-engines/talimat b/talimatname/genel/g/gtk-engines/talimat new file mode 100644 index 000000000..7dbea9895 --- /dev/null +++ b/talimatname/genel/g/gtk-engines/talimat @@ -0,0 +1,21 @@ +# Tanım: GTK-engines paketi, sekiz tema / motor ve GTK2 için iki ilave motor içerir. +# URL: http://ftp.gnome.org/pub/gnome/sources/gtk-engines +# Paketçi: milisarge +# Gerekler: gtk2 lua + +isim=gtk-engines +surum=2.20.2 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gtk-engines/2.20/$isim-$surum.tar.bz2) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr + + make + + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/g/gtk-gnutella/talimat b/talimatname/genel/g/gtk-gnutella/talimat new file mode 100644 index 000000000..e6f25e679 --- /dev/null +++ b/talimatname/genel/g/gtk-gnutella/talimat @@ -0,0 +1,15 @@ +# Tanım: Bir Gnutella sunucu / istemci +# URL: http://gtk-gnutella.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: desktop-file-utils gtk2 + +isim=gtk-gnutella +surum=devel +devir=1 +kaynak=(https://github.com/gtk-gnutella/gtk-gnutella/archive/$surum.tar.gz) + +derle() { + cd gtk-gnutella-devel + ./build.sh --prefix=/usr --enable-halloc --gtk2 + make install INSTALL_PREFIX=$PKG/ +} diff --git a/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.desktop b/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.desktop new file mode 100644 index 000000000..df3d05dee --- /dev/null +++ b/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Tema Ayarları +GenericName=Tema Ayarları +Comment=GTK tema renklerini yapılandırma +Exec=gtk-theme-config +Terminal=false +Type=Application +Icon=gtk-theme-config +Categories=GNOME;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-PersonalSettings; +Keywords=color;gtk;highlight;theme;widget; diff --git a/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.vala b/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.vala new file mode 100644 index 000000000..3a58a6045 --- /dev/null +++ b/talimatname/genel/g/gtk-theme-config/gtk-theme-config-tr.vala @@ -0,0 +1,724 @@ +using Gtk; + +class ThemeConfigWindow : ApplicationWindow { + Label selectbg_label; + Label selectfg_label; + + ColorButton selectbg_button; + ColorButton selectfg_button; + ColorButton panelbg_button; + ColorButton panelfg_button; + ColorButton menubg_button; + ColorButton menufg_button; + + Switch select_switch; + Switch panel_switch; + Switch menu_switch; + + Button revert_button; + Button apply_button; + + Gdk.RGBA color_rgb; + + File config_dir; + File home_dir; + + File gtk3_config_file; + File gtk2_config_file; + + File theme_path; + + string color_hex; + + string color_scheme; + + string selectbg_value; + string selectfg_value; + string panelbg_value; + string panelfg_value; + string menubg_value; + string menufg_value; + + internal ThemeConfigWindow (ThemeConfigApp app) { + Object (application: app, title: "Tema Yapılandırması"); + + // Set window properties + this.window_position = WindowPosition.CENTER; + this.resizable = false; + this.border_width = 10; + + // Set window icon + try { + this.icon = IconTheme.get_default ().load_icon ("gtk-theme-config", 48, 0); + } catch (Error e) { + stderr.printf ("Uygulama simgesi yüklenemedi: %s\n", e.message); + } + + // Methods + create_widgets (); + connect_signals (); + } + + void set_values () { + + // Set default values + selectbg_value = "#398ee7"; + selectfg_value = "#eeeeee"; + panelbg_value = "#cccccc"; + panelfg_value = "#333333"; + menubg_value = "#eeeeee"; + menufg_value = "#333333"; + + select_switch.set_active (false); + panel_switch.set_active (false); + menu_switch.set_active (false); + + // Read the current values + var settings = new GLib.Settings ("org.gnome.desktop.interface"); + var color_scheme = settings.get_string ("gtk-color-scheme"); + var theme_name = settings.get_string ("gtk-theme"); + + // Set paths of config files + config_dir = File.new_for_path (Environment.get_user_config_dir ()); + home_dir = File.new_for_path (Environment.get_home_dir ()); + + gtk3_config_file = config_dir.get_child ("gtk-3.0").get_child ("gtk.css"); + + gtk2_config_file = home_dir.get_child (".gtkrc-2.0"); + + // Create path if doesn't exist + if (!gtk3_config_file.get_parent().query_exists ()) { + try { + gtk3_config_file.get_parent().make_directory_with_parents(null); + } catch (Error e) { + stderr.printf ("Üst dizin oluşturulamadı: %s\n", e.message); + } + } + + // Detect current theme path + if (gtk3_config_file.query_exists ()) { + theme_path = gtk3_config_file; + } else if (home_dir.get_child (".themes/%s/gtk-3.0/gtk-main.css".printf (theme_name)).query_exists ()) { + theme_path = home_dir.get_child (".themes/%s/gtk-3.0/gtk-main.css".printf (theme_name)); + } else if (home_dir.get_child (".themes/%s/gtk-3.0/gtk.css".printf (theme_name)).query_exists ()) { + theme_path = home_dir.get_child (".themes/%s/gtk-3.0/gtk.css".printf (theme_name)); + } else if (File.parse_name ("/usr/share/themes/%s/gtk-3.0/gtk-main.css".printf (theme_name)).query_exists ()) { + theme_path = File.parse_name ("/usr/share/themes/%s/gtk-3.0/gtk-main.css".printf (theme_name)); + } else if (File.parse_name ("/usr/share/themes/%s/gtk-3.0/gtk.css".printf (theme_name)).query_exists ()) { + theme_path = File.parse_name ("/usr/share/themes/%s/gtk-3.0/gtk.css".printf (theme_name)); + } + + // Read the current theme file + try { + var dis = new DataInputStream (theme_path.read ()); + string line; + while ((line = dis.read_line (null)) != null) { + if ("@define-color selected_bg_color" in line) { + selectbg_value = line.substring (32, line.length-33); + if ("@" in selectbg_value) { + selectbg_value = "#398ee7"; + } + } + if ("@define-color selected_fg_color" in line) { + selectfg_value = line.substring (32, line.length-33); + if ("@" in selectfg_value) { + selectfg_value = "#eeeeee"; + } + } + if ("@define-color panel_bg_color" in line) { + panelbg_value = line.substring (29, line.length-30); + if ("@" in panelbg_value) { + panelbg_value = "#cccccc"; + } + } + if ("@define-color panel_fg_color" in line) { + panelfg_value = line.substring (29, line.length-30); + if ("@" in panelfg_value) { + panelfg_value = "#333333"; + } + } + if ("@define-color menu_bg_color" in line) { + menubg_value = line.substring (28, line.length-29); + if ("@" in menubg_value) { + menubg_value = "#eeeeee"; + } + } + if ("@define-color menu_fg_color" in line) { + menufg_value = line.substring (28, line.length-29); + if ("@" in menufg_value) { + menufg_value = "#333333"; + } + } + if ("/* select-on */" in line) { + select_switch.set_active (true); + } + if ("/* panel-on */" in line) { + panel_switch.set_active (true); + } + if ("/* menu-on */" in line) { + menu_switch.set_active (true); + } + } + } catch (Error e) { + stderr.printf ("Kullanıcı teması okunamadı: %s\n", e.message); + } + + // Read the current color scheme + if (";" in color_scheme) { + string[] parts = color_scheme.split_set(";"); + if ("selected_bg_color:#" in parts[0] && "selected_fg_color:#" in parts[1]) { + selectbg_value = parts[0].substring (18, parts[0].length-18); + selectfg_value = parts[1].substring (18, parts[1].length-18); + select_switch.set_active (true); + } + } + + // Set colors + Gdk.RGBA color = Gdk.RGBA (); + color.parse (selectbg_value); + selectbg_button.set_rgba (color); + color.parse (selectfg_value); + selectfg_button.set_rgba (color); + color.parse (panelbg_value); + panelbg_button.set_rgba (color); + color.parse (panelfg_value); + panelfg_button.set_rgba (color); + color.parse (menubg_value); + menubg_button.set_rgba (color); + color.parse (menufg_value); + menufg_button.set_rgba (color); + + apply_button.set_sensitive (false); + } + + void create_widgets () { + // Create and setup widgets + var select_heading = new Label.with_mnemonic ("_Özel vurgu renkleri"); + select_heading.set_use_markup (true); + select_heading.set_halign (Align.START); + var panel_heading = new Label.with_mnemonic ("_Özel panel renkleri/b>"); + panel_heading.set_use_markup (true); + panel_heading.set_halign (Align.START); + var menu_heading = new Label.with_mnemonic ("_Özel menü renkleri"); + menu_heading.set_use_markup (true); + menu_heading.set_halign (Align.START); + + selectbg_label = new Label.with_mnemonic ("_Arka planı vurgulayın"); + selectbg_label.set_halign (Align.START); + selectfg_label = new Label.with_mnemonic ("_Metni vurgulayın"); + selectfg_label.set_halign (Align.START); + var panelbg_label = new Label.with_mnemonic ("_Panel arka planı"); + panelbg_label.set_halign (Align.START); + var panelfg_label = new Label.with_mnemonic ("_Panel metni"); + panelfg_label.set_halign (Align.START); + var menubg_label = new Label.with_mnemonic ("_Menü arkaplanı"); + menubg_label.set_halign (Align.START); + var menufg_label = new Label.with_mnemonic ("_Menü Metni"); + menufg_label.set_halign (Align.START); + + selectbg_button = new ColorButton (); + selectfg_button = new ColorButton (); + panelbg_button = new ColorButton (); + panelfg_button = new ColorButton (); + menubg_button = new ColorButton (); + menufg_button = new ColorButton (); + + select_switch = new Switch (); + select_switch.set_halign (Align.END); + panel_switch = new Switch (); + panel_switch.set_halign (Align.END); + menu_switch = new Switch (); + menu_switch.set_halign (Align.END); + + revert_button = new Button.from_stock(Stock.REVERT_TO_SAVED); + apply_button = new Button.from_stock (Stock.APPLY); + + // Buttons + var buttons = new ButtonBox (Orientation.HORIZONTAL); + buttons.set_layout (ButtonBoxStyle.EDGE); + buttons.add (revert_button); + buttons.add (apply_button); + + // Layout widgets + var grid = new Grid (); + grid.set_column_homogeneous (true); + grid.set_row_homogeneous (true); + grid.set_column_spacing (5); + grid.set_row_spacing (5); + grid.attach (select_heading, 0, 0, 1, 1); + grid.attach_next_to (select_switch, select_heading, PositionType.RIGHT, 1, 1); + grid.attach (selectbg_label, 0, 1, 1, 1); + grid.attach_next_to (selectbg_button, selectbg_label, PositionType.RIGHT, 1, 1); + grid.attach (selectfg_label, 0, 2, 1, 1); + grid.attach_next_to (selectfg_button, selectfg_label, PositionType.RIGHT, 1, 1); + grid.attach (panel_heading, 0, 3, 1, 1); + grid.attach_next_to (panel_switch, panel_heading, PositionType.RIGHT, 1, 1); + grid.attach (panelbg_label, 0, 4, 1, 1); + grid.attach_next_to (panelbg_button, panelbg_label, PositionType.RIGHT, 1, 1); + grid.attach (panelfg_label, 0, 5, 1, 1); + grid.attach_next_to (panelfg_button, panelfg_label, PositionType.RIGHT, 1, 1); + grid.attach (menu_heading, 0, 6, 1, 1); + grid.attach_next_to (menu_switch, menu_heading, PositionType.RIGHT, 1, 1); + grid.attach (menubg_label, 0, 7, 1, 1); + grid.attach_next_to (menubg_button, menubg_label, PositionType.RIGHT, 1, 1); + grid.attach (menufg_label, 0, 8, 1, 1); + grid.attach_next_to (menufg_button, menufg_label, PositionType.RIGHT, 1, 1); + grid.attach (buttons, 0, 9, 2, 1); + + this.add (grid); + + set_values (); + } + + void connect_signals () { + selectbg_button.color_set.connect (() => { + on_selectbg_color_set (); + apply_button.set_sensitive (true); + }); + selectfg_button.color_set.connect (() => { + on_selectfg_color_set (); + apply_button.set_sensitive (true); + }); + panelbg_button.color_set.connect (() => { + on_panelbg_color_set (); + apply_button.set_sensitive (true); + }); + panelfg_button.color_set.connect (() => { + on_panelfg_color_set (); + apply_button.set_sensitive (true); + }); + menubg_button.color_set.connect (() => { + on_menubg_color_set (); + apply_button.set_sensitive (true); + }); + menufg_button.color_set.connect (() => { + on_menufg_color_set (); + apply_button.set_sensitive (true); + }); + select_switch.notify["active"].connect (() => { + apply_button.set_sensitive (true); + }); + panel_switch.notify["active"].connect (() => { + apply_button.set_sensitive (true); + }); + menu_switch.notify["active"].connect (() => { + apply_button.set_sensitive (true); + }); + revert_button.clicked.connect (() => { + on_config_reset (); + revert_button.set_sensitive (false); + }); + apply_button.clicked.connect (() => { + on_config_set (); + apply_button.set_sensitive (false); + revert_button.set_sensitive (true); + }); + } + + void rgb_to_hex () { + int r = (int)Math.round (color_rgb.red * 255); + int g = (int)Math.round (color_rgb.green * 255); + int b = (int)Math.round (color_rgb.blue * 255); + + color_hex = "#%02x%02x%02x".printf (r, g, b); + } + + void on_selectbg_color_set () { + color_rgb = selectbg_button.get_rgba (); + rgb_to_hex (); + selectbg_value = color_hex; + } + + void on_selectfg_color_set () { + color_rgb = selectfg_button.get_rgba (); + rgb_to_hex (); + selectfg_value = color_hex; + } + + void on_panelbg_color_set () { + color_rgb = panelbg_button.get_rgba (); + rgb_to_hex (); + panelbg_value = color_hex; + } + + void on_panelfg_color_set () { + color_rgb = panelfg_button.get_rgba (); + rgb_to_hex (); + panelfg_value = color_hex; + } + + void on_menubg_color_set () { + color_rgb = menubg_button.get_rgba (); + rgb_to_hex (); + menubg_value = color_hex; + } + + void on_menufg_color_set () { + color_rgb = menufg_button.get_rgba (); + rgb_to_hex (); + menufg_value = color_hex; + } + + void on_config_set () { + set_color_scheme (); + write_config (); + notify_change (); + } + + void on_config_reset () { + reset_color_scheme (); + reset_config (); + set_values (); + notify_change (); + } + + void set_color_scheme () { + // Determine color scheme + if (select_switch.get_active()) { + color_scheme = "\"selected_bg_color:%s;selected_fg_color:%s;\"".printf (selectbg_value, selectfg_value); + } else { + color_scheme = "\"\""; + } + + // Set color scheme + try { + Process.spawn_command_line_sync ("gsettings set org.gnome.desktop.interface gtk-color-scheme %s".printf (color_scheme)); + } catch (Error e) { + stderr.printf ("Could not set color scheme for gtk3: %s\n", e.message); + } + try { + Process.spawn_command_line_sync ("gconftool-2 -s /desktop/gnome/interface/gtk_color_scheme -t string %s".printf (color_scheme)); + } catch (Error e) { + stderr.printf ("Could not set color scheme for gtk2: %s\n", e.message); + } + if (File.parse_name ("/usr/bin/xfconf-query").query_exists ()) { + try { + Process.spawn_command_line_sync ("xfconf-query -n -c xsettings -p /Gtk/ColorScheme -t string -s %s".printf (color_scheme)); + } catch (Error e) { + stderr.printf ("Could not set color scheme for xfce: %s\n", e.message); + } + } + } + + void reset_color_scheme () { + try { + Process.spawn_command_line_sync ("gsettings reset org.gnome.desktop.interface gtk-color-scheme"); + } catch (Error e) { + stderr.printf ("CGtk3 için renk düzenini sıfırlayamadı: %s\n", e.message); + } + try { + Process.spawn_command_line_sync ("gconftool-2 -u /desktop/gnome/interface/gtk_color_scheme"); + } catch (Error e) { + stderr.printf ("Gtk2 için renk düzenini sıfırlayamadı: %s\n", e.message); + } + if (File.parse_name ("/usr/bin/xfconf-query").query_exists ()) { + try { + Process.spawn_command_line_sync ("xfconf-query -c xsettings -p /Gtk/ColorScheme -r"); + } catch (Error e) { + stderr.printf ("Cxfce için renk düzenini sıfırlayamadı: %s\n", e.message); + } + } + } + + void reset_config () { + try { + if (gtk3_config_file.query_exists ()) { + gtk3_config_file.delete (); + } + } catch (Error e) { + stderr.printf ("Önceki gtk3 yapılandırması silinemiyor: %s\n", e.message); + } + try { + if (gtk2_config_file.query_exists ()) { + gtk2_config_file.delete (); + } + } catch (Error e) { + stderr.printf ("Önceki gtk2 yapılandırması silinemiyor: %s\n", e.message); + } + } + + void write_config () { + + // Determine states + string select_state1; + string select_state2; + string panel_state1; + string panel_state2; + string menu_state1; + string menu_state2; + + string panel_gtk2; + string menu_gtk2; + + if (select_switch.get_active()) { + select_state1 = "/* select-on */"; + select_state2 = "/* select-on */"; + } else { + select_state1 = "/* select-off"; + select_state2 = "select-off */"; + } + if (panel_switch.get_active()) { + panel_state1 = "/* panel-on */"; + panel_state2 = "/* panel-on */"; + panel_gtk2 = ("style \"gtk-theme-config-panel\" {\n" + + "\tbg[NORMAL] = \"%s\"\n" + + "\tbg[PRELIGHT] = shade(1.1,\"%s\")\n" + + "\tbg[ACTIVE] = shade(0.9,\"%s\")\n" + + "\tbg[SELECTED] = shade(0.97,\"%s\")\n" + + "\tfg[NORMAL] = \"%s\"\n" + + "\tfg[PRELIGHT] = \"%s\"\n" + + "\tfg[SELECTED] = \"%s\"\n" + + "\tfg[ACTIVE] = \"%s\"\n" + + "}\n\n" + + "widget \"*PanelWidget*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*PanelApplet*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*fast-user-switch*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*CPUFreq*Applet*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*indicator-applet*\" style \"gtk-theme-config-panel\"\n" + + "class \"PanelApp*\" style \"gtk-theme-config-panel\"\n" + + "class \"PanelToplevel*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*PanelToplevel*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*notif*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*Notif*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*Tray*\" style \"gtk-theme-config-panel\" \n" + + "widget_class \"*tray*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*computertemp*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*Applet*Tomboy*\" style \"gtk-theme-config-panel\"\n" + + "widget_class \"*Applet*Netstatus*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*gdm-user-switch-menubar*\" style \"gtk-theme-config-panel\"\n" + + "widget \"*Xfce*Panel*\" style \"gtk-theme-config-panel\"\n" + + "class \"*Xfce*Panel*\" style \"gtk-theme-config-panel\"\n").printf (panelbg_value, panelbg_value, panelbg_value, panelbg_value, panelfg_value, panelfg_value, panelfg_value, panelfg_value); + } else { + panel_state1 = "/* panel-off"; + panel_state2 = "panel-off */"; + panel_gtk2 = ""; + } + if (menu_switch.get_active()) { + menu_state1 = "/* menu-on */"; + menu_state2 = "/* menu-on */"; + menu_gtk2 = ("style \"gtk-theme-config-menu\" {\n" + + "\tbase[NORMAL] = \"%s\"\n" + + "\tbg[NORMAL] = \"%s\"\n" + + "\tbg[ACTIVE] = \"%s\"\n" + + "\tbg[INSENSITIVE] = \"%s\"\n" + + "\ttext[NORMAL] = \"%s\"\n" + + "\tfg[NORMAL] = \"%s\"\n" + + "}\n\n" + + "widget_class\"**\"style\"gtk-theme-config-menu\"\n").printf (menubg_value, menubg_value, menubg_value, menubg_value, menufg_value, menufg_value); + } else { + menu_state1 = "/* menu-off"; + menu_state2 = "menu-off */";; + menu_gtk2 = ""; + } + + // Write config + try { + var dos = new DataOutputStream (gtk3_config_file.replace (null, false, FileCreateFlags.REPLACE_DESTINATION)); + dos.put_string ("/* Custom styles */\n\n"); + string text = ("%s\n" + + "@define-color selected_bg_color %s;\n" + + "@define-color selected_fg_color %s;\n" + + "@define-color theme_selected_bg_color @selected_bg_color;\n" + + "@define-color theme_selected_fg_color @selected_fg_color;\n" + + "%s\n\n" + + "%s\n" + + "@define-color panel_bg_color %s;\n" + + "@define-color panel_fg_color %s;\n\n" + + "PanelWidget,\n" + + "PanelApplet,\n" + + "PanelToplevel,\n" + + "PanelSeparator,\n" + + "PanelApplet > GtkMenuBar.menubar,\n" + + "PanelApplet > GtkMenuBar.menubar.menuitem,\n" + + "PanelMenuBar.menubar,\n" + + "PanelMenuBar.menubar.menuitem,\n" + + "PanelAppletFrame,\n" + + "UnityPanelWidget,\n" + + ".gnome-panel-menu-bar,\n" + + ".unity-panel {\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(@panel_bg_color,1.2)),to(shade(@panel_bg_color,0.8)));\n" + + "\tcolor: @panel_fg_color;\n" + + "}\n\n" + + ".unity-panel.menuitem,\n" + + ".unity-panel .menuitem {\n" + + "\tcolor: @panel_fg_color;\n" + + "}\n\n" + + ".unity-panel.menubar.menuitem:hover,\n" + + ".unity-panel.menubar .menuitem *:hover {\n" + + "\tborder-color: shade(@panel_bg_color, 0.7);\n" + + "\tborder-image: none;\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(@panel_bg_color, 0.97)),to(shade(@panel_bg_color, 0.82)));\n" + + "\tcolor: @panel_fg_color;\n" + + "}\n\n" + + "PanelApplet .button {\n" + + "\tborder-color: transparent;\n" + + "\tborder-image: none;\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(@panel_bg_color,1.2)),to(shade(@panel_bg_color,0.8)));\n" + + "\tcolor: @panel_fg_color;\n" + + "\tbox-shadow: none;\n" + + "\ttext-shadow: none;\n" + + "\t-unico-inner-stroke-width: 0;\n" + + "}\n\n" + + "PanelApplet .button:active {\n" + + "\tborder-color: shade(@panel_bg_color,0.8);\n" + + "\tborder-image: none;\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(shade(@panel_bg_color,1.02),0.9)),to(shade(shade(@panel_bg_color,1.02),0.95)));\n" + + "\tcolor: @panel_fg_color;\n" + + "\tbox-shadow: none;\n" + + "\ttext-shadow: none;\n" + + "\t-unico-inner-stroke-width: 0;\n" + + "}\n\n" + + "PanelApplet .button:prelight {\n" + + "\tborder-color: transparent;\n" + + "\tborder-image: none;\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(@panel_bg_color,1.2)),to(shade(@panel_bg_color,1.0)));\n" + + "\tcolor: @panel_fg_color;\n" + + "\tbox-shadow: none;\n" + + "\ttext-shadow: none;\n" + + "\t-unico-inner-stroke-width: 0;\n" + + "}\n\n" + + "PanelApplet .button:active:prelight {\n" + + "\tborder-color: shade(@panel_bg_color,0.8);\n" + + "\tborder-image: none;\n" + + "\tbackground-image: -gtk-gradient(linear,left top,left bottom,from(shade(shade(@panel_bg_color,1.02),1.0)),to(shade(shade(@panel_bg_color,1.02),1.05)));\n" + + "\tcolor: @panel_fg_color;\n" + + "\tbox-shadow: none;\n" + + "\ttext-shadow: none;\n" + + "\t-unico-inner-stroke-width: 0;\n" + + "}\n\n" + + "WnckPager,\n" + + "WnckTasklist {\n" + + "\tbackground-color: @panel_bg_color;\n" + + "}\n\n" + + "%s\n\n" + + "%s\n" + + "@define-color menu_bg_color %s;\n" + + "@define-color menu_fg_color %s;\n\n" + + "GtkTreeMenu.menu,\n" + + "GtkMenuToolButton.menu,\n" + + "GtkComboBox .menu {\n" + + "\tbackground-color: @menu_bg_color;\n" + + "}\n\n" + + ".primary-toolbar .button .menu,\n" + + ".toolbar .menu,\n" + + ".toolbar .primary-toolbar .menu,\n" + + ".menu {\n" + + "\tborder-style: none;\n" + + "\tbackground-image: none;\n" + + "\tbackground-color: @menu_bg_color;\n" + + "\tcolor: @menu_fg_color;\n" + + "\tbox-shadow: none;\n" + + "\ttext-shadow: none;\n" + + "\t-unico-inner-stroke-width: 0;\n" + + "}\n\n" + + ".menu.button:hover,\n" + + ".menu.button:active,\n" + + ".menu.button:active:insensitive,\n" + + ".menu.button:insensitive,\n" + + ".menu.button {\n" + + "\tbackground-color: @menu_bg_color;\n" + + "\tbackground-image: none;\n" + + "}\n\n" + + "GtkTreeMenu .menuitem * {\n" + + "\tcolor: @menu_fg_color;\n" + + "}\n\n" + + ".menuitem,\n" + + ".menu .menuitem {\n" + + "\tbackground-color: transparent;\n" + + "}\n\n" + + ".menu .menuitem:active,\n" + + ".menu .menuitem:hover {\n" + + "\tbackground-color: @theme_selected_bg_color;\n" + + "}\n\n" + + ".menuitem.check,\n" + + ".menuitem.radio,\n" + + ".menuitem.check:hover,\n" + + ".menuitem.radio:hover,\n" + + ".menuitem.check:active,\n" + + ".menuitem.radio:active {\n" + + "\tbackground-color: transparent;\n" + + "}\n\n" + + ".menu .menuitem:insensitive,\n" + + ".menu .menuitem *:insensitive {\n" + + "\tcolor: mix(@menu_fg_color,@menu_bg_color,0.5);\n" + + "}\n\n" + + ".menuitem.arrow {\n" + + "\tcolor: alpha(@menu_fg_color, 0.6);\n" + + "}\n\n" + + ".menuitem .entry {\n" + + "\tborder-color: shade(@menu_bg_color,0.7);\n" + + "\tborder-image: none;\n" + + "\tbackground-color: @menu_bg_color;\n" + + "\tbackground-image: none;\n" + + "\tcolor: @menu_fg_color;\n" + + "}\n\n" + + ".menuitem .accelerator {\n" + + "\tcolor: alpha(@menu_fg_color,0.6);\n" + + "}\n\n" + + ".menuitem .accelerator:insensitive {\n" + + "\tcolor: alpha(mix(@menu_fg_color,@menu_bg_color,0.5),0.6);\n" + + "\ttext-shadow: none;\n" + + "}\n\n" + + ".menuitem.separator {\n" + + "\tbackground-color: transparent;\n" + + "\tcolor: shade(@menu_bg_color, 0.9);\n" + + "}\n\n" + + ".menuitem GtkCalendar,\n" + + ".menuitem GtkCalendar.button,\n" + + ".menuitem GtkCalendar.header,\n" + + ".menuitem GtkCalendar.view {\n" + + "\tborder-color: shade(@menu_bg_color,0.8);\n" + + "\tborder-image: none;\n" + + "\tbackground-color: @menu_bg_color;\n" + + "\tbackground-image: none;\n" + + "\tcolor: @menu_fg_color;\n" + + "}\n\n" + + ".menuitem GtkCalendar:inconsistent {\n" + + "\tcolor: mix(@menu_fg_color,@menu_bg_color,0.5);\n" + + "}\n\n" + + "%s\n").printf (select_state1, selectbg_value, selectfg_value, select_state2, panel_state1, panelbg_value, panelfg_value, panel_state2, menu_state1, menubg_value, menufg_value, menu_state2); + uint8[] data = text.data; + long written = 0; + while (written < data.length) { + written += dos.write (data[written:data.length]); + } + } catch (Error e) { + stderr.printf ("Gtk3 yapılandırması yazılamadı: %s\n", e.message); + } + try { + var dos = new DataOutputStream (gtk2_config_file.replace (null, false, FileCreateFlags.REPLACE_DESTINATION)); + dos.put_string ("# Custom styles\n\n"); + string text = "%s\n%s".printf(panel_gtk2, menu_gtk2); + uint8[] data = text.data; + long written = 0; + while (written < data.length) { + written += dos.write (data[written:data.length]); + } + } catch (Error e) { + stderr.printf ("Gtk2 yapılandırması yazılamadı: %s\n", e.message); + } + } + + void notify_change() { + try { + Process.spawn_command_line_async("notify-send -h int:transient:1 -i \"gtk-theme-config\" \"Changes applied.\" \"You might need to restart running applications.\""); + } catch (Error e) { + stderr.printf ("Bildirim görüntülenemiyor: %s\n", e.message); + } + } +} + +class ThemeConfigApp : Gtk.Application { + internal ThemeConfigApp () { + Object (application_id: "org.themeconfig.app"); + } + + protected override void activate () { + var window = new ThemeConfigWindow (this); + window.show_all (); + } +} + +int main (string[] args) { + return new ThemeConfigApp ().run (args); +} diff --git a/talimatname/genel/g/gtk-theme-config/talimat b/talimatname/genel/g/gtk-theme-config/talimat new file mode 100644 index 000000000..d0b3f7a58 --- /dev/null +++ b/talimatname/genel/g/gtk-theme-config/talimat @@ -0,0 +1,20 @@ +# Tanım: GTK tema renklerini yapılandırmak için kullanılan bir araç. +# URL: https://github.com/satya164/gtk-theme-config +# Paketçi: Cihan_Alkan +# Gerekler: gconf gsettings-desktop-schemas hicolor-icon-theme gtk3 vala +# Grup: + +isim=gtk-theme-config +surum=1.0 +devir=1 +kaynak=(https://github.com/satya164/gtk-theme-config/archive/v1.0.tar.gz::$isim-$surum.tar.gz + gtk-theme-config-tr.desktop + gtk-theme-config-tr.vala) + +derle() { + cd gtk-theme-config-1.0 + cp ../gtk-theme-config-tr.vala ./gtk-theme-config.vala + cp ../gtk-theme-config-tr.desktop ./gtk-theme-config.desktop + make + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/g/gtk-update-icon-cache/talimat b/talimatname/genel/g/gtk-update-icon-cache/talimat new file mode 100644 index 000000000..3d5c33303 --- /dev/null +++ b/talimatname/genel/g/gtk-update-icon-cache/talimat @@ -0,0 +1,23 @@ +# Tanım: GTK + güncelleme simgesi önbellek aracı +# URL: http://www.gtk.org/ +# Paketçi: milisarge +# Gerekler: gdk-pixbuf glib atk pango cairo libffi libpng pcre + +isim=gtk-update-icon-cache +surum=2.24.29 +devir=2 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gtk+/${surum%.*}/gtk+-$surum.tar.xz) + +derle() { +cd gtk+-$surum +sed -i 's#.*@man_#man_#' docs/reference/gtk/Makefile.in +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--sysconfdir=/etc \ +--with-xinput=yes +cd gtk +make gtk-update-icon-cache +mkdir -p $PKG/usr/{bin,share/man/man1} +install -c gtk-update-icon-cache $PKG/usr/bin/gtk-update-icon-cache +} diff --git a/talimatname/genel/g/gtk-vnc/talimat b/talimatname/genel/g/gtk-vnc/talimat new file mode 100644 index 000000000..71bcaf694 --- /dev/null +++ b/talimatname/genel/g/gtk-vnc/talimat @@ -0,0 +1,19 @@ +# Tanım: GTK için bir VNC görüntüleyici widget'ı +# URL: http://live.gnome.org/gtk-vnc +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk3 python-gtk gnutls pulseaudio cyrus-sasl + +isim=gtk-vnc +surum=0.6.0 +devir=2 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --with-gtk=3.0 \ + --enable-vala + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtk2/gtk.kur-kos b/talimatname/genel/g/gtk2/gtk.kur-kos new file mode 100644 index 000000000..ac5d54a7c --- /dev/null +++ b/talimatname/genel/g/gtk2/gtk.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/gtk-query-immodules-2.0 > /etc/gtk-2.0/gtk.immodules +gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache +gdk-pixbuf-query-loaders --update-cache + + diff --git a/talimatname/genel/g/gtk2/talimat b/talimatname/genel/g/gtk2/talimat new file mode 100644 index 000000000..753ddcfe3 --- /dev/null +++ b/talimatname/genel/g/gtk2/talimat @@ -0,0 +1,56 @@ +# Tanım: GTK +, çok platformlu bir araç setidir (sürüm 2) +# URL: http://www.gtk.org/ +# Paketçi: milisarge +# Gerekler: gtk-doc shared-mime-info xorg-libxinerama xorg-libxrandr cairo pango pangox-compat atk libtiff cups gdk-pixbuf xorg-libxi xorg-libxcursor hicolor-icon-theme gtk-update-icon-cache + +isim=gtk2 +surum=2.24.29 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gtk+/${surum%.*}/gtk+-$surum.tar.xz) + +gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache + +derle() { +cd gtk+-$surum +sed -i 's#l \(gtk-.*\).sgml#& -o \1#' docs/{faq,tutorial}/Makefile.in +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +mkdir -p $PKG/etc/gtk-2.0 +echo 'gtk-fallback-icon-theme = "Tango"' > $PKG/etc/gtk-2.0/gtkrc + +# Construit dans gtk-update-icon-cache +rm -f $PKG/usr/bin/gtk-update-icon-cache +rm -f $PKG/usr/share/man/man1/gtk-update-icon-cache.1 +} +doc () { +# Chaque fonction produisant un groupe doit suivre les règles suivantes +# 1. Archiver les fichiers souhaités en utilisant la syntaxe correcte (avec les bonnes variables) +# 2. Effacer ces même fichiers pour qu'ils ne se retrouvent pas dans le paquet principal (ou de base) + +# Normalement pkgmk EST dans $PKG juste pour la lisibilitée et la compréhension + +cd $PKG + +# 1. Création de l'archive des fichiers souhaités +bsdtar -cf \ +$PKGMK_PACKAGE_DIR/${isim}.doc#$surum-any.mps \ +usr/share/gtk-doc usr/share/gtk-2.0/demo +# 2. On efface CES MÊMES fichiers +rm -r usr/share/{gtk-doc,gtk-2.0/demo} +} +devel () { + +cd $PKG + +bsdtar -cf \ +$PKGMK_PACKAGE_DIR/$isim.devel#$surum-any.mps \ +usr/lib/pkgconfig \ +usr/include \ +usr/share/gir-1.0 + +rm -r usr/{share/gir-1.0,lib/pkgconfig,include} +} diff --git a/talimatname/genel/g/gtk3/gtk3.kur-kos b/talimatname/genel/g/gtk3/gtk3.kur-kos new file mode 100644 index 000000000..088752e4d --- /dev/null +++ b/talimatname/genel/g/gtk3/gtk3.kur-kos @@ -0,0 +1 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/g/gtk3/talimat b/talimatname/genel/g/gtk3/talimat new file mode 100644 index 000000000..c1bfcbefe --- /dev/null +++ b/talimatname/genel/g/gtk3/talimat @@ -0,0 +1,30 @@ +# Tanım: GTK + Araç Seti, grafik kullanıcı arayüzleri oluşturmak için kullanılan çoklu platform araç kitidir. +# URL: http://www.gtk.org/ +# Paketçi: milisarge +# Gerekler: adwaita-icon-theme libepoxy xorg-libxinerama,xorg-libxrandr xorg-libxcursor at-spi2-atk cups colord xorg-libxi atk cairo pango pangox-compat gdk-pixbuf gtk-update-icon-cache graphene + +isim=gtk3 +surum=3.22.15 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gtk+/${surum%.*}/gtk+-$surum.tar.xz) + +derle() { +cd gtk+-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--enable-broadway-backend \ +--enable-x11-backend \ +--disable-wayland-backend + +make || make -j1 +make DESTDIR=$PKG install +rm -r $PKG/usr/share/gtk-doc +cat > $PKG/etc/gtk-3.0/settings.ini << "EOF" +[Settings] +gtk-theme-name = Adwaita +gtk-icon-theme-name = gnome +gtk-cursor-theme-name = Adwaita +EOF +} diff --git a/talimatname/genel/g/gtkdialog/talimat b/talimatname/genel/g/gtkdialog/talimat new file mode 100644 index 000000000..ece67cfe6 --- /dev/null +++ b/talimatname/genel/g/gtkdialog/talimat @@ -0,0 +1,18 @@ +# Tanım: Gtkdialog hızlı arayüz yapma aracı +# URL: http://linux.pte.hu/~pipas/gtkdialog/ +# Paketçi: milisarge +# Gerekler: gtk2 vte + +isim=gtkdialog +surum=0.8.3 +devir=2 +kaynak=(https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/gtkdialog/gtkdialog-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make prefix=$PKG/usr install + mkdir -p "$PKG"/usr/share/$isim + cp -a examples "$PKG"/usr/share/$isim/examples +} diff --git a/talimatname/genel/g/gtkglext/gtk2.20.patch b/talimatname/genel/g/gtkglext/gtk2.20.patch new file mode 100644 index 000000000..54b34c11e --- /dev/null +++ b/talimatname/genel/g/gtkglext/gtk2.20.patch @@ -0,0 +1,77 @@ +diff -Nur gtkglext-1.2.0.orig/gtk/gtkglwidget.c gtkglext-1.2.0/gtk/gtkglwidget.c +--- gtkglext-1.2.0.orig/gtk/gtkglwidget.c 2004-02-20 11:38:36.000000000 +0200 ++++ gtkglext-1.2.0/gtk/gtkglwidget.c 2010-04-20 19:29:42.941917275 +0300 +@@ -127,7 +127,7 @@ + * Synchronize OpenGL and window resizing request streams. + */ + +- if (GTK_WIDGET_REALIZED (widget) && private->is_realized) ++ if (gtk_widget_get_realized (widget) && private->is_realized) + { + gldrawable = gdk_window_get_gl_drawable (widget->window); + gdk_gl_drawable_wait_gdk (gldrawable); +@@ -154,7 +154,7 @@ + * Remove OpenGL-capability from widget->window. + */ + +- if (GTK_WIDGET_REALIZED (widget)) ++ if (gtk_widget_get_realized (widget)) + gdk_window_unset_gl_capability (widget->window); + + private->is_realized = FALSE; +@@ -174,7 +174,7 @@ + */ + + toplevel = gtk_widget_get_toplevel (widget); +- if (GTK_WIDGET_TOPLEVEL (toplevel) && !GTK_WIDGET_REALIZED (toplevel)) ++ if (gtk_widget_is_toplevel (toplevel) && !gtk_widget_get_realized (toplevel)) + { + GTK_GL_NOTE (MISC, + g_message (" - Install colormap to the top-level window.")); +@@ -194,7 +194,7 @@ + * Set a background of "None" on window to avoid AIX X server crash. + */ + +- if (GTK_WIDGET_REALIZED (widget)) ++ if (gtk_widget_get_realized (widget)) + { + GTK_GL_NOTE (MISC, + g_message (" - window->bg_pixmap = %p", +@@ -250,8 +250,8 @@ + GTK_GL_NOTE_FUNC (); + + g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); +- g_return_val_if_fail (!GTK_WIDGET_NO_WINDOW (widget), FALSE); +- g_return_val_if_fail (!GTK_WIDGET_REALIZED (widget), FALSE); ++ g_return_val_if_fail (gtk_widget_get_has_window (widget), FALSE); ++ g_return_val_if_fail (!gtk_widget_get_realized (widget), FALSE); + g_return_val_if_fail (GDK_IS_GL_CONFIG (glconfig), FALSE); + + /* +@@ -432,7 +432,7 @@ + GTK_GL_NOTE_FUNC (); + + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); +- g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL); ++ g_return_val_if_fail (gtk_widget_get_realized (widget), NULL); + + gldrawable = gdk_window_get_gl_drawable (widget->window); + if (gldrawable == NULL) +@@ -474,7 +474,7 @@ + GLWidgetPrivate *private; + + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); +- g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL); ++ g_return_val_if_fail (gtk_widget_get_realized (widget), NULL); + + private = g_object_get_qdata (G_OBJECT (widget), quark_gl_private); + if (private == NULL) +@@ -501,7 +501,7 @@ + gtk_widget_get_gl_window (GtkWidget *widget) + { + g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); +- g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL); ++ g_return_val_if_fail (gtk_widget_get_realized (widget), NULL); + + return gdk_window_get_gl_window (widget->window); + } diff --git a/talimatname/genel/g/gtkglext/talimat b/talimatname/genel/g/gtkglext/talimat new file mode 100644 index 000000000..e73eb6acc --- /dev/null +++ b/talimatname/genel/g/gtkglext/talimat @@ -0,0 +1,23 @@ +# Tanım: Gtk2 için opengl uzantıları +# URL: http://gtkglext.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: glib gtk2 + +isim=gtkglext +surum=1.2.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/gtkglext/$isim-$surum.tar.gz + gtk2.20.patch) + + +derle() { + cd $isim-$surum + patch -Np1 -i $SRC/gtk2.20.patch + sed '/AC_PATH_XTRA/d' -i configure.in + + autoreconf --force --install + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtkhtml/talimat b/talimatname/genel/g/gtkhtml/talimat new file mode 100644 index 000000000..8aceab8c4 --- /dev/null +++ b/talimatname/genel/g/gtkhtml/talimat @@ -0,0 +1,16 @@ +# Tanım: GtkHTML paketi hafif bir HTML oluşturma / yazdırma / düzenleme motoru içerir. +# URL: https://github.com/GNOME/gtkhtml +# Paketçi: milisarge +# Gerekler: enchant gsettings-desktop-schemas gtk3 iso-codes libsoup + +isim=gtkhtml +surum=4.10.0 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtkmm/talimat b/talimatname/genel/g/gtkmm/talimat new file mode 100644 index 000000000..ecbc8d924 --- /dev/null +++ b/talimatname/genel/g/gtkmm/talimat @@ -0,0 +1,23 @@ +# Tanım: Gtk2 için C ++ bağları +# URL: http://gtkmm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: gtk2 pangomm cairomm atkmm + +isim=gtkmm +surum=2.24.4 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + +CXXFLAGS+=' -std=c++11' + + ./configure \ + --prefix=/usr \ + --disable-dependency-tracking \ + --disable-documentation + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtkmm3/talimat b/talimatname/genel/g/gtkmm3/talimat new file mode 100644 index 000000000..419c949ff --- /dev/null +++ b/talimatname/genel/g/gtkmm3/talimat @@ -0,0 +1,18 @@ +# Tanım: GTK+ ve GNOME için C ++ arabirimleri +# URL: http://www.gtkmm.org/ +# Paketçi: yasarciv milisarge +# Gerekler: gtk3 glibmm pangomm atkmm + +isim=gtkmm3 +surum=3.18.1 +devir=1 +kaynak=(http://download.gnome.org/sources/gtkmm/${version:0:4}/gtkmm-$surum.tar.xz) + +derle() { + cd gtkmm-$surum + ./configure --prefix=/usr + make -j1 + make -j1 DESTDIR=$PKG install + + rm -r $PKG/usr/share/doc +} diff --git a/talimatname/genel/g/gtksourceview2/talimat b/talimatname/genel/g/gtksourceview2/talimat new file mode 100644 index 000000000..d40f1510f --- /dev/null +++ b/talimatname/genel/g/gtksourceview2/talimat @@ -0,0 +1,18 @@ +# Tanım: GTK+ 2 metin işlevlerini sözdizimini vurgulamaya genişletmek için kullanılan kitaplıklar. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: gtk2 libxml2 + +isim=gtksourceview2 +surum=2.10.5 +devir=2 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gtksourceview/2.10/gtksourceview-${surum}.tar.bz2) + +derle() { +cd gtksourceview-$surum +sed -i 's#python#python2#' gtksourceview/language-specs/convert.py + ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtksourceview3/talimat b/talimatname/genel/g/gtksourceview3/talimat new file mode 100644 index 000000000..f3dd98402 --- /dev/null +++ b/talimatname/genel/g/gtksourceview3/talimat @@ -0,0 +1,17 @@ +# Tanım: GtkSourceView, standart GTK+ metin widget'ını genişleten bir metin widgettır +# URL: http://mail.gnome.org/mailman/listinfo/gnome-devtools +# Paketçi: milisarge yasarciv67@gmail.com +# Gerekler: gtk3 libxml2 + +isim=gtksourceview3 +surum=3.24.2 +devir=1 +_isim=gtksourceview +kaynak=(http://download.gnome.org/sources/${_name}/${version:0:4}/${_name}-$surum.tar.xz) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gtkspell/talimat b/talimatname/genel/g/gtkspell/talimat new file mode 100644 index 000000000..a2c1aeebc --- /dev/null +++ b/talimatname/genel/g/gtkspell/talimat @@ -0,0 +1,26 @@ +# Tanım: GtkTextView widget'inde kelime işlemci tarzı vurgulama ve yanlış yazılmış kelimelerin değiştirilmesini sağlar. +# URL: http://gtkspell.sourceforge.net/ +# Paketçi: yasarciv67 Cihan_Alkan +# Gerekler: gtk3 enchant gtk2 +# Grup: kütüphane + +isim=gtkspell +surum=3.0.9 +devir=1 + +kaynak=(https://sourceforge.net/projects/gtkspell/files/$surum/gtkspell3-$surum.tar.xz + https://downloads.sourceforge.net/sourceforge/gtkspell/${isim}-2.0.16.tar.gz) + +derle() { + cd gtkspell3-$surum + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install + + cd ../$isim-2.0.16 + ./configure --prefix=/usr --disable-static + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/g/gtop/talimat b/talimatname/genel/g/gtop/talimat new file mode 100644 index 000000000..3ed67ef98 --- /dev/null +++ b/talimatname/genel/g/gtop/talimat @@ -0,0 +1,23 @@ +# Tanım: Terminal için sistem izleme kontrol paneli +# URL: https://github.com/aksakalli/gtop +# Paketçi: Cihan_Alkan +# Gerekler: node +# Grup: sistem + + +isim=gtop +surum=0.1.4 +devir=1 +kaynak=(https://github.com/aksakalli/gtop/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + npm install --production + cd $SRC + local _npmdir="$PKG/usr/lib/node_modules" + mkdir -p "$_npmdir" + cp -R "$SRC/$isim-$surum" "$_npmdir/gtop" + local _bindir="$PKG/usr/bin" + mkdir -p "$_bindir" + ln -s /usr/lib/node_modules/gtop/bin/gtop "$_bindir/gtop" +} diff --git a/talimatname/genel/g/gtrayicon/talimat b/talimatname/genel/g/gtrayicon/talimat new file mode 100644 index 000000000..7b40757a4 --- /dev/null +++ b/talimatname/genel/g/gtrayicon/talimat @@ -0,0 +1,25 @@ +# Tanım: Hızlı ve menulü , sistem çekmecesi için simge oluştuma uygulaması +# URL: http://gtrayicon.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: gtk2 libglade + +isim=gtrayicon +surum=1.1 +devir=1 +kaynak=(http://kaynaklar.milislinux.org/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make + install -d $PKG/usr/share/$isim + install -d $PKG/usr/bin + install -m 644 $isim.glade $PKG/usr/share/$isim/ + install -m 644 activate.svg $PKG/usr/share/$isim/ + install -m 644 deactivate.svg $PKG/usr/share/$isim/ + install -m 755 $isim $PKG/usr/bin/ + install -m 644 README $PKG/usr/share/$isim/ + install -m 644 ChangeLog $PKG/usr/share/$isim/ + install -m 644 LICENSE $PKG/usr/share/$isim/ + install -m 644 sample.menu $PKG/usr/share/$isim/ +} + diff --git a/talimatname/genel/g/guake/guake.kur-kos b/talimatname/genel/g/guake/guake.kur-kos new file mode 100644 index 000000000..aea6bad51 --- /dev/null +++ b/talimatname/genel/g/guake/guake.kur-kos @@ -0,0 +1 @@ +gconftool-2 --install-schema-file=/usr/share/gconf/schemas/guake.schemas diff --git a/talimatname/genel/g/guake/talimat b/talimatname/genel/g/guake/talimat new file mode 100644 index 000000000..2c3bda1e4 --- /dev/null +++ b/talimatname/genel/g/guake/talimat @@ -0,0 +1,25 @@ +# Tanım: Guake, Gnome için tepeden inişli bir terminaldir (KDE Yakuake, Tilda veya Quake'de kullanılan terminal tarzında) +# URL: http://guake-project.org/ +# Paketçi: milisarge aydinyakar +# Gerekler: intltool gnome-common python-notify vte python-vte python-gconf dbus-python python-keybinder python-xdg libutempter + +isim=guake +surum=0.8.7 +devir=1 +kaynak=(https://github.com/Guake/$isim/archive/$surum.tar.gz) + +derle() { + # Python2 fix + cd $isim-$surum + sed -i 's|/usr/bin/env python|/usr/bin/python2|' src/guake/prefs.py + + NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --disable-schemas-install \ + --with-gconf-schema-file-dir=/usr/share/gconf/schemas \ + PYTHON=python2 + make + make DESTDIR="$PKG" install + python2 -m compileall "$PKG"/usr/lib/python2.7/site-packages/guake/ + +} diff --git a/talimatname/genel/g/gucharmap/gucharmap.kur-kos b/talimatname/genel/g/gucharmap/gucharmap.kur-kos new file mode 100644 index 000000000..4b4baf3fd --- /dev/null +++ b/talimatname/genel/g/gucharmap/gucharmap.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/g/gucharmap/talimat b/talimatname/genel/g/gucharmap/talimat new file mode 100644 index 000000000..3a6906701 --- /dev/null +++ b/talimatname/genel/g/gucharmap/talimat @@ -0,0 +1,17 @@ +# Tanım: Gucharmap, Unicode karakter haritası ve yazı tipi görüntüleyici. +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache gtk3 itstool gobject-introspection vala + +isim=gucharmap +surum=8.0.1 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --enable-vala + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/guile/talimat b/talimatname/genel/g/guile/talimat new file mode 100644 index 000000000..4da52b858 --- /dev/null +++ b/talimatname/genel/g/guile/talimat @@ -0,0 +1,35 @@ +# Tanım: Guile, Scheme programlama dili için bir yorumlayıcı ve derleyicidir. +# URL: http://www.gnu.org/software/guile/guile.html +# Paketçi: milisarge +# Gerekler: gc libunistring libffi emacs gdb + +isim=guile +surum=2.2.2 +devir=1 +kaynak=(ftp://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) + +derle() { + + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --disable-static + + make + make html + + makeinfo --plaintext -o doc/r5rs/r5rs.txt doc/r5rs/r5rs.texi + makeinfo --plaintext -o doc/ref/guile.txt doc/ref/guile.texi + + make DESTDIR=$PKG install + make install-html + + install -v -m755 -d $PKG/usr/share/gdb/auto-load/usr/lib + mv $PKG/usr/lib/libguile-*-gdb.scm $PKG/usr/share/gdb/auto-load/usr/lib + install -v -m755 -d $PKG/usr/share/doc/guile-2.0.11 + + find examples -name "Makefile*" -delete + unset DIRNAME + +} diff --git a/talimatname/genel/g/gunicorn/talimat b/talimatname/genel/g/gunicorn/talimat new file mode 100644 index 000000000..896b739f4 --- /dev/null +++ b/talimatname/genel/g/gunicorn/talimat @@ -0,0 +1,19 @@ +# Tanım: Python'da yazılmış (green unicorn) WSGI HTTP sunucu +# URL: http://pypi.python.org/pypi/six/ +# Paketçi: milisarge +# Gerekler: python python3 python-pip python3-pip + +isim=gunicorn +surum=19.7.0 +devir=1 + +kaynak=(https://github.com/benoitc/${isim}/archive/${surum}.tar.gz) + +derle() { + cd "${isim}-${surum}" + python3 setup.py install --root="${PKG}" --prefix=/usr --optimize=1 + mv "${PKG}/usr/bin/gunicorn" "${PKG}/usr/bin/gunicorn3" + python setup.py install --root="${PKG}" --prefix=/usr --optimize=1 + rm -r "${PKG}/usr/bin/gunicorn_paster" +} + diff --git a/talimatname/genel/g/gupnp/talimat b/talimatname/genel/g/gupnp/talimat new file mode 100755 index 000000000..3a34b3f80 --- /dev/null +++ b/talimatname/genel/g/gupnp/talimat @@ -0,0 +1,18 @@ +# Tanım: Nesneye yönelik bir UPNP çerçevesi +# URL: http://gupnp.org/ +# Paketçi: milisarge +# Gerekler: gssdp util-linux + +isim=gupnp +surum=0.20.14 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/${isim}/${surum%.*}.tar.xz) + +derle() { +cd $isim-$surum +sed -i '1s|^#!.*python$|&2|' tools/gupnp-binding-tool + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --disable-static --with-context-manager=linux +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gutenprint-gimp/talimat b/talimatname/genel/g/gutenprint-gimp/talimat new file mode 100644 index 000000000..0cf956073 --- /dev/null +++ b/talimatname/genel/g/gutenprint-gimp/talimat @@ -0,0 +1,27 @@ +# Tanım: Gimp gutenprint eklentisi +# URL: http://gimp-print.sourceforge.net +# Paketçi: milisarge +# Gerekler: gutenprint gimp + +isim=gutenprint-gimp +surum=5.2.13 +devir=1 +kaynak=(http://downloads.sourceforge.net/gimp-print/gutenprint-$surum.tar.bz2) + +derle() { + cd gutenprint-$surum + + ./configure --prefix=/usr \ + --disable-{samples,escputil} \ + --without-{foomatic,ghostscript,doc} \ + --enable-libgutenprintui2 \ + --with-gimp2 + make + make DESTDIR=$PKG install + + rm $PKG/usr/lib/libgutenprint.* + rm $PKG/usr/lib/pkgconfig/gutenprint.pc + rm -r $PKG/usr/include/gutenprint + rm -r $PKG/usr/lib/cups + rm -r $PKG/usr/{bin,sbin,share} $PKG/etc +} diff --git a/talimatname/genel/g/gutenprint/gutenprint.kur-kos b/talimatname/genel/g/gutenprint/gutenprint.kur-kos new file mode 100644 index 000000000..7083fbdd1 --- /dev/null +++ b/talimatname/genel/g/gutenprint/gutenprint.kur-kos @@ -0,0 +1,3 @@ +if [ -f /etc/rc.d/init.d/cups ]; then + /etc/rc.d/init.d/cups restart +fi diff --git a/talimatname/genel/g/gutenprint/talimat b/talimatname/genel/g/gutenprint/talimat new file mode 100644 index 000000000..596a7f4bd --- /dev/null +++ b/talimatname/genel/g/gutenprint/talimat @@ -0,0 +1,23 @@ +# Tanım: POSIX sistemleri için en kaliteli yazıcı sürücüleri +# URL: http://gimp-print.sourceforge.net +# Paketçi: milisarge +# Gerekler: ghostscript + +isim=gutenprint +surum=5.2.13 +devir=1 +kaynak=(http://downloads.sourceforge.net/gimp-print/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --disable-samples \ + --disable-libgutenprintui2 \ + --without-gimp2 + + make + make DESTDIR=$PKG install + + rm -r $PKG/usr/share/gutenprint/doc +} diff --git a/talimatname/genel/g/gvfs/gvfs.kur-kos b/talimatname/genel/g/gvfs/gvfs.kur-kos new file mode 100644 index 000000000..f57cfeb82 --- /dev/null +++ b/talimatname/genel/g/gvfs/gvfs.kur-kos @@ -0,0 +1,2 @@ +gio-querymodules /usr/lib/gio/modules +glib-compile-schemas /usr/share/glib-2.0/schemas > /dev/null 2>&1 diff --git a/talimatname/genel/g/gvfs/talimat b/talimatname/genel/g/gvfs/talimat new file mode 100644 index 000000000..5a1036c9d --- /dev/null +++ b/talimatname/genel/g/gvfs/talimat @@ -0,0 +1,20 @@ +# Tanım: GVfs, GIO'nun G/Ç soyutlamasıyla çalışmak üzere tasarlanmış bir kullanıcı alanı sanal dosya sistemidir. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: avahi dbus-glib intltool libsecret gtk3 libsoup udisks2 obexd fuse libarchive samba bluez gcr libgphoto2 libmtp glib + +isim=gvfs +surum=1.33.1 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var --disable-static \ + --libexecdir=/usr/lib/gvfs \ + --with-bash-completion-dir=/usr/share/bash-completion/completions \ + --disable-systemd + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/g/gvim/gvim.desktop b/talimatname/genel/g/gvim/gvim.desktop new file mode 100644 index 000000000..e1a43b5e0 --- /dev/null +++ b/talimatname/genel/g/gvim/gvim.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=1.0 +Name=gVim +Comment=GTK2 enhanced vim text editor +GenericName=Text Editor +Type=Application +TryExec=gvim +Exec=gvim %F +Icon=vim48x48.png +Terminal=false +Categories=GTK;Application;Utility;TextEditor; diff --git a/talimatname/genel/g/gvim/talimat b/talimatname/genel/g/gvim/talimat new file mode 100644 index 000000000..3977fcfd4 --- /dev/null +++ b/talimatname/genel/g/gvim/talimat @@ -0,0 +1,26 @@ +# Tanım: Vim düzenleyicisinin GTK sürümü +# URL: http://www.vim.org/ +# Paketçi: milisarge +# Gerekler: vim gtk2 xorg-libxt + +isim=gvim +surum=8.0.0329 +devir=1 +kaynak=(http://crux.nu/files/distfiles/vim-$surum.tar.xz) + +derle() { + cd vim-$surum/src + + ./configure --prefix=/usr \ + --with-vim-isim=gvim \ + --with-x=yes \ + --enable-gui=gtk2 \ + --enable-multibyte \ + --enable-cscope \ + --disable-gpm + + make VIMRTDIR= + make VIMRTDIR= DESTDIR=$PKG installvimbin install-icons + + sed -ri '/\[.+\]=/d' $PKG/usr/share/applications/*.desktop +} diff --git a/talimatname/genel/g/gwenview/talimat b/talimatname/genel/g/gwenview/talimat new file mode 100644 index 000000000..0433261d1 --- /dev/null +++ b/talimatname/genel/g/gwenview/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE5 için hızlı ve basit bir resim görüntüleme aracı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules phonon-qt5 kf5-kio kf5-kactivities kf5-kdelibs4support libjpeg-turbo libpng exiv2 lcms2 kf5-baloo hicolor-icon-theme libkdcraw libkipi +# Grup: kde + +isim=gwenview +surum=17.12.0 +devir=1 +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DGWENVIEW_SEMANTICINFO_BACKEND="Baloo" \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/handbrake/talimat b/talimatname/genel/h/handbrake/talimat new file mode 100644 index 000000000..634a342d3 --- /dev/null +++ b/talimatname/genel/h/handbrake/talimat @@ -0,0 +1,22 @@ +# Tanım: Acik kaynak kodlu video donusturucu +# URL: http://handbrake.fr/ +# Paketçi: milisarge +# Gerekler: cmake qt5 libnotify lame x264 gtk3 faad2 freetype fribidi xorg-fontconfig libass libbluray libogg libpng libsamplerate libtheora libvorbis libvpx libxml2 perl-xml-parser pcre xorg-pixman python yasm x265 + +isim=handbrake +surum=0.10.3 +devir=1 +kaynak=(http://download.handbrake.fr/releases/$surum/HandBrake-$surum.tar.bz2) + +derle() { + cd HandBrake-$surum + + ./configure \ + --prefix=/usr \ + --force \ + --disable-gtk-update-checks + + cd build + make -j1 + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hardinfo/hardinfo-tr.po b/talimatname/genel/h/hardinfo/hardinfo-tr.po new file mode 100644 index 000000000..ea91face0 --- /dev/null +++ b/talimatname/genel/h/hardinfo/hardinfo-tr.po @@ -0,0 +1,4350 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-14 22:23-0500\n" +"PO-Revision-Date: 2018-01-10 22:23-0200\n" +"Last-Translator: Cihan Alkan \n" +"Language-Team: Turkish\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#. / %d will be latest year of copyright +#: hardinfo/hardinfo.c:49 +#, c-format +msgid "" +"Copyright (C) 2003-%d Leandro A. F. Pereira. See COPYING for details.\n" +"\n" +msgstr "" +"Telif(C) 2003-%d Leandro A. F. Pereira. Ayrıntılar için COPYING bölümüne bakın.\n" +"\n" + +#: hardinfo/hardinfo.c:51 +#, c-format +msgid "" +"Compile-time options:\n" +" Release version: %s (%s)\n" +" BinReloc enabled: %s\n" +" Data prefix: %s\n" +" Library prefix: %s\n" +" Compiled for: %s\n" +msgstr "" +"Derleme zamanı seçenekleri:\n" +" Dağıtım sürümü: %s (%s)\n" +" BinReloc etkin: %s\n" +" Veri öneki: %s\n" +" Kütüphane öneki: %s\n" +" Için derlendi: %s\n" + +#: hardinfo/hardinfo.c:57 hardinfo/hardinfo.c:58 modules/computer.c:605 +#: modules/devices/inputdevices.c:128 modules/devices/pci.c:112 +#: modules/devices/printers.c:138 +msgid "Yes" +msgstr "Evet" + +#: hardinfo/hardinfo.c:58 modules/computer.c:605 modules/devices/pci.c:112 +#: modules/devices/printers.c:138 +msgid "No" +msgstr "Hayır" + +#: hardinfo/hardinfo.c:69 +#, c-format +msgid "" +"Failed to find runtime data.\n" +"\n" +"• Is HardInfo correctly installed?\n" +"• See if %s and %s exists and you have read permission." +msgstr "" +"Çalışma zamanı verileri bulunamadı.\n" +"\n" +"• HardInfo doğru kurulmuş mu?\n" +"• See if %s and %s exists and you have read permission." + +#: hardinfo/hardinfo.c:76 +#, c-format +msgid "" +"Modules:\n" +"%-20s %-15s %-12s\n" +msgstr "" + +#: hardinfo/hardinfo.c:77 +msgid "File Name" +msgstr "Dosya Adı" + +#: hardinfo/hardinfo.c:77 modules/computer.c:534 modules/computer.c:562 +#: modules/computer.c:630 modules/computer/languages.c:104 +#: modules/computer/modules.c:146 modules/devices/arm/processor.c:336 +#: modules/devices/ia64/processor.c:160 modules/devices/inputdevices.c:116 +#: modules/devices/pci.c:215 modules/devices/sh/processor.c:84 +#: modules/devices/x86/processor.c:455 modules/network.c:326 +msgid "Name" +msgstr "İsim" + +#: hardinfo/hardinfo.c:77 modules/computer.c:296 modules/computer.c:505 +#: modules/computer.c:507 modules/computer.c:595 modules/computer.c:603 +#: modules/devices/inputdevices.c:121 +msgid "Version" +msgstr "Sürüm" + +#: hardinfo/hardinfo.c:124 +#, c-format +msgid "Unknown benchmark ``%s'' or libbenchmark.so not loaded" +msgstr "" + +#: hardinfo/hardinfo.c:152 +msgid "Don't know what to do. Exiting." +msgstr "Ne yapacağımı bilmiyorum. Çıkılıyor." + +#: hardinfo/util.c:104 modules/computer/uptime.c:53 +#, c-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#: hardinfo/util.c:105 modules/computer/uptime.c:54 +#, c-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#: hardinfo/util.c:106 modules/computer/uptime.c:55 +#, c-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dakika" +msgstr[1] "%d dakika" + +#: hardinfo/util.c:107 +#, c-format +msgid "%d second" +msgid_plural "%d seconds" +msgstr[0] "%d saniye" +msgstr[1] "%d saniye" + +#: hardinfo/util.c:128 +#, c-format +msgid "%.1f B" +msgstr "" + +#: hardinfo/util.c:130 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: hardinfo/util.c:132 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: hardinfo/util.c:134 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: hardinfo/util.c:136 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: hardinfo/util.c:138 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: hardinfo/util.c:361 +msgid "Error" +msgstr "Hata" + +#: hardinfo/util.c:361 hardinfo/util.c:377 +msgid "Warning" +msgstr "Uyarı" + +#: hardinfo/util.c:376 +msgid "Fatal Error" +msgstr "Ölümcül Hata" + +#: hardinfo/util.c:401 +msgid "creates a report and prints to standard output" +msgstr "bir rapor oluşturur ve standart çıktıya basar" + +#: hardinfo/util.c:407 +msgid "chooses a report format (text, html)" +msgstr "bir rapor biçimi seçer (metin, html)" + +#: hardinfo/util.c:413 +msgid "run benchmark; requires benchmark.so to be loaded" +msgstr "kriter çalıştır; Benchmark.so'nin yüklenmesi gerekiyor" + +#: hardinfo/util.c:419 +msgid "lists modules" +msgstr "modülleri listeler" + +#: hardinfo/util.c:425 +msgid "specify module to load" +msgstr "yüklenecek modülü belirt" + +#: hardinfo/util.c:431 +msgid "automatically load module dependencies" +msgstr "modül bağımlılıklarını otomatik olarak yükle" + +#: hardinfo/util.c:438 +msgid "run in XML-RPC server mode" +msgstr "XML-RPC sunucu modunda çalıştır" + +#: hardinfo/util.c:445 +msgid "shows program version and quit" +msgstr "program sürümünü gösterir ve çıkış" + +#: hardinfo/util.c:450 +msgid "- System Profiler and Benchmark tool" +msgstr "- Sistem Profiler ve Karşılaştırma aracı" + +#: hardinfo/util.c:460 +#, c-format +msgid "" +"Unrecognized arguments.\n" +"Try ``%s --help'' for more information.\n" +msgstr "" + +#: hardinfo/util.c:526 +#, c-format +msgid "Couldn't find a Web browser to open URL %s." +msgstr "" + +#: hardinfo/util.c:875 +#, c-format +msgid "Module \"%s\" depends on module \"%s\", load it?" +msgstr "" + +#: hardinfo/util.c:898 +#, c-format +msgid "Module \"%s\" depends on module \"%s\"." +msgstr "" + +#: hardinfo/util.c:943 +#, c-format +msgid "No module could be loaded. Check permissions on \"%s\" and try again." +msgstr "" + +#: hardinfo/util.c:947 +msgid "" +"No module could be loaded. Please use hardinfo -l to list all available " +"modules and try again with a valid module list." +msgstr "" + +#: hardinfo/util.c:1024 +#, c-format +msgid "Scanning: %s..." +msgstr "Taranıyor: %s..." + +#: hardinfo/util.c:1034 shell/shell.c:301 shell/shell.c:760 shell/shell.c:1795 +#: modules/benchmark.c:449 modules/benchmark.c:457 +msgid "Done." +msgstr "Bitti" + +#: shell/callbacks.c:117 +#, c-format +msgid "%s Module" +msgstr "%s Modül" + +#: shell/callbacks.c:128 +#, c-format +msgid "" +"Written by %s\n" +"Licensed under %s" +msgstr "" + +#: shell/callbacks.c:142 +#, c-format +msgid "No about information is associated with the %s module." +msgstr "%s modülü ile ilgili bilgi yok." + +#: shell/callbacks.c:158 +msgid "Author:" +msgstr "Yazar:" + +#: shell/callbacks.c:161 +msgid "Contributors:" +msgstr "Katkı sağlayanlar" + +#: shell/callbacks.c:166 +msgid "Based on work by:" +msgstr "Tarafından yapılan çalışmaya göre" + +#: shell/callbacks.c:167 +msgid "MD5 implementation by Colin Plumb (see md5.c for details)" +msgstr "Colin Plumb tarafından MD5 uygulaması (ayrıntılar için md5.c'ye bakın)" + +#: shell/callbacks.c:168 +msgid "SHA1 implementation by Steve Reid (see sha1.c for details)" +msgstr "Steve Reid'in SHA1 uygulaması (ayrıntılar için sha1.c'ye bakın)" + +#: shell/callbacks.c:169 +msgid "Blowfish implementation by Paul Kocher (see blowfich.c for details)" +msgstr "Paul Kocher tarafından yapılan Blowfish uygulaması (ayrıntılar için blowfich.c'ye bakın)" + +#: shell/callbacks.c:170 +msgid "Raytracing benchmark by John Walker (see fbench.c for details)" +msgstr "" + +#: shell/callbacks.c:171 +msgid "FFT benchmark by Scott Robert Ladd (see fftbench.c for details)" +msgstr "" + +#: shell/callbacks.c:172 +msgid "Some code partly based on x86cpucaps by Osamu Kayasono" +msgstr "" + +#: shell/callbacks.c:173 +msgid "Vendor list based on GtkSysInfo by Pissens Sebastien" +msgstr "" + +#: shell/callbacks.c:174 +msgid "DMI support based on code by Stewart Adam" +msgstr "" + +#: shell/callbacks.c:175 +msgid "SCSI support based on code by Pascal F. Martin" +msgstr "" + +#: shell/callbacks.c:180 +msgid "Tango Project" +msgstr "Tango Projesi" + +#: shell/callbacks.c:181 +msgid "The GNOME Project" +msgstr "GNOME Projesi" + +#: shell/callbacks.c:182 +msgid "VMWare, Inc. (USB icon from VMWare Workstation 6)" +msgstr "" + +#: shell/callbacks.c:200 +msgid "System information and benchmark tool" +msgstr "Sistem bilgisi ve Karşılaştırma Aracı\n (Türkçe Çevirisi Cihan Alkan Tarafından Yapılmıştır)" + +#: shell/callbacks.c:205 +msgid "" +"HardInfo is free software; you can redistribute it and/or modify it under " +"the terms of the GNU General Public License as published by the Free " +"Software Foundation, version 2.\n" +"\n" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for " +"more details.\n" +"\n" +"You should have received a copy of the GNU General Public License along with " +"this program; if not, write to the Free Software Foundation, Inc., 51 " +"Franklin St, Fifth Floor, Boston, MA 02110-1301 USA" +msgstr "" + +#: shell/callbacks.c:220 +msgid "translator-credits" +msgstr "çevirmen-kredisi" + +#: shell/menu.c:35 +msgid "_Information" +msgstr "_Bilgi" + +#: shell/menu.c:36 +msgid "_Remote" +msgstr "Uzak" + +#: shell/menu.c:37 +msgid "_View" +msgstr "Görünüm" + +#: shell/menu.c:38 +msgid "_Help" +msgstr "Yardım" + +#: shell/menu.c:39 +msgid "About _Modules" +msgstr "Modüller Hakkında" + +#: shell/menu.c:43 +msgid "Generate _Report" +msgstr "Rapor Oluştur" + +#: shell/menu.c:48 +msgid "_Network Updater..." +msgstr "" + +#: shell/menu.c:53 +msgid "_Open..." +msgstr "Aç..." + +#: shell/menu.c:58 +msgid "_Copy to Clipboard" +msgstr "Panoya Kopyala" + +#: shell/menu.c:59 +msgid "Copy to clipboard" +msgstr "Panoya kopyala" + +#: shell/menu.c:63 +msgid "_Refresh" +msgstr "Yenile" + +#: shell/menu.c:68 +msgid "_Open HardInfo Web Site" +msgstr "HardInfo Web Sayfasına Git" + +#: shell/menu.c:73 +msgid "_Report bug" +msgstr "Hata Bildir" + +#: shell/menu.c:78 +msgid "_About HardInfo" +msgstr "HardInfo Hakkında" + +#: shell/menu.c:79 +msgid "Displays program version information" +msgstr "Program sürüm bilgilerini görüntüler" + +#: shell/menu.c:83 +msgid "_Quit" +msgstr "Çıkış" + +#: shell/menu.c:90 +msgid "_Side Pane" +msgstr "Yan Panel" + +#: shell/menu.c:91 +msgid "Toggles side pane visibility" +msgstr "Yan bölmenin görünürlüğünü açar veya kapatır" + +#: shell/menu.c:94 +msgid "_Toolbar" +msgstr "Araç Çubuğu" + +#: shell/report.c:494 shell/report.c:502 +msgid "Save File" +msgstr "Dosya Kaydet" + +#: shell/report.c:629 +msgid "Cannot create ReportContext. Programming bug?" +msgstr "ReportContext oluşturulamıyor. Hatalı programlama mı?" + +#: shell/report.c:648 +msgid "Open the report with your web browser?" +msgstr "Raporu web tarayıcınızla açın?" + +#: shell/report.c:682 +msgid "Generating report..." +msgstr "Rapor üretiliyor ..." + +#: shell/report.c:692 +msgid "Report saved." +msgstr "Rapor kaydedildi." + +#: shell/report.c:694 +msgid "Error while creating the report." +msgstr "Rapor oluşturulurken hata oluştu." + +#: shell/report.c:796 +msgid "Generate Report" +msgstr "Rapor Oluştur" + +#: shell/report.c:821 +msgid "" +"Generate Report\n" +"Please choose the information that you wish to view in your report:" +msgstr "" +"Rapor Oluştur\n" +"Lütfen raporunuzda görmek istediğiniz bilgileri seçin:" + +#: shell/report.c:893 +msgid "Select _None" +msgstr "Seçim Yok" + +#: shell/report.c:904 +msgid "Select _All" +msgstr "Tümünü Seç" + +#: shell/report.c:929 shell/syncmanager.c:748 +msgid "_Cancel" +msgstr "İptal" + +#: shell/report.c:939 +msgid "_Generate" +msgstr "Oluştur" + +#: shell/shell.c:402 +#, c-format +msgid "%s - System Information" +msgstr "%s - Sistem Bilgisi" + +#: shell/shell.c:407 +msgid "System Information" +msgstr "Sistem Bilgisi" + +#: shell/shell.c:747 +msgid "Loading modules..." +msgstr "Modüller yükleniyor..." + +#: shell/shell.c:1660 +#, c-format +msgid "%s → Summary" +msgstr "%s → Özet" + +#: shell/shell.c:1769 +msgid "Updating..." +msgstr "Güncelleniyor" + +#: shell/syncmanager.c:69 +msgid "" +"Synchronize with Central Database\n" +"The following information may be synchronized with the HardInfo central " +"database." +msgstr "" + +#: shell/syncmanager.c:72 +msgid "" +"Synchronizing\n" +"This may take some time." +msgstr "" + +#: shell/syncmanager.c:132 +msgid "" +"HardInfo was compiled without libsoup support. (Network Updater requires it.)" +msgstr "" + +#: shell/syncmanager.c:161 shell/syncmanager.c:189 +#, c-format +msgid "%s (error #%d)" +msgstr "" + +#: shell/syncmanager.c:170 shell/syncmanager.c:198 +msgid "Could not parse XML-RPC response" +msgstr "XML-RPC yanıtı ayrıştırılamadı" + +#: shell/syncmanager.c:280 +#, c-format +msgid "" +"Server says it supports API version %d, but this version of HardInfo only " +"supports API version %d." +msgstr "" + +#: shell/syncmanager.c:375 +msgid "Contacting HardInfo Central Database" +msgstr "HardInfo Merkez Veritabanı ile Bağlantı Kuruluyor" + +#: shell/syncmanager.c:376 +msgid "Cleaning up" +msgstr "Temizle" + +#: shell/syncmanager.c:493 +msgid "(canceled)" +msgstr "(vazgeçildi)" + +#: shell/syncmanager.c:510 +msgid "(failed)" +msgstr "(hatalı)" + +#: shell/syncmanager.c:521 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)\n" +"\n" +"Details: %s" +msgstr "" + +#: shell/syncmanager.c:530 +#, c-format +msgid "" +"Failed while performing \"%s\". Please file a bug report if this problem " +"persists. (Use the Help→Report bug option.)" +msgstr "" + +#: shell/syncmanager.c:658 +msgid "Network Updater" +msgstr "Ağ Güncelleyicisi" + +#: shell/syncmanager.c:757 +msgid "_Synchronize" +msgstr "Senkronize Et" + +#: modules/benchmark.c:52 +msgid "CPU Blowfish" +msgstr "" + +#: modules/benchmark.c:53 +msgid "CPU CryptoHash" +msgstr "" + +#: modules/benchmark.c:54 +msgid "CPU Fibonacci" +msgstr "" + +#: modules/benchmark.c:55 +msgid "CPU N-Queens" +msgstr "" + +#: modules/benchmark.c:56 +msgid "CPU Zlib" +msgstr "" + +#: modules/benchmark.c:57 +msgid "FPU FFT" +msgstr "" + +#: modules/benchmark.c:58 +msgid "FPU Raytracing" +msgstr "" + +#: modules/benchmark.c:60 +msgid "GPU Drawing" +msgstr "" + +#: modules/benchmark.c:239 modules/benchmark.c:255 +msgid "CPU Config" +msgstr "" + +#: modules/benchmark.c:239 modules/benchmark.c:255 +msgid "Results" +msgstr "Sonuç" + +#: modules/benchmark.c:239 modules/benchmark.c:255 modules/computer.c:751 +#: modules/devices/sparc/processor.c:75 +msgid "CPU" +msgstr "" + +#: modules/benchmark.c:381 +#, c-format +msgid "Benchmarking: %s." +msgstr "Karşılaştırılıyor: %s." + +#: modules/benchmark.c:395 +msgid "Benchmarking. Please do not move your mouse or press any keys." +msgstr "Karşılaştırılıyor. Lütfen farenizi hareket ettirmeyin veya herhangi bir tuşa basmayın." + +#: modules/benchmark.c:399 +msgid "Cancel" +msgstr "İptal" + +#: modules/benchmark.c:536 +msgid "Results in MiB/second. Higher is better." +msgstr "MiB / saniye olarak sonuçlanır. Üstte olanlar daha iyidir." + +#: modules/benchmark.c:540 +msgid "Results in HIMarks. Higher is better." +msgstr "HIMarks sonuçları. Üstte olanlar daha iyidir." + +#: modules/benchmark.c:547 +msgid "Results in seconds. Lower is better." +msgstr "Saniyeler içinde sonuçlandı. Altta olanlar daha iyidir." + +#: modules/benchmark.c:555 +msgid "Benchmarks" +msgstr "Karşılaştır" + +#: modules/benchmark.c:573 +msgid "Perform tasks and compare with other systems" +msgstr "Görevleri yerine getir ve diğer sistemler ile karşılaştır" + +#: modules/benchmark.c:663 +msgid "Send benchmark results" +msgstr "" + +#: modules/benchmark.c:668 +msgid "Receive benchmark results" +msgstr "Benchmark results gönder" + +#: modules/computer/alsa.c:26 modules/computer.c:489 +msgid "Audio Devices" +msgstr "Ses Aygıtları" + +#: modules/computer/alsa.c:34 +msgid "Audio Adapter" +msgstr "Ses Adaptörü" + +#: modules/computer/boots.c:33 modules/computer.c:73 modules/computer.c:546 +msgid "Boots" +msgstr "Açılış" + +#: modules/computer.c:70 +msgid "Summary" +msgstr "Özet" + +#: modules/computer.c:71 modules/computer.c:476 modules/computer.c:750 +msgid "Operating System" +msgstr "İşletim Sistemi" + +#: modules/computer.c:72 +msgid "Kernel Modules" +msgstr "Çekirdek Modülleri" + +#: modules/computer.c:74 +msgid "Languages" +msgstr "Diller" + +#: modules/computer.c:75 +msgid "Filesystems" +msgstr "Dosya Sistemleri" + +#: modules/computer.c:76 modules/computer.c:481 modules/computer.c:590 +msgid "Display" +msgstr "Ekran" + +#: modules/computer.c:77 modules/computer/environment.c:32 +msgid "Environment Variables" +msgstr "Ortam Değişkenleri" + +#: modules/computer.c:79 +msgid "Development" +msgstr "Geliştirme" + +#: modules/computer.c:81 modules/computer.c:617 +msgid "Users" +msgstr "Kullanıcılar" + +#: modules/computer.c:82 +msgid "Groups" +msgstr "Gruplar" + +#: modules/computer.c:104 modules/computer.c:473 modules/devices.c:96 +#: modules/devices/pci.c:149 +msgid "Memory" +msgstr "Hafıza" + +#: modules/computer.c:106 +#, c-format +msgid "%dMB (%dMB used)" +msgstr "%dMB (%dMB kullanılan)" + +#: modules/computer.c:108 modules/computer.c:520 +msgid "Uptime" +msgstr "Çalışma Süresi" + +#: modules/computer.c:110 modules/computer.c:478 +msgid "Date/Time" +msgstr "Tarih/Saat" + +#: modules/computer.c:115 modules/computer.c:521 +msgid "Load Average" +msgstr "" + +#: modules/computer.c:117 modules/computer.c:522 +msgid "Available entropy in /dev/random" +msgstr "" + +#: modules/computer.c:203 +msgid "Scripting Languages" +msgstr "Komut Oluşturma Dilleri" + +#: modules/computer.c:204 +msgid "Gambas3 (gbr3)" +msgstr "" + +#: modules/computer.c:205 +msgid "Python" +msgstr "" + +#: modules/computer.c:206 +msgid "Python2" +msgstr "" + +#: modules/computer.c:207 +msgid "Python3" +msgstr "" + +#: modules/computer.c:208 +msgid "Perl" +msgstr "" + +#: modules/computer.c:209 +msgid "Perl6 (VM)" +msgstr "" + +#: modules/computer.c:210 +msgid "Perl6" +msgstr "" + +#: modules/computer.c:211 +msgid "PHP" +msgstr "" + +#: modules/computer.c:212 +msgid "Ruby" +msgstr "" + +#: modules/computer.c:213 +msgid "Bash" +msgstr "" + +#: modules/computer.c:214 +msgid "Compilers" +msgstr "Derleyiciler" + +#: modules/computer.c:215 +msgid "C (GCC)" +msgstr "" + +#: modules/computer.c:216 +msgid "C (Clang)" +msgstr "" + +#: modules/computer.c:217 +msgid "D (dmd)" +msgstr "" + +#: modules/computer.c:218 +msgid "Gambas3 (gbc3)" +msgstr "" + +#: modules/computer.c:219 +msgid "Java" +msgstr "" + +#: modules/computer.c:220 +msgid "CSharp (Mono, old)" +msgstr "" + +#: modules/computer.c:221 +msgid "CSharp (Mono)" +msgstr "" + +#: modules/computer.c:222 +msgid "Vala" +msgstr "" + +#: modules/computer.c:223 +msgid "Haskell (GHC)" +msgstr "" + +#: modules/computer.c:224 +msgid "FreePascal" +msgstr "" + +#: modules/computer.c:225 +msgid "Go" +msgstr "" + +#: modules/computer.c:226 +msgid "Tools" +msgstr "Araçlar" + +#: modules/computer.c:227 +msgid "make" +msgstr "" + +#: modules/computer.c:228 +msgid "GDB" +msgstr "" + +#: modules/computer.c:229 +msgid "strace" +msgstr "" + +#: modules/computer.c:230 +msgid "valgrind" +msgstr "" + +#: modules/computer.c:231 +msgid "QMake" +msgstr "" + +#: modules/computer.c:232 +msgid "CMake" +msgstr "" + +#: modules/computer.c:233 +msgid "Gambas3 IDE" +msgstr "" + +#: modules/computer.c:274 +msgid "Not found" +msgstr "Bulunamadı" + +#: modules/computer.c:279 +#, c-format +msgid "Detecting version: %s" +msgstr "Sürüm algılanıyor: %s" + +#: modules/computer.c:296 +msgid "Program" +msgstr "" + +#: modules/computer.c:308 +msgid "Invalid chassis type (0)" +msgstr "" + +#: modules/computer.c:309 modules/computer.c:310 +msgid "Unknown chassis type" +msgstr "Bilinmeyen şasi tipi" + +#: modules/computer.c:311 +msgid "Desktop" +msgstr "Masaüstü" + +#: modules/computer.c:312 +msgid "Low-profile Desktop" +msgstr "Düşük profilli Masaüstü" + +#: modules/computer.c:313 +msgid "Pizza Box" +msgstr "" + +#: modules/computer.c:314 +msgid "Mini Tower" +msgstr "" + +#: modules/computer.c:315 +msgid "Tower" +msgstr "" + +#: modules/computer.c:316 +msgid "Portable" +msgstr "Taşınabilir" + +#: modules/computer.c:317 modules/computer.c:341 modules/computer.c:350 +#: modules/computer.c:372 +msgid "Laptop" +msgstr "" + +#: modules/computer.c:318 +msgid "Notebook" +msgstr "" + +#: modules/computer.c:319 +msgid "Handheld" +msgstr "" + +#: modules/computer.c:320 +msgid "Docking Station" +msgstr "Yerleştirme İstasyonu" + +#: modules/computer.c:321 +msgid "All-in-one" +msgstr "Hepsi Bir Arada" + +#: modules/computer.c:322 +msgid "Subnotebook" +msgstr "" + +#: modules/computer.c:323 +msgid "Space-saving" +msgstr "" + +#: modules/computer.c:324 +msgid "Lunch Box" +msgstr "" + +#: modules/computer.c:325 +msgid "Main Server Chassis" +msgstr "" + +#: modules/computer.c:326 +msgid "Expansion Chassis" +msgstr "Genişletme Şasisi" + +#: modules/computer.c:327 +msgid "Sub Chassis" +msgstr "" + +#: modules/computer.c:328 +msgid "Bus Expansion Chassis" +msgstr "" + +#: modules/computer.c:329 +msgid "Peripheral Chassis" +msgstr "" + +#: modules/computer.c:330 +msgid "RAID Chassis" +msgstr "" + +#: modules/computer.c:331 +msgid "Rack Mount Chassis" +msgstr "" + +#: modules/computer.c:332 +msgid "Sealed-case PC" +msgstr "" + +#. /proc/apm +#. FIXME: use dmidecode if available to get chassis type +#: modules/computer.c:386 +msgid "Unknown physical machine type" +msgstr "Bilinmeyen fiziksel makine türü" + +#: modules/computer.c:470 modules/computer.c:709 +msgid "Computer" +msgstr "Bilgisayar" + +#: modules/computer.c:471 modules/devices/alpha/processor.c:87 +#: modules/devices/arm/processor.c:236 modules/devices.c:95 +#: modules/devices/ia64/processor.c:159 modules/devices/m68k/processor.c:83 +#: modules/devices/mips/processor.c:74 modules/devices/parisc/processor.c:154 +#: modules/devices/ppc/processor.c:157 modules/devices/riscv/processor.c:181 +#: modules/devices/s390/processor.c:131 modules/devices/sh/processor.c:83 +#: modules/devices/sparc/processor.c:74 modules/devices/x86/processor.c:409 +msgid "Processor" +msgstr "İşlemci" + +#: modules/computer.c:474 +msgid "Machine Type" +msgstr "Makine Türü" + +#: modules/computer.c:477 modules/computer.c:514 +msgid "User Name" +msgstr "Kullanıcı Adı" + +#: modules/computer.c:482 modules/computer.c:591 +msgid "Resolution" +msgstr "Çözünürlük" + +#: modules/computer.c:483 modules/computer.c:592 +#, c-format +msgid "%dx%d pixels" +msgstr "%dx%d piksel" + +#: modules/computer.c:485 +msgid "OpenGL Renderer" +msgstr "" + +#: modules/computer.c:486 +msgid "X11 Vendor" +msgstr "" + +#: modules/computer.c:491 modules/devices.c:102 +msgid "Input Devices" +msgstr "Giriş Aygıtları" + +#: modules/computer.c:493 modules/computer.c:752 modules/devices.c:99 +msgid "Printers" +msgstr "Yazıcılar" + +#: modules/computer.c:495 modules/computer.c:752 modules/devices.c:103 +msgid "Storage" +msgstr "Depolama" + +#: modules/computer.c:506 +msgid "Kernel" +msgstr "Çekirdek" + +#: modules/computer.c:508 +msgid "C Library" +msgstr "C Kütüphanesi" + +#: modules/computer.c:509 +msgid "Distribution" +msgstr "Dağıtım" + +#: modules/computer.c:512 +msgid "Current Session" +msgstr "Mevcut Oturum" + +#: modules/computer.c:513 +msgid "Computer Name" +msgstr "Bilgisayar Adı" + +#: modules/computer.c:515 modules/computer/languages.c:108 +msgid "Language" +msgstr "Dil" + +#: modules/computer.c:516 modules/computer/users.c:50 +msgid "Home Directory" +msgstr "Ev Dizini" + +#: modules/computer.c:519 modules/devices/usb.c:87 modules/devices/usb.c:234 +#: modules/devices/usb.c:351 +msgid "Misc" +msgstr "Çeşitli" + +#: modules/computer.c:532 +msgid "Loaded Modules" +msgstr "Yüklü Modüller" + +#: modules/computer.c:535 modules/computer/modules.c:145 +#: modules/computer/modules.c:147 modules/devices/arm/processor.c:337 +#: modules/devices.c:559 modules/devices/x86/processor.c:456 +msgid "Description" +msgstr "Tanım" + +#: modules/computer.c:548 +msgid "Date & Time" +msgstr "Tarih & Zaman" + +#: modules/computer.c:549 +msgid "Kernel Version" +msgstr "Çekirdek Sürümü" + +#: modules/computer.c:559 +msgid "Available Languages" +msgstr "" + +#: modules/computer.c:561 +msgid "Language Code" +msgstr "Dil Kodu" + +#: modules/computer.c:573 +msgid "Mounted File Systems" +msgstr "Bağlı Dosya Sistemleri" + +#: modules/computer.c:575 modules/computer/filesystem.c:85 +msgid "Mount Point" +msgstr "Bağlantı Noktası" + +#: modules/computer.c:576 +msgid "Usage" +msgstr "Kullanım" + +#: modules/computer.c:577 +msgid "Device" +msgstr "Aygıt" + +#: modules/computer.c:594 modules/computer.c:601 +#: modules/devices/ia64/processor.c:161 modules/devices/inputdevices.c:119 +#: modules/devices/pci.c:225 modules/devices/usb.c:349 +#: modules/devices/x86/processor.c:416 +msgid "Vendor" +msgstr "Satıcı" + +#: modules/computer.c:598 +msgid "Monitors" +msgstr "Ekranlar" + +#: modules/computer.c:600 +msgid "OpenGL" +msgstr "" + +#: modules/computer.c:602 +msgid "Renderer" +msgstr "" + +#: modules/computer.c:604 +msgid "Direct Rendering" +msgstr "" + +#: modules/computer.c:608 +msgid "Extensions" +msgstr "Eklentiler" + +#: modules/computer.c:628 +msgid "Group" +msgstr "Grup" + +#: modules/computer.c:631 modules/computer/users.c:49 +msgid "Group ID" +msgstr "Grup ID" + +#: modules/computer.c:751 +msgid "RAM" +msgstr "" + +#: modules/computer.c:751 modules/devices/devicetree/pmac_data.c:82 +msgid "Motherboard" +msgstr "Anakart" + +#: modules/computer.c:751 +msgid "Graphics" +msgstr "Ekran Kartı" + +#: modules/computer.c:752 +msgid "Audio" +msgstr "Ses" + +#: modules/computer.c:807 +msgid "Gathers high-level computer information" +msgstr "Üst düzey bilgisayar bilgilerini toplar" + +#: modules/computer/display.c:122 +#, c-format +msgid "Monitor %d=%dx%d pixels\n" +msgstr "" + +#: modules/computer/filesystem.c:83 +msgid "Filesystem" +msgstr "Dosya Sistemi" + +#: modules/computer/filesystem.c:84 +msgid "Mounted As" +msgstr "" + +#: modules/computer/filesystem.c:84 +msgid "Read-Write" +msgstr "Okuma-Yazma" + +#: modules/computer/filesystem.c:84 +msgid "Read-Only" +msgstr "Salt Okunur" + +#: modules/computer/filesystem.c:86 modules/devices/spd-decode.c:1510 +msgid "Size" +msgstr "Boyut" + +#: modules/computer/filesystem.c:87 +msgid "Used" +msgstr "Kullanılan" + +#: modules/computer/filesystem.c:88 +msgid "Available" +msgstr "Uygulanabilir" + +#: modules/computer/languages.c:103 +msgid "Locale Information" +msgstr "Yerel Bilgisi" + +#: modules/computer/languages.c:105 +msgid "Source" +msgstr "Kaynak" + +#: modules/computer/languages.c:106 +msgid "Address" +msgstr "Adres" + +#: modules/computer/languages.c:107 +msgid "E-mail" +msgstr "" + +#: modules/computer/languages.c:109 +msgid "Territory" +msgstr "Bölge" + +#: modules/computer/languages.c:110 modules/devices/arm/processor.c:250 +#: modules/devices/ia64/processor.c:166 modules/devices/ppc/processor.c:159 +#: modules/devices/usb.c:236 +msgid "Revision" +msgstr "Revizyon" + +#: modules/computer/languages.c:111 +msgid "Date" +msgstr "Tarih" + +#: modules/computer/languages.c:112 +msgid "Codeset" +msgstr "" + +#: modules/computer/loadavg.c:64 +msgid "Couldn't obtain load average" +msgstr "Yük ortalaması alınamadı" + +#: modules/computer/modules.c:125 modules/computer/modules.c:126 +#: modules/computer/modules.c:127 modules/computer/modules.c:128 +#: modules/computer/modules.c:129 +msgid "(Not available)" +msgstr "(Uygun değil)" + +#: modules/computer/modules.c:142 +msgid "Module Information" +msgstr "Modül Bilgisi" + +#: modules/computer/modules.c:143 +msgid "Path" +msgstr "Yol" + +#: modules/computer/modules.c:144 +msgid "Used Memory" +msgstr "Kullanılan Hafıza" + +#: modules/computer/modules.c:144 +msgid "KiB" +msgstr "" + +#: modules/computer/modules.c:148 +msgid "Version Magic" +msgstr "" + +#: modules/computer/modules.c:149 +msgid "Copyright" +msgstr "Telif" + +#: modules/computer/modules.c:150 +msgid "Author" +msgstr "Yazar" + +#: modules/computer/modules.c:151 +msgid "License" +msgstr "Lisans" + +#: modules/computer/modules.c:158 +msgid "Dependencies" +msgstr "Bağımlılıklar" + +#: modules/computer/os.c:35 modules/computer/os.c:36 modules/computer/os.c:37 +#: modules/computer/os.c:38 +msgid "GNU C Library" +msgstr "" + +#: modules/computer/os.c:39 +msgid "uClibc or uClibc-ng" +msgstr "" + +#: modules/computer/os.c:40 +msgid "diet libc" +msgstr "" + +#: modules/computer/os.c:78 modules/computer/os.c:234 modules/computer/os.c:359 +#: modules/devices.c:333 modules/devices.c:387 modules/devices/printers.c:99 +#: modules/devices/printers.c:106 modules/devices/printers.c:116 +#: modules/devices/printers.c:131 modules/devices/printers.c:140 +#: modules/devices/printers.c:243 +msgid "Unknown" +msgstr "Bilinmeyen" + +#: modules/computer/os.c:112 modules/computer/os.c:115 +msgid "GNOME Shell " +msgstr "" + +#: modules/computer/os.c:123 modules/computer/os.c:126 +msgid "Version: " +msgstr "Sürüm" + +#: modules/computer/os.c:157 +#, c-format +msgid "Unknown (Window Manager: %s)" +msgstr "Bilinmeyen (Pencere Yöneticisi: %s)" + +#. /{desktop environment} on {session type} +#: modules/computer/os.c:168 +#, c-format +msgid "%s on %s" +msgstr "" + +#: modules/computer/os.c:232 +msgid "Terminal" +msgstr "" + +#. /bits of entropy for rng (0) +#: modules/computer/os.c:241 +msgid "(None or not available)" +msgstr "(Yok veya uygun değil)" + +#. /bits of entropy for rng (low/poor value) +#: modules/computer/os.c:242 +#, c-format +msgid "%d bits (low)" +msgstr "" + +#. /bits of entropy for rng (medium value) +#: modules/computer/os.c:243 +#, c-format +msgid "%d bits (medium)" +msgstr "" + +#. /bits of entropy for rng (high/good value) +#: modules/computer/os.c:244 +#, c-format +msgid "%d bits (healthy)" +msgstr "" + +#: modules/computer/os.c:279 modules/devices/usb.c:48 modules/devices/usb.c:307 +#: modules/devices/usb.c:310 modules/network/net.c:442 includes/cpu_util.h:11 +msgid "(Unknown)" +msgstr "(Bilinmeyen)" + +#: modules/computer/users.c:47 +msgid "User Information" +msgstr "Kullanıcı Bilgisi" + +#: modules/computer/users.c:48 +msgid "User ID" +msgstr "Kullanıcı ID" + +#: modules/computer/users.c:51 +msgid "Default Shell" +msgstr "" + +#: modules/devices/alpha/processor.c:88 modules/devices/devicetree.c:141 +#: modules/devices/devicetree.c:176 modules/devices/devicetree/pmac_data.c:80 +#: modules/devices/ia64/processor.c:165 modules/devices/m68k/processor.c:84 +#: modules/devices/mips/processor.c:75 modules/devices/parisc/processor.c:155 +#: modules/devices/ppc/processor.c:158 modules/devices/riscv/processor.c:182 +#: modules/devices/s390/processor.c:132 modules/devices/spd-decode.c:1510 +msgid "Model" +msgstr "" + +#: modules/devices/alpha/processor.c:89 +msgid "Platform String" +msgstr "" + +#: modules/devices/alpha/processor.c:90 modules/devices/arm/processor.c:240 +#: modules/devices/ia64/processor.c:167 modules/devices/m68k/processor.c:87 +#: modules/devices/mips/processor.c:77 modules/devices/parisc/processor.c:158 +#: modules/devices/pci.c:108 modules/devices/ppc/processor.c:160 +#: modules/devices/riscv/processor.c:186 modules/devices/sh/processor.c:87 +#: modules/devices/x86/processor.c:420 +msgid "Frequency" +msgstr "Frekans" + +#: modules/devices/alpha/processor.c:90 modules/devices/arm/processor.c:240 +#: modules/devices/arm/processor.c:365 modules/devices.c:299 +#: modules/devices.c:307 modules/devices.c:335 +#: modules/devices/ia64/processor.c:167 modules/devices/ia64/processor.c:196 +#: modules/devices/m68k/processor.c:87 modules/devices/mips/processor.c:77 +#: modules/devices/parisc/processor.c:158 +#: modules/devices/parisc/processor.c:191 modules/devices/pci.c:108 +#: modules/devices/ppc/processor.c:160 modules/devices/ppc/processor.c:187 +#: modules/devices/riscv/processor.c:186 modules/devices/riscv/processor.c:214 +#: modules/devices/s390/processor.c:160 modules/devices/sh/processor.c:87 +#: modules/devices/sh/processor.c:88 modules/devices/sh/processor.c:89 +#: modules/devices/x86/processor.c:420 modules/devices/x86/processor.c:479 +msgid "MHz" +msgstr "" + +#: modules/devices/alpha/processor.c:91 modules/devices/arm/processor.c:241 +#: modules/devices/ia64/processor.c:168 modules/devices/m68k/processor.c:88 +#: modules/devices/mips/processor.c:78 modules/devices/parisc/processor.c:159 +#: modules/devices/ppc/processor.c:161 modules/devices/s390/processor.c:134 +#: modules/devices/sh/processor.c:90 modules/devices/x86/processor.c:421 +msgid "BogoMips" +msgstr "" + +#: modules/devices/alpha/processor.c:92 modules/devices/arm/processor.c:242 +#: modules/devices/ia64/processor.c:169 modules/devices/m68k/processor.c:89 +#: modules/devices/mips/processor.c:79 modules/devices/parisc/processor.c:160 +#: modules/devices/ppc/processor.c:162 modules/devices/riscv/processor.c:187 +#: modules/devices/s390/processor.c:135 modules/devices/sh/processor.c:91 +#: modules/devices/sparc/processor.c:77 modules/devices/x86/processor.c:422 +msgid "Byte Order" +msgstr "" + +#. /hw_cap +#. /flag:swp +#: modules/devices/arm/arm_data.c:42 +msgctxt "arm-flag" +msgid "SWP instruction (atomic read-modify-write)" +msgstr "" + +#. /flag:half +#: modules/devices/arm/arm_data.c:43 +msgctxt "arm-flag" +msgid "Half-word loads and stores" +msgstr "" + +#. /flag:thumb +#: modules/devices/arm/arm_data.c:44 +msgctxt "arm-flag" +msgid "Thumb (16-bit instruction set)" +msgstr "" + +#. /flag:26bit +#: modules/devices/arm/arm_data.c:45 +msgctxt "arm-flag" +msgid "26-Bit Model (Processor status register folded into program counter)" +msgstr "" + +#. /flag:fastmult +#: modules/devices/arm/arm_data.c:46 +msgctxt "arm-flag" +msgid "32x32->64-bit multiplication" +msgstr "" + +#. /flag:fpa +#: modules/devices/arm/arm_data.c:47 +msgctxt "arm-flag" +msgid "Floating point accelerator" +msgstr "" + +#. /flag:vfp +#: modules/devices/arm/arm_data.c:48 +msgctxt "arm-flag" +msgid "VFP (early SIMD vector floating point instructions)" +msgstr "" + +#. /flag:edsp +#: modules/devices/arm/arm_data.c:49 +msgctxt "arm-flag" +msgid "DSP extensions (the 'e' variant of the ARM9 CPUs, and all others above)" +msgstr "" + +#. /flag:java +#: modules/devices/arm/arm_data.c:50 +msgctxt "arm-flag" +msgid "Jazelle (Java bytecode accelerator)" +msgstr "" + +#. /flag:iwmmxt +#: modules/devices/arm/arm_data.c:51 +msgctxt "arm-flag" +msgid "SIMD instructions similar to Intel MMX" +msgstr "" + +#. /flag:crunch +#: modules/devices/arm/arm_data.c:52 +msgctxt "arm-flag" +msgid "MaverickCrunch coprocessor (if kernel support enabled)" +msgstr "" + +#. /flag:thumbee +#: modules/devices/arm/arm_data.c:53 +msgctxt "arm-flag" +msgid "ThumbEE" +msgstr "" + +#. /flag:neon +#: modules/devices/arm/arm_data.c:54 +msgctxt "arm-flag" +msgid "Advanced SIMD/NEON on AArch32" +msgstr "" + +#. /flag:evtstrm +#: modules/devices/arm/arm_data.c:55 +msgctxt "arm-flag" +msgid "Kernel event stream using generic architected timer" +msgstr "" + +#. /flag:vfpv3 +#: modules/devices/arm/arm_data.c:56 +msgctxt "arm-flag" +msgid "VFP version 3" +msgstr "" + +#. /flag:vfpv3d16 +#: modules/devices/arm/arm_data.c:57 +msgctxt "arm-flag" +msgid "VFP version 3 with 16 D-registers" +msgstr "" + +#. /flag:vfpv4 +#: modules/devices/arm/arm_data.c:58 +msgctxt "arm-flag" +msgid "VFP version 4 with fast context switching" +msgstr "" + +#. /flag:vfpd32 +#: modules/devices/arm/arm_data.c:59 +msgctxt "arm-flag" +msgid "VFP with 32 D-registers" +msgstr "" + +#. /flag:tls +#: modules/devices/arm/arm_data.c:60 +msgctxt "arm-flag" +msgid "TLS register" +msgstr "" + +#. /flag:idiva +#: modules/devices/arm/arm_data.c:61 +msgctxt "arm-flag" +msgid "SDIV and UDIV hardware division in ARM mode" +msgstr "" + +#. /flag:idivt +#: modules/devices/arm/arm_data.c:62 +msgctxt "arm-flag" +msgid "SDIV and UDIV hardware division in Thumb mode" +msgstr "" + +#. /flag:lpae +#: modules/devices/arm/arm_data.c:63 +msgctxt "arm-flag" +msgid "40-bit Large Physical Address Extension" +msgstr "" + +#. /hw_cap2 +#. /flag:pmull +#: modules/devices/arm/arm_data.c:65 +msgctxt "arm-flag" +msgid "64x64->128-bit F2m multiplication (arch>8)" +msgstr "" + +#. /flag:aes +#: modules/devices/arm/arm_data.c:66 +msgctxt "arm-flag" +msgid "Crypto:AES (arch>8)" +msgstr "" + +#. /flag:sha1 +#: modules/devices/arm/arm_data.c:67 +msgctxt "arm-flag" +msgid "Crypto:SHA1 (arch>8)" +msgstr "" + +#. /flag:sha2 +#: modules/devices/arm/arm_data.c:68 +msgctxt "arm-flag" +msgid "Crypto:SHA2 (arch>8)" +msgstr "" + +#. /flag:crc32 +#: modules/devices/arm/arm_data.c:69 +msgctxt "arm-flag" +msgid "CRC32 checksum instructions (arch>8)" +msgstr "" + +#. /flag:asimd +#: modules/devices/arm/arm_data.c:72 +msgctxt "arm-flag" +msgid "Advanced SIMD/NEON on AArch64 (arch>8)" +msgstr "" + +#: modules/devices/arm/processor.c:142 +msgid "ARM Processor" +msgstr "" + +#: modules/devices/arm/processor.c:200 modules/devices/riscv/processor.c:147 +#: modules/devices/x86/processor.c:371 +msgid "Empty List" +msgstr "" + +#: modules/devices/arm/processor.c:237 +msgid "Linux Name" +msgstr "Linux Adı" + +#: modules/devices/arm/processor.c:238 +msgid "Decoded Name" +msgstr "" + +#: modules/devices/arm/processor.c:239 modules/network/net.c:458 +msgid "Mode" +msgstr "" + +#: modules/devices/arm/processor.c:245 +msgid "ARM" +msgstr "" + +#: modules/devices/arm/processor.c:246 +msgid "Implementer" +msgstr "" + +#: modules/devices/arm/processor.c:247 +msgid "Part" +msgstr "" + +#: modules/devices/arm/processor.c:248 modules/devices/ia64/processor.c:162 +#: modules/devices/parisc/processor.c:156 modules/devices/riscv/processor.c:183 +msgid "Architecture" +msgstr "Mimari" + +#: modules/devices/arm/processor.c:249 +msgid "Variant" +msgstr "" + +#: modules/devices/arm/processor.c:251 modules/devices/riscv/processor.c:190 +#: modules/devices/sparc/processor.c:78 modules/devices/x86/processor.c:428 +msgid "Capabilities" +msgstr "" + +#: modules/devices/arm/processor.c:335 +msgid "SOC/Package" +msgstr "" + +#: modules/devices/arm/processor.c:338 modules/devices/cpu_util.c:222 +msgid "Topology" +msgstr "" + +#: modules/devices/arm/processor.c:339 +msgid "Clocks" +msgstr "" + +#: modules/devices/arm/processor.c:354 +msgid "SOC/Package Information" +msgstr "" + +#: modules/devices/battery.c:181 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s (load: %s)\n" +"Capacity=%s / %s (%.2f%%)\n" +"Battery Technology=%s (%s)\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" + +#: modules/devices/battery.c:258 +#, c-format +msgid "" +"\n" +"[Battery: %s]\n" +"State=%s\n" +"Capacity=%s / %s\n" +"Battery Technology=%s\n" +"Manufacturer=%s\n" +"Model Number=%s\n" +"Serial Number=%s\n" +msgstr "" + +#: modules/devices/battery.c:346 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Remaining Charge=%s of %s\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" + +#: modules/devices/battery.c:358 +#, c-format +msgid "" +"\n" +"[Battery (APM)]\n" +"Charge=%d%%\n" +"Using=%s\n" +"APM driver version=%s\n" +"APM BIOS version=%s\n" +msgstr "" + +#: modules/devices/battery.c:385 +msgid "" +"[No batteries]\n" +"No batteries found on this system=\n" +msgstr "" + +#: modules/devices.c:97 +msgid "PCI Devices" +msgstr "PCI Aygıtlar" + +#: modules/devices.c:98 modules/devices/usb.c:117 modules/devices/usb.c:156 +#: modules/devices/usb.c:415 +msgid "USB Devices" +msgstr "USB Aygıtlar" + +#: modules/devices.c:100 +msgid "Battery" +msgstr "Batarya" + +#: modules/devices.c:101 +msgid "Sensors" +msgstr "Sensörler" + +#: modules/devices.c:105 +msgid "DMI" +msgstr "" + +#: modules/devices.c:106 +msgid "Memory SPD" +msgstr "SPD Hafıza" + +#: modules/devices.c:111 +msgid "Device Tree" +msgstr "Aygıt Ağacı" + +#: modules/devices.c:113 +msgid "Resources" +msgstr "Kaynaklar" + +#: modules/devices.c:151 +#, c-format +msgid "%d physical processor" +msgid_plural "%d physical processors" +msgstr[0] "" +msgstr[1] "" + +#: modules/devices.c:152 +#, c-format +msgid "%d core" +msgid_plural "%d cores" +msgstr[0] "" +msgstr[1] "" + +#: modules/devices.c:153 +#, c-format +msgid "%d thread" +msgid_plural "%d threads" +msgstr[0] "" +msgstr[1] "" + +#. /NP procs; NC cores; NT threads +#: modules/devices.c:154 +#, c-format +msgid "%s; %s; %s" +msgstr "" + +#: modules/devices.c:372 +msgid " (model unknown)" +msgstr "(model bilinmiyor)" + +#: modules/devices.c:374 +msgid " (vendor unknown)" +msgstr "" + +#: modules/devices.c:559 +msgid "Field" +msgstr "" + +#: modules/devices.c:559 modules/devices.c:591 +msgid "Value" +msgstr "" + +#: modules/devices.c:591 +msgid "Sensor" +msgstr "" + +#: modules/devices.c:591 modules/devices/inputdevices.c:117 +msgid "Type" +msgstr "Tür" + +#: modules/devices.c:637 +msgid "Devices" +msgstr "Aygıtlar" + +#: modules/devices.c:649 +msgid "Update PCI ID listing" +msgstr "" + +#: modules/devices.c:661 +msgid "Update CPU feature database" +msgstr "CPU özellik veritabanını güncelle" + +#: modules/devices.c:689 +msgid "Gathers information about hardware devices" +msgstr "Donanım aygıtları hakkında bilgi toplar" + +#: modules/devices.c:708 +msgid "Resource information requires superuser privileges" +msgstr "Kaynak bilgileri süper kullanıcı ayrıcalıkları gerektirir" + +#: modules/devices/cpu_util.c:30 +msgid "Little Endian" +msgstr "" + +#: modules/devices/cpu_util.c:32 +msgid "Big Endian" +msgstr "" + +#: modules/devices/cpu_util.c:178 modules/devices/cpu_util.c:189 +msgid "Frequency Scaling" +msgstr "" + +#: modules/devices/cpu_util.c:179 +msgid "Minimum" +msgstr "" + +#: modules/devices/cpu_util.c:179 modules/devices/cpu_util.c:180 +#: modules/devices/cpu_util.c:181 +msgid "kHz" +msgstr "" + +#: modules/devices/cpu_util.c:180 +msgid "Maximum" +msgstr "En Fazla" + +#: modules/devices/cpu_util.c:181 +msgid "Current" +msgstr "Güncel" + +#: modules/devices/cpu_util.c:182 +msgid "Transition Latency" +msgstr "" + +#: modules/devices/cpu_util.c:182 +msgid "ns" +msgstr "" + +#: modules/devices/cpu_util.c:183 +msgid "Governor" +msgstr "" + +#: modules/devices/cpu_util.c:184 modules/devices/cpu_util.c:190 +msgid "Driver" +msgstr "Sürücü" + +#: modules/devices/cpu_util.c:196 modules/devices/x86/processor.c:297 +msgid "(Not Available)" +msgstr "" + +#: modules/devices/cpu_util.c:204 modules/devices/cpu_util.c:206 +msgid "Socket" +msgstr "" + +#: modules/devices/cpu_util.c:209 modules/devices/cpu_util.c:211 +msgid "Core" +msgstr "" + +#: modules/devices/cpu_util.c:214 +msgid "Book" +msgstr "" + +#: modules/devices/cpu_util.c:216 +msgid "Drawer" +msgstr "" + +#: modules/devices/cpu_util.c:223 +msgid "ID" +msgstr "" + +#: modules/devices/devicetree.c:47 +msgid "Properties" +msgstr "" + +#: modules/devices/devicetree.c:48 +msgid "Children" +msgstr "" + +#: modules/devices/devicetree.c:84 +msgid "Node" +msgstr "" + +#: modules/devices/devicetree.c:85 +msgid "Node Path" +msgstr "" + +#: modules/devices/devicetree.c:86 +msgid "Alias" +msgstr "" + +#: modules/devices/devicetree.c:86 modules/devices/devicetree.c:87 +msgid "(None)" +msgstr "" + +#: modules/devices/devicetree.c:87 +msgid "Symbol" +msgstr "" + +#: modules/devices/devicetree.c:132 modules/devices/devicetree/pmac_data.c:79 +msgid "Platform" +msgstr "" + +#: modules/devices/devicetree.c:133 modules/devices/devicetree.c:178 +msgid "Compatible" +msgstr "" + +#: modules/devices/devicetree.c:134 +msgid "GPU-compatible" +msgstr "" + +#: modules/devices/devicetree.c:140 +msgid "Raspberry Pi or Compatible" +msgstr "" + +#: modules/devices/devicetree.c:142 modules/devices/devicetree.c:160 +#: modules/devices/devicetree.c:177 modules/devices/devicetree/rpi_data.c:160 +msgid "Serial Number" +msgstr "" + +#: modules/devices/devicetree.c:143 modules/devices/devicetree/rpi_data.c:157 +msgid "RCode" +msgstr "" + +#: modules/devices/devicetree.c:143 +msgid "No revision code available; unable to lookup model details." +msgstr "" + +#: modules/devices/devicetree.c:159 +msgid "More" +msgstr "" + +#: modules/devices/devicetree.c:175 +msgid "Board" +msgstr "" + +#: modules/devices/devicetree.c:234 +msgid "Messages" +msgstr "" + +#: modules/devices/devicetree/dt_util.c:1013 +msgid "phandle Map" +msgstr "" + +#: modules/devices/devicetree/dt_util.c:1014 +msgid "Alias Map" +msgstr "" + +#: modules/devices/devicetree/dt_util.c:1015 +msgid "Symbol Map" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:78 +msgid "Apple Power Macintosh" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:81 modules/devices/sh/processor.c:85 +msgid "Machine" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:83 +msgid "Detected as" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:84 +msgid "PMAC Flags" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:85 +msgid "L2 Cache" +msgstr "" + +#: modules/devices/devicetree/pmac_data.c:86 +msgid "PMAC Generation" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:152 +#: modules/devices/devicetree/rpi_data.c:153 +msgid "Raspberry Pi" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:153 +msgid "Board Name" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:154 +msgid "PCB Revision" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:155 +msgid "Introduction" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:156 modules/devices/spd-decode.c:1510 +#: modules/devices/usb.c:84 modules/devices/usb.c:217 +msgid "Manufacturer" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:158 +msgid "SOC (spec)" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:159 +msgid "Memory (spec)" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:161 +msgid "Permanent overvolt bit" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:161 +msgctxt "rpi-ov-bit" +msgid "Set" +msgstr "" + +#: modules/devices/devicetree/rpi_data.c:161 +msgctxt "rpi-ov-bit" +msgid "Not set" +msgstr "" + +#: modules/devices/devmemory.c:93 +msgid "Total Memory" +msgstr "Toplam Hafıza" + +#: modules/devices/devmemory.c:94 +msgid "Free Memory" +msgstr "Boş Hafıza" + +#: modules/devices/devmemory.c:95 +msgid "Cached Swap" +msgstr "" + +#: modules/devices/devmemory.c:96 +msgid "High Memory" +msgstr "" + +#: modules/devices/devmemory.c:97 +msgid "Free High Memory" +msgstr "" + +#: modules/devices/devmemory.c:98 +msgid "Low Memory" +msgstr "" + +#: modules/devices/devmemory.c:99 +msgid "Free Low Memory" +msgstr "" + +#: modules/devices/devmemory.c:100 +msgid "Virtual Memory" +msgstr "" + +#: modules/devices/devmemory.c:101 +msgid "Free Virtual Memory" +msgstr "" + +#: modules/devices/dmi.c:188 +msgid "(Not available; Perhaps try running HardInfo as root.)" +msgstr "(Mevcut değil, belki de HardInfo'u kök olarak çalıştırmalısınız.)" + +#: modules/devices/ia64/processor.c:108 +msgid "IA64 Processor" +msgstr "" + +#: modules/devices/ia64/processor.c:163 +msgid "Architecture Revision" +msgstr "" + +#: modules/devices/ia64/processor.c:164 modules/devices/sh/processor.c:86 +msgid "Family" +msgstr "" + +#: modules/devices/ia64/processor.c:170 +msgid "CPU regs" +msgstr "" + +#: modules/devices/ia64/processor.c:171 +msgid "Features" +msgstr "" + +#: modules/devices/inputdevices.c:115 modules/devices/pci.c:214 +#: modules/devices/usb.c:82 modules/devices/usb.c:215 modules/devices/usb.c:347 +msgid "Device Information" +msgstr "Aygıt Bilgisi" + +#: modules/devices/inputdevices.c:118 modules/devices/usb.c:92 +#: modules/devices/usb.c:240 modules/devices/usb.c:356 +msgid "Bus" +msgstr "" + +#: modules/devices/inputdevices.c:120 modules/devices/usb.c:83 +#: modules/devices/usb.c:216 modules/devices/usb.c:348 +msgid "Product" +msgstr "Ürün" + +#: modules/devices/inputdevices.c:124 +msgid "Connected to" +msgstr "" + +#: modules/devices/inputdevices.c:128 +msgid "InfraRed port" +msgstr "Kızılötesi Portu" + +#: modules/devices/m68k/processor.c:85 modules/devices/riscv/processor.c:185 +msgid "MMU" +msgstr "" + +#: modules/devices/m68k/processor.c:86 modules/devices/sparc/processor.c:76 +msgid "FPU" +msgstr "" + +#: modules/devices/m68k/processor.c:90 +msgid "Calibration" +msgstr "" + +#: modules/devices/mips/processor.c:76 +msgid "System Type" +msgstr "Sistem Türü" + +#: modules/devices/parisc/processor.c:107 +msgid "PA-RISC Processor" +msgstr "" + +#: modules/devices/parisc/processor.c:157 +msgid "System" +msgstr "Sistem" + +#: modules/devices/parisc/processor.c:161 +msgid "HVersion" +msgstr "" + +#: modules/devices/parisc/processor.c:162 +msgid "SVersion" +msgstr "" + +#: modules/devices/parisc/processor.c:163 modules/devices/x86/processor.c:425 +msgid "Cache" +msgstr "" + +#: modules/devices/pci.c:106 +msgid "IRQ" +msgstr "" + +#: modules/devices/pci.c:110 +msgid "Latency" +msgstr "" + +#: modules/devices/pci.c:112 +msgid "Bus Master" +msgstr "" + +#: modules/devices/pci.c:118 +msgid "Kernel modules" +msgstr "" + +#: modules/devices/pci.c:124 +#, c-format +msgid "%s=%s (%s)\n" +msgstr "" + +#: modules/devices/pci.c:126 +msgid "OEM Vendor" +msgstr "" + +#: modules/devices/pci.c:153 +msgid "prefetchable" +msgstr "" + +#: modules/devices/pci.c:154 +msgid "non-prefetchable" +msgstr "" + +#: modules/devices/pci.c:163 +msgid "I/O ports at" +msgstr "" + +#: modules/devices/pci.c:216 modules/devices/usb.c:89 modules/devices/usb.c:237 +#: modules/devices/usb.c:353 +msgid "Class" +msgstr "" + +#: modules/devices/pci.c:217 +msgid "Domain" +msgstr "" + +#: modules/devices/pci.c:218 +msgid "Bus, device, function" +msgstr "" + +#: modules/devices/pci.c:243 +msgid "No PCI devices found" +msgstr "" + +#: modules/devices/ppc/processor.c:117 +msgid "POWER Processor" +msgstr "" + +#: modules/devices/printers.c:81 +msgid "⚬ Can do black and white printing=\n" +msgstr "" + +#: modules/devices/printers.c:83 +msgid "⚬ Can do color printing=\n" +msgstr "" + +#: modules/devices/printers.c:85 +msgid "⚬ Can do duplexing=\n" +msgstr "" + +#: modules/devices/printers.c:87 +msgid "⚬ Can do staple output=\n" +msgstr "" + +#: modules/devices/printers.c:89 +msgid "⚬ Can do copies=\n" +msgstr "" + +#: modules/devices/printers.c:91 +msgid "⚬ Can collate copies=\n" +msgstr "" + +#: modules/devices/printers.c:93 +msgid "⚬ Printer is rejecting jobs=\n" +msgstr "" + +#: modules/devices/printers.c:95 +msgid "⚬ Printer was automatically discovered and added=\n" +msgstr "" + +#: modules/devices/printers.c:110 +msgid "Idle" +msgstr "" + +#: modules/devices/printers.c:112 +msgid "Printing a Job" +msgstr "" + +#: modules/devices/printers.c:114 +msgid "Stopped" +msgstr "" + +#: modules/devices/printers.c:190 +msgid "" +"[Printers]\n" +"No suitable CUPS library found=" +msgstr "" + +#: modules/devices/printers.c:200 +msgid "[Printers (CUPS)]\n" +msgstr "" + +#: modules/devices/printers.c:263 +msgid "" +"[Printers]\n" +"No printers found=\n" +msgstr "" +"[Yazıcılar]\n" +"Yazıcı bulunamadı=\n" + +#: modules/devices/riscv/processor.c:107 +msgid "RISC-V Processor" +msgstr "" + +#: modules/devices/riscv/processor.c:184 +msgid "uarch" +msgstr "" + +#. /ext:RV32 +#: modules/devices/riscv/riscv_data.c:37 +msgctxt "rv-ext" +msgid "RISC-V 32-bit" +msgstr "" + +#. /ext:RV64 +#: modules/devices/riscv/riscv_data.c:38 +msgctxt "rv-ext" +msgid "RISC-V 64-bit" +msgstr "" + +#. /ext:RV128 +#: modules/devices/riscv/riscv_data.c:39 +msgctxt "rv-ext" +msgid "RISC-V 128-bit" +msgstr "" + +#. /ext:E +#: modules/devices/riscv/riscv_data.c:40 +msgctxt "rv-ext" +msgid "Base embedded integer instructions (15 registers)" +msgstr "" + +#. /ext:I +#: modules/devices/riscv/riscv_data.c:41 +msgctxt "rv-ext" +msgid "Base integer instructions (31 registers)" +msgstr "" + +#. /ext:M +#: modules/devices/riscv/riscv_data.c:42 +msgctxt "rv-ext" +msgid "Hardware integer multiply and divide" +msgstr "" + +#. /ext:A +#: modules/devices/riscv/riscv_data.c:43 +msgctxt "rv-ext" +msgid "Atomic memory operations" +msgstr "" + +#. /ext:C +#: modules/devices/riscv/riscv_data.c:44 +msgctxt "rv-ext" +msgid "Compressed 16-bit instructions" +msgstr "" + +#. /ext:F +#: modules/devices/riscv/riscv_data.c:45 +msgctxt "rv-ext" +msgid "Floating-point instructions, single-precision" +msgstr "" + +#. /ext:D +#: modules/devices/riscv/riscv_data.c:46 +msgctxt "rv-ext" +msgid "Floating-point instructions, double-precision" +msgstr "" + +#. /ext:Q +#: modules/devices/riscv/riscv_data.c:47 +msgctxt "rv-ext" +msgid "Floating-point instructions, quad-precision" +msgstr "" + +#. /ext:B +#: modules/devices/riscv/riscv_data.c:48 +msgctxt "rv-ext" +msgid "Bit manipulation instructions" +msgstr "" + +#. /ext:V +#: modules/devices/riscv/riscv_data.c:49 +msgctxt "rv-ext" +msgid "Vector operations" +msgstr "" + +#. /ext:T +#: modules/devices/riscv/riscv_data.c:50 +msgctxt "rv-ext" +msgid "Transactional memory" +msgstr "" + +#. /ext:P +#: modules/devices/riscv/riscv_data.c:51 +msgctxt "rv-ext" +msgid "Packed SIMD instructions" +msgstr "" + +#. /ext:L +#: modules/devices/riscv/riscv_data.c:52 +msgctxt "rv-ext" +msgid "Decimal floating-point instructions" +msgstr "" + +#. /ext:J +#: modules/devices/riscv/riscv_data.c:53 +msgctxt "rv-ext" +msgid "Dynamically translated languages" +msgstr "" + +#. /ext:N +#: modules/devices/riscv/riscv_data.c:54 +msgctxt "rv-ext" +msgid "User-level interrupts" +msgstr "" + +#: modules/devices/s390/processor.c:92 +msgid "S390 Processor" +msgstr "" + +#: modules/devices/s390/processor.c:133 +msgid "ID String" +msgstr "" + +#: modules/devices/sh/processor.c:55 +msgid "SuperH Processor" +msgstr "" + +#: modules/devices/sh/processor.c:88 +msgid "Bus Frequency" +msgstr "" + +#: modules/devices/sh/processor.c:89 +msgid "Module Frequency" +msgstr "Modül Frekansı" + +#: modules/devices/spd-decode.c:1475 +msgid "" +"[SPD]\n" +"Please load the eeprom module to obtain information about memory SPD=\n" +"[$ShellParam$]\n" +"ReloadInterval=500\n" +msgstr "" + +#: modules/devices/spd-decode.c:1480 +msgid "" +"[SPD]\n" +"Reading memory SPD not supported on this system=\n" +msgstr "" + +#: modules/devices/spd-decode.c:1509 +msgid "SPD" +msgstr "" + +#: modules/devices/spd-decode.c:1510 +msgid "Bank" +msgstr "" + +#: modules/devices/storage.c:46 +msgid "" +"\n" +"[SCSI Disks]\n" +msgstr "" + +#: modules/devices/storage.c:110 modules/devices/storage.c:313 +#, c-format +msgid "" +"[Device Information]\n" +"Model=%s\n" +msgstr "" + +#: modules/devices/storage.c:115 modules/devices/storage.c:319 +#, c-format +msgid "Vendor=%s (%s)\n" +msgstr "" + +#: modules/devices/storage.c:120 modules/devices/storage.c:321 +#, c-format +msgid "Vendor=%s\n" +msgstr "" + +#: modules/devices/storage.c:125 +#, c-format +msgid "" +"Type=%s\n" +"Revision=%s\n" +"[SCSI Controller]\n" +"Controller=scsi%d\n" +"Channel=%d\n" +"ID=%d\n" +"LUN=%d\n" +msgstr "" + +#: modules/devices/storage.c:167 +msgid "" +"\n" +"[IDE Disks]\n" +msgstr "" + +#: modules/devices/storage.c:250 +#, c-format +msgid "Driver=%s\n" +msgstr "" + +#: modules/devices/storage.c:324 +#, c-format +msgid "" +"Device Name=hd%c\n" +"Media=%s\n" +"Cache=%dkb\n" +msgstr "" + +#: modules/devices/storage.c:334 +#, c-format +msgid "" +"[Geometry]\n" +"Physical=%s\n" +"Logical=%s\n" +msgstr "" + +#: modules/devices/storage.c:344 +#, c-format +msgid "" +"[Capabilities]\n" +"%s" +msgstr "" + +#: modules/devices/storage.c:351 +#, c-format +msgid "" +"[Speeds]\n" +"%s" +msgstr "" + +#: modules/devices/usb.c:44 modules/devices/usb.c:326 +msgid "mA" +msgstr "" + +#. /%.2f is version +#: modules/devices/usb.c:53 modules/devices/usb.c:190 +#, c-format +msgid "USB %.2f Hub" +msgstr "" + +#: modules/devices/usb.c:55 modules/devices/usb.c:192 +#, c-format +msgid "Unknown USB %.2f Device (class %d)" +msgstr "" + +#: modules/devices/usb.c:85 modules/devices/usb.c:232 +msgid "Speed" +msgstr "Hız" + +#: modules/devices/usb.c:85 modules/devices/usb.c:232 +msgid "Mbit/s" +msgstr "" + +#: modules/devices/usb.c:86 modules/devices/usb.c:233 modules/devices/usb.c:350 +msgid "Max Current" +msgstr "" + +#: modules/devices/usb.c:88 modules/devices/usb.c:235 modules/devices/usb.c:352 +msgid "USB Version" +msgstr "USB Sürümü" + +#: modules/devices/usb.c:90 modules/devices/usb.c:238 modules/devices/usb.c:354 +msgid "Vendor ID" +msgstr "" + +#: modules/devices/usb.c:91 modules/devices/usb.c:239 modules/devices/usb.c:355 +msgid "Product ID" +msgstr "" + +#: modules/devices/usb.c:231 +msgid "Port" +msgstr "" + +#: modules/devices/usb.c:241 +msgid "Level" +msgstr "" + +#: modules/devices/x86/processor.c:149 +msgid "Cache information not available=\n" +msgstr "" + +#: modules/devices/x86/processor.c:155 +#, c-format +msgid "Level %d (%s)=%d-way set-associative, %d sets, %dKB size\n" +msgstr "" + +#. /cache type, as appears in: Level 1 (Data) +#: modules/devices/x86/processor.c:170 +msgctxt "cache-type" +msgid "Data" +msgstr "" + +#. /cache type, as appears in: Level 1 (Instruction) +#: modules/devices/x86/processor.c:171 +msgctxt "cache-type" +msgid "Instruction" +msgstr "" + +#. /cache type, as appears in: Level 2 (Unified) +#: modules/devices/x86/processor.c:172 +msgctxt "cache-type" +msgid "Unified" +msgstr "" + +#: modules/devices/x86/processor.c:410 +msgid "Model Name" +msgstr "" + +#: modules/devices/x86/processor.c:411 +msgid "Family, model, stepping" +msgstr "" + +#: modules/devices/x86/processor.c:417 +msgid "Microcode Version" +msgstr "" + +#: modules/devices/x86/processor.c:418 +msgid "Configuration" +msgstr "" + +#: modules/devices/x86/processor.c:419 +msgid "Cache Size" +msgstr "" + +#: modules/devices/x86/processor.c:419 +msgid "kb" +msgstr "" + +#: modules/devices/x86/processor.c:426 +msgid "Power Management" +msgstr "" + +#: modules/devices/x86/processor.c:427 +msgid "Bug Workarounds" +msgstr "" + +#: modules/devices/x86/processor.c:454 modules/devices/x86/processor.c:468 +msgid "Package Information" +msgstr "" + +#. /flag:fpu +#: modules/devices/x86/x86_data.c:43 +msgctxt "x86-flag" +msgid "Onboard FPU (floating point support)" +msgstr "" + +#. /flag:vme +#: modules/devices/x86/x86_data.c:44 +msgctxt "x86-flag" +msgid "Virtual 8086 mode enhancements" +msgstr "" + +#. /flag:de +#: modules/devices/x86/x86_data.c:45 +msgctxt "x86-flag" +msgid "Debugging Extensions (CR4.DE)" +msgstr "" + +#. /flag:pse +#: modules/devices/x86/x86_data.c:46 +msgctxt "x86-flag" +msgid "Page Size Extensions (4MB memory pages)" +msgstr "" + +#. /flag:tsc +#: modules/devices/x86/x86_data.c:47 +msgctxt "x86-flag" +msgid "Time Stamp Counter (RDTSC)" +msgstr "" + +#. /flag:msr +#: modules/devices/x86/x86_data.c:48 +msgctxt "x86-flag" +msgid "Model-Specific Registers (RDMSR, WRMSR)" +msgstr "" + +#. /flag:pae +#: modules/devices/x86/x86_data.c:49 +msgctxt "x86-flag" +msgid "Physical Address Extensions (support for more than 4GB of RAM)" +msgstr "Fiziksel Adres Uzantıları (4GB'dan fazla RAM desteği)" + +#. /flag:mce +#: modules/devices/x86/x86_data.c:50 +msgctxt "x86-flag" +msgid "Machine Check Exception" +msgstr "" + +#. /flag:cx8 +#: modules/devices/x86/x86_data.c:51 +msgctxt "x86-flag" +msgid "CMPXCHG8 instruction (64-bit compare-and-swap)" +msgstr "" + +#. /flag:apic +#: modules/devices/x86/x86_data.c:52 +msgctxt "x86-flag" +msgid "Onboard APIC" +msgstr "" + +#. /flag:sep +#: modules/devices/x86/x86_data.c:53 +msgctxt "x86-flag" +msgid "SYSENTER/SYSEXIT" +msgstr "" + +#. /flag:mtrr +#: modules/devices/x86/x86_data.c:54 +msgctxt "x86-flag" +msgid "Memory Type Range Registers" +msgstr "" + +#. /flag:pge +#: modules/devices/x86/x86_data.c:55 +msgctxt "x86-flag" +msgid "Page Global Enable (global bit in PDEs and PTEs)" +msgstr "" + +#. /flag:mca +#: modules/devices/x86/x86_data.c:56 +msgctxt "x86-flag" +msgid "Machine Check Architecture" +msgstr "" + +#. /flag:cmov +#: modules/devices/x86/x86_data.c:57 +msgctxt "x86-flag" +msgid "CMOV instructions (conditional move) (also FCMOV)" +msgstr "" + +#. /flag:pat +#: modules/devices/x86/x86_data.c:58 +msgctxt "x86-flag" +msgid "Page Attribute Table" +msgstr "" + +#. /flag:pse36 +#: modules/devices/x86/x86_data.c:59 +msgctxt "x86-flag" +msgid "36-bit PSEs (huge pages)" +msgstr "" + +#. /flag:pn +#: modules/devices/x86/x86_data.c:60 +msgctxt "x86-flag" +msgid "Processor serial number" +msgstr "" + +#. /flag:clflush +#: modules/devices/x86/x86_data.c:61 +msgctxt "x86-flag" +msgid "Cache Line Flush instruction" +msgstr "" + +#. /flag:dts +#: modules/devices/x86/x86_data.c:62 +msgctxt "x86-flag" +msgid "" +"Debug Store (buffer for debugging and profiling instructions), or " +"alternately: digital thermal sensor" +msgstr "" + +#. /flag:acpi +#: modules/devices/x86/x86_data.c:63 +msgctxt "x86-flag" +msgid "ACPI via MSR (temperature monitoring and clock speed modulation)" +msgstr "" + +#. /flag:mmx +#: modules/devices/x86/x86_data.c:64 +msgctxt "x86-flag" +msgid "Multimedia Extensions" +msgstr "" + +#. /flag:fxsr +#: modules/devices/x86/x86_data.c:65 +msgctxt "x86-flag" +msgid "FXSAVE/FXRSTOR, CR4.OSFXSR" +msgstr "" + +#. /flag:sse +#: modules/devices/x86/x86_data.c:66 +msgctxt "x86-flag" +msgid "Intel SSE vector instructions" +msgstr "" + +#. /flag:sse2 +#: modules/devices/x86/x86_data.c:67 +msgctxt "x86-flag" +msgid "SSE2" +msgstr "" + +#. /flag:ss +#: modules/devices/x86/x86_data.c:68 +msgctxt "x86-flag" +msgid "CPU self snoop" +msgstr "" + +#. /flag:ht +#: modules/devices/x86/x86_data.c:69 +msgctxt "x86-flag" +msgid "Hyper-Threading" +msgstr "" + +#. /flag:tm +#: modules/devices/x86/x86_data.c:70 +msgctxt "x86-flag" +msgid "Automatic clock control (Thermal Monitor)" +msgstr "" + +#. /flag:ia64 +#: modules/devices/x86/x86_data.c:71 +msgctxt "x86-flag" +msgid "" +"Intel Itanium Architecture 64-bit (not to be confused with Intel's 64-bit " +"x86 architecture with flag x86-64 or \"AMD64\" bit indicated by flag lm)" +msgstr "" + +#. /flag:pbe +#: modules/devices/x86/x86_data.c:72 +msgctxt "x86-flag" +msgid "Pending Break Enable (PBE# pin) wakeup support" +msgstr "" + +#. /flag:syscall +#: modules/devices/x86/x86_data.c:75 +msgctxt "x86-flag" +msgid "SYSCALL (Fast System Call) and SYSRET (Return From Fast System Call)" +msgstr "" + +#. /flag:mp +#: modules/devices/x86/x86_data.c:76 +msgctxt "x86-flag" +msgid "Multiprocessing Capable." +msgstr "" + +#. /flag:nx +#: modules/devices/x86/x86_data.c:77 +msgctxt "x86-flag" +msgid "Execute Disable" +msgstr "" + +#. /flag:mmxext +#: modules/devices/x86/x86_data.c:78 +msgctxt "x86-flag" +msgid "AMD MMX extensions" +msgstr "" + +#. /flag:fxsr_opt +#: modules/devices/x86/x86_data.c:79 +msgctxt "x86-flag" +msgid "FXSAVE/FXRSTOR optimizations" +msgstr "" + +#. /flag:pdpe1gb +#: modules/devices/x86/x86_data.c:80 +msgctxt "x86-flag" +msgid "One GB pages (allows hugepagesz=1G)" +msgstr "" + +#. /flag:rdtscp +#: modules/devices/x86/x86_data.c:81 +msgctxt "x86-flag" +msgid "Read Time-Stamp Counter and Processor ID" +msgstr "" + +#. /flag:lm +#: modules/devices/x86/x86_data.c:82 +msgctxt "x86-flag" +msgid "Long Mode (x86-64: amd64, also known as Intel 64, i.e. 64-bit capable)" +msgstr "" + +#. /flag:3dnow +#: modules/devices/x86/x86_data.c:83 +msgctxt "x86-flag" +msgid "3DNow! (AMD vector instructions, competing with Intel's SSE1)" +msgstr "" + +#. /flag:3dnowext +#: modules/devices/x86/x86_data.c:84 +msgctxt "x86-flag" +msgid "AMD 3DNow! extensions" +msgstr "" + +#. /flag:recovery +#: modules/devices/x86/x86_data.c:86 +msgctxt "x86-flag" +msgid "CPU in recovery mode" +msgstr "" + +#. /flag:longrun +#: modules/devices/x86/x86_data.c:87 +msgctxt "x86-flag" +msgid "Longrun power control" +msgstr "" + +#. /flag:lrti +#: modules/devices/x86/x86_data.c:88 +msgctxt "x86-flag" +msgid "LongRun table interface" +msgstr "" + +#. /flag:cxmmx +#: modules/devices/x86/x86_data.c:90 +msgctxt "x86-flag" +msgid "Cyrix MMX extensions" +msgstr "" + +#. /flag:k6_mtrr +#: modules/devices/x86/x86_data.c:91 +msgctxt "x86-flag" +msgid "AMD K6 nonstandard MTRRs" +msgstr "" + +#. /flag:cyrix_arr +#: modules/devices/x86/x86_data.c:92 +msgctxt "x86-flag" +msgid "Cyrix ARRs (= MTRRs)" +msgstr "" + +#. /flag:centaur_mcr +#: modules/devices/x86/x86_data.c:93 +msgctxt "x86-flag" +msgid "Centaur MCRs (= MTRRs)" +msgstr "" + +#. /flag:constant_tsc +#: modules/devices/x86/x86_data.c:94 +msgctxt "x86-flag" +msgid "TSC ticks at a constant rate" +msgstr "" + +#. /flag:up +#: modules/devices/x86/x86_data.c:95 +msgctxt "x86-flag" +msgid "SMP kernel running on UP" +msgstr "" + +#. /flag:art +#: modules/devices/x86/x86_data.c:96 +msgctxt "x86-flag" +msgid "Always-Running Timer" +msgstr "" + +#. /flag:arch_perfmon +#: modules/devices/x86/x86_data.c:97 +msgctxt "x86-flag" +msgid "Intel Architectural PerfMon" +msgstr "" + +#. /flag:pebs +#: modules/devices/x86/x86_data.c:98 +msgctxt "x86-flag" +msgid "Precise-Event Based Sampling" +msgstr "" + +#. /flag:bts +#: modules/devices/x86/x86_data.c:99 +msgctxt "x86-flag" +msgid "Branch Trace Store" +msgstr "" + +#. /flag:rep_good +#: modules/devices/x86/x86_data.c:100 +msgctxt "x86-flag" +msgid "rep microcode works well" +msgstr "" + +#. /flag:acc_power +#: modules/devices/x86/x86_data.c:101 +msgctxt "x86-flag" +msgid "AMD accumulated power mechanism" +msgstr "" + +#. /flag:nopl +#: modules/devices/x86/x86_data.c:102 +msgctxt "x86-flag" +msgid "The NOPL (0F 1F) instructions" +msgstr "" + +#. /flag:xtopology +#: modules/devices/x86/x86_data.c:103 +msgctxt "x86-flag" +msgid "cpu topology enum extensions" +msgstr "" + +#. /flag:tsc_reliable +#: modules/devices/x86/x86_data.c:104 +msgctxt "x86-flag" +msgid "TSC is known to be reliable" +msgstr "" + +#. /flag:nonstop_tsc +#: modules/devices/x86/x86_data.c:105 +msgctxt "x86-flag" +msgid "TSC does not stop in C states" +msgstr "" + +#. /flag:extd_apicid +#: modules/devices/x86/x86_data.c:106 +msgctxt "x86-flag" +msgid "has extended APICID (8 bits)" +msgstr "" + +#. /flag:amd_dcm +#: modules/devices/x86/x86_data.c:107 +msgctxt "x86-flag" +msgid "multi-node processor" +msgstr "" + +#. /flag:aperfmperf +#: modules/devices/x86/x86_data.c:108 +msgctxt "x86-flag" +msgid "APERFMPERF" +msgstr "" + +#. /flag:eagerfpu +#: modules/devices/x86/x86_data.c:109 +msgctxt "x86-flag" +msgid "Non lazy FPU restore" +msgstr "" + +#. /flag:nonstop_tsc_s3 +#: modules/devices/x86/x86_data.c:110 +msgctxt "x86-flag" +msgid "TSC doesn't stop in S3 state" +msgstr "" + +#. /flag:mce_recovery +#: modules/devices/x86/x86_data.c:111 +msgctxt "x86-flag" +msgid "CPU has recoverable machine checks" +msgstr "" + +#. /flag:pni +#: modules/devices/x86/x86_data.c:114 +msgctxt "x86-flag" +msgid "SSE-3 (\"Prescott New Instructions\")" +msgstr "" + +#. /flag:pclmulqdq +#: modules/devices/x86/x86_data.c:115 +msgctxt "x86-flag" +msgid "" +"Perform a Carry-Less Multiplication of Quadword instruction - accelerator " +"for GCM)" +msgstr "" + +#. /flag:dtes64 +#: modules/devices/x86/x86_data.c:116 +msgctxt "x86-flag" +msgid "64-bit Debug Store" +msgstr "" + +#. /flag:monitor +#: modules/devices/x86/x86_data.c:117 +msgctxt "x86-flag" +msgid "Monitor/Mwait support (Intel SSE3 supplements)" +msgstr "" + +#. /flag:ds_cpl +#: modules/devices/x86/x86_data.c:118 +msgctxt "x86-flag" +msgid "CPL Qual. Debug Store" +msgstr "" + +#. /flag:vmx +#: modules/devices/x86/x86_data.c:119 +msgctxt "x86-flag" +msgid "Hardware virtualization, Intel VMX" +msgstr "" + +#. /flag:smx +#: modules/devices/x86/x86_data.c:120 +msgctxt "x86-flag" +msgid "Safer mode TXT (TPM support)" +msgstr "" + +#. /flag:est +#: modules/devices/x86/x86_data.c:121 +msgctxt "x86-flag" +msgid "Enhanced SpeedStep" +msgstr "" + +#. /flag:tm2 +#: modules/devices/x86/x86_data.c:122 +msgctxt "x86-flag" +msgid "Thermal Monitor 2" +msgstr "" + +#. /flag:ssse3 +#: modules/devices/x86/x86_data.c:123 +msgctxt "x86-flag" +msgid "Supplemental SSE-3" +msgstr "" + +#. /flag:cid +#: modules/devices/x86/x86_data.c:124 +msgctxt "x86-flag" +msgid "Context ID" +msgstr "" + +#. /flag:sdbg +#: modules/devices/x86/x86_data.c:125 +msgctxt "x86-flag" +msgid "silicon debug" +msgstr "" + +#. /flag:fma +#: modules/devices/x86/x86_data.c:126 +msgctxt "x86-flag" +msgid "Fused multiply-add" +msgstr "" + +#. /flag:cx16 +#: modules/devices/x86/x86_data.c:127 +msgctxt "x86-flag" +msgid "CMPXCHG16B" +msgstr "" + +#. /flag:xtpr +#: modules/devices/x86/x86_data.c:128 +msgctxt "x86-flag" +msgid "Send Task Priority Messages" +msgstr "" + +#. /flag:pdcm +#: modules/devices/x86/x86_data.c:129 +msgctxt "x86-flag" +msgid "Performance Capabilities" +msgstr "" + +#. /flag:pcid +#: modules/devices/x86/x86_data.c:130 +msgctxt "x86-flag" +msgid "Process Context Identifiers" +msgstr "" + +#. /flag:dca +#: modules/devices/x86/x86_data.c:131 +msgctxt "x86-flag" +msgid "Direct Cache Access" +msgstr "" + +#. /flag:sse4_1 +#: modules/devices/x86/x86_data.c:132 +msgctxt "x86-flag" +msgid "SSE-4.1" +msgstr "" + +#. /flag:sse4_2 +#: modules/devices/x86/x86_data.c:133 +msgctxt "x86-flag" +msgid "SSE-4.2" +msgstr "" + +#. /flag:x2apic +#: modules/devices/x86/x86_data.c:134 +msgctxt "x86-flag" +msgid "x2APIC" +msgstr "" + +#. /flag:movbe +#: modules/devices/x86/x86_data.c:135 +msgctxt "x86-flag" +msgid "Move Data After Swapping Bytes instruction" +msgstr "" + +#. /flag:popcnt +#: modules/devices/x86/x86_data.c:136 +msgctxt "x86-flag" +msgid "" +"Return the Count of Number of Bits Set to 1 instruction (Hamming weight, i." +"e. bit count)" +msgstr "" + +#. /flag:tsc_deadline_timer +#: modules/devices/x86/x86_data.c:137 +msgctxt "x86-flag" +msgid "Tsc deadline timer" +msgstr "" + +#. /flag:aes/aes-ni +#: modules/devices/x86/x86_data.c:138 +msgctxt "x86-flag" +msgid "Advanced Encryption Standard (New Instructions)" +msgstr "" + +#. /flag:xsave +#: modules/devices/x86/x86_data.c:139 +msgctxt "x86-flag" +msgid "Save Processor Extended States: also provides XGETBY,XRSTOR,XSETBY" +msgstr "" + +#. /flag:avx +#: modules/devices/x86/x86_data.c:140 +msgctxt "x86-flag" +msgid "Advanced Vector Extensions" +msgstr "" + +#. /flag:f16c +#: modules/devices/x86/x86_data.c:141 +msgctxt "x86-flag" +msgid "16-bit fp conversions (CVT16)" +msgstr "" + +#. /flag:rdrand +#: modules/devices/x86/x86_data.c:142 +msgctxt "x86-flag" +msgid "Read Random Number from hardware random number generator instruction" +msgstr "" + +#. /flag:hypervisor +#: modules/devices/x86/x86_data.c:143 +msgctxt "x86-flag" +msgid "Running on a hypervisor" +msgstr "" + +#. /Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001 +#. /flag:rng +#: modules/devices/x86/x86_data.c:145 +msgctxt "x86-flag" +msgid "Random Number Generator present (xstore)" +msgstr "" + +#. /flag:rng_en +#: modules/devices/x86/x86_data.c:146 +msgctxt "x86-flag" +msgid "Random Number Generator enabled" +msgstr "" + +#. /flag:ace +#: modules/devices/x86/x86_data.c:147 +msgctxt "x86-flag" +msgid "on-CPU crypto (xcrypt)" +msgstr "" + +#. /flag:ace_en +#: modules/devices/x86/x86_data.c:148 +msgctxt "x86-flag" +msgid "on-CPU crypto enabled" +msgstr "" + +#. /flag:ace2 +#: modules/devices/x86/x86_data.c:149 +msgctxt "x86-flag" +msgid "Advanced Cryptography Engine v2" +msgstr "" + +#. /flag:ace2_en +#: modules/devices/x86/x86_data.c:150 +msgctxt "x86-flag" +msgid "ACE v2 enabled" +msgstr "" + +#. /flag:phe +#: modules/devices/x86/x86_data.c:151 +msgctxt "x86-flag" +msgid "PadLock Hash Engine" +msgstr "" + +#. /flag:phe_en +#: modules/devices/x86/x86_data.c:152 +msgctxt "x86-flag" +msgid "PHE enabled" +msgstr "" + +#. /flag:pmm +#: modules/devices/x86/x86_data.c:153 +msgctxt "x86-flag" +msgid "PadLock Montgomery Multiplier" +msgstr "" + +#. /flag:pmm_en +#: modules/devices/x86/x86_data.c:154 +msgctxt "x86-flag" +msgid "PMM enabled" +msgstr "" + +#. /flag:lahf_lm +#: modules/devices/x86/x86_data.c:156 +msgctxt "x86-flag" +msgid "Load AH from Flags (LAHF) and Store AH into Flags (SAHF) in long mode" +msgstr "" + +#. /flag:cmp_legacy +#: modules/devices/x86/x86_data.c:157 +msgctxt "x86-flag" +msgid "If yes HyperThreading not valid" +msgstr "" + +#. /flag:svm +#: modules/devices/x86/x86_data.c:158 +msgctxt "x86-flag" +msgid "\"Secure virtual machine\": AMD-V" +msgstr "" + +#. /flag:extapic +#: modules/devices/x86/x86_data.c:159 +msgctxt "x86-flag" +msgid "Extended APIC space" +msgstr "" + +#. /flag:cr8_legacy +#: modules/devices/x86/x86_data.c:160 +msgctxt "x86-flag" +msgid "CR8 in 32-bit mode" +msgstr "" + +#. /flag:abm +#: modules/devices/x86/x86_data.c:161 +msgctxt "x86-flag" +msgid "Advanced Bit Manipulation" +msgstr "" + +#. /flag:sse4a +#: modules/devices/x86/x86_data.c:162 +msgctxt "x86-flag" +msgid "SSE-4A" +msgstr "" + +#. /flag:misalignsse +#: modules/devices/x86/x86_data.c:163 +msgctxt "x86-flag" +msgid "" +"indicates if a general-protection exception (#GP) is generated when some " +"legacy SSE instructions operate on unaligned data. Also depends on CR0 and " +"Alignment Checking bit" +msgstr "" + +#. /flag:3dnowprefetch +#: modules/devices/x86/x86_data.c:164 +msgctxt "x86-flag" +msgid "3DNow prefetch instructions" +msgstr "" + +#. /flag:osvw +#: modules/devices/x86/x86_data.c:165 +msgctxt "x86-flag" +msgid "" +"indicates OS Visible Workaround, which allows the OS to work around " +"processor errata." +msgstr "" + +#. /flag:ibs +#: modules/devices/x86/x86_data.c:166 +msgctxt "x86-flag" +msgid "Instruction Based Sampling" +msgstr "" + +#. /flag:xop +#: modules/devices/x86/x86_data.c:167 +msgctxt "x86-flag" +msgid "extended AVX instructions" +msgstr "" + +#. /flag:skinit +#: modules/devices/x86/x86_data.c:168 +msgctxt "x86-flag" +msgid "SKINIT/STGI instructions" +msgstr "" + +#. /flag:wdt +#: modules/devices/x86/x86_data.c:169 +msgctxt "x86-flag" +msgid "Watchdog timer" +msgstr "" + +#. /flag:lwp +#: modules/devices/x86/x86_data.c:170 +msgctxt "x86-flag" +msgid "Light Weight Profiling" +msgstr "" + +#. /flag:fma4 +#: modules/devices/x86/x86_data.c:171 +msgctxt "x86-flag" +msgid "4 operands MAC instructions" +msgstr "" + +#. /flag:tce +#: modules/devices/x86/x86_data.c:172 +msgctxt "x86-flag" +msgid "translation cache extension" +msgstr "" + +#. /flag:nodeid_msr +#: modules/devices/x86/x86_data.c:173 +msgctxt "x86-flag" +msgid "NodeId MSR" +msgstr "" + +#. /flag:tbm +#: modules/devices/x86/x86_data.c:174 +msgctxt "x86-flag" +msgid "Trailing Bit Manipulation" +msgstr "" + +#. /flag:topoext +#: modules/devices/x86/x86_data.c:175 +msgctxt "x86-flag" +msgid "Topology Extensions CPUID leafs" +msgstr "" + +#. /flag:perfctr_core +#: modules/devices/x86/x86_data.c:176 +msgctxt "x86-flag" +msgid "Core Performance Counter Extensions" +msgstr "" + +#. /flag:perfctr_nb +#: modules/devices/x86/x86_data.c:177 +msgctxt "x86-flag" +msgid "NB Performance Counter Extensions" +msgstr "" + +#. /flag:bpext +#: modules/devices/x86/x86_data.c:178 +msgctxt "x86-flag" +msgid "data breakpoint extension" +msgstr "" + +#. /flag:ptsc +#: modules/devices/x86/x86_data.c:179 +msgctxt "x86-flag" +msgid "performance time-stamp counter" +msgstr "" + +#. /flag:perfctr_l2 +#: modules/devices/x86/x86_data.c:180 +msgctxt "x86-flag" +msgid "L2 Performance Counter Extensions" +msgstr "" + +#. /flag:mwaitx +#: modules/devices/x86/x86_data.c:181 +msgctxt "x86-flag" +msgid "MWAIT extension (MONITORX/MWAITX)" +msgstr "" + +#. /flag:cpb +#: modules/devices/x86/x86_data.c:183 +msgctxt "x86-flag" +msgid "AMD Core Performance Boost" +msgstr "" + +#. /flag:epb +#: modules/devices/x86/x86_data.c:184 +msgctxt "x86-flag" +msgid "IA32_ENERGY_PERF_BIAS support" +msgstr "" + +#. /flag:hw_pstate +#: modules/devices/x86/x86_data.c:185 +msgctxt "x86-flag" +msgid "AMD HW-PState" +msgstr "" + +#. /flag:proc_feedback +#: modules/devices/x86/x86_data.c:186 +msgctxt "x86-flag" +msgid "AMD ProcFeedbackInterface" +msgstr "" + +#. /flag:intel_pt +#: modules/devices/x86/x86_data.c:187 +msgctxt "x86-flag" +msgid "Intel Processor Tracing" +msgstr "" + +#. /flag:tpr_shadow +#: modules/devices/x86/x86_data.c:189 +msgctxt "x86-flag" +msgid "Intel TPR Shadow" +msgstr "" + +#. /flag:vnmi +#: modules/devices/x86/x86_data.c:190 +msgctxt "x86-flag" +msgid "Intel Virtual NMI" +msgstr "" + +#. /flag:flexpriority +#: modules/devices/x86/x86_data.c:191 +msgctxt "x86-flag" +msgid "Intel FlexPriority" +msgstr "" + +#. /flag:ept +#: modules/devices/x86/x86_data.c:192 +msgctxt "x86-flag" +msgid "Intel Extended Page Table" +msgstr "" + +#. /flag:vpid +#: modules/devices/x86/x86_data.c:193 +msgctxt "x86-flag" +msgid "Intel Virtual Processor ID" +msgstr "" + +#. /flag:vmmcall +#: modules/devices/x86/x86_data.c:194 +msgctxt "x86-flag" +msgid "prefer VMMCALL to VMCALL" +msgstr "" + +#. /flag:fsgsbase +#: modules/devices/x86/x86_data.c:196 +msgctxt "x86-flag" +msgid "{RD/WR}{FS/GS}BASE instructions" +msgstr "" + +#. /flag:tsc_adjust +#: modules/devices/x86/x86_data.c:197 +msgctxt "x86-flag" +msgid "TSC adjustment MSR" +msgstr "" + +#. /flag:bmi1 +#: modules/devices/x86/x86_data.c:198 +msgctxt "x86-flag" +msgid "1st group bit manipulation extensions" +msgstr "" + +#. /flag:hle +#: modules/devices/x86/x86_data.c:199 +msgctxt "x86-flag" +msgid "Hardware Lock Elision" +msgstr "" + +#. /flag:avx2 +#: modules/devices/x86/x86_data.c:200 +msgctxt "x86-flag" +msgid "AVX2 instructions" +msgstr "" + +#. /flag:smep +#: modules/devices/x86/x86_data.c:201 +msgctxt "x86-flag" +msgid "Supervisor Mode Execution Protection" +msgstr "" + +#. /flag:bmi2 +#: modules/devices/x86/x86_data.c:202 +msgctxt "x86-flag" +msgid "2nd group bit manipulation extensions" +msgstr "" + +#. /flag:erms +#: modules/devices/x86/x86_data.c:203 +msgctxt "x86-flag" +msgid "Enhanced REP MOVSB/STOSB" +msgstr "" + +#. /flag:invpcid +#: modules/devices/x86/x86_data.c:204 +msgctxt "x86-flag" +msgid "Invalidate Processor Context ID" +msgstr "" + +#. /flag:rtm +#: modules/devices/x86/x86_data.c:205 +msgctxt "x86-flag" +msgid "Restricted Transactional Memory" +msgstr "" + +#. /flag:cqm +#: modules/devices/x86/x86_data.c:206 +msgctxt "x86-flag" +msgid "Cache QoS Monitoring" +msgstr "" + +#. /flag:mpx +#: modules/devices/x86/x86_data.c:207 +msgctxt "x86-flag" +msgid "Memory Protection Extension" +msgstr "" + +#. /flag:avx512f +#: modules/devices/x86/x86_data.c:208 +msgctxt "x86-flag" +msgid "AVX-512 foundation" +msgstr "" + +#. /flag:avx512dq +#: modules/devices/x86/x86_data.c:209 +msgctxt "x86-flag" +msgid "AVX-512 Double/Quad instructions" +msgstr "" + +#. /flag:rdseed +#: modules/devices/x86/x86_data.c:210 +msgctxt "x86-flag" +msgid "The RDSEED instruction" +msgstr "" + +#. /flag:adx +#: modules/devices/x86/x86_data.c:211 +msgctxt "x86-flag" +msgid "The ADCX and ADOX instructions" +msgstr "" + +#. /flag:smap +#: modules/devices/x86/x86_data.c:212 +msgctxt "x86-flag" +msgid "Supervisor Mode Access Prevention" +msgstr "" + +#. /flag:clflushopt +#: modules/devices/x86/x86_data.c:213 +msgctxt "x86-flag" +msgid "CLFLUSHOPT instruction" +msgstr "" + +#. /flag:clwb +#: modules/devices/x86/x86_data.c:214 +msgctxt "x86-flag" +msgid "CLWB instruction" +msgstr "" + +#. /flag:avx512pf +#: modules/devices/x86/x86_data.c:215 +msgctxt "x86-flag" +msgid "AVX-512 Prefetch" +msgstr "" + +#. /flag:avx512er +#: modules/devices/x86/x86_data.c:216 +msgctxt "x86-flag" +msgid "AVX-512 Exponential and Reciprocal" +msgstr "" + +#. /flag:avx512cd +#: modules/devices/x86/x86_data.c:217 +msgctxt "x86-flag" +msgid "AVX-512 Conflict Detection" +msgstr "" + +#. /flag:sha_ni +#: modules/devices/x86/x86_data.c:218 +msgctxt "x86-flag" +msgid "SHA1/SHA256 Instruction Extensions" +msgstr "" + +#. /flag:avx512bw +#: modules/devices/x86/x86_data.c:219 +msgctxt "x86-flag" +msgid "AVX-512 Byte/Word instructions" +msgstr "" + +#. /flag:avx512vl +#: modules/devices/x86/x86_data.c:220 +msgctxt "x86-flag" +msgid "AVX-512 128/256 Vector Length extensions" +msgstr "" + +#. /flag:xsaveopt +#: modules/devices/x86/x86_data.c:222 +msgctxt "x86-flag" +msgid "Optimized XSAVE" +msgstr "" + +#. /flag:xsavec +#: modules/devices/x86/x86_data.c:223 +msgctxt "x86-flag" +msgid "XSAVEC" +msgstr "" + +#. /flag:xgetbv1 +#: modules/devices/x86/x86_data.c:224 +msgctxt "x86-flag" +msgid "XGETBV with ECX = 1" +msgstr "" + +#. /flag:xsaves +#: modules/devices/x86/x86_data.c:225 +msgctxt "x86-flag" +msgid "XSAVES/XRSTORS" +msgstr "" + +#. /flag:cqm_llc +#: modules/devices/x86/x86_data.c:227 +msgctxt "x86-flag" +msgid "LLC QoS" +msgstr "" + +#. /flag:cqm_occup_llc +#: modules/devices/x86/x86_data.c:229 +msgctxt "x86-flag" +msgid "LLC occupancy monitoring" +msgstr "" + +#. /flag:cqm_mbm_total +#: modules/devices/x86/x86_data.c:230 +msgctxt "x86-flag" +msgid "LLC total MBM monitoring" +msgstr "" + +#. /flag:cqm_mbm_local +#: modules/devices/x86/x86_data.c:231 +msgctxt "x86-flag" +msgid "LLC local MBM monitoring" +msgstr "" + +#. /flag:clzero +#: modules/devices/x86/x86_data.c:233 +msgctxt "x86-flag" +msgid "CLZERO instruction" +msgstr "" + +#. /flag:irperf +#: modules/devices/x86/x86_data.c:234 +msgctxt "x86-flag" +msgid "instructions retired performance counter" +msgstr "" + +#. /flag:dtherm +#: modules/devices/x86/x86_data.c:236 +msgctxt "x86-flag" +msgid "digital thermal sensor" +msgstr "" + +#. /flag:ida +#: modules/devices/x86/x86_data.c:237 +msgctxt "x86-flag" +msgid "Intel Dynamic Acceleration" +msgstr "" + +#. /flag:arat +#: modules/devices/x86/x86_data.c:238 +msgctxt "x86-flag" +msgid "Always Running APIC Timer" +msgstr "" + +#. /flag:pln +#: modules/devices/x86/x86_data.c:239 +msgctxt "x86-flag" +msgid "Intel Power Limit Notification" +msgstr "" + +#. /flag:pts +#: modules/devices/x86/x86_data.c:240 +msgctxt "x86-flag" +msgid "Intel Package Thermal Status" +msgstr "" + +#. /flag:hwp +#: modules/devices/x86/x86_data.c:241 +msgctxt "x86-flag" +msgid "Intel Hardware P-states" +msgstr "" + +#. /flag:hwp_notify +#: modules/devices/x86/x86_data.c:242 +msgctxt "x86-flag" +msgid "HWP notification" +msgstr "" + +#. /flag:hwp_act_window +#: modules/devices/x86/x86_data.c:243 +msgctxt "x86-flag" +msgid "HWP Activity Window" +msgstr "" + +#. /flag:hwp_epp +#: modules/devices/x86/x86_data.c:244 +msgctxt "x86-flag" +msgid "HWP Energy Performance Preference" +msgstr "" + +#. /flag:hwp_pkg_req +#: modules/devices/x86/x86_data.c:245 +msgctxt "x86-flag" +msgid "HWP package-level request" +msgstr "" + +#. /flag:npt +#: modules/devices/x86/x86_data.c:247 +msgctxt "x86-flag" +msgid "AMD Nested Page Table support" +msgstr "" + +#. /flag:lbrv +#: modules/devices/x86/x86_data.c:248 +msgctxt "x86-flag" +msgid "AMD LBR Virtualization support" +msgstr "" + +#. /flag:svm_lock +#: modules/devices/x86/x86_data.c:249 +msgctxt "x86-flag" +msgid "AMD SVM locking MSR" +msgstr "" + +#. /flag:nrip_save +#: modules/devices/x86/x86_data.c:250 +msgctxt "x86-flag" +msgid "AMD SVM next_rip save" +msgstr "" + +#. /flag:tsc_scale +#: modules/devices/x86/x86_data.c:251 +msgctxt "x86-flag" +msgid "AMD TSC scaling support" +msgstr "" + +#. /flag:vmcb_clean +#: modules/devices/x86/x86_data.c:252 +msgctxt "x86-flag" +msgid "AMD VMCB clean bits support" +msgstr "" + +#. /flag:flushbyasid +#: modules/devices/x86/x86_data.c:253 +msgctxt "x86-flag" +msgid "AMD flush-by-ASID support" +msgstr "" + +#. /flag:decodeassists +#: modules/devices/x86/x86_data.c:254 +msgctxt "x86-flag" +msgid "AMD Decode Assists support" +msgstr "" + +#. /flag:pausefilter +#: modules/devices/x86/x86_data.c:255 +msgctxt "x86-flag" +msgid "AMD filtered pause intercept" +msgstr "" + +#. /flag:pfthreshold +#: modules/devices/x86/x86_data.c:256 +msgctxt "x86-flag" +msgid "AMD pause filter threshold" +msgstr "" + +#. /flag:avic +#: modules/devices/x86/x86_data.c:257 +msgctxt "x86-flag" +msgid "Virtual Interrupt Controller" +msgstr "" + +#. /flag:pku +#: modules/devices/x86/x86_data.c:259 +msgctxt "x86-flag" +msgid "Protection Keys for Userspace" +msgstr "" + +#. /flag:ospke +#: modules/devices/x86/x86_data.c:260 +msgctxt "x86-flag" +msgid "OS Protection Keys Enable" +msgstr "" + +#. /flag:overflow_recov +#: modules/devices/x86/x86_data.c:262 +msgctxt "x86-flag" +msgid "MCA overflow recovery support" +msgstr "" + +#. /flag:succor +#: modules/devices/x86/x86_data.c:263 +msgctxt "x86-flag" +msgid "uncorrectable error containment and recovery" +msgstr "" + +#. /flag:smca +#: modules/devices/x86/x86_data.c:264 +msgctxt "x86-flag" +msgid "Scalable MCA" +msgstr "" + +#. /bug:f00f +#: modules/devices/x86/x86_data.c:267 +msgctxt "x86-flag" +msgid "Intel F00F bug" +msgstr "" + +#. /bug:fdiv +#: modules/devices/x86/x86_data.c:268 +msgctxt "x86-flag" +msgid "FPU FDIV" +msgstr "" + +#. /bug:coma +#: modules/devices/x86/x86_data.c:269 +msgctxt "x86-flag" +msgid "Cyrix 6x86 coma" +msgstr "" + +#. /bug:tlb_mmatch +#: modules/devices/x86/x86_data.c:270 +msgctxt "x86-flag" +msgid "AMD Erratum 383" +msgstr "" + +#. /bug:apic_c1e +#. /bug:amd_e400 +#: modules/devices/x86/x86_data.c:271 modules/devices/x86/x86_data.c:280 +msgctxt "x86-flag" +msgid "AMD Erratum 400" +msgstr "" + +#. /bug:11ap +#: modules/devices/x86/x86_data.c:272 +msgctxt "x86-flag" +msgid "Bad local APIC aka 11AP" +msgstr "" + +#. /bug:fxsave_leak +#: modules/devices/x86/x86_data.c:273 +msgctxt "x86-flag" +msgid "FXSAVE leaks FOP/FIP/FOP" +msgstr "" + +#. /bug:clflush_monitor +#: modules/devices/x86/x86_data.c:274 +msgctxt "x86-flag" +msgid "AAI65, CLFLUSH required before MONITOR" +msgstr "" + +#. /bug:sysret_ss_attrs +#: modules/devices/x86/x86_data.c:275 +msgctxt "x86-flag" +msgid "SYSRET doesn't fix up SS attrs" +msgstr "" + +#. /bug:espfix +#: modules/devices/x86/x86_data.c:276 +msgctxt "x86-flag" +msgid "IRET to 16-bit SS corrupts ESP/RSP high bits" +msgstr "" + +#. /bug:null_seg +#: modules/devices/x86/x86_data.c:277 +msgctxt "x86-flag" +msgid "Nulling a selector preserves the base" +msgstr "" + +#. /bug:swapgs_fence +#: modules/devices/x86/x86_data.c:278 +msgctxt "x86-flag" +msgid "SWAPGS without input dep on GS" +msgstr "" + +#. /bug:monitor +#: modules/devices/x86/x86_data.c:279 +msgctxt "x86-flag" +msgid "IPI required to wake up remote CPU" +msgstr "" + +#. /x86/kernel/cpu/powerflags.h +#. /flag:pm:ts +#: modules/devices/x86/x86_data.c:283 +msgctxt "x86-flag" +msgid "temperature sensor" +msgstr "" + +#. /flag:pm:fid +#: modules/devices/x86/x86_data.c:284 +msgctxt "x86-flag" +msgid "frequency id control" +msgstr "" + +#. /flag:pm:vid +#: modules/devices/x86/x86_data.c:285 +msgctxt "x86-flag" +msgid "voltage id control" +msgstr "" + +#. /flag:pm:ttp +#: modules/devices/x86/x86_data.c:286 +msgctxt "x86-flag" +msgid "thermal trip" +msgstr "" + +#. /flag:pm:tm +#: modules/devices/x86/x86_data.c:287 +msgctxt "x86-flag" +msgid "hardware thermal control" +msgstr "" + +#. /flag:pm:stc +#: modules/devices/x86/x86_data.c:288 +msgctxt "x86-flag" +msgid "software thermal control" +msgstr "" + +#. /flag:pm:100mhzsteps +#: modules/devices/x86/x86_data.c:289 +msgctxt "x86-flag" +msgid "100 MHz multiplier control" +msgstr "" + +#. /flag:pm:hwpstate +#: modules/devices/x86/x86_data.c:290 +msgctxt "x86-flag" +msgid "hardware P-state control" +msgstr "" + +#. /flag:pm:cpb +#: modules/devices/x86/x86_data.c:291 +msgctxt "x86-flag" +msgid "core performance boost" +msgstr "" + +#. /flag:pm:eff_freq_ro +#: modules/devices/x86/x86_data.c:292 +msgctxt "x86-flag" +msgid "Readonly aperf/mperf" +msgstr "" + +#. /flag:pm:proc_feedback +#: modules/devices/x86/x86_data.c:293 +msgctxt "x86-flag" +msgid "processor feedback interface" +msgstr "" + +#. /flag:pm:acc_power +#: modules/devices/x86/x86_data.c:294 +msgctxt "x86-flag" +msgid "accumulated power mechanism" +msgstr "" + +#: modules/network.c:59 +msgid "Interfaces" +msgstr "" + +#: modules/network.c:60 +msgid "IP Connections" +msgstr "" + +#: modules/network.c:61 +msgid "Routing Table" +msgstr "" + +#: modules/network.c:62 modules/network.c:303 +msgid "ARP Table" +msgstr "" + +#: modules/network.c:63 +msgid "DNS Servers" +msgstr "" + +#: modules/network.c:64 +msgid "Statistics" +msgstr "" + +#: modules/network.c:65 +msgid "Shared Directories" +msgstr "Paylaşılan Dizinler" + +#: modules/network.c:304 modules/network.c:326 modules/network.c:357 +#: modules/network/net.c:477 +msgid "IP Address" +msgstr "" + +#: modules/network.c:304 modules/network.c:357 modules/network.c:374 +msgid "Interface" +msgstr "" + +#: modules/network.c:304 +msgid "MAC Address" +msgstr "" + +#: modules/network.c:313 +msgid "SAMBA" +msgstr "" + +#: modules/network.c:314 +msgid "NFS" +msgstr "" + +#: modules/network.c:325 +msgid "Name Servers" +msgstr "" + +#: modules/network.c:340 +msgid "Connections" +msgstr "Bağlantılar" + +#: modules/network.c:341 +msgid "Local Address" +msgstr "" + +#: modules/network.c:341 +msgid "Protocol" +msgstr "Protokol" + +#: modules/network.c:341 +msgid "Foreign Address" +msgstr "" + +#: modules/network.c:341 +msgid "State" +msgstr "" + +#: modules/network.c:357 +msgid "Sent" +msgstr "" + +#: modules/network.c:357 +msgid "Received" +msgstr "" + +#: modules/network.c:373 +msgid "IP routing table" +msgstr "" + +#: modules/network.c:374 +msgid "Destination/Gateway" +msgstr "" + +#: modules/network.c:374 +msgid "Flags" +msgstr "" + +#: modules/network.c:374 modules/network/net.c:478 +msgid "Mask" +msgstr "" + +#: modules/network.c:402 +msgid "Network" +msgstr "Ağ" + +#: modules/network.c:435 +msgid "Gathers information about this computer's network connection" +msgstr "Bu bilgisayarın ağ bağlantısı hakkında bilgi toplar" + +#: modules/network/net.c:72 +msgctxt "wi-op-mode" +msgid "Auto" +msgstr "" + +#: modules/network/net.c:73 +msgctxt "wi-op-mode" +msgid "Ad-Hoc" +msgstr "" + +#: modules/network/net.c:74 +msgctxt "wi-op-mode" +msgid "Managed" +msgstr "" + +#: modules/network/net.c:75 +msgctxt "wi-op-mode" +msgid "Master" +msgstr "" + +#: modules/network/net.c:76 +msgctxt "wi-op-mode" +msgid "Repeater" +msgstr "" + +#: modules/network/net.c:77 +msgctxt "wi-op-mode" +msgid "Secondary" +msgstr "" + +#: modules/network/net.c:78 +msgctxt "wi-op-mode" +msgid "(Unknown)" +msgstr "" + +#: modules/network/net.c:242 modules/network/net.c:262 +#: modules/network/net.c:270 +msgctxt "net-if-type" +msgid "Ethernet" +msgstr "" + +#: modules/network/net.c:243 +msgctxt "net-if-type" +msgid "Loopback" +msgstr "" + +#: modules/network/net.c:244 +msgctxt "net-if-type" +msgid "Point-to-Point" +msgstr "" + +#: modules/network/net.c:245 modules/network/net.c:246 +#: modules/network/net.c:247 modules/network/net.c:248 +#: modules/network/net.c:272 +msgctxt "net-if-type" +msgid "Wireless" +msgstr "" + +#: modules/network/net.c:249 +msgctxt "net-if-type" +msgid "Virtual Point-to-Point (TUN)" +msgstr "" + +#: modules/network/net.c:250 +msgctxt "net-if-type" +msgid "Ethernet (TAP)" +msgstr "" + +#: modules/network/net.c:251 +msgctxt "net-if-type" +msgid "Parallel Line Internet Protocol" +msgstr "" + +#: modules/network/net.c:252 +msgctxt "net-if-type" +msgid "Infrared" +msgstr "" + +#: modules/network/net.c:253 modules/network/net.c:271 +msgctxt "net-if-type" +msgid "Serial Line Internet Protocol" +msgstr "" + +#: modules/network/net.c:254 +msgctxt "net-if-type" +msgid "Integrated Services Digital Network" +msgstr "" + +#: modules/network/net.c:255 +msgctxt "net-if-type" +msgid "IPv6-over-IPv4 Tunnel" +msgstr "" + +#: modules/network/net.c:256 +msgctxt "net-if-type" +msgid "VMWare Virtual Network Interface (NAT)" +msgstr "" + +#: modules/network/net.c:257 +msgctxt "net-if-type" +msgid "VMWare Virtual Network Interface" +msgstr "" + +#: modules/network/net.c:258 +msgctxt "net-if-type" +msgid "Personal Area Network (PAN)" +msgstr "" + +#: modules/network/net.c:259 +msgctxt "net-if-type" +msgid "Bluetooth" +msgstr "" + +#: modules/network/net.c:260 +msgctxt "net-if-type" +msgid "Bridge Interface" +msgstr "" + +#: modules/network/net.c:261 +msgctxt "net-if-type" +msgid "Hamachi Virtual Personal Network" +msgstr "" + +#: modules/network/net.c:263 +msgctxt "net-if-type" +msgid "Intermediate Functional Block" +msgstr "" + +#: modules/network/net.c:264 +msgctxt "net-if-type" +msgid "GRE Network Tunnel" +msgstr "" + +#: modules/network/net.c:265 +msgctxt "net-if-type" +msgid "Mesh Network" +msgstr "" + +#: modules/network/net.c:266 +msgctxt "net-if-type" +msgid "Wireless Master Interface" +msgstr "" + +#: modules/network/net.c:267 +msgctxt "net-if-type" +msgid "VirtualBox Virtual Network Interface" +msgstr "" + +#: modules/network/net.c:273 +msgctxt "net-if-type" +msgid "Wireless (WAN)" +msgstr "" + +#: modules/network/net.c:275 +msgctxt "net-if-type" +msgid "(Unknown)" +msgstr "" + +#: modules/network/net.c:348 modules/network/net.c:358 +msgid "Network Interfaces" +msgstr "" + +#: modules/network/net.c:348 +msgid "None Found" +msgstr "" + +#: modules/network/net.c:400 modules/network/net.c:422 +#: modules/network/net.c:423 +msgid "MiB" +msgstr "" + +#: modules/network/net.c:414 +msgid "Network Adapter Properties" +msgstr "" + +#: modules/network/net.c:415 +msgid "Interface Type" +msgstr "" + +#: modules/network/net.c:416 +msgid "Hardware Address (MAC)" +msgstr "" + +#: modules/network/net.c:420 +msgid "MTU" +msgstr "" + +#: modules/network/net.c:421 +msgid "Transfer Details" +msgstr "" + +#: modules/network/net.c:422 +msgid "Bytes Received" +msgstr "" + +#: modules/network/net.c:423 +msgid "Bytes Sent" +msgstr "" + +#: modules/network/net.c:440 modules/network/net.c:462 +#: modules/network/net.c:463 +msgid "dBm" +msgstr "" + +#: modules/network/net.c:440 +msgid "mW" +msgstr "" + +#: modules/network/net.c:454 +msgid "Wireless Properties" +msgstr "" + +#: modules/network/net.c:455 +msgid "Network Name (SSID)" +msgstr "" + +#: modules/network/net.c:456 +msgid "Bit Rate" +msgstr "" + +#: modules/network/net.c:456 +msgid "Mb/s" +msgstr "" + +#: modules/network/net.c:457 +msgid "Transmission Power" +msgstr "" + +#: modules/network/net.c:459 +msgid "Status" +msgstr "" + +#: modules/network/net.c:460 +msgid "Link Quality" +msgstr "" + +#: modules/network/net.c:461 +msgid "Signal / Noise" +msgstr "" + +#: modules/network/net.c:476 +msgid "Internet Protocol (IPv4)" +msgstr "" + +#: modules/network/net.c:477 modules/network/net.c:478 +#: modules/network/net.c:480 +msgid "(Not set)" +msgstr "" + +#: modules/network/net.c:479 +msgid "Broadcast Address" +msgstr "" diff --git a/talimatname/genel/h/hardinfo/talimat b/talimatname/genel/h/hardinfo/talimat new file mode 100644 index 000000000..d16bb1c0b --- /dev/null +++ b/talimatname/genel/h/hardinfo/talimat @@ -0,0 +1,31 @@ +# Tanım: Bir sistem bilgisi ve performans aracı. +# URL: http://sourceforge.net/projects/hardinfo.berlios/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk2 libsoup glib +# Grup: sistem + +isim=hardinfo +surum=0.6 +devir=1 +kaynak=(hardinfo-tr.po) + +derle() { + + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/lpereira/hardinfo $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + cp ../hardinfo-tr.po po/tr.po + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + make + + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/h/harfbuzz/harfbuzz.kos-kur b/talimatname/genel/h/harfbuzz/harfbuzz.kos-kur new file mode 100644 index 000000000..108d5e2e1 --- /dev/null +++ b/talimatname/genel/h/harfbuzz/harfbuzz.kos-kur @@ -0,0 +1 @@ +mkdir -p /usr/share/gir-1.0 diff --git a/talimatname/genel/h/harfbuzz/harfbuzz.kos-sil b/talimatname/genel/h/harfbuzz/harfbuzz.kos-sil new file mode 100644 index 000000000..2530ea28c --- /dev/null +++ b/talimatname/genel/h/harfbuzz/harfbuzz.kos-sil @@ -0,0 +1 @@ +[ -d /usr/share/gir-1.0 ] && mv /usr/share/gir-1.0 /usr/share/gir-1.0.ydk diff --git a/talimatname/genel/h/harfbuzz/harfbuzz.sil-kos b/talimatname/genel/h/harfbuzz/harfbuzz.sil-kos new file mode 100644 index 000000000..ef803d41f --- /dev/null +++ b/talimatname/genel/h/harfbuzz/harfbuzz.sil-kos @@ -0,0 +1 @@ +[ -d /usr/share/gir-1.0.ydk ] && mv /usr/share/gir-1.0.ydk /usr/share/gir-1.0 diff --git a/talimatname/genel/h/harfbuzz/talimat b/talimatname/genel/h/harfbuzz/talimat new file mode 100644 index 000000000..ca222c282 --- /dev/null +++ b/talimatname/genel/h/harfbuzz/talimat @@ -0,0 +1,32 @@ +# Tanım: OpenType metin şekillendirme motoru +# URL: http://www.freedesktop.org/software/harfbuzz +# Paketçi: Cihan Alkan +# Gerekler: cairo glib icu freetype ragel graphite2 + +isim=harfbuzz +surum=1.5.1 +devir=3 +kaynak=(http://www.freedesktop.org/software/$isim/release/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + NOCONFIGURE=1 ./autogen.sh + ./configure \ + --prefix=/usr \ + --with-cairo \ + --with-freetype \ + --with-glib \ + --with-gobject \ + --with-graphite2 \ + --with-icu + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR=$PKG install + install -Dm644 COPYING "$PKG/usr/share/licenses/harfbuzz/COPYING" + mkdir -p ../hb-icu/usr/{include/harfbuzz,lib/pkgconfig}; cd ../hb-icu + mv "$PKG"/usr/lib/libharfbuzz-icu* ./usr/lib + mv "$PKG"/usr/lib/pkgconfig/harfbuzz-icu.pc ./usr/lib/pkgconfig + mv "$PKG"/usr/include/harfbuzz/hb-icu.h ./usr/include/harfbuzz + cp -r $SRC/hb-icu/* "$PKG" + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/h/haveged/talimat b/talimatname/genel/h/haveged/talimat new file mode 100644 index 000000000..7429efa19 --- /dev/null +++ b/talimatname/genel/h/haveged/talimat @@ -0,0 +1,29 @@ +# Tanım: Rasgele sayıların öngörülemeyen bir akışı üreten ve /dev/random'ı besleyen program +# URL: http://www.issihosts.com/haveged/ +# Paketçi: milisarge +# Gerekler: + +isim=haveged +surum=1.9.1 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/haveged/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + source /etc/blfs-bootscripts + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + + cd $scripts-$scriptsversion + make DESTDIR=$PKG install-haveged + + mkdir -pv $PKG/usr/share/doc/haveged-1.9.1 + cp -v README $PKG/usr/share/doc/haveged-1.9.1 + +} diff --git a/talimatname/genel/h/hd2u/talimat b/talimatname/genel/h/hd2u/talimat new file mode 100644 index 000000000..8f5011f71 --- /dev/null +++ b/talimatname/genel/h/hd2u/talimat @@ -0,0 +1,20 @@ +# Tanım: Metin formatlari icin donusturucu +# URL: http://terminus.sk/~hany +# Paketçi: milisarge +# Gerekler: popt + +isim=hd2u +surum=1.0.3 +devir=1 +kaynak=(http://terminus.sk/~hany/\_data/hd2u/$isim-$surum.tgz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr + make + install -d -m 755 $PKG/usr/bin + install -m 755 -s dos2unix $PKG/usr/bin + +} diff --git a/talimatname/genel/h/hdajackretask/talimat b/talimatname/genel/h/hdajackretask/talimat new file mode 100644 index 000000000..0adb037f7 --- /dev/null +++ b/talimatname/genel/h/hdajackretask/talimat @@ -0,0 +1,16 @@ +# Tanım: jack girişlerini yeniden ayarlama yapar. +# URL: http://alsa-project.org/ +# Paketçi: milisarge +# Gerekler: gtk3 + +isim=hdajackretask +surum=1.1.3 +devir=1 +kaynak=(ftp://ftp.alsa-project.org/pub/tools/alsa-tools-$surum.tar.bz2) + +derle() { + cd alsa-tools-$surum/$isim + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-byteswap.patch b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-byteswap.patch new file mode 100644 index 000000000..7b0dddc2a --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-byteswap.patch @@ -0,0 +1,28 @@ +diff -Nuar --exclude '*~' hddtemp-0.3-beta15.orig/src/sata.c hddtemp-0.3-beta15/src/sata.c +--- hddtemp-0.3-beta15.orig/src/sata.c 2006-05-14 02:09:55.579437498 -0700 ++++ hddtemp-0.3-beta15/src/sata.c 2006-05-14 02:06:08.495948437 -0700 +@@ -88,7 +88,9 @@ + return strdup(_("unknown")); + else + { ++ //fprintf(stderr,"sata_model1=%s\n",identify + 54); + sata_fixstring(identify + 54, 24); ++ //fprintf(stderr,"sata_model2=%s\n",identify + 54); + return strdup(identify + 54); + } + } +diff -Nuar --exclude '*~' hddtemp-0.3-beta15.orig/src/satacmds.c hddtemp-0.3-beta15/src/satacmds.c +--- hddtemp-0.3-beta15.orig/src/satacmds.c 2006-05-14 02:09:40.983470339 -0700 ++++ hddtemp-0.3-beta15/src/satacmds.c 2006-05-14 02:09:02.319557333 -0700 +@@ -98,7 +98,10 @@ + /* convert from big-endian to host byte order */ + for (p = end ; p != s;) { + unsigned short *pp = (unsigned short *) (p -= 2); +- *pp = ntohs(*pp); ++ char tmp = p[0]; ++ p[0] = p[1]; ++ p[1] = tmp; ++ //*pp = ntohs(*pp); + } + + /* strip leading blanks */ diff --git a/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-execinfo.patch b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-execinfo.patch new file mode 100644 index 000000000..1e7239535 --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-execinfo.patch @@ -0,0 +1,21 @@ +--- hddtemp-0.3-beta15/configure.in~ 2005-10-17 19:14:19 +0000 ++++ hddtemp-0.3-beta15/configure.in 2006-12-11 18:23:22 +0000 +@@ -18,6 +18,7 @@ + AC_HEADER_STDC + AC_CHECK_HEADERS(fcntl.h) + AC_CHECK_HEADERS(netinet/in.h) ++AC_CHECK_HEADERS(execinfo.h) + AC_CHECK_TYPE(in_addr_t, ,[AC_DEFINE_UNQUOTED([in_addr_t], [uint32_t], [Define to 'uint32_t' if does not define.])], [#include ]) + + # Checks for typedefs, structures, and compiler characteristics. +--- hddtemp-0.3-beta15/src/backtrace.c-orig 2006-12-11 18:20:41 +0000 ++++ hddtemp-0.3-beta15/src/backtrace.c 2006-12-11 18:23:28 +0000 +@@ -18,7 +18,7 @@ + + #include + +-#if defined(__i386__) && defined(__GLIBC__) ++#ifdef HAS_EXECINFO_H + + #include + diff --git a/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-iconv.patch b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-iconv.patch new file mode 100644 index 000000000..621e7549a --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-iconv.patch @@ -0,0 +1,28 @@ +--- hddtemp-0.3-beta15/src/utf8.c~ 2007-03-27 09:09:59.000000000 +0200 ++++ hddtemp-0.3-beta15/src/utf8.c 2007-03-27 09:10:06.000000000 +0200 +@@ -23,7 +23,9 @@ + + // Standard includes + #include ++#ifdef HAVE_ICONV + #include ++#endif + #include + #include + #include +@@ -34,6 +36,7 @@ + + static char *iconv_from_utf8_to_locale(const char *string, const char* fallback_string) + { ++#ifdef HAVE_ICONV + const size_t buffer_inc = 80; // Increment buffer size in 80 bytes step + const char *charset; + iconv_t cd; +@@ -93,6 +96,7 @@ + if (dest_buffer != NULL) + free(dest_buffer); // free buffer + free(src_buffer); // free string ++#endif // HAVE_ICONV + return strdup(fallback_string); // and return fallback string + } + diff --git a/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-nls.patch b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-nls.patch new file mode 100644 index 000000000..86567aeb8 --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-nls.patch @@ -0,0 +1,14 @@ +--- hddtemp-0.3-beta15/src/hddtemp.c~ 2006-04-19 02:37:35 +0000 ++++ hddtemp-0.3-beta15/src/hddtemp.c 2007-03-26 08:14:17 +0000 +@@ -275,9 +275,11 @@ + backtrace_sigill(); + backtrace_sigbus(); + ++#if ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); ++#endif + + show_db = debug = numeric = quiet = wakeup = af_hint = syslog_interval = 0; + unit = DEFAULT; diff --git a/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-satacmds.patch b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-satacmds.patch new file mode 100644 index 000000000..d67e0681f --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp-0.3-beta15-satacmds.patch @@ -0,0 +1,26 @@ +diff -Naurp hddtemp-0.3-beta15-orig/src/satacmds.c hddtemp-0.3-beta15/src/satacmds.c +--- hddtemp-0.3-beta15-orig/src/satacmds.c 2007-02-10 14:25:15.000000000 +0100 ++++ hddtemp-0.3-beta15/src/satacmds.c 2007-02-10 14:26:53.000000000 +0100 +@@ -54,7 +54,6 @@ int sata_pass_thru(int device, unsigned + unsigned char cdb[16]; + unsigned char sense[32]; + int dxfer_direction; +- int ret; + + memset(cdb, 0, sizeof(cdb)); + cdb[0] = ATA_16; +@@ -78,13 +77,7 @@ int sata_pass_thru(int device, unsigned + cdb[6] = cmd[1]; + cdb[14] = cmd[0]; + +- ret = scsi_SG_IO(device, cdb, sizeof(cdb), buffer, cmd[3] * 512, sense, sizeof(sense), dxfer_direction); +- +- /* Verify SATA magics */ +- if (sense[0] != 0x72 || sense[7] != 0x0e || sense[9] != 0x0e || sense[10] != 0x00) +- return 1; +- else +- return ret; ++ return scsi_SG_IO(device, cdb, sizeof(cdb), buffer, cmd[3] * 512, sense, sizeof(sense), dxfer_direction); + } + + void sata_fixstring(unsigned char *s, int bytecount) diff --git a/talimatname/genel/h/hddtemp/hddtemp.rc b/talimatname/genel/h/hddtemp/hddtemp.rc new file mode 100644 index 000000000..53b0508ad --- /dev/null +++ b/talimatname/genel/h/hddtemp/hddtemp.rc @@ -0,0 +1,37 @@ +#!/bin/sh +# +# /etc/rc.d/hddtemp: start/stop hddtemp daemon +# + +# Check for configuration files +[ -f /etc/hddtemp.db ] || exit 1 + +case $1 in +start) + printf "Starting hddtemp..." + /usr/sbin/hddtemp -d -l 127.0.0.1 $(ls /dev/sd[a-z] | xargs) + if [ $? = 0 ]; then + printf " done.\n" + else + printf " error.\n" + fi + ;; +stop) + printf "Shutting down hddtemp..." + killall -q /usr/sbin/hddtemp + printf " done.\n" + ;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) + echo "usage: $0 [start|stop|restart]" + exit 1 + ;; +esac + +exit $? + +# End of file diff --git a/talimatname/genel/h/hddtemp/talimat b/talimatname/genel/h/hddtemp/talimat new file mode 100644 index 000000000..acb5a617f --- /dev/null +++ b/talimatname/genel/h/hddtemp/talimat @@ -0,0 +1,37 @@ +# Tanım: S.M.A.R.T degerlerini okuyarak hdd ısısını verir +# URL: http://www.guzu.net/linux/hddtemp.php +# Paketçi: milisarge +# Gerekler: + +isim=hddtemp +surum=0.3-beta15 +devir=2 +kaynak=(http://nongnu.askapache.com/hddtemp/$isim-$surum.tar.bz2 + http://nongnu.askapache.com/hddtemp/hddtemp.db + hddtemp-0.3-beta15-satacmds.patch + hddtemp-0.3-beta15-byteswap.patch + hddtemp-0.3-beta15-execinfo.patch + hddtemp-0.3-beta15-nls.patch + hddtemp-0.3-beta15-iconv.patch + hddtemp.rc) + +derle() { + cd $isim-$surum + + patch -p 1 -i $SRC/hddtemp-0.3-beta15-satacmds.patch + patch -p 1 -i $SRC/hddtemp-0.3-beta15-byteswap.patch + patch -p 1 -i $SRC/hddtemp-0.3-beta15-execinfo.patch + patch -p 1 -i $SRC/hddtemp-0.3-beta15-nls.patch + patch -p 1 -i $SRC/hddtemp-0.3-beta15-iconv.patch + autoreconf + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --with-db-path=/etc/hddtemp.db + + make + make DESTDIR=$PKG install + install -m 0644 -D $SRC/hddtemp.db $PKG/etc/hddtemp.db + install -m 0744 -D $SRC/hddtemp.rc $PKG/etc/rc.d/init.d/hddtemp +} diff --git a/talimatname/genel/h/hdparm/talimat b/talimatname/genel/h/hdparm/talimat new file mode 100644 index 000000000..83b15e891 --- /dev/null +++ b/talimatname/genel/h/hdparm/talimat @@ -0,0 +1,14 @@ +# Tanım: Hdparm paketi, ATA/IDE'yi denetlemek için kullanışlı bir yardımcı program içerir +# URL: http://hdparm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=hdparm +surum=9.52 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum && make + make DESTDIR=$PKG binprefix=/usr install +} diff --git a/talimatname/genel/h/heimdall/heimdall.desktop b/talimatname/genel/h/heimdall/heimdall.desktop new file mode 100644 index 000000000..ca2d125c1 --- /dev/null +++ b/talimatname/genel/h/heimdall/heimdall.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Name=Heimdall +Type=Application +Comment=Firmware flasher for Samsung mobile devices +Terminal=false +Exec=heimdall-frontend +Icon=phone +Categories=Development; diff --git a/talimatname/genel/h/heimdall/talimat b/talimatname/genel/h/heimdall/talimat new file mode 100644 index 000000000..c8c957107 --- /dev/null +++ b/talimatname/genel/h/heimdall/talimat @@ -0,0 +1,25 @@ +# Tanım: Samsung cihazlara firmware yükleme aracı +# URL: http://www.glassechidna.com.au/products/heimdall/ +# Paketçi: milisarge +# Gerekler: cmake qt5 android-udev + +isim=heimdall +surum=1.4.2 +devir=2 +kaynak=(https://github.com/Benjamin-Dobell/Heimdall/archive/v${surum}.tar.gz::$isim-$surum.tar.gz + https://github.com/oltulu/Heimdall/raw/master/heimdall-frontend/mainwindow.ui::$isim-mainwindow.ui + https://github.com/oltulu/Heimdall/raw/master/heimdall-frontend/aboutform.ui::$isim-aboutform.ui + heimdall.desktop) + +derle(){ + cd Heimdall-$surum + cp -r $SRC/$isim-mainwindow.ui $SRC/Heimdall-$surum/heimdall-frontend/ + cp -r $SRC/$isim-aboutform.ui $SRC/Heimdall-$surum/heimdall-frontend/ + cmake . -DCMAKE_INSTALL_PREFIX=/usr + make + install -m644 -D $SRC/heimdall.desktop "$PKG/usr/share/applications/heimdall.desktop" + install -m644 -D LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + install -d "$PKG"/usr/bin + install -Dm755 bin/* "$PKG"/usr/bin/ + install -Dm644 heimdall/60-heimdall.rules "$PKG"/usr/lib/udev/rules.d/60-heimdall.rules +} diff --git a/talimatname/genel/h/help2man/talimat b/talimatname/genel/h/help2man/talimat new file mode 100644 index 000000000..c7eac3528 --- /dev/null +++ b/talimatname/genel/h/help2man/talimat @@ -0,0 +1,19 @@ +# Tanım: Help2man, program çıktısından otomatik olarak basit manuel sayfalar üretmek için kullanılan bir araçtır. +# URL: http://www.gnu.org/software/help2man/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: perl-locale-gettext + +isim=help2man +surum=1.47.3 +devir=1 +kaynak=(http://ftp.gnu.org/gnu/help2man/help2man-$surum.tar.xz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --libdir=/usr/lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hexchat/talimat b/talimatname/genel/h/hexchat/talimat new file mode 100644 index 000000000..495d86b3b --- /dev/null +++ b/talimatname/genel/h/hexchat/talimat @@ -0,0 +1,25 @@ +# Tanım: HexChat bir IRC sohbet programıdır. Aynı anda birden fazla IRC kanalına (sohbet odaları) katılmanızı, herkese açık olarak konuşmanızı, özel birebir konuşmalar yapmanızı, vb. olanak sağlar. Dosya aktarımları da mümkündür. +# URL: https://dl.hexchat.net/hexchat +# Paketçi: milisarge +# Gerekler: lua52 glib gtk2 dbus libnotify libcanberra openssl pciutils desktop-file-utils pango + +isim=hexchat +surum=2.12.3 +devir=1 +kaynak=(https://dl.hexchat.net/hexchat/$isim-$surum.tar.xz) + +derle() { + gdk-pixbuf-query-loaders --update-cache + cd $isim-$surum + + ./configure \ + --prefix='/usr' \ + --enable-python='python3' \ + --enable-textfe + + make + + make DESTDIR=$PKG install + + +} diff --git a/talimatname/genel/h/hfsprogs/license b/talimatname/genel/h/hfsprogs/license new file mode 100644 index 000000000..c7fab4b24 --- /dev/null +++ b/talimatname/genel/h/hfsprogs/license @@ -0,0 +1,353 @@ +Apple Public Source License + +Version 2.0 - August 6, 2003 + +Please read this License carefully before downloading this software. By +downloading or using this software, you are agreeing to be bound by the +terms of this License. If you do not or cannot agree to the terms of +this License, please do not download or use the software. + +1. General; Definitions. This License applies to any program or other +work which Apple Computer, Inc. ("Apple") makes publicly available and +which contains a notice placed by Apple identifying such program or work +as "Original Code" and stating that it is subject to the terms of this +Apple Public Source License version 2.0 ("License"). As used in this +License: + +1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the +grantor of rights, (i) claims of patents that are now or hereafter +acquired, owned by or assigned to Apple and (ii) that cover subject +matter contained in the Original Code, but only to the extent necessary +to use, reproduce and/or distribute the Original Code without +infringement; and (b) in the case where You are the grantor of rights, +(i) claims of patents that are now or hereafter acquired, owned by or +assigned to You and (ii) that cover subject matter in Your +Modifications, taken alone or in combination with Original Code. + +1.2 "Contributor" means any person or entity that creates or contributes +to the creation of Modifications. + +1.3 "Covered Code" means the Original Code, Modifications, the +combination of Original Code and any Modifications, and/or any +respective portions thereof. + +1.4 "Externally Deploy" means: (a) to sublicense, distribute or +otherwise make Covered Code available, directly or indirectly, to anyone +other than You; and/or (b) to use Covered Code, alone or as part of a +Larger Work, in any way to provide a service, including but not limited +to delivery of content, through electronic communication with a client +other than You. + +1.5 "Larger Work" means a work which combines Covered Code or portions +thereof with code not governed by the terms of this License. + +1.6 "Modifications" mean any addition to, deletion from, and/or change +to, the substance and/or structure of the Original Code, any previous +Modifications, the combination of Original Code and any previous +Modifications, and/or any respective portions thereof. When code is +released as a series of files, a Modification is: (a) any addition to or +deletion from the contents of a file containing Covered Code; and/or (b) +any new file or other representation of computer program statements that +contains any part of Covered Code. + +1.7 "Original Code" means (a) the Source Code of a program or other work +as originally made available by Apple under this License, including the +Source Code of any updates or upgrades to such programs or works made +available by Apple under this License, and that has been expressly +identified by Apple as such in the header file(s) of such work; and (b) +the object code compiled from such Source Code and originally made +available by Apple under this License + +1.8 "Source Code" means the human readable form of a program or other +work that is suitable for making modifications to it, including all +modules it contains, plus any associated interface definition files, +scripts used to control compilation and installation of an executable +(object code). + +1.9 "You" or "Your" means an individual or a legal entity exercising +rights under this License. For legal entities, "You" or "Your" includes +any entity which controls, is controlled by, or is under common control +with, You, where "control" means (a) the power, direct or indirect, to +cause the direction or management of such entity, whether by contract or +otherwise, or (b) ownership of fifty percent (50%) or more of the +outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and +conditions of this License, Apple hereby grants You, effective on the +date You accept this License and download the Original Code, a +world-wide, royalty-free, non-exclusive license, to the extent of +Apple's Applicable Patent Rights and copyrights covering the Original +Code, to do the following: + +2.1 Unmodified Code. You may use, reproduce, display, perform, +internally distribute within Your organization, and Externally Deploy +verbatim, unmodified copies of the Original Code, for commercial or +non-commercial purposes, provided that in each instance: + +(a) You must retain and reproduce in all copies of Original Code the +copyright and other proprietary notices and disclaimers of Apple as they +appear in the Original Code, and keep intact all notices in the Original +Code that refer to this License; and + +(b) You must include a copy of this License with every copy of Source +Code of Covered Code and documentation You distribute or Externally +Deploy, and You may not offer or impose any terms on such Source Code +that alter or restrict this License or the recipients' rights hereunder, +except as permitted under Section 6. + +2.2 Modified Code. You may modify Covered Code and use, reproduce, +display, perform, internally distribute within Your organization, and +Externally Deploy Your Modifications and Covered Code, for commercial or +non-commercial purposes, provided that in each instance You also meet +all of these conditions: + +(a) You must satisfy all the conditions of Section 2.1 with respect to +the Source Code of the Covered Code; + +(b) You must duplicate, to the extent it does not already exist, the +notice in Exhibit A in each file of the Source Code of all Your +Modifications, and cause the modified files to carry prominent notices +stating that You changed the files and the date of any change; and + +(c) If You Externally Deploy Your Modifications, You must make Source +Code of all Your Externally Deployed Modifications either available to +those to whom You have Externally Deployed Your Modifications, or +publicly available. Source Code of Your Externally Deployed +Modifications must be released under the terms set forth in this +License, including the license grants set forth in Section 3 below, for +as long as you Externally Deploy the Covered Code or twelve (12) months +from the date of initial External Deployment, whichever is longer. You +should preferably distribute the Source Code of Your Externally Deployed +Modifications electronically (e.g. download from a web site). + +2.3 Distribution of Executable Versions. In addition, if You Externally +Deploy Covered Code (Original Code and/or Modifications) in object code, +executable form only, You must include a prominent notice, in the code +itself as well as in related documentatble under the terms of this +License with information on how and where to obtain such Source Code. + +2.4 Third Party Rights. You expressly acknowledge and agree that +although Apple and each Contributor grants the licenses to their +respective portions of the Covered Code set forth herein, no assurances +are provided by Apple or any Contributor that the Covered Code does not +infringe the patent or other intellectual property rights of any other +entity. Apple and each Contributor disclaim any liability to You for +claims brought by any other entity based on infringement of intellectual +property rights or otherwise. As a condition to exercising the rights +and licenses granted hereunder, You hereby assume sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow You to +distribute the Covered Code, it is Your responsibility to acquire that +license before distributing the Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses +granted to You under this License, You hereby grant to any person or +entity receiving or distributing Covered Code under this License a +non-exclusive, royalty-free, perpetual, irrevocable license, under Your +Applicable Patent Rights and other intellectual property rights (other +than patent) owned or controlled by You, to use, reproduce, display, +perform, modify, sublicense, distribute and Externally Deploy Your +Modifications of the same scope and extent as Apple's licenses under +Sections 2.1 and 2.2 above. + +4. Larger Works. You may create a Larger Work by combining Covered Code +with other code not governed by the terms of this License and distribute +the Larger Work as a single product. In each such instance, You must +make sure the requirements of this License are fulfilled for the Covered +Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section +2, no other patent rights, express or implied, are granted by Apple +herein. Modifications and/or Larger Works may require additional patent +licensesrms") to one or more recipients of Covered Code. However, You +may do so only on Your own behalf and as Your sole responsibility, and +not on behalf of Apple or any Contributor. You must obtain the +recipient's agreement that any such Additional Terms are offered by You +alone, and You hereby agree to indemnify, defend and hold Apple and +every Contributor harmless for any liability incurred by or claims +asserted against Apple or such Contributor by reason of any such +Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new +versions of this License from time to time. Each version will be given a +distinguishing version number. Once Original Code has been published +under a particular version of this License, You may continue to use it +under the terms of that version. You may also choose to use such +Original Code under the terms of any subsequent version of this License +published by Apple. No one other than Apple has the right to modify the +terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in +part pre-release, untested, or not fully tested works. The Covered Code +may contain errors that could cause failures or loss of data, and may be +incomplete or contain inaccuracies. You expressly acknowledge and agree +that use of the Covered Code, or any portion thereof, is at Your sole +and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT +WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S +LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF +SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES +AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF +SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, +OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND +EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR +ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE +COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE +COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE +COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE +GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR +SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not +intended for use in the operation of nuclear facilities, aircraft +navigation, communication systems, or air traffic control machines in +which case the failure of the Covered Code could lead to death, personal +injury, or severe physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO +EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO +THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY +PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT +(INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE +OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES +AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME +JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR +CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no +event shall Apple's total liability to You for all damages (other than +as may be required by applicable law) under this License exceed the +amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the +trademarks or trade names "Apple", "Apple Computer", "Mac", "Mac OS", +"QuickTime", "QuickTime Streaming Server" or any other trademarks, +service marks, logos or trade names belonging to Apple (collectively +"Apple Marks") or to any trademark, service mark, logo or trade name +belonging to any Contributor. You agree not to use any Apple Marks in or +as part of the name of products derived from the Original Code or to +endorse or promote products derived from the Original Code other than as +expressly permitted by and in strict compliance at all times with +Apple's third party trademark usage guidelines which are posted at +http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Subject to the licenses granted under this License, each +Contributor retains all rights, title and interest in and to any +Modifications made by such Contributor. Apple retains all rights, title +and interest in and to the Original Code and any Modifications made by +or on behalf of Apple ("Apple Modifications"), and such Apple +Modifications will not be automatically subject to this License. Apple +may, at its sole discretion, choose to license such Apple Modifications +under this License, or on different terms from those contained in this +License or may choose not to license them at all. + +12. Termination. + +12.1 Termination. This License and the rights granted hereunder will +terminate: + +(a) automatically without notice from Apple if You fail to comply with +any term(s) of this License and fail to cure such breach within 30 days +of becoming aware of such breach; + +(b) immediately in the event of the circumstances described in Section +13.5(b); or + +(c) automatically without notice from Apple if You, at any time during +the term of this License, commence an action for patent infringement +against Apple; provided that Apple did not first commence an action for +patent infringement against You in that instance. + +12.2 Effect of Termination. Upon termination, You agree to immediately +stop any further use, reproduction, modification, sublicensing and +distribution of the Covered Code. All sublicenses to the Covered Code +which have been properly granted prior to termination shall survive any +termination of this License. Provisions which, by their nature, should +remain in effect beyond the termination of this License shall survive, +including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. +No party will be liable to any other for compensation, indemnity or +damages of any sort solely as a result of terminating this License in +accordance with its terms, and termination of this License will be +without prejudice to any other right or remedy of any party. + +13. Miscellaneous. + +13.1 Government End Users. The Covered Code is a "commercial item" as +defined in FAR 2.101. Government software and technical data rights in +the Covered Code include only those rights customarily provided to the +public as defined in this License. This customary commercial license in +technical data and software is provided in accordance with FAR 12.211 +(Technical Data) and 12.212 (Computer Software) and, for Department of +Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial +Items) and 227.7202-3 (Rights in Commercial Computer Software or +Computer Software Documentation). Accordingly, all U.S. Government End +Users acquire Covered Code with only those rights set forth herein. + +13.2 Relationship of Parties. This License will not be construed as +creating an agency, partnership, joint venture or any other form of +legal association between or among You, Apple or any Contributor, and +You will not represent to the contrary, whether expressly, by +implication, appearance or otherwise. + +13.3 Independent Development. Nothing in this License will impair +Apple's right to acquire, license, develop, have others develop for it, +market and/or distribute technology or products that perform the same or +similar functions as, or otherwise compete with, Modifications, Larger +Works, technology or products that You may develop, produce, market or +distribute. + +13.4 Waiver; Construction. Failure by Apple or any Contributor to +enforce any provision of this License will not be deemed a waiver of +future enforcement of that or any other provision. Any law or regulation +which provides that the language of a contract shall be construed +against the drafter will not apply to this License. + +13.5 Severability. (a) If for any reason a court of competent +jurisdiction finds any provision of this License, or portion thereof, to +be unenforceable, that provision of the License will be enforced to the +maximum extent permissible so as to effect the economic benefits and +intent of the parties, and the remainder of this License will continue +in full force and effect. (b) Notwithstanding the foregoing, if +applicable law prohibits or restricts You from fully and/or specifically +complying with Sections 2 and/or 3 or prevents the enforceability of +either of those Sections, this License will immediately terminate and +You must immediately discontinue any use of the Covered Code and destroy +all copies of it that are in your possession or control. + +13.6 Dispute Resolution. Any litigation or other dispute resolution +between You and Apple relating to this License shall take place in the +Northern District of California, and You and Apple hereby consent to the +personal jurisdiction of, and venue in, the state and federal courts +within that District with respect to this License. The application of +the United Nations Convention on Contracts for the International Sale of +Goods isce of Quebec, Canada, the following clause applies: The parties +hereby confirm that they have requested that this License and all +related documents be drafted in English. Les parties ont exigé que le +présent contrat et tous les documents connexes soient rédigés en +anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights +Reserved. + +This file contains Original Code and/or Modifications of Original Code +as defined in and that are subject to the Apple Public Source License +Version 2.0 (the 'License'). You may not use this file except in +compliance with the License. Please obtain a copy of the License at +http://www.opensource.apple.com/apsl/ and read it before using this +file. + +The Original Code and all software distributed under the License are +distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please +see the License for the specific language governing rights and +limitations under the License." + +Please read the terms of this license carefully. By clicking on the +"Yes, I Accept" button below you are accepting and agreeing to the terms +of this license with Apple Computer, Inc. If you are agreeing to this +license on behalf of a company, you represent that you are authorized to +bind the company to such a license. If you do not meet this criterion or +you do not agree to any of the terms of this license, please click on +the "No, I Reject" button below or use your browser's Back button to +exit this page. diff --git a/talimatname/genel/h/hfsprogs/makefile.patch b/talimatname/genel/h/hfsprogs/makefile.patch new file mode 100644 index 000000000..812655f2e --- /dev/null +++ b/talimatname/genel/h/hfsprogs/makefile.patch @@ -0,0 +1,10 @@ +diff -Naur a/Makefile.lnx b/Makefile.lnx +--- a/Makefile.lnx 2014-05-03 21:05:26.619853000 +0200 ++++ b/Makefile.lnx 2014-05-03 21:04:42.977667000 +0200 +@@ -1,5 +1,5 @@ + CC := gcc +-CFLAGS += -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1 ++CFLAGS += `pkg-config --cflags libbsd` -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1 + SUBDIRS := newfs_hfs.tproj fsck_hfs.tproj + + all clean: diff --git a/talimatname/genel/h/hfsprogs/talimat b/talimatname/genel/h/hfsprogs/talimat new file mode 100644 index 000000000..6677c17d3 --- /dev/null +++ b/talimatname/genel/h/hfsprogs/talimat @@ -0,0 +1,35 @@ +# Tanım: HFS/HFS + kullanıcı alanı etiketleri +# URL: http://www.opensource.apple.com/ +# Paketçi: milisarge +# Gerekler: libbsd openssl + +isim=hfsprogs +surum=332.25 +devir=1 +kaynak=(http://ftp.de.debian.org/debian/pool/main/h/hfsprogs/${isim}_${surum}.orig.tar.gz + http://ftp.de.debian.org/debian/pool/main/h/hfsprogs/${isim}_${surum}-11.debian.tar.gz + license + makefile.patch) + +derle() { + cd diskdev_cmds-${surum} + for patch in ../debian/patches/*.patch ../makefile.patch + do + patch -Np1 -i ${patch} + done + make -f Makefile.lnx + install -m 755 -d ${PKG}/usr/bin + install -m 755 -d ${PKG}/usr/share/licenses/${isim} + install -m 755 -d ${PKG}/usr/share/${isim} + install -m 755 -d ${PKG}/usr/share/man/man8/ + + install -m 644 ../license ${PKG}/usr/share/licenses/${isim}/APSL + + install -m 755 newfs_hfs.tproj/newfs_hfs ${PKG}/usr/bin/mkfs.hfsplus + install -m 755 fsck_hfs.tproj/fsck_hfs ${PKG}/usr/bin/fsck.hfsplus + + install -m 644 newfs_hfs.tproj/hfsbootdata.img ${PKG}/usr/share/${NAME}/hfsbootdata + + install -m 644 newfs_hfs.tproj/newfs_hfs.8 ${PKG}/usr/share/man/man8/mkfs.hfsplus.8 + install -m 644 fsck_hfs.tproj/fsck_hfs.8 ${PKG}/usr/share/man/man8/fsck.hfsplus.8 +} diff --git a/talimatname/genel/h/hiawatha/hiawatha.conf.sample b/talimatname/genel/h/hiawatha/hiawatha.conf.sample new file mode 100644 index 000000000..1c1d62450 --- /dev/null +++ b/talimatname/genel/h/hiawatha/hiawatha.conf.sample @@ -0,0 +1,114 @@ +# Hiawatha main configuration file +# This is a basic sample configuration file that sets up a: +# 1) Default web site at /srv/http/hiawatha (Note: fast CGI is not active on default site) +# 2) Virtual host for phpmyadmin at /srv/http/phpMyAdmin +# note: you must install phpmyadmin, mysql, php-mcrypt, and php-cgi separately. Be sure that extensions +# mcrypt.so and mysql.so are enabled in your php.ini. +# Also add phpmyadmin to your hosts file +# 3) FastCGI server + + +# GENERAL SETTINGS +ServerId = http +ConnectionsTotal = 150 +ConnectionsPerIP = 10 +SystemLogfile = /var/log/hiawatha/system.log +GarbageLogfile = /var/log/hiawatha/garbage.log + + +# BINDING SETTINGS +# A binding is where a client can connect to. +# +Binding { + Port = 80 +} + + + +### The following fast CGI daemons require php-fpm using a UNIX socket and TCP port, respectively. +# ACTIVATE a FastCGI server for php (using UNIX socket) +FastCGIserver { + FastCGIid = PHP5 + ConnectTo = /run/php-fpm/php-fpm.sock + Extension = php + SessionTimeout = 30 +} + +# ACTIVATE a FastCGI server for php (using IP-address and TCP port) +#FastCGIserver { +# FastCGIid = PHP5 +# ConnectTo = 127.0.0.1:9000 +# Extension = php +# SessionTimeout = 30 +#} + + +# DEFAULT WEBSITE +# It is wise to use your IP address as the hostname of the default website +# and give it a blank webpage. By doing so, automated webscanners won't find +# your possible vulnerable website. +# +Hostname = 127.0.0.1 +WebsiteRoot = /srv/http/hiawatha +StartFile = index.html +AccessLogfile = /var/log/hiawatha/access.log +ErrorLogfile = /var/log/hiawatha/error.log +#ErrorHandler = 404:/error.cgi +UseXSLT = yes + + +# VIRTUAL HOSTS +VirtualHost { + + # If you set WebsiteRoot to /usr/share/webapps/phpMyAdmin you don't need followsymlinks + # I symlinked the phpMyAdmin folder to '/srv/http/phpMyAdmin' so that I can easily remember where it's located but + # still set 'WebsiteRoot' to the real source directory. You could point WebsiteRoot to the + # symlinked directory, but you will have to set 'FollowSymlinks = yes' for that to function properly + + #FollowSymlinks = yes + #WebsiteRoot = /srv/http/phpMyAdmin + WebsiteRoot = /usr/share/webapps/phpMyAdmin + Hostname = phpmyadmin + AccessLogfile = /var/log/hiawatha/phpmyadmin/access.log + ErrorLogfile = /var/log/hiawatha/phpmyadmin/error.log + StartFile = index.php + UseFastCGI = PHP5 + +} + +# Add some more + +#VirtualHost { +# Hostname = www.my-domain.com +# WebsiteRoot = /svr/http/my-domain/public +# StartFile = index.php +# AccessLogfile = /svr/http/my-domain/log/access.log +# ErrorLogfile = /svr/http/my-domain/log/error.log +# TimeForCGI = 5 +# UseFastCGI = PHP5 +# UseToolkit = banshee +#} + + +#Additional settings for monitoring + +UrlToolkit { + ToolkitID = banshee + RequestURI isfile Return + Match ^/(css|files|images|js)/ Return + Match ^/(favicon.ico|robots.txt|sitemap.xml)$ Return + Match .*\?(.*) Rewrite /index.php?$1 + Match .* Rewrite /index.php +} + +VirtualHost { + Hostname = monitor.domain.com + WebsiteRoot = /svr/http/monitor/public + AccessLogfile = /svr/http/monitor/logfiles/access.log + ErrorLogfile = /svr/http/monitor/logfiles/error.log + StartFile = index.php +# ExecuteCGI = yes + UseFastCGI = PHP5 # Use if you use PHP as a FastCGI daemon + TimeForCGI = 15 + UseToolkit = banshee +} diff --git a/talimatname/genel/h/hiawatha/hiawatha.kur-kos b/talimatname/genel/h/hiawatha/hiawatha.kur-kos new file mode 100644 index 000000000..d520b8257 --- /dev/null +++ b/talimatname/genel/h/hiawatha/hiawatha.kur-kos @@ -0,0 +1 @@ +cp /sources/milis.git/talimatname/genel/hiawatha/hiawatha.rc /etc/rc.d/init.d/hiawatha diff --git a/talimatname/genel/h/hiawatha/hiawatha.rc b/talimatname/genel/h/hiawatha/hiawatha.rc new file mode 100755 index 000000000..b482bdfef --- /dev/null +++ b/talimatname/genel/h/hiawatha/hiawatha.rc @@ -0,0 +1,33 @@ +#!/bin/sh +# +# /etc/rc.d/hiawatha: başlatma/durdurma hiawatha web sunucu +# + +. /lib/lsb/init-functions +_PID=/var/run/hiawatha.pid + +case $1 in +start) + log_info_msg "Hiawatha başlatılıyor..." + /usr/bin/hiawatha + evaluate_retval + ;; +stop) + log_info_msg "Hiawatha durduruluyor..." + if [ -f $_PID ]; then + kill `cat $_PID` + else + killall -9 /usr/bin/hiawatha + fi + evaluate_retval + ;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) + echo "Kullanım: $0 [start|stop|restart]" + exit 1 + ;; +esac diff --git a/talimatname/genel/h/hiawatha/talimat b/talimatname/genel/h/hiawatha/talimat new file mode 100644 index 000000000..53550d32d --- /dev/null +++ b/talimatname/genel/h/hiawatha/talimat @@ -0,0 +1,65 @@ +# Tanım: Guvenli ve gelişmiş bir webserver +# URL: https://www.hiawatha-webserver.org/ +# Paketçi: milisarge +# Gerekler: cmake libxslt mbedtls + +isim=hiawatha +surum=10.3 +devir=1 +kaynak=(https://www.hiawatha-webserver.org/files/$isim-$surum.tar.gz + hiawatha.conf.sample) + +derle() { + + cd "$isim-$surum" + sed -i 's/www-data/http/g' extra/logrotate.in + mkdir -p build + cd build + + cmake ../ -DCMAKE_INSTALL_PREFIX="/" \ + -DCMAKE_INSTALL_BINDIR="/usr/bin" \ + -DCMAKE_INSTALL_SBINDIR="/usr/bin" \ + -DCMAKE_INSTALL_SYSCONFDIR="/etc/hiawatha" \ + -DCMAKE_INSTALL_LIBDIR="/usr/lib" \ + -DCMAKE_INSTALL_MANDIR="/usr/share/man" \ + -DCONFIG_DIR="/etc/hiawatha" \ + -DLOG_DIR="/var/log/hiawatha" \ + -DPID_DIR="/run" \ + -DENABLE_TLS=ON \ + -DUSE_SYSTEM_MBEDTLS=ON \ + -DENABLE_MONITOR=ON \ + -DWEBROOT_DIR="/srv/http/hiawatha" \ + -DWORK_DIR="/var/lib/hiawatha" + + make + + # Features enabled by default + # -DENABLE_CACHE + # -DENABLE_IPV6 + # -DENABLE_RPROXY + # -DENABLE_TOOLKIT + # -DENABLE_XSLT + + # Features disabled by default + # -DENABLE_DEBUG + # -DENABLE_TOMAHAWK + + make DESTDIR="$PKG/" install + + rmdir "$PKG/run" + rm "$PKG/srv/http/hiawatha/index.html" + rmdir -p --ignore-fail-on-non-empty "$PKG/srv/http/hiawatha" + + # Update stock hiawatha.conf + sed -e 's|#ServerId = www-data|ServerId = http|' \ + -e 's|/var/www/|/srv/http/|g' \ + -e 's|//|/|g' \ + -e 's|#CGIextension = cgi|&\n#TriggerOnCGIstatus = no|g' \ + -e 's|ConnectTo = 127.0.0.1:2005|ConnectTo = 127.0.0.1:9000|g' \ + -e 's|# Extension = php|&\n# SessionTimeout = 30|g' \ + -e 's|#ErrorHandler = 404:/error.cgi|&\n#UseGZfile = yes|g' \ + -i "$PKG/etc/hiawatha/hiawatha.conf" + + install -Dm644 logrotate.d/hiawatha "$PKG/etc/logrotate.d/hiawatha" + install -Dm644 $SRC/"hiawatha.conf.sample" "$PKG/etc/hiawatha/" +} diff --git a/talimatname/genel/h/hicolor-icon-theme/talimat b/talimatname/genel/h/hicolor-icon-theme/talimat new file mode 100644 index 000000000..df3d62b01 --- /dev/null +++ b/talimatname/genel/h/hicolor-icon-theme/talimat @@ -0,0 +1,18 @@ +# Tanım: Freedesktop.org Hicolor icon temasi +# URL: http://icon-theme.freedesktop.org/wiki/HicolorTheme +# Paketçi: milisarge +# Gerekler: + +isim=hicolor-icon-theme +surum=0.15 +devir=1 +kaynak=( http://ftp.osuosl.org/pub/blfs/conglomeration/hicolor-icon-theme/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hidapi/talimat b/talimatname/genel/h/hidapi/talimat new file mode 100644 index 000000000..b55f50357 --- /dev/null +++ b/talimatname/genel/h/hidapi/talimat @@ -0,0 +1,18 @@ +# Tanım: USB ve Bluetooth aygıtları ile iletişim için basit bir kütüphane +# URL: http://www.signal11.us/oss/hidapi/ +# Paketçi: milisarge +# Gerekler: libusb fox + + +isim=hidapi +surum=0.8.0-rc1 +devir=1 +kaynak=(https://github.com/signal11/hidapi/archive/$isim-$surum.tar.gz) + +derle() { + cd "$isim-$isim-$surum" + ./bootstrap + ./configure --enable-testgui --prefix=/usr + make + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/h/highlight/talimat b/talimatname/genel/h/highlight/talimat new file mode 100644 index 000000000..71df63ae9 --- /dev/null +++ b/talimatname/genel/h/highlight/talimat @@ -0,0 +1,15 @@ +# Tanım: Hızlı ve esnek kaynak kodu vurgulayıcı (CLI sürümü) +# URL: http://www.andre-simon.de/doku/highlight/highlight.html +# Paketçi: milisarge +# Gerekler: qt4 boost lua + +isim=highlight +surum=3.23 +devir=1 +kaynak=(http://www.andre-simon.de/zip/$isim-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + make QMAKE=qmake-qt4 + make DESTDIR=$PKG QMAKE=qmake-qt4 install +} diff --git a/talimatname/genel/h/hping/Makefile.patch b/talimatname/genel/h/hping/Makefile.patch new file mode 100644 index 000000000..d1d4221f4 --- /dev/null +++ b/talimatname/genel/h/hping/Makefile.patch @@ -0,0 +1,30 @@ +diff -Naur hping3-20051105/Makefile hping3-20051105-new/Makefile +--- hping3-20051105/Makefile 2005-11-05 05:31:41.000000000 -0500 ++++ hping3-20051105-new/Makefile 2009-02-26 03:21:46.000000000 -0500 +@@ -72,16 +72,18 @@ + rm -rf hping3 *.o byteorder byteorder.h systype.h Makefile libars.a .depend + + install: hping3 +- cp -f hping3 /usr/sbin/ +- chmod 755 /usr/sbin/hping3 +- ln -s /usr/sbin/hping3 /usr/sbin/hping +- ln -s /usr/sbin/hping3 /usr/sbin/hping2 +- @if [ -d ${INSTALL_MANPATH}/man8 ]; then \ +- cp ./docs/hping3.8 ${INSTALL_MANPATH}/man8; \ +- chmod 644 ${INSTALL_MANPATH}/man8/hping3.8; \ ++ @[ ! -d ${DESTDIR}/usr/bin ] && install -d ${DESTDIR}/usr/bin ++ cp -f hping3 ${DESTDIR}/usr/bin/ ++ chmod 755 ${DESTDIR}/usr/bin/hping3 ++ ln -s hping3 ${DESTDIR}/usr/bin/hping ++ ln -s hping3 ${DESTDIR}/usr/bin/hping2 ++ @[ ! -d ${DESTDIR}${INSTALL_MANPATH}/man8 ] && install -d ${DESTDIR}${INSTALL_MANPATH}/man8 ++ @if [ -d ${DESTDIR}${INSTALL_MANPATH}/man8 ]; then \ ++ cp ./docs/hping3.8 ${DESTDIR}${INSTALL_MANPATH}/man8; \ ++ chmod 644 ${DESTDIR}${INSTALL_MANPATH}/man8/hping3.8; \ + else \ + echo "@@@@@@ WARNING @@@@@@"; \ +- echo "Can't install the man page: ${INSTALL_MANPATH}/man8 does not exist"; \ ++ echo "Can't install the man page: ${DESTDIR}${INSTALL_MANPATH}/man8 does not exist"; \ + fi + + strip: hping3 diff --git a/talimatname/genel/h/hping/talimat b/talimatname/genel/h/hping/talimat new file mode 100644 index 000000000..51fb19f25 --- /dev/null +++ b/talimatname/genel/h/hping/talimat @@ -0,0 +1,21 @@ +# Tanım: TCP/IP prokolu icin Ping +# URL: https://github.com/antirez/hping +# Paketçi: milisarge +# Gerekler: libpcap + +isim=hping +surum=git +devir=1 +kaynak=(tshzset.patch Makefile.patch) + +derle() { + git clone https://github.com/antirez/hping + + cd $isim + patch -Np1 -i $SRC/tshzset.patch + MANPATH=/usr/share/man + ./configure --prefix=/usr --no-tcl + make + patch -p1 < $SRC/Makefile.patch + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hping/tshzset.patch b/talimatname/genel/h/hping/tshzset.patch new file mode 100644 index 000000000..2d831e7c0 --- /dev/null +++ b/talimatname/genel/h/hping/tshzset.patch @@ -0,0 +1,13 @@ +diff --git a/waitpacket.c b/waitpacket.c +index a6c20f0..6e6acfb 100644 +--- a/waitpacket.c ++++ b/waitpacket.c +@@ -656,7 +656,7 @@ found: + printf(" TCP timestamp: tcpts=%u\n", tstamp); + if (first_tstamp) { + int tsdiff; +- int hz_set[] = { 2, 10, 100, 1000, 0 }; ++ int hz_set[] = { 1, 2, 10, 20, 25, 30, 40, 50, 60, 70, 80, 90, 100, 150, 200, 250, 300, 400, 500, 600, 700, 750, 800, 1000, 2000, 9000, 0 }; + int hzdiff = -1; + int hz = 0, sec; + int days, hours, minutes; diff --git a/talimatname/genel/h/hplip-plugin/talimat b/talimatname/genel/h/hplip-plugin/talimat new file mode 100644 index 000000000..237b622c2 --- /dev/null +++ b/talimatname/genel/h/hplip-plugin/talimat @@ -0,0 +1,48 @@ +# Tanım: HPs hplip yazıcı ikili sürücüler +# URL: http://hplipopensource.com/node/309 +# Paketçi: milisarge +# Gerekler: hplip + +isim=hplip-plugin +surum=3.17.6 +devir=1 +kaynak=(http://www.openprinting.org/download/printdriver/auxfiles/HP/plugins/hplip-$surum-plugin.run) + +derle() { + sh "hplip-$surum-plugin.run" --target "$SRC/hplip-$surum-plugin" --noexec + cd "$SRC/hplip-$surum-plugin" + _arch='x86_64' + + install -d "$PKG/usr/share/hplip/data/firmware" + install -d "$PKG/usr/share/hplip/fax/plugins" + install -d "$PKG/usr/share/hplip/prnt/plugins" + install -d "$PKG/usr/share/hplip/scan/plugins" + install -d "$PKG/usr/share/licenses/hplip-plugin" + install -d "$PKG/var/lib/hp" + + install -m644 plugin.spec "$PKG/usr/share/hplip/" + install -m644 hp_laserjet_*.fw.gz "$PKG/usr/share/hplip/data/firmware/" + install -m755 fax_marvell-"$_arch".so "$PKG/usr/share/hplip/fax/plugins/" + install -m755 hbpl1-"$_arch".so "$PKG/usr/share/hplip/prnt/plugins/" + install -m755 lj-"$_arch".so "$PKG/usr/share/hplip/prnt/plugins/" + install -m755 bb_*-"$_arch".so "$PKG/usr/share/hplip/scan/plugins/" + install -m644 license.txt "$PKG/usr/share/licenses/hplip-plugin/" + + # Create hplip.state used by hplip-tools + + cat << EOF > hplip.state +[plugin] +installed = 1 +eula = 1 +version = $surum +EOF + + install -m644 hplip.state "$PKG/var/lib/hp" + # Create symlinks + find "$PKG/usr/share/hplip" -type f -name "*.so" | while read f; do + lib_dir="${f%/*}" + lib_isim="${f##*/}" + ln -vsf "$lib_name" "$lib_dir/${lib_name%%-*}.so" + done + +} diff --git a/talimatname/genel/h/hplip/0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch b/talimatname/genel/h/hplip/0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch new file mode 100644 index 000000000..491c3072b --- /dev/null +++ b/talimatname/genel/h/hplip/0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch @@ -0,0 +1,50 @@ +From b3a7fa4d4a573cfe0073ae50197f679af7e3a0ac Mon Sep 17 00:00:00 2001 +From: Till Kamppeter +Date: Sat, 24 Sep 2016 10:37:20 +0200 +Subject: Add 'include ' in various places as CUPS 2.2 moved some + definitions to ppd.h + +--- + configure.in | 2 +- + prnt/hpcups/HPCupsFilter.h | 2 ++ + prnt/hpijs/hpcupsfax.cpp | 1 + + 3 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/configure.in b/configure.in +index d3a1ddb..eabe14a 100755 +--- a/configure.in ++++ b/configure.in +@@ -554,7 +554,7 @@ fi + + if test "$hpijs_only_build" = "no" && test "$hpcups_only_build" = "no"; then + AC_CHECK_LIB([cups], [cupsDoFileRequest], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libcups support], 9)]) +- AC_CHECK_HEADERS(cups/cups.h, ,[AC_MSG_ERROR([cannot find cups-devel support], 3)]) ++ AC_CHECK_HEADERS(cups/cups.h cups/ppd.h, ,[AC_MSG_ERROR([cannot find cups-devel support], 3)]) + if test "$libusb01_build" = "yes"; then + AC_CHECK_LIB([usb], [usb_init], [LIBS="$LIBS"], [AC_MSG_ERROR([cannot find libusb support], 2)]) + AC_CHECK_HEADERS(usb.h, ,[AC_MSG_ERROR([cannot find libusb-devel support], 11)]) +diff --git a/prnt/hpcups/HPCupsFilter.h b/prnt/hpcups/HPCupsFilter.h +index ff5548e..c517989 100644 +--- a/prnt/hpcups/HPCupsFilter.h ++++ b/prnt/hpcups/HPCupsFilter.h +@@ -38,6 +38,8 @@ + + #include "dbuscomm.h" + ++#include ++ + #define DBITMAPFILEHEADER 14 + #define DBITMAPINFOHEADER 40 + +diff --git a/prnt/hpijs/hpcupsfax.cpp b/prnt/hpijs/hpcupsfax.cpp +index 8514775..994e50f 100644 +--- a/prnt/hpijs/hpcupsfax.cpp ++++ b/prnt/hpijs/hpcupsfax.cpp +@@ -43,6 +43,7 @@ + #include + #include + #include ++#include + #include + #include + #ifdef FALSE diff --git a/talimatname/genel/h/hplip/fix_tabs.patch b/talimatname/genel/h/hplip/fix_tabs.patch new file mode 100644 index 000000000..1552933df --- /dev/null +++ b/talimatname/genel/h/hplip/fix_tabs.patch @@ -0,0 +1,17 @@ +--- prnt/filters/hpps 2016-08-26 12:04:29.000000000 +0200 ++++ prnt/filters/hpps.new 2016-08-31 21:19:57.868640372 +0200 +@@ -191,11 +191,11 @@ + msg("Setting Pin to default") + else: + szKeyInitials = ['HPFIDigit', 'HPSEDigit', 'HPTHDigit', 'HPFTDigit'] +- for x in szKeyInitials: ++ for x in szKeyInitials: + try: +- secpin += opts[x] ++ secpin += opts[x] + except KeyError: +- secpin += '0' ++ secpin += '0' + + os.write(output_fd, to_bytes_utf8('@PJL SET HOLDKEY="%s"\x0a' % secpin)) + diff --git a/talimatname/genel/h/hplip/hplip.kur-kos b/talimatname/genel/h/hplip/hplip.kur-kos new file mode 100644 index 000000000..eaf822ba0 --- /dev/null +++ b/talimatname/genel/h/hplip/hplip.kur-kos @@ -0,0 +1,3 @@ +# Pour que les scanners en reseau soient reconnus +# +echo "hpaio" >> /etc/sane.d/dll.conf diff --git a/talimatname/genel/h/hplip/talimat b/talimatname/genel/h/hplip/talimat new file mode 100644 index 000000000..3ebecd063 --- /dev/null +++ b/talimatname/genel/h/hplip/talimat @@ -0,0 +1,62 @@ +# Tanım: HP DeskJet, OfficeJet, Photosmart, Business Inkjet ve bazı LaserJet serileri için sürücüler +# URL: http://hplipopensource.com/hplip-web/index.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: v4l-utils libgphoto2 python3-sip python3-qt5 avahi python3 wget ghostscript foomatic-db foomatic-db-engine usbutils sane xsane cups cups-filters rpcbind libusb libusb-compat net-snmp dbus-python python3-gobject python-notify python3-pillow python3-reportlab + +isim=hplip +surum=3.16.10 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz + 0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch + fix_tabs.patch) + + +derle() { + cd $isim-$surum + patch -Np0 -i $SRC/fix_tabs.patch + patch -Np1 -i $SRC/0022-Add-include-cups-ppd.h-in-various-places-as-CUPS-2.2.patch + + # Use system foomatic-rip for hpijs driver instead of foomatic-rip-hplip + # The hpcups driver does not use foomatic-rip + local i + for i in ppd/hpijs/*.ppd.gz ; do + rm -f ${i}.temp + gunzip -c ${i} | sed 's/foomatic-rip-hplip/foomatic-rip/g' | \ + gzip > ${i}.temp || return 1 + mv ${i}.temp ${i} + done + + export AUTOMAKE='automake --foreign' + autoreconf --force --install + + ./configure --prefix=/usr \ + --enable-qt5 \ + --disable-qt4 \ + --disable-foomatic-rip-hplip-install \ + --enable-foomatic-ppd-install \ + --enable-hpcups-install \ + --enable-new-hpcups \ + --enable-cups-ppd-install \ + --enable-cups-drv-install \ + --enable-hpijs-install \ + --enable-foomatic-drv-install \ + --enable-pp-build \ + --enable-udev-acl-rules \ + --enable-dbus-build \ + --enable-scan-build \ + --enable-fax-build \ + --enable-network-build + make + make -j1 rulesdir=/usr/lib/udev/rules.d DESTDIR=$PKG install + + # hplip ne connait que lfs 6 ... + mkdir -pv $PKG/etc + echo "lfs 6" > $PKG/etc/issue + + # remove config provided by sane and autostart of hp-daemon + rm -rf $PKG/etc/{sane.d,xdg} + + # remove HAL .fdi file because HAL is no longer used + rm -vrf $PKG/usr/share/hal + +} diff --git a/talimatname/genel/h/htop/talimat b/talimatname/genel/h/htop/talimat new file mode 100644 index 000000000..def3e7fa2 --- /dev/null +++ b/talimatname/genel/h/htop/talimat @@ -0,0 +1,16 @@ +# Tanım: interaktif bir süreç görüntüleyici/düzenleyici +# URL: http://htop.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=htop +surum=2.0.2 +devir=1 +kaynak=(http://hisham.hm/htop/releases/2.0.2/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/http-parser/talimat b/talimatname/genel/h/http-parser/talimat new file mode 100644 index 000000000..7f7cacc17 --- /dev/null +++ b/talimatname/genel/h/http-parser/talimat @@ -0,0 +1,21 @@ +# Tanım: HTTP İstek/Yanıt için ayrıştırıcı +# URL: https://github.com/nodejs/http-parser +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: geliştirme + +isim=http-parser +surum=2.7.1 +devir=1 + +kaynak=(https://github.com/nodejs/http-parser/archive/v2.7.1.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's|-Werror||' ./Makefile + make library + make PREFIX="$PKG/usr" install + install -Dm644 LICENSE-MIT \ + "${PKG}/usr/share/licenses/${isim}/LICENSE-MIT" + ln -sf libhttp_parser.so.$surum "${PKG}/usr/lib/libhttp_parser.so" +} diff --git a/talimatname/genel/h/httpup/talimat b/talimatname/genel/h/httpup/talimat new file mode 100644 index 000000000..08390fa29 --- /dev/null +++ b/talimatname/genel/h/httpup/talimat @@ -0,0 +1,15 @@ +# Tanım: Http üzerinden tek yönlü senkronizasyon +# URL: http://jw.tks6.net/files/crux/httpup_manual.html +# Paketçi: milisarge +# Gerekler: + +isim=httpup +surum=0.4.0l +devir=1 +kaynak=(http://crux.nu/files/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make + make DESTDIR=$PKG prefix=/usr mandir=/usr/share/man install +} diff --git a/talimatname/genel/h/hunspell/talimat b/talimatname/genel/h/hunspell/talimat new file mode 100644 index 000000000..16207c789 --- /dev/null +++ b/talimatname/genel/h/hunspell/talimat @@ -0,0 +1,20 @@ +# Tanım: Yazım denetimi ve morfolojik analizler için kütüphane ve uygulama +# URL: http://hunspell.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=hunspell +surum=1.3.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static \ + --with-ui \ + --with-readline \ + --with-experimental + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/h/hydra/talimat b/talimatname/genel/h/hydra/talimat new file mode 100644 index 000000000..8a2d7ab82 --- /dev/null +++ b/talimatname/genel/h/hydra/talimat @@ -0,0 +1,17 @@ +# Tanım: Birçok farklı hizmeti destekleyen çok hızlı ağ oturum açma test (fuzzer) uygulaması. +# URL: https://www.thc.org/thc-hydra/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: postgresql subversion libssh mariadb libidn freebird-client afpfs-ng zlib openssl ncurses pcre + +isim=hydra +surum=8.5 +devir=1 +kaynak=(https://www.thc.org/releases/${isim}-${surum}.tar.gz) + +derle() { + cd ${isim}-${surum} + ./configure --fhs + make + make DESTDIR="${PKG}" install + install -Dm 644 README -t "${PKG}/usr/share/doc/${isim}" +} diff --git a/talimatname/genel/h/hyphen/talimat b/talimatname/genel/h/hyphen/talimat new file mode 100644 index 000000000..735c594b0 --- /dev/null +++ b/talimatname/genel/h/hyphen/talimat @@ -0,0 +1,17 @@ +# Tanım: Dönüştürülmüş TeX tireleme kalıplarını kullanmak için tire, tireleme kitaplığı +# URL: http://hunspell.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=hyphen +surum=2.8.8 +devir=1 +kaynak=( http://downloads.sourceforge.net/hunspell/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/i2pd/i2pd.conf b/talimatname/genel/i/i2pd/i2pd.conf new file mode 100644 index 000000000..74ce0f1fd --- /dev/null +++ b/talimatname/genel/i/i2pd/i2pd.conf @@ -0,0 +1,168 @@ +## milis ayar dosyası +## See https://i2pd.readthedocs.org/en/latest/configuration.html +## for more options you can use in this file. + +## Lines that begin with "## " try to explain what's going on. Lines +## that begin with just "#" are disabled commands: you can enable them +## by removing the "#" symbol. + +## Tunnels config file +## Default: ~/.i2pd/tunnels.conf or /var/lib/i2pd/tunnels.conf +#tunconf = /etc/i2pd/tunnels.conf + +## Where to write pidfile (don't write by default) +# pidfile = /var/run/i2pd.pid + +## Logging configuration section +## By default logs go to stdout with level 'info' and higher +## +## Logs destination (valid values: stdout, file, syslog) +## * stdout - print log entries to stdout +## * file - log entries to a file +## * syslog - use syslog, see man 3 syslog +# log = file +## Path to logfile (default - autodetect) +logfile = /var/log/i2pd.log +## Log messages above this level (debug, *info, warn, error) +# loglevel = info + +## Path to storage of i2pd data (RI, keys, peer profiles, ...) +## Default: ~/.i2pd or /var/lib/i2pd +#datadir = /var/lib/i2pd + +## Daemon mode. Router will go to background after start +# daemon = true +## Run as a service. Router will use system folders like ‘/var/lib/i2pd’ +# service = true + +## Specify a family, router belongs to (default - none) +# family = + +## External IP address to listen for connections +## By default i2pd sets IP automatically +# host = 1.2.3.4 + +## Port to listen for connections +## By default i2pd picks random port. You MUST pick a random number too, +## don't just uncomment this +# port = 4567 + +## Enable communication through ipv4 +ipv4 = true +## Enable communication through ipv6 +ipv6 = false + +## Network interface to bind to +# ifname = + +## Enable NTCP transport (default = true) +# ntcp = true +## Enable SSU transport (default = true) +# ssu = true + +## Should we assume we are behind NAT? (false only in MeshNet) +# nat = true + +## Bandwidth configuration +## L limit bandwidth to 32Kbs/sec, O - to 256Kbs/sec, P - to 2048Kbs/sec, +## X - unlimited +## Default is X for floodfill, L for regular node +# bandwidth = L + +## Router will not accept transit tunnels at startup +# notransit = true + +## Router will be floodfill +# floodfill = true + +[limits] +## Maximum active transit sessions (default:2500) +# transittunnels = 2500 + +[precomputation] +## Enable or disable elgamal precomputation table +## By default, enabled on i386 hosts +# elgamal = true + +[upnp] +## Enable or disable UPnP: automatic port forwarding (enabled by default in WINDOWS, ANDROID) +# enabled = false + +## Name i2pd appears in UPnP forwardings list (default = I2Pd) +# name = I2Pd + +[reseed] +## Enable or disable reseed data verification. +verify = true +## URLs to request reseed data from, separated by comma +## Default: "mainline" I2P Network reseeds +# urls = https://reseed.i2p-projekt.de/,https://i2p.mooo.com/netDb/,https://netdb.i2p2.no/ +## Path to local reseed data file (.su3) for manual reseeding +# file = /path/to/i2pseeds.su3 +## or HTTPS URL to reseed from +# file = https://legit-website.com/i2pseeds.su3 + +[addressbook] +## AddressBook subscription URL for initial setup +## Default: inr.i2p at "mainline" I2P Network +defaulturl = http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt +## Optional subscriptions URLs, separated by comma +subscriptions = http://inr.i2p/export/alive-hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://rus.i2p/hosts.txt + +[http] +## Uncomment and set to 'false' to disable Web Console +# enabled = true +## Address and port service will listen on +address = 127.0.0.1 +port = 7070 + +[httpproxy] +## Uncomment and set to 'false' to disable HTTP Proxy +# enabled = true +## Address and port service will listen on +address = 127.0.0.1 +port = 4444 +## Optional keys file for proxy local destination +# keys = http-proxy-keys.dat + +[socksproxy] +## Uncomment and set to 'false' to disable SOCKS Proxy +# enabled = true +## Address and port service will listen on +address = 127.0.0.1 +port = 4447 +## Optional keys file for proxy local destination +# keys = socks-proxy-keys.dat + +## Socks outproxy. Example below is set to use Tor for all connections except i2p +## Address and port of outproxy +# outproxy = 127.0.0.1 +# outproxyport = 9050 + +[sam] +## Uncomment and set to 'true' to enable SAM Bridge +# enabled = false +## Address and port service will listen on +# address = 127.0.0.1 +# port = 7656 + +[bob] +## Uncomment and set to 'true' to enable BOB command channel +# enabled = false +## Address and port service will listen on +# address = 127.0.0.1 +# port = 2827 + +[i2cp] +## Uncomment and set to 'true' to enable I2CP protocol +# enabled = false +## Address and port service will listen on +# address = 127.0.0.1 +# port = 7654 + +[i2pcontrol] +## Uncomment and set to 'true' to enable I2PControl protocol +# enabled = false +## Address and port service will listen on +# address = 127.0.0.1 +# port = 7650 diff --git a/talimatname/genel/i/i2pd/i2pd.kur-kos b/talimatname/genel/i/i2pd/i2pd.kur-kos new file mode 100644 index 000000000..426f6fe20 --- /dev/null +++ b/talimatname/genel/i/i2pd/i2pd.kur-kos @@ -0,0 +1,5 @@ +rm -rf ~/.i2pd +mkdir -p ~/.i2pd +cp -r /usr/share/i2pd/certificates ~/.i2pd/certificates +cp /etc/i2pd/i2pd.conf ~/.i2pd/ +cp /etc/i2pd/tunnels.conf ~/.i2pd/ diff --git a/talimatname/genel/i/i2pd/talimat b/talimatname/genel/i/i2pd/talimat new file mode 100644 index 000000000..9763ce73a --- /dev/null +++ b/talimatname/genel/i/i2pd/talimat @@ -0,0 +1,60 @@ +# Tanım: I2P sistemi c++ +# URL: https://github.com/PurpleI2P/i2pd +# Paketçi: milisarge +# Gerekler: cmake boost miniupnpc websocketpp + +isim=i2pd +surum=2.11.0 +devir=1 +kaynak=(https://github.com/PurpleI2P/${isim}/archive/${surum}.tar.gz + i2pd.conf + tunnels.conf) + +derle() { + cd $SRC/$isim-$surum + cd build + cmake . -Wno-dev \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DWITH_UPNP=1 -DWITH_PCH=1 \ + -DCMAKE_BUILD_TYPE=Release + make + _conf_dest=etc/${isim} + _home_dest=var/lib/${isim} + _share_dest=usr/share + + cd $SRC/$isim-$surum + + cd build + make DESTDIR=$PKG install + install -Dm0644 $SRC/i2pd.conf $PKG/${_conf_dest}/i2pd.conf + install -Dm0644 $SRC/tunnels.conf $PKG/${_conf_dest}/tunnels.conf + install -Dm0644 $SRC/$isim-$surum/docs/subscriptions.txt $PKG/${_conf_dest}/subscriptions.txt + install -d -m0750 $PKG/${_home_dest} + ln -s /${_conf_dest}/i2pd.conf $PKG/${_home_dest}/i2pd.conf + ln -s /${_conf_dest}/tunnels.conf $PKG/${_home_dest}/tunnels.conf + ln -s /${_conf_dest}/subscriptions.txt $PKG/${_home_dest}/subscriptions.txt + + cd $SRC/$isim-$surum/contrib + _dest="$PKG/${_share_dest}/${isim}" + find ./certificates -type d -exec install -d {} ${_dest}/{} \; + find ./certificates -type f -exec install -Dm644 {} ${_dest}/{} \; + ln -s /${_share_dest}/${isim}/certificates $PKG/${_home_dest}/certificates + + # license + install -Dm644 $SRC/$isim-$surum/LICENSE "$PKG/${_share_dest}/licenses/${isim}/LICENSE" + + # docs + _dest="$PKG/${_share_dest}/doc/${isim}" + install -Dm644 $SRC/$isim-$surum/README.md "${_dest}/README.md" + install -Dm644 $SRC/$isim-$surum/docs/configuration.md "${_dest}/configuration.md" + install -Dm644 $SRC/$isim-$surum/docs/family.md "${_dest}/family.md" + install -Dm644 $SRC/$isim-$surum/docs/config_opts_after_2.3.0.md "${_dest}/config_opts_after_2.3.0.md" + + # remove src folder + rm -r "$PKG/usr/src" + + #man + install -Dm644 $SRC/$isim-$surum/debian/i2pd.1 "$PKG/${_share_dest}/man/man1/i2pd.1" + + chmod -R o= $PKG/${_home_dest} +} diff --git a/talimatname/genel/i/i2pd/tunnels.conf b/talimatname/genel/i/i2pd/tunnels.conf new file mode 100644 index 000000000..c9df56f42 --- /dev/null +++ b/talimatname/genel/i/i2pd/tunnels.conf @@ -0,0 +1,49 @@ +[IRC] +type = client +address = 127.0.0.1 +port = 6668 +destination = irc.postman.i2p +destinationport = 6667 +keys = irc-keys.dat + +#[IRCBAGLANICI] +#type = client +#address = 127.0.0.1 +#port = 6670 +#destination = walker.i2p +#destinationport = 6670 +#keys = irc-keys.dat + +#[SMTP] +#type = client +#address = 127.0.0.1 +#port = 7659 +#destination = smtp.postman.i2p +#destinationport = 25 +#keys = smtp-keys.dat + +#[POP3] +#type = client +#address = 127.0.0.1 +#port = 7660 +#destination = pop.postman.i2p +#destinationport = 110 +#keys = pop3-keys.dat + +#[MTN] +#type = client +#address = 127.0.0.1 +#port = 8998 +#destination = mtn.i2p-projekt.i2p +#destinationport = 4691 +#keys = mtn-keys.dat + +#yerel siste sunmak icin + +#[YERELSITE] +#type = http +#host = 127.0.0.1 +#port = 80 +#keys = site-keys.dat + +# see more examples in /usr/share/doc/i2pd/configuration.md.gz diff --git a/talimatname/genel/i/i3-status/talimat b/talimatname/genel/i/i3-status/talimat new file mode 100644 index 000000000..3b4c8e3e7 --- /dev/null +++ b/talimatname/genel/i/i3-status/talimat @@ -0,0 +1,19 @@ +# Tanım: I3bar, dzen2 veya xmobar ile kullanılacak durum çubuğu üretir +# URL: https://i3wm.org/i3status/ +# Paketçi: Cihan_Alkan +# Gerekler: wireless-tools confuse yajl pulseaudio libnl asciidoc +# Grup: i3 + + +isim=i3-status +surum=2.11 +devir=1 +kaynak=(https://i3wm.org/i3status/i3status-$surum.tar.bz2) + +derle() { + cd i3status-$surum + make + make DESTDIR="$PKG" install + install -Dm644 LICENSE ${PKG}/usr/share/licenses/i3status/LICENSE + make clean +} diff --git a/talimatname/genel/i/i3wm/talimat b/talimatname/genel/i/i3wm/talimat new file mode 100644 index 000000000..6f88be4f1 --- /dev/null +++ b/talimatname/genel/i/i3wm/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir döşeme pencere yöneticisi +# URL: https://i3wm.org/ +# Paketçi: Yaşar Çiv +# Gerekler: yajl xmlto libev startup-notification pango libxkbcommon xcb-util-cursor xcb-util-wm xcb-util-keysyms xorg-libx11 xcb-util-xrm i3-status +# Grup: i3 + + +isim=i3wm +surum=4.14.1 +devir=1 +kaynak=(https://i3wm.org/downloads/i3-$surum.tar.bz2) + +derle() { + cd i3-$surum +autoreconf -fi +mkdir build +cd build +../configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/ibus/talimat b/talimatname/genel/i/ibus/talimat new file mode 100644 index 000000000..35dc6c564 --- /dev/null +++ b/talimatname/genel/i/ibus/talimat @@ -0,0 +1,25 @@ +# Tanım: IBus is an Intelligent Input Bus +# URL: http://ibus.googlecode.com +# Paketçi: yasarciv67@gmail.com +# Gerekler: dconf iso-codes gobject-introspection gtk2 libnotify vala python python-gobject libxkbcommon dbus-python python-xdg + +isim=ibus +surum=1.5.15 +devir=1 + +kaynak=(https://github.com/ibus/ibus/releases/download/$surum/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum + +sed -i 's@/desktop/ibus@/org/freedesktop/ibus@g' \ + data/ibus.schemas.in \ + data/dconf/org.freedesktop.ibus.gschema.xml.in + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --enable-gtk-doc \ + --disable-emoji-dict +rm -f tools/main.c +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/icecat/fix-wifi-scanner.diff b/talimatname/genel/i/icecat/fix-wifi-scanner.diff new file mode 100644 index 000000000..f8fdd6c42 --- /dev/null +++ b/talimatname/genel/i/icecat/fix-wifi-scanner.diff @@ -0,0 +1,16 @@ + netwerk/wifi/nsWifiScannerDBus.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git c/netwerk/wifi/nsWifiScannerDBus.cpp i/netwerk/wifi/nsWifiScannerDBus.cpp +index 182553e18fa6e104..6fa0a0b023d3e45f 100644 +--- c/netwerk/wifi/nsWifiScannerDBus.cpp ++++ i/netwerk/wifi/nsWifiScannerDBus.cpp +@@ -62,7 +62,7 @@ nsWifiScannerDBus::SendMessage(const char* aInterface, + return NS_ERROR_FAILURE; + } + } else if (!strcmp(aFuncCall, "GetAll")) { +- const char* param = ""; ++ const char* param = "org.freedesktop.NetworkManager.AccessPoint"; + if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, ¶m)) { + return NS_ERROR_FAILURE; + } diff --git a/talimatname/genel/i/icecat/icecat-safe.desktop b/talimatname/genel/i/icecat/icecat-safe.desktop new file mode 100644 index 000000000..87acc970c --- /dev/null +++ b/talimatname/genel/i/icecat/icecat-safe.desktop @@ -0,0 +1,78 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=/usr/bin/icecat -safe-mode %u +Icon=icecat +Type=Application +Terminal=false +MultipleArgs=false +Name=GNU IceCat - Safe Mode +GenericName=Web Browser +GenericName[af]=Web Blaaier +GenericName[ar]=متصفح ويب +GenericName[az]=Veb Səyyahı +GenericName[bg]=Браузър +GenericName[bn]=ওয়েব ব্রাউজার +GenericName[br]=Furcher ar Gwiad +GenericName[bs]=WWW Preglednik +GenericName[ca]=Fullejador web +GenericName[cs]=WWW prohlížeč +GenericName[cy]=Porydd Gwe +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=Περιηγητής Ιστού +GenericName[eo]=TTT-legilo +GenericName[es]=Navegador web +GenericName[et]=Veebilehitseja +GenericName[eu]=Web arakatzailea +GenericName[fa]=مرورگر وب +GenericName[fi]=WWW-selain +GenericName[fo]=Alnótsfar +GenericName[fr]=Navigateur web +GenericName[gl]=Navegador Web +GenericName[he]=דפדפן אינטרנט +GenericName[hi]=वेब ब्राउज़र +GenericName[hr]=Web preglednik +GenericName[hu]=Webböngésző +GenericName[is]=Vafri +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[ko]=웹 브라우저 +GenericName[lo]=ເວັບບຣາວເຊີ +GenericName[lt]=Žiniatinklio naršyklė +GenericName[lv]=Web Pārlūks +GenericName[mk]=Прелистувач на Интернет +GenericName[mn]=Веб-Хөтөч +GenericName[nb]=Nettleser +GenericName[nds]=Nettkieker +GenericName[nl]=Webbrowser +GenericName[nn]=Nettlesar +GenericName[nso]=Seinyakisi sa Web +GenericName[pa]=ਵੈਬ ਝਲਕਾਰਾ +GenericName[pl]=Przeglądarka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador Web +GenericName[ro]=Navigator de web +GenericName[ru]=Веб-браузер +GenericName[se]=Fierpmádatlogan +GenericName[sk]=Webový prehliadač +GenericName[sl]=Spletni brskalnik +GenericName[sr]=Веб претраживач +GenericName[sr@Latn]=Veb pretraživač +GenericName[ss]=Ibrawuza yeWeb +GenericName[sv]=Webbläsare +GenericName[ta]=வலை உலாவி +GenericName[tg]=Тафсиргари вэб +GenericName[th]=เว็บบราวเซอร์ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Навігатор Тенет +GenericName[uz]=Веб-браузер +GenericName[ven]=Buronza ya Webu +GenericName[vi]=Trình duyệt Web +GenericName[wa]=Betchteu waibe +GenericName[xh]=Umkhangeli zincwadi we Web +GenericName[zh_CN]=网页浏览器 +GenericName[zh_TW]=網頁瀏覽器 +GenericName[zu]=Umcingi we-Web +MimeType=text/html +StartupNotify=false +Categories=Application;Network; diff --git a/talimatname/genel/i/icecat/icecat.desktop b/talimatname/genel/i/icecat/icecat.desktop new file mode 100644 index 000000000..8a7cad93d --- /dev/null +++ b/talimatname/genel/i/icecat/icecat.desktop @@ -0,0 +1,78 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=/usr/bin/icecat %u +Icon=icecat +Type=Application +Terminal=false +MultipleArgs=false +Name=GNU IceCat +GenericName=Web Browser +GenericName[af]=Web Blaaier +GenericName[ar]=متصفح ويب +GenericName[az]=Veb Səyyahı +GenericName[bg]=Браузър +GenericName[bn]=ওয়েব ব্রাউজার +GenericName[br]=Furcher ar Gwiad +GenericName[bs]=WWW Preglednik +GenericName[ca]=Fullejador web +GenericName[cs]=WWW prohlížeč +GenericName[cy]=Porydd Gwe +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=Περιηγητής Ιστού +GenericName[eo]=TTT-legilo +GenericName[es]=Navegador web +GenericName[et]=Veebilehitseja +GenericName[eu]=Web arakatzailea +GenericName[fa]=مرورگر وب +GenericName[fi]=WWW-selain +GenericName[fo]=Alnótsfar +GenericName[fr]=Navigateur web +GenericName[gl]=Navegador Web +GenericName[he]=דפדפן אינטרנט +GenericName[hi]=वेब ब्राउज़र +GenericName[hr]=Web preglednik +GenericName[hu]=Webböngésző +GenericName[is]=Vafri +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[ko]=웹 브라우저 +GenericName[lo]=ເວັບບຣາວເຊີ +GenericName[lt]=Žiniatinklio naršyklė +GenericName[lv]=Web Pārlūks +GenericName[mk]=Прелистувач на Интернет +GenericName[mn]=Веб-Хөтөч +GenericName[nb]=Nettleser +GenericName[nds]=Nettkieker +GenericName[nl]=Webbrowser +GenericName[nn]=Nettlesar +GenericName[nso]=Seinyakisi sa Web +GenericName[pa]=ਵੈਬ ਝਲਕਾਰਾ +GenericName[pl]=Przeglądarka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador Web +GenericName[ro]=Navigator de web +GenericName[ru]=Веб-браузер +GenericName[se]=Fierpmádatlogan +GenericName[sk]=Webový prehliadač +GenericName[sl]=Spletni brskalnik +GenericName[sr]=Веб претраживач +GenericName[sr@Latn]=Veb pretraživač +GenericName[ss]=Ibrawuza yeWeb +GenericName[sv]=Webbläsare +GenericName[ta]=வலை உலாவி +GenericName[tg]=Тафсиргари вэб +GenericName[th]=เว็บบราวเซอร์ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Навігатор Тенет +GenericName[uz]=Веб-браузер +GenericName[ven]=Buronza ya Webu +GenericName[vi]=Trình duyệt Web +GenericName[wa]=Betchteu waibe +GenericName[xh]=Umkhangeli zincwadi we Web +GenericName[zh_CN]=网页浏览器 +GenericName[zh_TW]=網頁瀏覽器 +GenericName[zu]=Umcingi we-Web +MimeType=text/html +StartupNotify=false +Categories=Application;Network; diff --git a/talimatname/genel/i/icecat/mozconfig b/talimatname/genel/i/icecat/mozconfig new file mode 100644 index 000000000..b7dc4528c --- /dev/null +++ b/talimatname/genel/i/icecat/mozconfig @@ -0,0 +1,37 @@ +. $topsrcdir/browser/config/mozconfig + +ac_add_options --prefix=/usr +ac_add_options --libdir=/usr/lib +ac_add_options --enable-gold +ac_add_options --enable-pie +ac_add_options --enable-optimize="-O2" +ac_add_options --enable-official-branding +ac_add_options --with-distribution-id=org.gnu + +# System libraries +ac_add_options --with-system-nspr +ac_add_options --with-system-nss +ac_add_options --with-system-jpeg +ac_add_options --with-system-zlib +ac_add_options --with-system-bz2 +ac_add_options --with-system-libvpx +ac_add_options --enable-system-hunspell +ac_add_options --enable-system-sqlite +ac_add_options --enable-system-ffi +ac_add_options --enable-system-pixman + +# Features +ac_add_options --enable-startup-notification +ac_add_options --enable-alsa +ac_add_options --disable-updater +ac_add_options --disable-crashreporter +ac_add_options --disable-debug-symbols +ac_add_options --disable-tests +ac_add_options --disable-eme + +ac_add_options --with-app-baseisim=icecat +ac_add_options --with-app-isim=icecat + +STRIP_FLAGS="--strip-debug" + +# vim:set ft=sh: diff --git a/talimatname/genel/i/icecat/mozilla-1228540-1.patch b/talimatname/genel/i/icecat/mozilla-1228540-1.patch new file mode 100644 index 000000000..be6ffc316 --- /dev/null +++ b/talimatname/genel/i/icecat/mozilla-1228540-1.patch @@ -0,0 +1,84 @@ +# HG changeset patch +# User Jonathan Kew +# Date 1452675061 0 +# Wed Jan 13 08:51:01 2016 +0000 +# Node ID cf699e95e98829b465b64a7e0281d95ec851ce8c +# Parent 3c9f357598e86c2f593e9895d5725bf3498f8f5a +Bug 1228540 - pt 2 - Remove our HBGetGlyphHOrigin callback, as the default behavior is sufficient. + +diff --git a/gfx/thebes/gfxHarfBuzzShaper.cpp b/gfx/thebes/gfxHarfBuzzShaper.cpp +--- a/gfx/thebes/gfxHarfBuzzShaper.cpp ++++ b/gfx/thebes/gfxHarfBuzzShaper.cpp +@@ -349,27 +349,16 @@ gfxHarfBuzzShaper::HBGetGlyphVAdvance(hb + static_cast(font_data); + // Currently, we don't offer gfxFont subclasses a method to override this + // and provide hinted platform-specific vertical advances (analogous to the + // GetGlyphWidth method for horizontal advances). If that proves necessary, + // we'll add a new gfxFont method and call it from here. + return fcd->mShaper->GetGlyphVAdvance(glyph); + } + +-/* static */ +-hb_bool_t +-gfxHarfBuzzShaper::HBGetGlyphHOrigin(hb_font_t *font, void *font_data, +- hb_codepoint_t glyph, +- hb_position_t *x, hb_position_t *y, +- void *user_data) +-{ +- // We work in horizontal coordinates, so no origin adjustment needed here. +- return true; +-} +- + struct VORG { + AutoSwap_PRUint16 majorVersion; + AutoSwap_PRUint16 minorVersion; + AutoSwap_PRInt16 defaultVertOriginY; + AutoSwap_PRUint16 numVertOriginYMetrics; + }; + + struct VORGrec { +@@ -1262,19 +1251,16 @@ gfxHarfBuzzShaper::Initialize() + hb_font_funcs_set_glyph_func(sHBFontFuncs, HBGetGlyph, + nullptr, nullptr); + hb_font_funcs_set_glyph_h_advance_func(sHBFontFuncs, + HBGetGlyphHAdvance, + nullptr, nullptr); + hb_font_funcs_set_glyph_v_advance_func(sHBFontFuncs, + HBGetGlyphVAdvance, + nullptr, nullptr); +- hb_font_funcs_set_glyph_h_origin_func(sHBFontFuncs, +- HBGetGlyphHOrigin, +- nullptr, nullptr); + hb_font_funcs_set_glyph_v_origin_func(sHBFontFuncs, + HBGetGlyphVOrigin, + nullptr, nullptr); + hb_font_funcs_set_glyph_extents_func(sHBFontFuncs, + HBGetGlyphExtents, + nullptr, nullptr); + hb_font_funcs_set_glyph_contour_point_func(sHBFontFuncs, + HBGetContourPoint, +diff --git a/gfx/thebes/gfxHarfBuzzShaper.h b/gfx/thebes/gfxHarfBuzzShaper.h +--- a/gfx/thebes/gfxHarfBuzzShaper.h ++++ b/gfx/thebes/gfxHarfBuzzShaper.h +@@ -56,21 +56,16 @@ public: + hb_codepoint_t glyph, void *user_data); + + // get harfbuzz vertical advance in 16.16 fixed point format. + static hb_position_t + HBGetGlyphVAdvance(hb_font_t *font, void *font_data, + hb_codepoint_t glyph, void *user_data); + + static hb_bool_t +- HBGetGlyphHOrigin(hb_font_t *font, void *font_data, +- hb_codepoint_t glyph, +- hb_position_t *x, hb_position_t *y, +- void *user_data); +- static hb_bool_t + HBGetGlyphVOrigin(hb_font_t *font, void *font_data, + hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y, + void *user_data); + + hb_position_t GetHKerning(uint16_t aFirstGlyph, + uint16_t aSecondGlyph) const; + diff --git a/talimatname/genel/i/icecat/no-crmf.diff b/talimatname/genel/i/icecat/no-crmf.diff new file mode 100644 index 000000000..f30d17cc3 --- /dev/null +++ b/talimatname/genel/i/icecat/no-crmf.diff @@ -0,0 +1,27 @@ +diff --git i/old-configure.in w/old-configure.in +index 0a06e470d2085922..d41c8e9d5dd2dbfb 100644 +--- i/old-configure.in ++++ w/old-configure.in +@@ -2020,9 +2020,7 @@ if test -n "$_USE_SYSTEM_NSS"; then + AM_PATH_NSS(3.31, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) + fi + +-if test -n "$MOZ_SYSTEM_NSS"; then +- NSS_LIBS="$NSS_LIBS -lcrmf" +-else ++if test -z "$MOZ_SYSTEM_NSS"; then + NSS_CFLAGS="-I${DIST}/include/nss" + case "${OS_ARCH}" in + # Only few platforms have been tested with GYP +diff --git a/config/external/nss/crmf/moz.build b/config/external/nss/crmf/moz.build +index 9b8005f..4bfcc81 100644 +--- a/config/external/nss/crmf/moz.build ++++ b/config/external/nss/crmf/moz.build +@@ -8,7 +8,6 @@ Library('crmf') + + if CONFIG['MOZ_NATIVE_NSS']: + OS_LIBS += [l for l in CONFIG['NSS_LIBS'] if l.startswith('-L')] +- OS_LIBS += ['-lcrmf'] + else: + USE_LIBS += [ + # The dependency on nss is not real, but is required to force the diff --git a/talimatname/genel/i/icecat/talimat b/talimatname/genel/i/icecat/talimat new file mode 100644 index 000000000..74604322e --- /dev/null +++ b/talimatname/genel/i/icecat/talimat @@ -0,0 +1,58 @@ +# Tanım: Firefox Web Tarayıcısının GNU çatallaması +# URL: http://www.gnu.org/software/gnuzilla/ +# Paketçi: milisarge +# Gerekler: unzip zip python yasm xorg-mesa xorg-imake gconf autoconf2 pulseaudio dejavu-ttf gstreamer-plugins-base cargo gtk3 gtk2 xorg-libxt startup-notification dbus-glib alsa-lib ffmpeg libvpx icu libevent nss hunspell sqlite freefont-ttf + +isim=icecat +surum=52.1.0 +devir=1 +kaynak=(http://ftpmirror.gnu.org/gnuzilla/52.1.0/icecat-$surum-gnu1.tar.bz2 + mozconfig + icecat.desktop + icecat-safe.desktop + vendor.js + fix-wifi-scanner.diff + no-crmf.diff) + +derle() { + + cd "${SRC}/${isim}-${surum}" + sed -e 's;$(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION);$(libdir)/$(MOZ_APP_NAME);g' -i config/baseconfig.mk + sed -e 's;$(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_VERSION);$(libdir)/$(MOZ_APP_NAME)-devel;g' -i config/baseconfig.mk + + patch -Np1 -i ../fix-wifi-scanner.diff + patch -Np1 -i ../no-crmf.diff + + cp -v ${SRC}/mozconfig .mozconfig + + mkdir -p "$SRC/path" + + ln -s /usr/bin/python2 "$SRC/path/python" + + cd "${SRC}/${isim}-${surum}" + + ICECATDIR="/usr/lib/${isim}" && export ICECATDIR + + CPPFLAGS+=" -O2" + LDFLAGS+=" -Wl,-z,now" + + export PATH="$SRC/path:$PATH" + +SHELL=/bin/sh make -f client.mk build +SHELL=/bin/sh make -f client.mk DESTDIR="${PKG}" install + + install -m755 -d ${PKG}/usr/share/applications + install -m755 -d ${PKG}/usr/share/pixmaps + + for i in 16 32 48; do + install -Dm644 ${SRC}/${isim}-${surum}/browser/branding/official/default${i}.png \ + "$PKG/usr/share/icons/hicolor/${i}x${i}/apps/icecat.png" + done + + install -Dm644 ${SRC}/${isim}-${surum}/browser/branding/official/default48.png ${PKG}/usr/share/pixmaps/icecat.png + install -Dm644 ${SRC}/icecat.desktop ${PKG}/usr/share/applications/ + install -Dm644 ${SRC}/icecat-safe.desktop ${PKG}/usr/share/applications/ + install -Dm644 "${SRC}"/vendor.js "${PKG}${ICECATDIR}/browser/defaults/preferences/vendor.js" + rm -rv "$PKG"/usr/{include,lib/icecat-devel,share/idl} + +} diff --git a/talimatname/genel/i/icecat/vendor.js b/talimatname/genel/i/icecat/vendor.js new file mode 100644 index 000000000..d8d606bc1 --- /dev/null +++ b/talimatname/genel/i/icecat/vendor.js @@ -0,0 +1,9 @@ +// Use LANG environment variable to choose locale +pref("intl.locale.matchOS", true); + +// Disable default browser checking. +pref("browser.shell.checkDefaultBrowser", false); + +// Don't disable our bundled extensions in the application directory +pref("extensions.autoDisableScopes", 11); +pref("extensions.shownSelectionUI", true); diff --git a/talimatname/genel/i/icedtea-web/talimat b/talimatname/genel/i/icedtea-web/talimat new file mode 100644 index 000000000..76a3d6cc2 --- /dev/null +++ b/talimatname/genel/i/icedtea-web/talimat @@ -0,0 +1,90 @@ +# Tanım: java web uygulamaları için tarayıcı eklentisi +# URL: http://icedtea.classpath.org/wiki/IcedTea-Web +# Paketçi: milisarge +# Gerekler: firefox npapi-sdk junit openjdk rhino xorg-libxtst zip + +isim=icedtea-web +surum=1.6.2 +devir=1 +kaynak=(http://icedtea.wildebeest.org/download/source/$isim-$surum.tar.gz) + +unpack_source() { + local FILE LOCAL_FILENAME COMMAND + + for FILE in ${source[@]}; do + LOCAL_FILENAME=`get_filename $FILE` + case $LOCAL_FILENAME in + *.tar|*.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tar.xz|*.txz|*.tar.lzma|*.tar.lz|*.zip|*.rpm) + COMMAND="tar -p --no-same-owner -C $SRC -xf $LOCAL_FILENAME" ;; + *) + COMMAND="cp $LOCAL_FILENAME $SRC" ;; + esac + + echo "$COMMAND" + + $COMMAND + + if [ $? != 0 ]; then + if [ "$PKGMK_KEEP_WORK" = "no" ]; then + rm -rf $PKGMK_WORK_DIR + fi + error "Building '$TARGET' failed." + exit $E_UNPACK + fi + done + + export LC_ALL="$SAVED_LC_ALL" +} + +derle() { + + cd "${SRC}"/${isim}-${surum} + LC_ALL=C \ + CFLAGS="$CFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + CXXFLAGS="$CXXFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + JAVA_HOME=/opt/OpenJDK-8u60-bin \ + PATH=$JAVA_HOME/bin:$PATH \ + CONFIG_SHELL=/bin/bash \ + ./configure \ + --prefix=/usr \ + --datarootdir=/usr/share \ + --libdir=/usr/lib/$isim \ + --libexecdir=/usr/lib/$isim \ + --with-jdk-home=/opt/OpenJDK-8u60-bin \ + --with-rhino=/usr/share/java/rhino.jar \ + --with-firefox=/usr/bin/firefox \ + --with-versionsion=MILIS \ + --disable-docs + + LANG=tr_TR.UTF-8 \ + LC_ALL=C \ + CFLAGS="$CFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + CXXFLAGS="$CXXFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + JAVA_HOME=/opt/OpenJDK-8u60-bin \ + PATH=$JAVA_HOME/bin:$PATH \ + CONFIG_SHELL=/bin/bash \ + make + + make DESTDIR=$PKG install-exec-local install-data-local + + cd "${SRC}"/${isim}-${surum} + + rm -rf $PKG/usr/share/man/* + rm -rf $PKG/usr/share/doc + + install -m 755 -d "${PKG}"/usr/share/{applications,pixmaps} + install -m 644 javaws.png "${PKG}"/usr/share/pixmaps + mv javaws.desktop.in javaws.desktop + mv itweb-settings.desktop.in itweb-settings.desktop + install -m 644 {javaws,itweb-settings}.desktop "${PKG}"/usr/share/applications + install -m 755 -d "${PKG}"/usr/bin + install -m 755 -d "${PKG}"/usr/share/${isim}/bin + pushd "${PKG}"/usr/share/${isim}/bin + for file in *; do + ln -sf /usr/share/${isim}/bin/${file} "${PKG}"/usr/bin/ + done + popd + install -d -m 755 $PKG/usr/lib/mozilla/plugins + ln -s ../../$isim/IcedTeaPlugin.so $PKG/usr/lib/mozilla/plugins/ + +} diff --git a/talimatname/genel/i/icewm/icewm.post.install b/talimatname/genel/i/icewm/icewm.post.install new file mode 100644 index 000000000..5a747a384 --- /dev/null +++ b/talimatname/genel/i/icewm/icewm.post.install @@ -0,0 +1,40 @@ +mkdir -v ~/.icewm +cp -v /usr/share/icewm/keys ~/.icewm/keys +cp -v /usr/share/icewm/menu ~/.icewm/menu +cp -v /usr/share/icewm/preferences ~/.icewm/preferences +cp -v /usr/share/icewm/toolbar ~/.icewm/toolbar +cp -v /usr/share/icewm/winoptions ~/.icewm/winoptions + +cat > ~/.icewm/menu << "EOF" && +prog Urxvt xterm urxvt +prog GVolWheel /usr/share/pixmaps/gvolwheel/audio-volume-medium gvolwheel +separator +menufile General folder general +menufile Multimedia folder multimedia +menufile Tool_bar folder toolbar +EOF +cat > ~/.icewm/general << "EOF" && +prog Firefox firefox firefox +prog Epiphany /usr/share/icons/gnome/16x16/apps/web-browser epiphany +prog Midori /usr/share/icons/hicolor/24x24/apps/midori midori +separator +prog Gimp /usr/share/icons/hicolor/16x16/apps/gimp gimp +separator +prog Evince /usr/share/icons/hicolor/16x16/apps/evince evince +prog Epdfview /usr/share/epdfview/pixmaps/icon_epdfview-48 epdfview +EOF +cat > ~/.icewm/multimedia << "EOF" +prog Audacious /usr/share/icons/hicolor/48x48/apps/audacious audacious +separator +prog Parole /usr/share/icons/hicolor/16x16/apps/parole parole +prog Totem /usr/share/icons/hicolor/16x16/apps/totem totem +prog Vlc /usr/share/icons/hicolor/16x16/apps/vlc vlc +prog Xine /usr/share/pixmaps/xine xine +EOF + +cat > ~/.icewm/startup << "EOF" +rox -p Default & +EOF && +chmod +x ~/.icewm/startup + + diff --git a/talimatname/genel/i/icewm/talimat b/talimatname/genel/i/icewm/talimat new file mode 100644 index 000000000..239b9d242 --- /dev/null +++ b/talimatname/genel/i/icewm/talimat @@ -0,0 +1,25 @@ +# Tanım: IceWM, hedefi hız ve hafiflik olan bir pencere yöneticisi +# URL: http://www.icewm.org/ +# Paketçi: milisarge +# Gerekler: xorg gdk-pixbuf + +isim=icewm +surum=1.3.8 +devir=1 +kaynak=(http://downloads.sourceforge.net/icewm/$isim-$surum.tar.gz) + +derle() { + +cd $isim-$surum + +sed -i '/^LIBS/s/\(.*\)/\1 -lfontconfig/' src/Makefile.in && +./configure --prefix=/usr + +make + +make DESTDIR=$PKG install +make DESTDIR=$PKG install-docs +make DESTDIR=$PKG install-man +make DESTDIR=$PKG install-desktop + +} diff --git a/talimatname/genel/i/icon-naming-utils/talimat b/talimatname/genel/i/icon-naming-utils/talimat new file mode 100644 index 000000000..0431467c2 --- /dev/null +++ b/talimatname/genel/i/icon-naming-utils/talimat @@ -0,0 +1,19 @@ +# Tanım: Tango simgelerinin yeni adlarını GNOME ve KDE masaüstleri tarafından kullanılan eski adlarla eşleştirir +# URL: http://tango.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: perl-xml-simple + +isim=icon-naming-utils +surum=0.8.90 +devir=1 +kaynak=(http://tango.freedesktop.org/releases/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/icon-naming-utils \ + --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/icu/talimat b/talimatname/genel/i/icu/talimat new file mode 100644 index 000000000..06ab55dee --- /dev/null +++ b/talimatname/genel/i/icu/talimat @@ -0,0 +1,23 @@ +# Tanım: Unicode Uluslararası Bileşenleri, olgun ve yaygın olarak kullanılan C / C ++ kitaplıkları kümesidir +# URL: http://www.icu-project.org/ +# Paketçi: milisarge +# Gerekler: + +isim=icu +surum=59.1 +devir=1 +kaynak=(http://download.icu-project.org/files/icu4c/$surum/icu4c-${version//./_}-src.tgz) + +derle() { + cd icu/source + + sed -i 's/xlocale/locale/' i18n/digitlst.cpp + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --mandir=/usr/share/man \ + --sbindir=/usr/bin + make + make -k check + make -j1 DESTDIR=$PKG install + install -Dm644 ${SRC}/icu/LICENSE ${PKG}/usr/share/licenses/icu/LICENSE +} diff --git a/talimatname/genel/i/id3lib/talimat b/talimatname/genel/i/id3lib/talimat new file mode 100644 index 000000000..dc8b155d1 --- /dev/null +++ b/talimatname/genel/i/id3lib/talimat @@ -0,0 +1,23 @@ +# Tanım: ID3v1 and ID3v2 taglarını okuma yazma ve düzenleme için kütüphane +# URL: http://id3lib.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=id3lib +surum=3.8.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim-$surum.tar.gz + http://downloads.nutyx.org/files/patchs/$isim/patch_id3lib_3.8.3_UTF16_writing_bug.diff + http://downloads.nutyx.org/files/patchs/$isim/id3lib-3.8.3-CVE-2007-4460.patch + http://downloads.nutyx.org/files/patchs/$isim/id3lib-3.8.3-gcc-4.3.patch) + +derle() { +cd $isim-$surum +patch -p1 -i ../patch_id3lib_3.8.3_UTF16_writing_bug.diff +patch -p0 -i ../id3lib-3.8.3-CVE-2007-4460.patch +patch -p1 -i ../id3lib-3.8.3-gcc-4.3.patch +./configure --prefix=/usr +sed -i -e 's/^LIBS =/LIBS = -lz -lstdc++/' src/Makefile +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/ido/talimat b/talimatname/genel/i/ido/talimat new file mode 100644 index 000000000..5ab232c86 --- /dev/null +++ b/talimatname/genel/i/ido/talimat @@ -0,0 +1,24 @@ +# Tanım: Göstergeler için kullanılan pencere öğeleri ve diğer nesneler +# URL: https://launchpad.net/ido +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk3 + +isim=ido +surum=12.10.2 +devir=1 +kaynak=(https://launchpad.net/$isim/${surum%.*}/$surum/+download/$isim-$surum.tar.gz +) + +derle() { + cd $isim-${surum} + + export CFLAGS="$CFLAGS -Wno-deprecated-declarations" + + ./configure \ + --prefix='/usr' \ + --localstatedir='/var' \ + --sysconfdir='/etc' + make -j1 + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/i/iftop/talimat b/talimatname/genel/i/iftop/talimat new file mode 100644 index 000000000..872eb2959 --- /dev/null +++ b/talimatname/genel/i/iftop/talimat @@ -0,0 +1,16 @@ +# Tanım: Bir ağ arayüzünde gerçek zamanlı bant genişliği kullanımı bilgisi +# URL: http://www.ex-parrot.com/~pdw/iftop/ +# Paketçi: milisarge +# Gerekler: libpcap, ncurses + +isim=iftop +surum=1.0pre4 +devir=1 +kaynak=(http://www.ex-parrot.com/~pdw/iftop/download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --mandir=/usr/man + make iftop + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/ijs/talimat b/talimatname/genel/i/ijs/talimat new file mode 100644 index 000000000..08a9ff40e --- /dev/null +++ b/talimatname/genel/i/ijs/talimat @@ -0,0 +1,18 @@ +# Tanım: Raster sayfa görüntülerinin iletimi için bir protokol uygulayan bir kütüphane. +# URL: http://www.linuxfoundation.org/collaborate/workgroups/openprinting +# Paketçi: milisarge +# Gerekler: + +isim=ijs +surum=0.35 +devir=1 +kaynak=(http://www.openprinting.org/download/$isim/download/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--enable-shared --disable-static \ +--infodir=/usr/share/info --mandir=/usr/share/man +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/ilmbase/talimat b/talimatname/genel/i/ilmbase/talimat new file mode 100644 index 000000000..773de781d --- /dev/null +++ b/talimatname/genel/i/ilmbase/talimat @@ -0,0 +1,20 @@ +# Tanım: OpenEXR için ILM'den temel kütüphaneler +# URL: http://openexr.com/ +# Paketçi: milisarge +# Gerekler: + +isim=ilmbase +surum=2.2.0 +devir=1 +kaynak=( http://download.savannah.nongnu.org/releases/openexr/$isim-$surum.tar.gz) + +derle() { +# build package +cd $isim-$surum +./configure --prefix=/usr \ +--disable-build-docs \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/imagemagick/talimat b/talimatname/genel/i/imagemagick/talimat new file mode 100644 index 000000000..31c7c4909 --- /dev/null +++ b/talimatname/genel/i/imagemagick/talimat @@ -0,0 +1,42 @@ +# Tanım: İmaj dosyaları için görüntüleme/düzenleme programı +# URL: URL: http://www.imagemagick.org/ +# Paketçi: milisarge +# Gerekler: freetype ghostscript lcms libgsf giflib libxml2 openexr libwmf libpng librsvg libwebp djvulibre + +isim=imagemagick +surum=6.9.3-6 +devir=1 +_surum=6.9.3-6 +kaynak=(https://launchpad.net/imagemagick/main/6.9.3-6/+download/ImageMagick-$surum.tar.gz) + +derle() { + cd ImageMagick-* + + [ "`uname -m`" == "i686" ] && EXTRAOPTS="--with-gcc-arch=i686" + [ "`uname -m`" == "x86_64" ] && EXTRAOPTS="--with-gcc-arch=x86-64" + + sed '/AC_PATH_XTRA/d' -i configure.ac + + ./configure --prefix=/usr \ + --enable-static=no \ + --enable-shared \ + --with-webp \ + --with-gslib \ + --with-perl \ + --with-perl-options="INSTALLDIRS=vendor" \ + --with-x \ + --with-frozenpaths=no \ + --with-modules \ + --disable-openmp \ + --enable-hdri \ + --with-wmf \ + --with-gs-font-dir=/usr/share/fonts/Type1 \ + --with-lqr \ + --with-rsvg \ + --enable-opencl \ + --with-openjp2 \ + $EXTRAOPTS + make + make DESTDIR=$PKG install + find $PKG -name perllocal.pod -exec rm {} \; +} diff --git a/talimatname/genel/i/imlib2/talimat b/talimatname/genel/i/imlib2/talimat new file mode 100644 index 000000000..58d50f167 --- /dev/null +++ b/talimatname/genel/i/imlib2/talimat @@ -0,0 +1,21 @@ +# Tanım: Imlib2 hızlı dosya yükleme, kaydetme, işleme ve değiştirme için bir grafik kitaplığıdır +# URL: http://sourceforge.net/projects/enlightenment +# Paketçi: milisarge +# Gerekler: aalib giflib xorg-libxext libtiff freetype xorg-libsm libpng libjpeg-turbo libid3tag +# Grup: kütüphane + +isim=imlib2 +surum=1.4.10 +devir=1 +kaynak=(http://downloads.sourceforge.net/enlightenment/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's/@my_libs@//' imlib2-config.in + EXTRAOPTS="--enable-amd64" + ./configure --prefix=/usr \ + --sysconfdir=/etc/imlib2 \ + --x-libraries=/usr/lib $EXTRAOPTS + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/impacket/talimat b/talimatname/genel/i/impacket/talimat new file mode 100644 index 000000000..99987a9a4 --- /dev/null +++ b/talimatname/genel/i/impacket/talimat @@ -0,0 +1,19 @@ +# Tanım: Ağ protokolleriyle çalışmak için sınıfların toplanması +# URL: Ağ protokolleriyle çalışmak için sınıfların toplanması +# Paketçi: Cihan_Alkan +# Gerekler: python-crypto python-pyasn1 python-pcapy python-openssl +# Grup: ağ + +isim=impacket +surum=0.9.15 +devir=1 +kaynak=(https://github.com/CoreSecurity/impacket/releases/download/impacket_0_9_15/impacket-0.9.15.tar.gz) + +derle() { + cd impacket-0.9.15 + find . -type f -exec sed -r 's|(#!/usr/bin/(env )?python)$|\12|' -i '{}' \; + python setup.py install -O1 --root="${PKG}" + install -Dm 644 ChangeLog -t "${PKG}/usr/share/doc/${isim}" + local PYTHONVERSION="$(python -c 'import sys; print("{}.{}".format(sys.version_info.major, sys.version_info.minor))')" + ln -s "/usr/lib/python${PYTHONVERSION}/site-packages/impacket/examples" "${PKG}/usr/share/doc/${isim}/examples" +} diff --git a/talimatname/genel/i/incidenceeditor/talimat b/talimatname/genel/i/incidenceeditor/talimat new file mode 100644 index 000000000..a2708af83 --- /dev/null +++ b/talimatname/genel/i/incidenceeditor/talimat @@ -0,0 +1,20 @@ +# Tanım: KDE PIM insidensiyon editörü +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools boost eventviews + +isim=incidenceeditor +surum=16.08.2 +devir=1 +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/indicator-sound/indicator-sound.kur-kos b/talimatname/genel/i/indicator-sound/indicator-sound.kur-kos new file mode 100644 index 000000000..1d319936d --- /dev/null +++ b/talimatname/genel/i/indicator-sound/indicator-sound.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/talimatname/genel/i/indicator-sound/talimat b/talimatname/genel/i/indicator-sound/talimat new file mode 100644 index 000000000..351e25a3c --- /dev/null +++ b/talimatname/genel/i/indicator-sound/talimat @@ -0,0 +1,29 @@ +# Tanım: Birleştirilmiş ses menü göstergesi. +# URL: https://launchpad.net/indicator-sound +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool vala ido libdbusmenu-gtk3 libgee06 libindicator libindicator-gtk2 pulseaudio libnotify + +isim=indicator-sound +surum=12.10.1 +devir=1 +kaynak=(https://launchpad.net/indicator-sound/12.10/$surum/+download/$isim-$surum.tar.gz + http://pkgbuild.com/~bgyorgy/sources/indicator-sound-translations-20130310.tar.gz) + +derle() { + cd ${isim}-${surum} +# Install updated language files + rename ${isim}- '' ../po/${isim}-*.po + mv -f -t po ../po/* + printf "%s\n" po/*.po | sed -e 's/po\///g' -e 's/\.po//g' >po/LINGUAS + export CFLAGS="$CFLAGS -Wno-deprecated-declarations" + ./configure --prefix='/usr' --sysconfdir='/etc' --localstatedir='/var' --libexecdir="/usr/lib/${isim}" --disable-{schemas-compile,static} + make + make DESTDIR="${PKG}" install +# Fix icon names to provide the playlist icon + install -dm 755 "${PKG}"/usr/share/libindicator/icons/hicolor/{16x16,scalable}/mimetypes + mv "${PKG}"/usr/share/libindicator/icons/hicolor/16x16/{status/sound-icon.png,mimetypes/playlist.png} + mv "${PKG}"/usr/share/libindicator/icons/hicolor/scalable/{status/sound-icon.svg,mimetypes/playlist.svg} + rm -r "${PKG}"/usr/share/libindicator/icons/hicolor/{16x16,scalable}/status +# vim: ts=2 sw=2 et: + +} diff --git a/talimatname/genel/i/initd-tools/initd-tools-0.1.3-0.1.3.tar.gz.partial b/talimatname/genel/i/initd-tools/initd-tools-0.1.3-0.1.3.tar.gz.partial new file mode 100644 index 000000000..e69de29bb diff --git a/talimatname/genel/i/initd-tools/talimat b/talimatname/genel/i/initd-tools/talimat new file mode 100644 index 000000000..46c773284 --- /dev/null +++ b/talimatname/genel/i/initd-tools/talimat @@ -0,0 +1,23 @@ +# Tanım: Init-tools paketi, LSB tabanlı önyükleme komut dosyalarını yükleyip kaldırmak için kullanılan programları içerir. +# URL: http://people.freedesktop.org/~dbn/initd-tools/releases/initd-tools-0.1.3.tar.gz +# Paketçi: milisarge +# Gerekler: + + +isim=initd-tools +surum=0.1.3 +devir=1 +kaynak=(http://people.freedesktop.org/~dbn/initd-tools/releases/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/ --mandir=/usr/share/man + + make + + make DESTDIR=$PKG install + + +} diff --git a/talimatname/genel/i/inkscape/inkscape-0.91-testfiles-1.patch b/talimatname/genel/i/inkscape/inkscape-0.91-testfiles-1.patch new file mode 100644 index 000000000..f3d297c29 --- /dev/null +++ b/talimatname/genel/i/inkscape/inkscape-0.91-testfiles-1.patch @@ -0,0 +1,257 @@ +Submitted By: Ken Moffat +Date: 2015-02-07 +Initial Package Version: 0.91 +Upstream Status: Applied +Origin: Upstream +Tanım: The tarball for 0.91 is missing the svg files used for the +extensions tests. Taken from +https://bazaar.launchpad.net/~inkscape.dev/inkscape/RELEASE_0_91_BRANCH/files/head:/share/extensions +/test/svg/ + +diff -Naur inkscape-0.91/share/extensions/test/svg/default-inkscape-SVG.svg inkscape-0.91-testfiles/share/extensions/test/svg/default-inkscape-SVG.svg +--- inkscape-0.91/share/extensions/test/svg/default-inkscape-SVG.svg 1970-01-01 01:00:00.000000000 +0100 ++++ inkscape-0.91-testfiles/share/extensions/test/svg/default-inkscape-SVG.svg 2015-02-07 13:59:29.083967647 +0000 +@@ -0,0 +1,37 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ image/svg+xml ++ ++ ++ ++ ++ ++ +diff -Naur inkscape-0.91/share/extensions/test/svg/default-plain-SVG.svg inkscape-0.91-testfiles/share/extensions/test/svg/default-plain-SVG.svg +--- inkscape-0.91/share/extensions/test/svg/default-plain-SVG.svg 1970-01-01 01:00:00.000000000 +0100 ++++ inkscape-0.91-testfiles/share/extensions/test/svg/default-plain-SVG.svg 2015-02-07 13:59:29.087967572 +0000 +@@ -0,0 +1,29 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ image/svg+xml ++ ++ ++ ++ ++ ++ ++ +diff -Naur inkscape-0.91/share/extensions/test/svg/empty-SVG.svg inkscape-0.91-testfiles/share/extensions/test/svg/empty-SVG.svg +--- inkscape-0.91/share/extensions/test/svg/empty-SVG.svg 1970-01-01 01:00:00.000000000 +0100 ++++ inkscape-0.91-testfiles/share/extensions/test/svg/empty-SVG.svg 2015-02-07 13:59:29.087967572 +0000 +@@ -0,0 +1,13 @@ ++ ++ ++ ++ ++ +diff -Naur inkscape-0.91/share/extensions/test/svg/multilayered-test.svg inkscape-0.91-testfiles/share/extensions/test/svg/multilayered-test.svg +--- inkscape-0.91/share/extensions/test/svg/multilayered-test.svg 1970-01-01 01:00:00.000000000 +0100 ++++ inkscape-0.91-testfiles/share/extensions/test/svg/multilayered-test.svg 2015-02-07 13:59:29.091967496 +0000 +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ image/svg+xml ++ ++ ++ ++ ++ ++ ++ ++ ++ Bottom layer ++ ++ ++ ++ ++ ++ Middle sublayer ++ ++ ++ ++ Middle layer ++ ++ ++ ++ Top layer ++ ++ ++ diff --git a/talimatname/genel/i/inkscape/talimat b/talimatname/genel/i/inkscape/talimat new file mode 100644 index 000000000..d0fd78417 --- /dev/null +++ b/talimatname/genel/i/inkscape/talimat @@ -0,0 +1,18 @@ +# Tanım: Açık kaynaklı bir SVG editörü +# URL: http://www.inkscape.org +# Paketçi: milisarge +# Gerekler: gc boost gsl gtkmm intltool libxslt popt poppler lcms lcms2 + +isim=inkscape +surum=0.91 +devir=1 +kaynak=(https://launchpad.net/inkscape/0.91.x/0.91/+download/inkscape-0.91.tar.bz2 + inkscape-0.91-testfiles-1.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../inkscape-0.91-testfiles-1.patch + CXXFLAGS="-g -O2 -std=c++11" ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/innoextract/talimat b/talimatname/genel/i/innoextract/talimat new file mode 100644 index 000000000..c5235a635 --- /dev/null +++ b/talimatname/genel/i/innoextract/talimat @@ -0,0 +1,23 @@ +# Tanım: Inno Setup tarafından oluşturulan yükleyicileri ayıklamak için kullanılan bir araç +# URL: https://constexpr.org/innoextract +# Paketçi: Cihan_Alkan +# Gerekler: boost cmake +# Grup: + +isim=innoextract +surum=1.6 +devir=1 +kaynak=(https://constexpr.org/innoextract/files/$isim-$surum.tar.gz) + +derle() { + + cd "$isim-$surum" + cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release + make + + make DESTDIR="$PKG/" install + + install -Dm644 README.md "$PKG/usr/share/doc/$isim/README.md" + install -m644 CHANGELOG "$PKG/usr/share/doc/$isim/CHANGELOG" + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/i/inspircd/inspircd.kur-kos b/talimatname/genel/i/inspircd/inspircd.kur-kos new file mode 100644 index 000000000..f7576a8da --- /dev/null +++ b/talimatname/genel/i/inspircd/inspircd.kur-kos @@ -0,0 +1,16 @@ +create_user() { + getent group inspircd &>/dev/null || groupadd -r -g 141 inspircd >/dev/null + getent passwd inspircd &>/dev/null || useradd -r -u 141 -g inspircd -d /var/lib/inspircd -s /bin/false inspircd >/dev/null +} + +kurkos() { + create_user + echo '==> Inspircd için bir yapılandırma dosyası oluşturmanız gerekecek' + echo '==> cp /usr/share/inspircd/examples/inspircd.conf.example /etc/inspircd/inspircd.conf' + echo '==> Pidfile değiştirmeniz gerekecek. Bunu yapmak için aşağıdakilerinizi yapılandırmanıza ekleyebilirsiniz.' + echo '==> ' + echo '==> Mutlak yolları config dizininizde kullanmayı unutmayın; kullanıcı tabanlı bir inspircd yüklemesiyle yapacağınız göreceli yolları değil.' +} + + +kurkos diff --git a/talimatname/genel/i/inspircd/inspircd.sil-kos b/talimatname/genel/i/inspircd/inspircd.sil-kos new file mode 100644 index 000000000..32d7fe34c --- /dev/null +++ b/talimatname/genel/i/inspircd/inspircd.sil-kos @@ -0,0 +1 @@ +getent passwd inspircd &>/dev/null && userdel inspircd diff --git a/talimatname/genel/i/inspircd/talimat b/talimatname/genel/i/inspircd/talimat new file mode 100644 index 000000000..bc3daf84e --- /dev/null +++ b/talimatname/genel/i/inspircd/talimat @@ -0,0 +1,47 @@ +# Tanım: Kararlı, modern ve hafif IRC arka plan +# URL: http://www.inspircd.org/ +# Paketçi: Cihan_Alkan +# Gerekler: mariadb sqlite geoip gnutls libgcrypt openldap +# Grup: ağ + +isim=inspircd +surum=2.0.24 +devir=1 +kaynak=(https://github.com/inspircd/inspircd/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/inspircd-${surum}" + + ./configure \ + --enable-extras=m_geoip.cpp \ + --enable-extras=m_ldapauth.cpp \ + --enable-extras=m_ldapoper.cpp \ + --enable-extras=m_mysql.cpp \ + --enable-extras=m_regex_pcre.cpp \ + --enable-extras=m_regex_posix.cpp \ + --enable-extras=m_sqlite3.cpp + + ./configure \ + --uid \ + --prefix=/usr/lib/inspircd \ + --binary-dir=/usr/bin \ + --module-dir=/usr/lib/inspircd/modules \ + --config-dir=/etc/inspircd \ + --data-dir=/var/lib/inspircd \ + --log-dir=/var/log/inspircd \ + --enable-gnutls \ + --enable-openssl \ + --enable-epoll + + make + + install -o141 -g141 -dm750 "${PKG}/var/log/inspircd" "${PKG}/var/lib/inspircd" + + make DESTDIR="$PKG" install + + mkdir -p "${PKG}"/usr/share/inspircd + mv "${PKG}"/etc/inspircd/examples "${PKG}"/usr/share/inspircd/examples + + rm -rf "${PKG}"/usr/lib/inspircd/logs + rm -rf "${PKG}"/usr/lib/inspircd/data +} diff --git a/talimatname/genel/i/intel-ucode/intel-ucode.kur-kos b/talimatname/genel/i/intel-ucode/intel-ucode.kur-kos new file mode 100644 index 000000000..99b8ec97c --- /dev/null +++ b/talimatname/genel/i/intel-ucode/intel-ucode.kur-kos @@ -0,0 +1,3 @@ +#!/bin/sh +[ ! -f /usr/lib/dracut/dracut.conf.d/intel_ucode.conf ] && echo "early_microcode=yes" >> /usr/lib/dracut/dracut.conf.d/intel_ucode.conf +initramfs_guncelle diff --git a/talimatname/genel/i/intel-ucode/talimat b/talimatname/genel/i/intel-ucode/talimat new file mode 100644 index 000000000..165f62cd2 --- /dev/null +++ b/talimatname/genel/i/intel-ucode/talimat @@ -0,0 +1,18 @@ +# Tanım: Microcode update for Intel CPUs +# URL: http://downloadcenter.intel.com/ +# Paketçi: milisarge +# Gerekler: +# Grup: firmware + +isim=intel-ucode +surum=2.1.15 +devir=1 + +kaynak=( +http://pkgs.fedoraproject.org/repo/pkgs/microcode_ctl/microcode_ctl-2.1-15.tar.xz/sha512/2c1c65b62de80ca958068f18b54c3c635415c45f83095d5dbf07c5c94776b0297c8ae8cf82271cc96d6ded9bf6e22c511f6a50523b307fd9e995d723621d63e7/microcode_ctl-2.1-15.tar.xz) + +derle() { + cd microcode_ctl-2.1-15 + make all + install -Dt $PKG/lib/firmware/intel-ucode/ intel-ucode/* +} diff --git a/talimatname/genel/i/intltool/talimat b/talimatname/genel/i/intltool/talimat new file mode 100644 index 000000000..dfc4ef3e5 --- /dev/null +++ b/talimatname/genel/i/intltool/talimat @@ -0,0 +1,19 @@ +# Tanım: Uluslararasılaştırma aracı koleksiyonu +# URL: http://freedesktop.org/wiki/Software/intltool +# Paketçi: milisarge +# Gerekler: perl-xml-parser + +isim=intltool +surum=0.51.0 +devir=1 +kaynak=(http://edge.launchpad.net/intltool/trunk/$surum/+download/intltool-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +mkdir -p $PKG/usr/share/doc/intltool-$surum +install -v -Dm644 doc/I18N-HOWTO \ +$PKG/usr/share/doc/intltool-$surum/I18N-HOWTO +} diff --git a/talimatname/genel/i/inxi/talimat b/talimatname/genel/i/inxi/talimat new file mode 100644 index 000000000..0bdb629f7 --- /dev/null +++ b/talimatname/genel/i/inxi/talimat @@ -0,0 +1,18 @@ +# Tanım: inxi sistem bilgi betigi +# URL: http://inxi.org +# Paketçi: milisarge +# Gerekler: + +isim=inxi +surum=master +devir=1 +kaynak=(https://github.com/smxi/inxi/archive/master.tar.gz) + +derle(){ + mv $DERLEME_KAYNAKDIZIN/$surum.tar.gz $DERLEME_KAYNAKDIZIN/$isim-$surum.tar.gz + cd $isim-$surum + install -Dm755 inxi \ + $PKG/usr/bin/inxi + install -Dm644 inxi.1 \ + $PKG/usr/share/man/man1/inxi.1 +} diff --git a/talimatname/genel/i/io/talimat b/talimatname/genel/i/io/talimat new file mode 100644 index 000000000..d6c29762c --- /dev/null +++ b/talimatname/genel/i/io/talimat @@ -0,0 +1,23 @@ +# Tanım: Io Smalltalk benzer programlama dili +# URL: http://www.iolanguage.com/ +# Paketçi: milisarge +# Gerekler: git cmake pcre libsndfile xorg-libxmu freetype libedit libxml2 libtiff libevent yajl mariadb libpng python3 freeglut libjpeg-turbo libtheora +# Grup: geliştirme + +isim=io +surum=git +devir=1 +kaynak=(https://github.com/stevedekorte/io/archive/master.tar.gz::$isim-master.tar.gz) + +derle() { + #git_indir https://github.com/stevedekorte/io.git $isim + #cd $SRC/io + cd $SRC/$isim-master + sed -ri "s|20[0-9]+|$surum|" libs/iovm/source/IoVersion.h + mkdir -p build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr .. + make -j1 + make -C../build DESTDIR="$PKG" install + install -Dm644 ../license/bsd_license.txt "$PKG/usr/share/licenses/$isim/bsd_license.txt" +} diff --git a/talimatname/genel/i/iperf/talimat b/talimatname/genel/i/iperf/talimat new file mode 100644 index 000000000..4fea53929 --- /dev/null +++ b/talimatname/genel/i/iperf/talimat @@ -0,0 +1,28 @@ +# Tanım: Maksimum TCP bant genişliğini ölçmek için bir araç +# URL: https://sourceforge.net/projects/iperf2/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: ağ + +isim=iperf +surum=2.0.10 +devir=1 +kaynak=(http://downloads.sourceforge.net/iperf2/iperf-$surum.tar.gz) + +derle() { + cd $isim-$surum + # kaynak diziden yama uygulayın + local filename + for filename in "${source[@]}"; do + if [[ "$filename" =~ \.patch$ ]]; then + patch -p1 -N -i "$SRC/${filename##*/}" + fi + done + : + ./configure --prefix=/usr \ + --enable-ipv6 \ + --enable-multicast \ + --enable-threads + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/i/iprange/talimat b/talimatname/genel/i/iprange/talimat new file mode 100644 index 000000000..8da486dcc --- /dev/null +++ b/talimatname/genel/i/iprange/talimat @@ -0,0 +1,19 @@ +# Tanım: ip aralıklarını yönetme aracı- firehol projesinden +# URL: http://firehol.org/ +# Paketçi: milisarge +# Gerekler: help2man + +isim=iprange +surum=1.0.3 +devir=2.0 +kaynak=(https://github.com/firehol/$isim/archive/v$surum.tar.gz +) + +derle() { + cd "$isim-$surum" + ./autogen.sh + ./configure --disable-man --prefix="/usr" --sysconfdir="/etc" --sbindir="/usr/bin" + make + make prefix="$PKG/usr" sysconfdir="$PKG/etc" sbindir="$PKG/usr/bin" install + +} diff --git a/talimatname/genel/i/ipset/talimat b/talimatname/genel/i/ipset/talimat new file mode 100644 index 000000000..d56e155b4 --- /dev/null +++ b/talimatname/genel/i/ipset/talimat @@ -0,0 +1,19 @@ +# Tanım: IP veya port ayarlamaları için yetkili uygulaması +# URL: http://ipset.netfilter.org/ +# Paketçi: milisarge +# Gerekler: iptables libmnl + +isim=ipset +surum=6.32 +devir=1 +kaynak=(http://$isim.netfilter.org/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sbindir=/usr/bin --with-kmod=no + make + make DESTDIR="$PKG" install + install -Dm644 lib/libipset.pc "$PKG/usr/lib/pkgconfig/libipset.pc" + # default config file + install -Dm 644 /dev/null "$PKG/etc/$isim.conf" +} diff --git a/talimatname/genel/i/iptables/iptables.kur-kos b/talimatname/genel/i/iptables/iptables.kur-kos new file mode 100644 index 000000000..77a284463 --- /dev/null +++ b/talimatname/genel/i/iptables/iptables.kur-kos @@ -0,0 +1 @@ +cp /sources/milis.git/talimatname/genel/iptables/iptables.rc /etc/rc.d/init.d/iptables diff --git a/talimatname/genel/i/iptables/iptables.okubeni b/talimatname/genel/i/iptables/iptables.okubeni new file mode 100644 index 000000000..08d78f8dc --- /dev/null +++ b/talimatname/genel/i/iptables/iptables.okubeni @@ -0,0 +1,57 @@ +Ce readme est une copie de la page: +http://www.fr.linuxfromscratch.org/view/blfs-svn/postlfs/firewall.html + +INTRODUCTION + L'objectif général d'un pare-feu est de protéger un ordinateur ou un réseau contre les accès malveillants. + +Dans un monde parfait, tout démon et tout service sur la machine est parfaitement configuré et immunisé contre des fléaux tels que les débordements de mémoire ou d'autres problèmes liés à leur sécurité. De plus, vous faites confiance aux utilisateurs qui accèdent à vos services. Dans ce monde, vous n'avez pas besoin de pare-feu. + +Mais dans le monde réel, les démons peuvent être mal configurés et les exploits contre des services essentiels sont librement disponibles. Vous pouvez souhaiter choisir les services qui sont accessibles à certaines machines ou vous pourriez souhaiter limiter les machines ou les applications qui sont autorisés à y accéder depuis l'extérieur. Sinon, vous pouvez tout simplement ne pas faire confiance à certaines de vos applications ou à certains de vos utilisateurs. Vous êtes probablement connectés à Internet. Dans ce monde, un pare-feu est essentiel. + +N'imaginez toutefois pas qu'un pare-feu rend redondante les mauvaises configurations, ni qu'il ôte tout risque d'une mauvaise configuration par négligence. Il n'empêche personne d'exploiter un service que vous offrez intentionnellement, mais que vous n'avez pas mis à jour récemment ou que vous n'avez pas corrigé après qu'un exploit a été publié. Bien qu'ayant un pare-feu, vous avez besoin d'avoir sur votre système des applications et des démons configurés correctement et à jour. Un pare-feu n'est pas le remède à tout, mais il devrait être une partie essentielle de votre stratégie globale de sécurité. + +SIGNIFICATION DU MOT "PARE-FEU" + Le mot « pare-feu » peut avoir plusieurs sens différents. + +C'est un périphérique matériel ou un logiciel disponible sur le commerce (ou offert gratuitement) par des sociétés telles que Symantec qui prétend que cela sécurise un ordinateur familial ou de bureau connecté à Internet. Ce type de pare-feu est fort pertinent pour les utilisateurs qui ne savent pas comment on pourrait accéder à leur ordinateur par Internet ou comment désactiver cet accès, surtout s'ils sont toujours en ligne et connectés par des liens à connexion illimitée. + +C'est un système placé entre Internet et l'intranet. Pour minimiser le risque de compromettre le pare-feu lui-même, il ne devrait en général jouer qu'un rôle—celui de protéger l'intranet. Bien que cela ne soit pas sans risques, la tâche de routage et de masquerading d'IPs (réécrire des en-têtes IP de paquets qu'il route depuis les clients avec des adresses privées sur Internet afin qu'elles semblent venir du pare-feu lui-même) est en général considérée comme relativement sécurisée. + +C'est souvent un vieil ordinateur à la retraite et que vous avez presqu'oublié, qui fait du masquerading ou des fonctions de routage mais qui offre des services de non pare-feu tels qu'un cache Web ou la messagerie. Cela peut être utilisé pour des réseaux familiaux, mais ce n'est pas considéré comme sécurisé en tant que machine uniquement dédiée au pare-feu car la combinaison d'un serveur et d'un routeur/pare-feu sur une machine augmente la complexité du paramétra + +PARE-FEU AVEC UN DEMILITARIZED ZONE +Cette machine effectue du masquerading ou du routage mais elle autorise un accès public à certaines branches de votre réseau qui, du fait des IPs publiques et d'une structure physique séparée, est epsentiellement un réseau séparé avec un accès direct à Internet. Les serveurs sur ce réseau sont les plus facilement accessibles, tant par Internet que depuis l'intranet. Le pare-feu protège les deux réseaux. Ce type de pare-feu a un minimum de trois interfaces réseaux. + +PACKETFILTER +Ce type de pare-feu fait du routage et du masquerading, mais il ne maintient pas un tableaux d'état de flux de communication en cours. Il est rapide mais a des capacités de blocage des paquets indésirés très limitées sans bloquer les paquets désirés. + +MAINTENANT VOUS POUVEZ COMMENCER A CONSTRUIRE VOTRE PARE-FEU +AVERTISSEMENT: +Cette introduction sur la façon de paramùqrer un pare-feu n'est pas un guide complet pour sécuriser des systèmes. Le pare-feu est un sujet complexe qui exige une configuration soignée. Les scripts cités ici ne visent qu'à donner des exemples de la façon dont fonctionne un pare-feu. Ils n'ambitionnent pas de convenir à toute configuration particulière et ils peuvent ne pas offrir de protection complète contre une attaque + +Une personnalisation de ces scripts pour votre situation spécifique sera nécessaire pour avoir une configuration optimale, mais vous devriez étudier sérieusement la documentation d'iptables et la création de pare-feux en général avant de toucher quoique ce soit. Jetez un oeil sur les liens en bas de ce README pour plus de détails. Vous y trouverez une liste de liens contenant des informations rapides et complètes sur la construction de votre propre pare-feu. + +Le script de configuration de pare-feu installé dans la section sur iptables diffère du script de configuration standard. Il n'a que deux des cibles standards : start et status. Les autres cibles sont vides et verrouillées. Par exemple, si vous lancez : + +/etc/rc.d/init.d/iptables start + + le pare-feu sera redémarré comme s'il s'agissait du démarrage du système. La cible status présentera une liste de toutes les règles actuellement implémentées. La cible vide désactive toutes les règles de pare-feu et la cible verrouillée (lock) bloquera tous les paquets entrant et sortant sur l'ordinateur sauf l'interface loopback. + +Le pare-feu de démarrage principal se trouve dans le fichier /etc/rc.d/rc.iptables. Les sections ci-dessous présentent trois approches différentes qu'on peut utiliser sur un système. + +NOTE: +Vous devriez toujours exécuter vos règles de pare-feu à partir d'un script. Cela vous assure d'être cohérent et de vous souvenir de ce que vous avez fait. Cela permet aussi de mettre des commentaires essentiels à la compréhension des règles longtemps après les avoir écrites. + +PARE-FEU PERSONNEL +Un pare-feu personnel est conçu pour vous permettre un accès à tous les services offerts sur Internet, mais il garde votre machine ainsi que vos données privées en sécurité. + +Le fichier rc.iptables est une version légèrement modifiée de la recommandation de Rusty Russell sur le lien +http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html (guide pratique sur le filtrage des paquets avec Linux 2.4). Il s'applique encore aux noyaux Linux 2.6. + +Ce script est très simple, il accepte tout le trafic venant dans votre ordinateur qui a été initié par votre ordinateur, mais tant que vous surfez simplement sur Internet, il y a peu de chances que vous dépassiez ses limites. + +Plus d'information sur ce lien + +http://www.fr.linuxfromscratch.org/view/blfs-svn/postlfs/firewall.html +http://www.linuxfromscratch.org/blfs/view/svn/postlfs/firewall.html + diff --git a/talimatname/genel/i/iptables/iptables.rc b/talimatname/genel/i/iptables/iptables.rc new file mode 100755 index 000000000..69ac3fc65 --- /dev/null +++ b/talimatname/genel/i/iptables/iptables.rc @@ -0,0 +1,84 @@ +#!/bin/sh +######################################################################## +# Begin iptables +# +# Tanım: Start iptables +# +# Authors : Ken Moffat - ken@linuxfromscratch.org +# Bruce Dubbs - bdubbs@linuxfromscratch.org +# +# Version : LFS 7.0 +# +######################################################################## + +### BEGIN INIT INFO +# Provides: iptables +# Required-Start: +# Should-Start: +# Required-Stop: $local_fs +# Should-Stop: +# Default-Start: 3 4 5 +# Default-Stop: +# Short-Tanım: Loads iptables rules. +# Tanım: Iptables provides firewall for Linux systems. +# X-LFS-Provided-By: BLFS / LFS 7.0 +### END INIT INFO + +. /lib/lsb/init-functions + +#$LastChangedBy: krejzi $ +#$Date: 2013-06-11 11:01:46 -0500 (Tue, 11 Jun 2013) $ + +case "$1" in + start) + if [ -x /etc/rc.d/rc.iptables ]; then + log_info_msg "Starting iptables..." + /etc/rc.d/rc.iptables + evaluate_retval + fi + ;; + + lock) + log_info_msg "Locking system iptables firewall..." + /usr/sbin/iptables --policy INPUT DROP + /usr/sbin/iptables --policy OUTPUT DROP + /usr/sbin/iptables --policy FORWARD DROP + /usr/sbin/iptables --flush + /usr/sbin/iptables -t nat --flush + /usr/sbin/iptables -t mangle --flush + /usr/sbin/iptables --delete-chain + /usr/sbin/iptables -t nat --delete-chain + /usr/sbin/iptables -t mangle --delete-chain + /usr/sbin/iptables -A INPUT -i lo -j ACCEPT + /usr/sbin/iptables -A OUTPUT -o lo -j ACCEPT + evaluate_retval + ;; + + clear) + log_info_msg "Clearing system iptables iptables..." + /usr/sbin/iptables --policy INPUT ACCEPT + /usr/sbin/iptables --policy OUTPUT ACCEPT + /usr/sbin/iptables --policy FORWARD ACCEPT + /usr/sbin/iptables --flush + /usr/sbin/iptables -t nat --flush + /usr/sbin/iptables -t mangle --flush + /usr/sbin/iptables --delete-chain + /usr/sbin/iptables -t nat --delete-chain + /usr/sbin/iptables -t mangle --delete-chain + evaluate_retval + ;; + + status) + /usr/sbin/iptables --numeric --list + /usr/sbin/iptables -t nat --numeric --list + /usr/sbin/iptables -t mangle --numeric --list + ;; + + *) + echo "Usage: $0 {start|clear|lock|status}" + exit 1 + ;; +esac + +# End /etc/init.d/iptables + diff --git a/talimatname/genel/i/iptables/talimat b/talimatname/genel/i/iptables/talimat new file mode 100644 index 000000000..d5273067c --- /dev/null +++ b/talimatname/genel/i/iptables/talimat @@ -0,0 +1,22 @@ +# Tanım: Linux çekirdeği paket filtreleme ve kontrol aracı +# URL: http://www.iptables.org/ +# Paketçi: milisarge +# Gerekler: + +isim=iptables +surum=1.6.0 +devir=1 +kaynak=(ftp://ftp.netfilter.org/pub/iptables/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --libexecdir=/usr/lib \ + --enable-libipq \ + --with-xtlibdir=/lib/xtables \ + --enable-devel \ + --with-pkgconfigdir=/usr/lib/pkgconfig \ + --disable-nftables + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/iputils/talimat b/talimatname/genel/i/iputils/talimat new file mode 100644 index 000000000..b06e07378 --- /dev/null +++ b/talimatname/genel/i/iputils/talimat @@ -0,0 +1,16 @@ +# Tanım: temel ağ uygulamaları +# URL: http://www.linuxfoundation.org/collaborate/workgroups/networking/iputils +# Paketçi: milisarge +# Gerekler: libcap libidn + +isim=iputils +surum=s20161105 +devir=1 +kaynak=(https://github.com/$isim/$isim/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + make USE_NETTLE=no USE_GNUTLS=no CCOPTOPT="$CFLAGS" + install -dm755 "${PKG}"/usr/bin + install -m755 arping clockdiff ping rarpd rdisc tftpd tracepath "${PKG}"/usr/bin/ +} diff --git a/talimatname/genel/i/ipw2100-fw/talimat b/talimatname/genel/i/ipw2100-fw/talimat new file mode 100644 index 000000000..6d9c85f77 --- /dev/null +++ b/talimatname/genel/i/ipw2100-fw/talimat @@ -0,0 +1,18 @@ +# Tanım: IPW2100 Intel Centrino wifi için sürücüler +# URL: http://ipw2100.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=ipw2100-fw +surum=1.3 +devir=1 +kaynak=(http://downloads.nutyx.org/files/$isim-$surum.tgz) + +derle() { + for i in *.fw + do + install -D -m 644 $i $PKG/lib/firmware/$i + done + # Install firmware licence + install -D -m 644 LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/i/ipw2200-fw/talimat b/talimatname/genel/i/ipw2200-fw/talimat new file mode 100644 index 000000000..db3e58a2b --- /dev/null +++ b/talimatname/genel/i/ipw2200-fw/talimat @@ -0,0 +1,19 @@ +# Tanım: IPW2200 Intel Centrino wifi için sürücüler +# URL: http://ipw2200.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=ipw2200-fw +surum=3.1 +devir=1 +kaynak=(http://downloads.nutyx.org/files/$isim-$surum.tgz) + +derle() { + cd $isim-$surum + for i in ipw*.fw + do + install -D -m 644 $i $PKG/lib/firmware/$i + done + # Install firmware licence + install -D -m 644 LICENSE.ipw2200-fw $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/i/irssi/talimat b/talimatname/genel/i/irssi/talimat new file mode 100644 index 000000000..c6363106e --- /dev/null +++ b/talimatname/genel/i/irssi/talimat @@ -0,0 +1,26 @@ +# Tanım: UNIX sistemler için terminal temelli IRC uygulaması +# URL: http://irssi.org/ +# Paketçi: milisarge +# Gerekler: glib + +isim=irssi +surum=0.8.20 +devir=1 +kaynak=(https://github.com/irssi-import/irssi/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --enable-ipv6 \ + --with-textui \ + --with-proxy + make + make DESTDIR=$PKG install + +find $PKG \ + -name .packlist -or \ + -name perllocal.pod -or \ + -name '*.bs' -or \ + -name autosplit.ix | xargs rm +} diff --git a/talimatname/genel/i/iso-codes/talimat b/talimatname/genel/i/iso-codes/talimat new file mode 100644 index 000000000..5878abc97 --- /dev/null +++ b/talimatname/genel/i/iso-codes/talimat @@ -0,0 +1,16 @@ +# Tanım: ISO Kodları paketi, ülke, dil ve para birimi adlarının bir listesini içerir +# URL: http://pkg-isocodes.alioth.debian.org/ +# Paketçi: milisarge +# Gerekler: + +isim=iso-codes +surum=3.65 +devir=1 +kaynak=(http://pkg-isocodes.alioth.debian.org/downloads/iso-codes-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/isodumper/header.png b/talimatname/genel/i/isodumper/header.png new file mode 100644 index 0000000000000000000000000000000000000000..e80cb783a132bd9f376f0da2561d36272af733bb GIT binary patch literal 21241 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/i/isodumper/header.svg b/talimatname/genel/i/isodumper/header.svg new file mode 100644 index 000000000..d229a0f1e --- /dev/null +++ b/talimatname/genel/i/isodumper/header.svg @@ -0,0 +1,435 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/talimatname/genel/i/isodumper/talimat b/talimatname/genel/i/isodumper/talimat new file mode 100644 index 000000000..cd42f4d26 --- /dev/null +++ b/talimatname/genel/i/isodumper/talimat @@ -0,0 +1,35 @@ +# Tanım: ISO imajlarini USB belleğe yazdırmak için usb-imagewriter temelli bir program +# URL: https://github.com/papoteur-mga/isodumper +# Paketçi: milisarge +# Gerekler: intltool imagemagick coreutils pango polkit procps-ng python-gtk python-cairo python-gobject2 libglade python dbus-python python-parted udisks2 xorg-term + +isim=isodumper +surum=0.48 +devir=1 +kaynak=( http://gitweb.mageia.org/software/isodumper/snapshot/$isim-$surum.tar.gz + header.png + header.svg) + +derle() { +cd $isim-$surum +make +make DESTDIR=$PKG install + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/isodumper.desktop << "EOF" && +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Name=ISO Dumper +Comment=ISO Kalıp Yazma Programı +Icon=isodumper +Exec=isodumper +Categories=Utility; +StartupNotify=true +Terminal=false +EOF + +cp $SRC/header.png $PKG/usr/share/isodumper +cp $SRC/header.svg $PKG/usr/share/isodumper +} diff --git a/talimatname/genel/i/isomaster/talimat b/talimatname/genel/i/isomaster/talimat new file mode 100644 index 000000000..97ac6b640 --- /dev/null +++ b/talimatname/genel/i/isomaster/talimat @@ -0,0 +1,17 @@ +# Tanım: CD/DVD İmaj editörü +# URL: http://www.littlesvr.ca/isomaster/ +# Paketçi: milisarge +# Gerekler: gtk2 desktop-file-utils harfbuzz atk gdk-pixbuf xorg-libx11 xorg-libxext xorg-libxrender xorg-libxdmcp xcb-proto xorg-proto xorg-libxau libxcb libpng freetype xorg-fontconfig xorg-pixman pango cairo pcre glib + +isim=isomaster +surum=1.3.13 +devir=1 +kaynak=(http://littlesvr.ca/isomaster/releases/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + make PREFIX=/usr + + make PREFIX=/usr DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/isowriter/talimat b/talimatname/genel/i/isowriter/talimat new file mode 100644 index 000000000..1619da309 --- /dev/null +++ b/talimatname/genel/i/isowriter/talimat @@ -0,0 +1,40 @@ +# Tanım: Kalıp dosyalarunu USB belleğe yaz +# URL: https://github.com/KaOSx/isowriter +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: sistem + +isim=isowriter +surum=1.1.3 +devir=2 + +kaynak=() + +derle() { + + git_indir https://github.com/KaOSx/isowriter $isim + cd $SRC/$isim + qmake-qt5 ImageWriter.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug + make +mkdir -p $PKG/usr/share/applications +# Başlatıcı +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Type=Application +Categories=System;Utility;Archiving; +X-KDE-RootOnly=true +Exec=sudo IsoWriter +Icon=/usr/share/icons/usb_blue.png +Name=ISO Writer +Comment=Tool for creating bootable installation USB flash drives +Comment[tr]=Kalıp dosyalarunu USB belleğe yaz +GenericName=USB key writer +Version=1.0 +EOF + + mkdir -p $PKG/usr/bin + cp IsoWriter $PKG/usr/bin/ + mkdir -p $PKG/usr/share/icons + cp res/usb_blue.png $PKG/usr/share/icons/ +} + diff --git a/talimatname/genel/i/itstool/talimat b/talimatname/genel/i/itstool/talimat new file mode 100644 index 000000000..6e68a3ff6 --- /dev/null +++ b/talimatname/genel/i/itstool/talimat @@ -0,0 +1,16 @@ +# Tanım: XML ve PO uzantilari icin dönüştürücü +# URL: http://itstool.org/ +# Paketçi: milisarge +# Gerekler: docbook-xml docbook-xsl python + +isim=itstool +surum=2.0.2 +devir=1 +kaynak=(http://files.itstool.org/itstool/$isim-$surum.tar.bz2 ) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/i/iucode-tool/talimat b/talimatname/genel/i/iucode-tool/talimat new file mode 100644 index 000000000..7a5a54e7d --- /dev/null +++ b/talimatname/genel/i/iucode-tool/talimat @@ -0,0 +1,17 @@ +# Tanım: Intel® IA-32/X86-64 microcode larını yönetmek için araç +# URL: https://gitlab.com/iucode-tool/iucode-tool/wikis/home +# Paketçi: milisarge +# Gerekler: +# Grup: sistem + +isim=iucode-tool +surum=2.2 +devir=1 +kaynak=(https://gitlab.com/iucode-tool/releases/raw/master/iucode-tool_$surum.tar.xz) + +derle() { + cd "$SRC/${isim}-$surum" + ./configure --prefix=/usr --sbindir=/usr/bin + make + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/i/iw/talimat b/talimatname/genel/i/iw/talimat new file mode 100644 index 000000000..8ac7ce0f0 --- /dev/null +++ b/talimatname/genel/i/iw/talimat @@ -0,0 +1,17 @@ +# Tanım: Kablosuz aygıtlar için nl80211 tabanlı CLI ayarlama aracı +# URL: http://wireless.kernel.org/en/users/Documentation/iw +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: libnl + +isim=iw +surum=4.9 +devir=1 +kaynak=(https://www.kernel.org/pub/software/network/$isim/$isim-$surum.tar.xz) + +derle() { + cd "$SRC"/$isim-$surum + make + + cd "$SRC"/$isim-$surum + make DESTDIR="$PKG" SBINDIR="/usr/bin" install +} diff --git a/talimatname/genel/j/jack/jack-40-hpet-permissions.rules b/talimatname/genel/j/jack/jack-40-hpet-permissions.rules new file mode 100644 index 000000000..7af3780f9 --- /dev/null +++ b/talimatname/genel/j/jack/jack-40-hpet-permissions.rules @@ -0,0 +1,2 @@ +KERNEL=="rtc0", GROUP="audio" +KERNEL=="hpet", GROUP="audio" diff --git a/talimatname/genel/j/jack/jack-99-audio.conf b/talimatname/genel/j/jack/jack-99-audio.conf new file mode 100644 index 000000000..eb76ef920 --- /dev/null +++ b/talimatname/genel/j/jack/jack-99-audio.conf @@ -0,0 +1,2 @@ +@audio - rtprio 99 +@audio - memlock unlimited diff --git a/talimatname/genel/j/jack/talimat b/talimatname/genel/j/jack/talimat new file mode 100644 index 000000000..fd07fefaf --- /dev/null +++ b/talimatname/genel/j/jack/talimat @@ -0,0 +1,25 @@ +# Tanım: Düşük gecikmeli bir ses sunucusu +# URL: http://jackaudio.org +# Paketçi: milisarge +# Gerekler: db libsamplerate readline doxygen celt + +_longisim=jack-audio-connection-kit +isim=jack +surum=0.124.1 +devir=1 +kaynak=(http://jackaudio.org/downloads/${_longname}-$surum.tar.gz + jack-99-audio.conf + jack-40-hpet-permissions.rules) + +derle() { +cd ${_longname}-$surum +./configure --prefix=/usr --libdir=/usr/lib +make +make DESTDIR=$PKG install + +install -Dm644 $SRC/jack-99-audio.conf \ + $PKG/etc/security/limits.d/99-audio.conf + +install -Dm644 $SRC/jack-40-hpet-permissions.rules \ + $PKG/etc/udev/rules.d/40-hpet-permissions.rules +} diff --git a/talimatname/genel/j/jam/talimat b/talimatname/genel/j/jam/talimat new file mode 100644 index 000000000..7b7d9dfaf --- /dev/null +++ b/talimatname/genel/j/jam/talimat @@ -0,0 +1,17 @@ +# Tanım: Jam bir yazılım oluşturma aracıdır. +# URL: http://www.perforce.com/documentation/jam +# Paketçi: milisarge +# Gerekler: + +isim=jam +surum=2.5 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/ede/jam/2.5-haiku-20080327/jam-2.5-haiku-20080327.tar.gz) + +derle() { +cd $isim +make +mkdir -p $PKG/usr/bin +cp bin.linuxx86/jam \ + $PKG/usr/bin/jam +} diff --git a/talimatname/genel/j/jansson/talimat b/talimatname/genel/j/jansson/talimat new file mode 100644 index 000000000..f0a7f9ef4 --- /dev/null +++ b/talimatname/genel/j/jansson/talimat @@ -0,0 +1,22 @@ +# Tanım: JSON verisini encode, decode etmek ve düzenlemek için C kütüphanesi +# URL: http://www.digip.org/jansson/ +# Paketçi: milisarge +# Gerekler: + +isim=jansson +surum=2.7 +devir=1 +kaynak=(http://www.digip.org/$isim/releases/$isim-$surum.tar.bz2) + +derle() { + + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man + + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/j/jasper/talimat b/talimatname/genel/j/jasper/talimat new file mode 100644 index 000000000..c94fef3aa --- /dev/null +++ b/talimatname/genel/j/jasper/talimat @@ -0,0 +1,22 @@ +# Tanım: Ortaya çıkan JPEG-2000 Bölüm 1'de belirtilen codec bileşeninin yazılım tabanlı bir uygulaması +# URL: http://www.ece.uvic.ca/~mdadams/jasper/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo + +isim=jasper +surum=1.900.1 +devir=1 +kaynak=(http://www.ece.uvic.ca/~mdadams/$isim/software/$isim-$surum.zip \ + http://www.linuxfromscratch.org/patches/blfs/svn/jasper-1.900.1-security_fixes-2.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../$isim-$surum-security_fixes-2.patch + ./configure --prefix=/usr --enable-shared \ + --mandir=/usr/share/man + make + make DESTDIR=$PKG install + + install -v -m755 -d $PKG/usr/share/doc/jasper-$surum + install -v -m644 doc/*.pdf $PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/j/java-mysql/talimat b/talimatname/genel/j/java-mysql/talimat new file mode 100644 index 000000000..afafc36f4 --- /dev/null +++ b/talimatname/genel/j/java-mysql/talimat @@ -0,0 +1,17 @@ +# Tanım: java-jdbc mysql bağlayıcısı +# URL: https://dev.mysql.com/downloads/connector/j/ +# Paketçi: milisarge +# Gerekler: openjdk mariadb + +isim=java-mysql +surum=5.1.41 +uzunisim=mysql-connector-java-${surum} +devir=1 +kaynak=(https://cdn.mysql.com/Downloads/Connector-J/${uzunisim}.tar.gz) + +derle() { + cd $uzunisim + jdkyol=`readlink -f /opt/jdk` + install -d "$PKG$jdkyol/jre/lib/ext/" + cp ${uzunisim}-bin.jar $PKG$jdkyol/jre/lib/ext/mysql.jar +} diff --git a/talimatname/genel/j/jbigkit/talimat b/talimatname/genel/j/jbigkit/talimat new file mode 100644 index 000000000..ecabc3cea --- /dev/null +++ b/talimatname/genel/j/jbigkit/talimat @@ -0,0 +1,36 @@ +# Tanım: JBIG1 sıkıştırma standardı uygulaması +# URL: http://www.cl.cam.ac.uk/~mgk25/jbigkit/ +# Paketçi: milisarge +# Gerekler: + +isim=jbigkit +surum=2.1 +devir=1 +kaynak=(http://www.cl.cam.ac.uk/~mgk25/$isim/download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + export CFLAGS="$CFLAGS -fPIC" + + make -e + + install -m 755 -d $PKG/usr/lib + install -m 755 -d $PKG/usr/include + install -m 755 -d $PKG/usr/bin + install -m 755 -d $PKG/usr/share/man/man1 + install -m 755 -d $PKG/usr/share/man/man5 + + install -m 644 libjbig/*.a $PKG/usr/lib + install -m 644 libjbig/*.h $PKG/usr/include + + install -m 755 pbmtools/jbgtopbm $PKG/usr/bin + install -m 755 pbmtools/jbgtopbm85 $PKG/usr/bin + install -m 755 pbmtools/pbmtojbg $PKG/usr/bin + install -m 755 pbmtools/pbmtojbg85 $PKG/usr/bin + + install -m 644 pbmtools/jbgtopbm.1 $PKG/usr/share/man/man1 + install -m 644 pbmtools/pbmtojbg.1 $PKG/usr/share/man/man1 + install -m 644 pbmtools/pgm.5 $PKG/usr/share/man/man5 + install -m 644 pbmtools/pbm.5 $PKG/usr/share/man/man5 +} diff --git a/talimatname/genel/j/jd-gui/jd-gui.desktop b/talimatname/genel/j/jd-gui/jd-gui.desktop new file mode 100644 index 000000000..fbb4de485 --- /dev/null +++ b/talimatname/genel/j/jd-gui/jd-gui.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Comment=Java Decompiler JD-GUI +Terminal=false +Name=JD-GUI +Exec=jd-gui +Type=Application +Icon=jd-gui diff --git a/talimatname/genel/j/jd-gui/talimat b/talimatname/genel/j/jd-gui/talimat new file mode 100644 index 000000000..3459d4ccd --- /dev/null +++ b/talimatname/genel/j/jd-gui/talimat @@ -0,0 +1,21 @@ +# Tanım: java .class dosyalarının kaynak kodunu gösteren uygulama +# URL: http://jd.benow.ca/ +# Paketçi: milisarge +# Gerekler: jre + +isim=jd-gui +surum=1.4.0 +devir=1 +kaynak=(https://github.com/java-decompiler/jd-gui/releases/download/v1.4.0/jd-gui-1.4.0.jar + https://github.com/java-decompiler/jd-gui/raw/v1.4.0/src/linux/resources/jd_icon_128.png + jd-gui.desktop) + +derle() { + cd "$SRC" + install -Dm644 "$isim-$surum.jar" "$PKG/usr/share/java/$isim/$isim.jar" + install -d "$PKG/usr/bin" + echo -e "#!/bin/sh\nexec java -jar /usr/share/java/$isim/$isim.jar" '"$@"' > "$PKG/usr/bin/$isim" + chmod 755 "$PKG/usr/bin/$isim" + install -Dm644 jd-gui.desktop "$PKG/usr/share/applications/$isim.desktop" + install -Dm644 jd_icon_128.png "$PKG/usr/share/pixmaps/$isim.png" +} diff --git a/talimatname/genel/j/jemalloc/talimat b/talimatname/genel/j/jemalloc/talimat new file mode 100644 index 000000000..55fd5d227 --- /dev/null +++ b/talimatname/genel/j/jemalloc/talimat @@ -0,0 +1,17 @@ +# Tanım: Genel amaçlı ölçeklenebilir eşzamanlı malloc uygulaması. +# URL: http://www.canonware.com/jemalloc/ +# Paketçi: milisarge +# Gerekler: + +isim=jemalloc +surum=4.2.1 +devir=1 +kaynak=(https://github.com/jemalloc/jemalloc/releases/download/${surum}/${isim}-${surum}.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + find "$PKG" -name \*.a -type f -exec chmod 644 '{}' \; +} diff --git a/talimatname/genel/j/jfsutils/talimat b/talimatname/genel/j/jfsutils/talimat new file mode 100644 index 000000000..84686c2d1 --- /dev/null +++ b/talimatname/genel/j/jfsutils/talimat @@ -0,0 +1,19 @@ +# Tanım: Administration and debugging tools for the jfs file system. +# URL: http://jfs.sourgeforge.net +# Paketçi: milisarge +# Gerekler: + +isim=jfsutils +surum=1.1.15 +devir=1 + +kaynak=(http://jfs.sourceforge.net/project/pub/$isim-$surum.tar.gz) + +derle() { + +cd $isim-$surum +sed "s@@&\n#include @g" -i fscklog/extract.c +./configure +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/j/joe/talimat b/talimatname/genel/j/joe/talimat new file mode 100644 index 000000000..846bbb739 --- /dev/null +++ b/talimatname/genel/j/joe/talimat @@ -0,0 +1,24 @@ +# Tanım: Joe'nun kendi editörü, WordStar, Pico ve Emacs'ı taklit edebilen küçük bir metin editörüdür. +# URL: http://downloads.sourceforge.net/joe-editor +# Paketçi: milisarge +# Gerekler: + +isim=joe +surum=4.1 +devir=1 +kaynak=(http://downloads.sourceforge.net/joe-editor/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --docdir=/usr/share/doc/joe-4.1 + make + make DESTDIR=$PKG install + install -vm 755 joe/util/{stringify,termidx,uniproc} $PKG/usr/bin + install -vdm755 $PKG/usr/share/joe/util + install -vm 644 joe/util/{*.txt,README} $PKG/usr/share/joe/util + +} diff --git a/talimatname/genel/j/john/talimat b/talimatname/genel/j/john/talimat new file mode 100644 index 000000000..9864e7bff --- /dev/null +++ b/talimatname/genel/j/john/talimat @@ -0,0 +1,28 @@ +# Tanım: John the Ripper hızlı bir şifre kırma yazılımıdır +# URL: http://www.openwall.com/john/ +# Paketçi: milisarge +# Gerekler: + +isim=john +_surum=1.8.0-jumbo-1 +surum=1.8.0 +devir=1 +kaynak=(http://www.openwall.com/$isim/j/$isim-$_version.tar.xz) + +derle() { + + sed -i 's|/usr/libexec|/usr/lib|g' $isim-$_version/src/params.h + + cd $isim-$_version/src + + # fix compilation with gcc 5.x + ./configure CFLAGS=-std=gnu89 + + make + + install -d $PKG/usr/bin + install -d $PKG/usr/lib/$isim + install -m 755 ../run/* $PKG/usr/lib/$isim + echo -e '#!/bin/sh\n/usr/lib/john/john "$@"\n' > $PKG/usr/bin/john + chmod 755 $PKG/usr/bin/john +} diff --git a/talimatname/genel/j/jq/talimat b/talimatname/genel/j/jq/talimat new file mode 100644 index 000000000..e0e30b334 --- /dev/null +++ b/talimatname/genel/j/jq/talimat @@ -0,0 +1,17 @@ +# Tanım: komut satirinda json parcalayici +# URL: https://stedolan.github.io/jq/ +# Paketçi: milisarge +# Gerekler: + +isim=jq +surum=1.5 +devir=1 +kaynak=(https://github.com/stedolan/$isim/releases/download/$isim-$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/j/jre/jre.kos-kur b/talimatname/genel/j/jre/jre.kos-kur new file mode 100644 index 000000000..e5eb0aa03 --- /dev/null +++ b/talimatname/genel/j/jre/jre.kos-kur @@ -0,0 +1,3 @@ +mps sil icedtea-web +install -d /usr/lib/mozilla/plugins + diff --git a/talimatname/genel/j/jre/talimat b/talimatname/genel/j/jre/talimat new file mode 100644 index 000000000..c9bbe9cbe --- /dev/null +++ b/talimatname/genel/j/jre/talimat @@ -0,0 +1,31 @@ +# Tanım: Java Runtime Environment +# URL: http://www.oracle.com/technetwork/java/javase/overview/index.html +# Paketçi: milisarge +# Gerekler: + +isim=jre +surum=1.8.0_152 +devir=1 +kaynak=(http://ftp.osuosl.org/pub/funtoo/distfiles/oracle-java/jre-8u152-linux-x64.tar.gz) + +derle(){ + cd $isim$surum + + install -d $PKG/usr/{bin,share,lib/$isim} + mv bin lib plugin $PKG/usr/lib/$isim + install -d "$PKG"/usr/lib/mozilla/plugins + # several symlinks + ln -s $isim $PKG/usr/lib/java + ln -s ../lib/java/bin/java $PKG/usr/bin/java + ln -s ../lib/java/bin/javaws $PKG/usr/bin/javaws + ln -s ../lib/java/bin/keytool $PKG/usr/bin/keytool + ln -s ../lib/java/bin/jcontrol $PKG/usr/bin/jcontrol + sed -e "s|Exec=|Exec=/usr/lib/java/bin/|" \ + -e "s|.png|-jre8.png|" \ + -i $PKG/usr/lib/jre/lib/desktop/applications/* + mv $PKG/usr/lib/jre/lib/desktop/applications "$PKG"/usr/share/ + #install -m644 "$SRC"/*.desktop "$PKG"/usr/share/applications/ + ln -s /usr/lib/java/lib/amd64/libnpjp2.so "$PKG"/usr/lib/mozilla/plugins/libnpjp2-jre8.so + # remove broken libraries + rm $PKG/usr/lib/jre/lib/amd64/libavplugin-*.so +} diff --git a/talimatname/genel/j/js1/talimat b/talimatname/genel/j/js1/talimat new file mode 100644 index 000000000..7329a3d0b --- /dev/null +++ b/talimatname/genel/j/js1/talimat @@ -0,0 +1,25 @@ +# Tanım: JavaScript yorumlayıcı ve kitaplıkları +# URL: https://developer.mozilla.org/En/SpiderMonkey/1.8.5 +# Paketçi: milisarge +# Gerekler: libffi nspr zip python + +isim=js1 +surum=17.0.0 +devir=1 +kaynak=( http://ftp.mozilla.org/pub/mozilla.org/js/mozjs$surum.tar.gz ) + +derle() { +cd mozjs$surum/js/src +sed -i 's/(defined\((@TEMPLATE_FILE)\))/\1/' config/milestone.pl +./configure --prefix=/usr \ + --enable-readline \ + --enable-threadsafe \ + --with-system-ffi \ + --with-system-nspr +make +make DESTDIR=$PKG install +find $PKG/usr/include/js-17.0/ \ + $PKG/usr/lib/libmozjs-17.0.a \ + $PKG/usr/lib/pkgconfig/mozjs-17.0.pc \ + -type f -exec chmod -v 644 {} \; +} diff --git a/talimatname/genel/j/js2/talimat b/talimatname/genel/j/js2/talimat new file mode 100644 index 000000000..8e96b279b --- /dev/null +++ b/talimatname/genel/j/js2/talimat @@ -0,0 +1,29 @@ +# Tanım: JavaScript yorumlayıcı ve kitaplığı +# URL: https://developer.mozilla.org/En/SpiderMonkey/1.8.5 +# Paketçi: milisarge +# Gerekler: libffi nspr zip python + +isim=js2 +surum=24.2.0 +devir=1 +kaynak=( http://ftp.mozilla.org/pub/mozilla.org/js/mozjs-$surum.tar.bz2 ) + +derle() { +cd mozjs-$surum/js/src + +sed -i 's/(defined\((@TEMPLATE_FILE)\))/\1/' config/milestone.pl + +SHELL=/bin/bash \ +./configure --prefix=/usr \ + --enable-readline \ + --enable-threadsafe \ + --with-system-ffi \ + --with-system-nspr +make +make DESTDIR=$PKG install + +find $PKG/usr/include/mozjs-24/ \ + $PKG/usr/lib/libmozjs-24.a \ + $PKG/usr/lib/pkgconfig/mozjs-24.pc \ + -type f -exec chmod -v 644 {} \; +} diff --git a/talimatname/genel/j/js38/mozjs38-1269317.patch b/talimatname/genel/j/js38/mozjs38-1269317.patch new file mode 100644 index 000000000..a3a57d544 --- /dev/null +++ b/talimatname/genel/j/js38/mozjs38-1269317.patch @@ -0,0 +1,122 @@ +--- a/js/src/jit/RegisterSets.h 2017-02-10 17:33:06.210702431 -0800 ++++ b/js/src/jit/RegisterSets.h 2017-02-10 17:43:52.877514146 -0800 +@@ -7,7 +7,6 @@ + #ifndef jit_RegisterSets_h + #define jit_RegisterSets_h + +-#include "mozilla/Alignment.h" + #include "mozilla/MathAlgorithms.h" + + #include "jit/JitAllocPolicy.h" +@@ -26,8 +25,8 @@ + Code code_; + + public: +- AnyRegister() +- { } ++ AnyRegister() = default; ++ + explicit AnyRegister(Register gpr) { + code_ = gpr.code(); + } +@@ -156,7 +155,7 @@ + } + #endif + +- ValueOperand() {} ++ ValueOperand() = default; + }; + + // Registers to hold either either a typed or untyped value. +@@ -165,46 +164,25 @@ + // Type of value being stored. + MIRType type_; + +- // Space to hold either an AnyRegister or a ValueOperand. + union U { +- mozilla::AlignedStorage2 typed; +- mozilla::AlignedStorage2 value; ++ AnyRegister typed; ++ ValueOperand value; + } data; + +- AnyRegister& dataTyped() { +- MOZ_ASSERT(hasTyped()); +- return *data.typed.addr(); +- } +- ValueOperand& dataValue() { +- MOZ_ASSERT(hasValue()); +- return *data.value.addr(); +- } +- +- AnyRegister dataTyped() const { +- MOZ_ASSERT(hasTyped()); +- return *data.typed.addr(); +- } +- const ValueOperand& dataValue() const { +- MOZ_ASSERT(hasValue()); +- return *data.value.addr(); +- } +- + public: + +- TypedOrValueRegister() +- : type_(MIRType_None) +- {} ++ TypedOrValueRegister() = default; + + TypedOrValueRegister(MIRType type, AnyRegister reg) + : type_(type) + { +- dataTyped() = reg; ++ data.typed = reg; + } + + MOZ_IMPLICIT TypedOrValueRegister(ValueOperand value) + : type_(MIRType_Value) + { +- dataValue() = value; ++ data.value = value; + } + + MIRType type() const { +@@ -220,11 +198,13 @@ + } + + AnyRegister typedReg() const { +- return dataTyped(); ++ MOZ_ASSERT(hasTyped()); ++ return data.typed; + } + + ValueOperand valueReg() const { +- return dataValue(); ++ MOZ_ASSERT(hasValue()); ++ return data.value; + } + + AnyRegister scratchReg() { +@@ -240,19 +220,18 @@ + // Whether a constant value is being stored. + bool constant_; + +- // Space to hold either a Value or a TypedOrValueRegister. + union U { +- mozilla::AlignedStorage2 constant; +- mozilla::AlignedStorage2 reg; ++ Value constant; ++ TypedOrValueRegister reg; + } data; + + Value& dataValue() { + MOZ_ASSERT(constant()); +- return *data.constant.addr(); ++ return data.constant; + } + TypedOrValueRegister& dataReg() { + MOZ_ASSERT(!constant()); +- return *data.reg.addr(); ++ return data.reg; + } + + public: diff --git a/talimatname/genel/j/js38/mozjs38-copy-headers.patch b/talimatname/genel/j/js38/mozjs38-copy-headers.patch new file mode 100644 index 000000000..8c877b36d --- /dev/null +++ b/talimatname/genel/j/js38/mozjs38-copy-headers.patch @@ -0,0 +1,20 @@ +Tanım: Copy headers on install instead of symlinking +Author: Rico Tzschichholz +Forwarded: no +Last-Update: 2014-10-29 + +--- + +Index: b/python/mozbuild/mozbuild/backend/recursivemake.py +=================================================================== +--- a/python/mozbuild/mozbuild/backend/recursivemake.py ++++ b/python/mozbuild/mozbuild/backend/recursivemake.py +@@ -796,7 +796,7 @@ + return + + for source, dest, _ in self._walk_hierarchy(obj, exports): +- self._install_manifests['dist_include'].add_symlink(source, dest) ++ self._install_manifests['dist_include'].add_copy(source, dest) + + if not os.path.exists(source): + raise Exception('File listed in EXPORTS does not exist: %s' % source) diff --git a/talimatname/genel/j/js38/mozjs38-fix-tracelogger.patch b/talimatname/genel/j/js38/mozjs38-fix-tracelogger.patch new file mode 100644 index 000000000..6798d24a3 --- /dev/null +++ b/talimatname/genel/j/js38/mozjs38-fix-tracelogger.patch @@ -0,0 +1,603 @@ +# === Fix the SM38 tracelogger === +# This patch is a squashed version of several patches that were adapted +# to fix failing hunks. +# +# Applied in the following order, they are: +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1223767 +# Assertion failure: i < size_, at js/src/vm/TraceLoggingTypes.h:210 +# Also fix stop-information to make reduce.py work correctly. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1227914 +# Limit the memory tracelogger can take. +# This causes tracelogger to flush data to the disk regularly and prevents out of +# memory issues if a lot of data gets logged. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1155618 +# Fix tracelogger destructor that touches possibly uninitialised hash table. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1223636 +# Don't treat extraTextId as containing only extra ids. +# This fixes an assertion failure: id == nextTextId at js/src/vm/TraceLoggingGraph.cpp +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1227028 +# Fix when to keep the payload of a TraceLogger event. +# This fixes an assertion failure: textId < uint32_t(1 << 31) at js/src/vm/TraceLoggingGraph.h +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1266649 +# Handle failing to add to pointermap gracefully. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1280648 +# Don't cache based on pointers to movable GC things. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1224123 +# Fix the use of LastEntryId in tracelogger.h. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1231170 +# Use size in debugger instead of the current id to track last logged item. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1221844 +# Move TraceLogger_Invalidation to LOG_ITEM. +# Add some debug checks to logTimestamp. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1255766 +# Also mark resizing of memory. +# * https://bugzilla.mozilla.org/show_bug.cgi?id=1259403 +# Only increase capacity by multiples of 2. +# Always make sure there are 3 free slots for events. +# === + +diff --git a/js/src/jit-test/tests/tracelogger/bug1231170.js b/js/src/jit-test/tests/tracelogger/bug1231170.js +new file mode 100644 +index 0000000..023e93e +--- /dev/null ++++ b/js/src/jit-test/tests/tracelogger/bug1231170.js +@@ -0,0 +1,3 @@ ++var du = new Debugger(); ++if (typeof du.drainTraceLogger === "function") ++ du.drainTraceLogger(); +diff --git a/js/src/jit-test/tests/tracelogger/bug1266649.js b/js/src/jit-test/tests/tracelogger/bug1266649.js +new file mode 100644 +index 0000000..81ae7ad +--- /dev/null ++++ b/js/src/jit-test/tests/tracelogger/bug1266649.js +@@ -0,0 +1,10 @@ ++ ++var du = new Debugger(); ++if (typeof du.setupTraceLogger === "function" && ++ typeof oomTest === 'function') ++{ ++ du.setupTraceLogger({ ++ Scripts: true ++ }) ++ oomTest(() => function(){}); ++} +diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp +index 93e2fda..09049d6 100644 +--- a/js/src/jit/Ion.cpp ++++ b/js/src/jit/Ion.cpp +@@ -1055,6 +1055,8 @@ IonScript::Destroy(FreeOp* fop, IonScript* script) + + script->destroyCaches(); + script->unlinkFromRuntime(fop); ++ // Frees the potential event we have set. ++ script->traceLoggerScriptEvent_ = TraceLoggerEvent(); + fop->free_(script); + } + +diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp +index 26262fd..af7f313 100644 +--- a/js/src/vm/Debugger.cpp ++++ b/js/src/vm/Debugger.cpp +@@ -369,10 +369,10 @@ Debugger::Debugger(JSContext* cx, NativeObject* dbg) + objects(cx), + environments(cx), + #ifdef NIGHTLY_BUILD +- traceLoggerLastDrainedId(0), ++ traceLoggerLastDrainedSize(0), + traceLoggerLastDrainedIteration(0), + #endif +- traceLoggerScriptedCallsLastDrainedId(0), ++ traceLoggerScriptedCallsLastDrainedSize(0), + traceLoggerScriptedCallsLastDrainedIteration(0) + { + assertSameCompartment(cx, dbg); +@@ -3907,9 +3907,9 @@ Debugger::drainTraceLogger(JSContext* cx, unsigned argc, Value* vp) + size_t num; + TraceLoggerThread* logger = TraceLoggerForMainThread(cx->runtime()); + bool lostEvents = logger->lostEvents(dbg->traceLoggerLastDrainedIteration, +- dbg->traceLoggerLastDrainedId); ++ dbg->traceLoggerLastDrainedSize); + EventEntry* events = logger->getEventsStartingAt(&dbg->traceLoggerLastDrainedIteration, +- &dbg->traceLoggerLastDrainedId, ++ &dbg->traceLoggerLastDrainedSize, + &num); + + RootedObject array(cx, NewDenseEmptyArray(cx)); +@@ -4002,10 +4002,10 @@ Debugger::drainTraceLoggerScriptCalls(JSContext* cx, unsigned argc, Value* vp) + size_t num; + TraceLoggerThread* logger = TraceLoggerForMainThread(cx->runtime()); + bool lostEvents = logger->lostEvents(dbg->traceLoggerScriptedCallsLastDrainedIteration, +- dbg->traceLoggerScriptedCallsLastDrainedId); ++ dbg->traceLoggerScriptedCallsLastDrainedSize); + EventEntry* events = logger->getEventsStartingAt( + &dbg->traceLoggerScriptedCallsLastDrainedIteration, +- &dbg->traceLoggerScriptedCallsLastDrainedId, ++ &dbg->traceLoggerScriptedCallsLastDrainedSize, + &num); + + RootedObject array(cx, NewDenseEmptyArray(cx)); +diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h +index 8cac36a..c92d685 100644 +--- a/js/src/vm/Debugger.h ++++ b/js/src/vm/Debugger.h +@@ -314,10 +314,10 @@ class Debugger : private mozilla::LinkedListElement + * lost events. + */ + #ifdef NIGHTLY_BUILD +- uint32_t traceLoggerLastDrainedId; ++ uint32_t traceLoggerLastDrainedSize; + uint32_t traceLoggerLastDrainedIteration; + #endif +- uint32_t traceLoggerScriptedCallsLastDrainedId; ++ uint32_t traceLoggerScriptedCallsLastDrainedSize; + uint32_t traceLoggerScriptedCallsLastDrainedIteration; + + class FrameRange; +diff --git a/js/src/vm/TraceLogging.cpp b/js/src/vm/TraceLogging.cpp +index 6715b36..9766a6f 100644 +--- a/js/src/vm/TraceLogging.cpp ++++ b/js/src/vm/TraceLogging.cpp +@@ -131,7 +131,7 @@ TraceLoggerThread::init() + { + if (!pointerMap.init()) + return false; +- if (!extraTextId.init()) ++ if (!textIdPayloads.init()) + return false; + if (!events.init()) + return false; +@@ -185,10 +185,10 @@ TraceLoggerThread::~TraceLoggerThread() + graph = nullptr; + } + +- for (TextIdHashMap::Range r = extraTextId.all(); !r.empty(); r.popFront()) +- js_delete(r.front().value()); +- extraTextId.finish(); +- pointerMap.finish(); ++ if (textIdPayloads.initialized()) { ++ for (TextIdHashMap::Range r = textIdPayloads.all(); !r.empty(); r.popFront()) ++ js_delete(r.front().value()); ++ } + } + + bool +@@ -287,7 +287,7 @@ TraceLoggerThread::eventText(uint32_t id) + if (id < TraceLogger_Last) + return TLTextIdString(static_cast(id)); + +- TextIdHashMap::Ptr p = extraTextId.lookup(id); ++ TextIdHashMap::Ptr p = textIdPayloads.lookup(id); + MOZ_ASSERT(p); + + return p->value()->string(); +@@ -341,13 +341,15 @@ TraceLoggerThread::extractScriptDetails(uint32_t textId, const char** filename, + TraceLoggerEventPayload* + TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId textId) + { +- TextIdHashMap::AddPtr p = extraTextId.lookupForAdd(textId); +- if (p) ++ TextIdHashMap::AddPtr p = textIdPayloads.lookupForAdd(textId); ++ if (p) { ++ MOZ_ASSERT(p->value()->textId() == textId); // Sanity check. + return p->value(); ++ } + + TraceLoggerEventPayload* payload = js_new(textId, (char*)nullptr); + +- if (!extraTextId.add(p, textId, payload)) ++ if (!textIdPayloads.add(p, textId, payload)) + return nullptr; + + return payload; +@@ -357,8 +359,10 @@ TraceLoggerEventPayload* + TraceLoggerThread::getOrCreateEventPayload(const char* text) + { + PointerHashMap::AddPtr p = pointerMap.lookupForAdd((const void*)text); +- if (p) ++ if (p) { ++ MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. + return p->value(); ++ } + + size_t len = strlen(text); + char* str = js_pod_malloc(len + 1); +@@ -369,7 +373,7 @@ TraceLoggerThread::getOrCreateEventPayload(const char* text) + MOZ_ASSERT(ret == len); + MOZ_ASSERT(strlen(str) == len); + +- uint32_t textId = extraTextId.count() + TraceLogger_Last; ++ uint32_t textId = nextTextId; + + TraceLoggerEventPayload* payload = js_new(textId, str); + if (!payload) { +@@ -377,17 +381,19 @@ TraceLoggerThread::getOrCreateEventPayload(const char* text) + return nullptr; + } + +- if (!extraTextId.putNew(textId, payload)) { ++ if (!textIdPayloads.putNew(textId, payload)) { + js_delete(payload); + return nullptr; + } + +- if (!pointerMap.add(p, text, payload)) +- return nullptr; +- + if (graph.get()) + graph->addTextId(textId, str); + ++ nextTextId++; ++ ++ if (!pointerMap.add(p, text, payload)) ++ return nullptr; ++ + return payload; + } + +@@ -407,9 +413,14 @@ TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId type, const char* f + if (!traceLoggerState->isTextIdEnabled(type)) + return getOrCreateEventPayload(type); + +- PointerHashMap::AddPtr p = pointerMap.lookupForAdd(ptr); +- if (p) +- return p->value(); ++ PointerHashMap::AddPtr p; ++ if (ptr) { ++ p = pointerMap.lookupForAdd(ptr); ++ if (p) { ++ MOZ_ASSERT(p->value()->textId() < nextTextId); // Sanity check. ++ return p->value(); ++ } ++ } + + // Compute the length of the string to create. + size_t lenFilename = strlen(filename); +@@ -428,24 +439,28 @@ TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId type, const char* f + MOZ_ASSERT(ret == len); + MOZ_ASSERT(strlen(str) == len); + +- uint32_t textId = extraTextId.count() + TraceLogger_Last; ++ uint32_t textId = nextTextId; + TraceLoggerEventPayload* payload = js_new(textId, str); + if (!payload) { + js_free(str); + return nullptr; + } + +- if (!extraTextId.putNew(textId, payload)) { ++ if (!textIdPayloads.putNew(textId, payload)) { + js_delete(payload); + return nullptr; + } + +- if (!pointerMap.add(p, ptr, payload)) +- return nullptr; +- + if (graph.get()) + graph->addTextId(textId, str); + ++ nextTextId++; ++ ++ if (ptr) { ++ if (!pointerMap.add(p, ptr, payload)) ++ return nullptr; ++ } ++ + return payload; + } + +@@ -453,14 +468,14 @@ TraceLoggerEventPayload* + TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId type, JSScript* script) + { + return getOrCreateEventPayload(type, script->filename(), script->lineno(), script->column(), +- script); ++ nullptr); + } + + TraceLoggerEventPayload* + TraceLoggerThread::getOrCreateEventPayload(TraceLoggerTextId type, + const JS::ReadOnlyCompileOptions& script) + { +- return getOrCreateEventPayload(type, script.filename(), script.lineno, script.column, &script); ++ return getOrCreateEventPayload(type, script.filename(), script.lineno, script.column, nullptr); + } + + void +@@ -485,7 +500,7 @@ TraceLoggerThread::startEvent(uint32_t id) + if (!traceLoggerState->isTextIdEnabled(id)) + return; + +- logTimestamp(id); ++ log(id); + } + + void +@@ -510,7 +525,7 @@ TraceLoggerThread::stopEvent(uint32_t id) + if (!traceLoggerState->isTextIdEnabled(id)) + return; + +- logTimestamp(TraceLogger_Stop); ++ log(TraceLogger_Stop); + } + + void +@@ -522,23 +537,57 @@ TraceLoggerThread::logTimestamp(TraceLoggerTextId id) + void + TraceLoggerThread::logTimestamp(uint32_t id) + { ++ MOZ_ASSERT(id > TraceLogger_LastTreeItem && id < TraceLogger_Last); ++ log(id); ++} ++ ++void ++TraceLoggerThread::log(uint32_t id) ++{ + if (enabled == 0) + return; + + MOZ_ASSERT(traceLoggerState); +- if (!events.ensureSpaceBeforeAdd()) { ++ ++ // We request for 3 items to add, since if we don't have enough room ++ // we record the time it took to make more place. To log this information ++ // we need 2 extra free entries. ++ if (!events.hasSpaceForAdd(3)) { + uint64_t start = rdtsc() - traceLoggerState->startupTime; + +- if (graph.get()) +- graph->log(events); ++ if (!events.ensureSpaceBeforeAdd(3)) { ++ if (graph.get()) ++ graph->log(events); ++ ++ iteration_++; ++ events.clear(); ++ ++ // Remove the item in the pointerMap for which the payloads ++ // have no uses anymore ++ for (PointerHashMap::Enum e(pointerMap); !e.empty(); e.popFront()) { ++ if (e.front().value()->uses() != 0) ++ continue; ++ ++ TextIdHashMap::Ptr p = textIdPayloads.lookup(e.front().value()->textId()); ++ MOZ_ASSERT(p); ++ textIdPayloads.remove(p); ++ ++ e.removeFront(); ++ } + +- iteration_++; +- events.clear(); ++ // Free all payloads that have no uses anymore. ++ for (TextIdHashMap::Enum e(textIdPayloads); !e.empty(); e.popFront()) { ++ if (e.front().value()->uses() == 0) { ++ js_delete(e.front().value()); ++ e.removeFront(); ++ } ++ } ++ } + + // Log the time it took to flush the events as being from the + // Tracelogger. + if (graph.get()) { +- MOZ_ASSERT(events.capacity() > 2); ++ MOZ_ASSERT(events.hasSpaceForAdd(2)); + EventEntry& entryStart = events.pushUninitialized(); + entryStart.time = start; + entryStart.textId = TraceLogger_Internal; +@@ -548,13 +597,6 @@ TraceLoggerThread::logTimestamp(uint32_t id) + entryStop.textId = TraceLogger_Stop; + } + +- // Free all TextEvents that have no uses anymore. +- for (TextIdHashMap::Enum e(extraTextId); !e.empty(); e.popFront()) { +- if (e.front().value()->uses() == 0) { +- js_delete(e.front().value()); +- e.removeFront(); +- } +- } + } + + uint64_t time = rdtsc() - traceLoggerState->startupTime; +@@ -956,3 +998,16 @@ TraceLoggerEvent::~TraceLoggerEvent() + if (payload_) + payload_->release(); + } ++ ++TraceLoggerEvent& ++TraceLoggerEvent::operator=(const TraceLoggerEvent& other) ++{ ++ if (hasPayload()) ++ payload()->release(); ++ if (other.hasPayload()) ++ other.payload()->use(); ++ ++ payload_ = other.payload_; ++ ++ return *this; ++} +diff --git a/js/src/vm/TraceLogging.h b/js/src/vm/TraceLogging.h +index a124dcb..91a1eb0 100644 +--- a/js/src/vm/TraceLogging.h ++++ b/js/src/vm/TraceLogging.h +@@ -110,6 +110,9 @@ class TraceLoggerEvent { + bool hasPayload() const { + return !!payload_; + } ++ ++ TraceLoggerEvent& operator=(const TraceLoggerEvent& other); ++ TraceLoggerEvent(const TraceLoggerEvent& event) = delete; + }; + + /** +@@ -130,6 +133,10 @@ class TraceLoggerEventPayload { + uses_(0) + { } + ++ ~TraceLoggerEventPayload() { ++ MOZ_ASSERT(uses_ == 0); ++ } ++ + uint32_t textId() { + return textId_; + } +@@ -166,7 +173,8 @@ class TraceLoggerThread + mozilla::UniquePtr graph; + + PointerHashMap pointerMap; +- TextIdHashMap extraTextId; ++ TextIdHashMap textIdPayloads; ++ uint32_t nextTextId; + + ContinuousSpace events; + +@@ -181,6 +189,7 @@ class TraceLoggerThread + : enabled(0), + failed(false), + graph(), ++ nextTextId(TraceLogger_Last), + iteration_(0), + top(nullptr) + { } +@@ -195,22 +204,22 @@ class TraceLoggerThread + bool enable(JSContext* cx); + bool disable(); + +- // Given the previous iteration and lastEntryId, return an array of events ++ // Given the previous iteration and size, return an array of events + // (there could be lost events). At the same time update the iteration and +- // lastEntry and gives back how many events there are. +- EventEntry* getEventsStartingAt(uint32_t* lastIteration, uint32_t* lastEntryId, size_t* num) { ++ // size and gives back how many events there are. ++ EventEntry* getEventsStartingAt(uint32_t* lastIteration, uint32_t* lastSize, size_t* num) { + EventEntry* start; + if (iteration_ == *lastIteration) { +- MOZ_ASSERT(events.lastEntryId() >= *lastEntryId); +- *num = events.lastEntryId() - *lastEntryId; +- start = events.data() + *lastEntryId + 1; ++ MOZ_ASSERT(*lastSize <= events.size()); ++ *num = events.size() - *lastSize; ++ start = events.data() + *lastSize; + } else { +- *num = events.lastEntryId() + 1; ++ *num = events.size(); + start = events.data(); + } + + *lastIteration = iteration_; +- *lastEntryId = events.lastEntryId(); ++ *lastSize = events.size(); + return start; + } + +@@ -220,16 +229,16 @@ class TraceLoggerThread + const char** lineno, size_t* lineno_len, const char** colno, + size_t* colno_len); + +- bool lostEvents(uint32_t lastIteration, uint32_t lastEntryId) { ++ bool lostEvents(uint32_t lastIteration, uint32_t lastSize) { + // If still logging in the same iteration, there are no lost events. + if (lastIteration == iteration_) { +- MOZ_ASSERT(lastEntryId <= events.lastEntryId()); ++ MOZ_ASSERT(lastSize <= events.size()); + return false; + } + +- // When proceeded to the next iteration and lastEntryId points to +- // the maximum capacity there are no logs that are lost. +- if (lastIteration + 1 == iteration_ && lastEntryId == events.capacity()) ++ // If we are in a consecutive iteration we are only sure we didn't lose any events, ++ // when the lastSize equals the maximum size 'events' can get. ++ if (lastIteration == iteration_ - 1 && lastSize == events.maxSize()) + return false; + + return true; +@@ -268,6 +277,7 @@ class TraceLoggerThread + void stopEvent(uint32_t id); + private: + void stopEvent(); ++ void log(uint32_t id); + + public: + static unsigned offsetOfEnabled() { +diff --git a/js/src/vm/TraceLoggingGraph.cpp b/js/src/vm/TraceLoggingGraph.cpp +index d1b7f2e..a4eb273 100644 +--- a/js/src/vm/TraceLoggingGraph.cpp ++++ b/js/src/vm/TraceLoggingGraph.cpp +@@ -276,7 +276,7 @@ TraceLoggerGraph::flush() + if (bytesWritten < tree.size()) + return false; + +- treeOffset += tree.lastEntryId(); ++ treeOffset += tree.size(); + tree.clear(); + } + +@@ -359,7 +359,7 @@ TraceLoggerGraph::startEventInternal(uint32_t id, uint64_t timestamp) + + if (parent.lastChildId() == 0) { + MOZ_ASSERT(!entry.hasChildren()); +- MOZ_ASSERT(parent.treeId() == tree.lastEntryId() + treeOffset); ++ MOZ_ASSERT(parent.treeId() == treeOffset + tree.size() - 1); + + if (!updateHasChildren(parent.treeId())) + return false; +diff --git a/js/src/vm/TraceLoggingTypes.h b/js/src/vm/TraceLoggingTypes.h +index f1c9d0c..10b76d6 100644 +--- a/js/src/vm/TraceLoggingTypes.h ++++ b/js/src/vm/TraceLoggingTypes.h +@@ -21,7 +21,6 @@ + _(Internal) \ + _(Interpreter) \ + _(InlinedScripts) \ +- _(Invalidation) \ + _(IonCompilation) \ + _(IonCompilationPaused) \ + _(IonLinking) \ +@@ -60,6 +59,7 @@ + + #define TRACELOGGER_LOG_ITEMS(_) \ + _(Bailout) \ ++ _(Invalidation) \ + _(Disable) \ + _(Enable) \ + _(Stop) +@@ -130,6 +130,9 @@ class ContinuousSpace { + uint32_t size_; + uint32_t capacity_; + ++ // The maximum amount of ram memory a continuous space structure can take (in bytes). ++ static const uint32_t LIMIT = 200 * 1024 * 1024; ++ + public: + ContinuousSpace () + : data_(nullptr) +@@ -151,6 +154,10 @@ class ContinuousSpace { + data_ = nullptr; + } + ++ static uint32_t maxSize() { ++ return LIMIT / sizeof(T); ++ } ++ + T* data() { + return data_; + } +@@ -187,11 +194,14 @@ class ContinuousSpace { + if (hasSpaceForAdd(count)) + return true; + ++ // Limit the size of a continuous buffer. ++ if (size_ + count > maxSize()) ++ return false; ++ + uint32_t nCapacity = capacity_ * 2; +- if (size_ + count > nCapacity) +- nCapacity = size_ + count; +- T* entries = (T*) js_realloc(data_, nCapacity * sizeof(T)); ++ nCapacity = (nCapacity < maxSize()) ? nCapacity : maxSize(); + ++ T* entries = (T*) js_realloc(data_, nCapacity * sizeof(T)); + if (!entries) + return false; + diff --git a/talimatname/genel/j/js38/mozjs38-install-name.patch b/talimatname/genel/j/js38/mozjs38-install-name.patch new file mode 100644 index 000000000..b6f25b266 --- /dev/null +++ b/talimatname/genel/j/js38/mozjs38-install-name.patch @@ -0,0 +1,11 @@ +--- a/config/rules.mk 2016-11-09 23:51:17.000000000 -0800 ++++ b/config/rules.mk 2016-11-09 23:54:23.000000000 -0800 +@@ -393,7 +393,7 @@ + ifdef IS_COMPONENT + EXTRA_DSO_LDOPTS += -bundle + else +-EXTRA_DSO_LDOPTS += -dynamiclib -install_name @executable_path/$(SHARED_LIBRARY) -compatibility_version 1 -current_version 1 -single_module ++EXTRA_DSO_LDOPTS += -dynamiclib -install_name $(abspath $(prefix))/lib/$(SHARED_LIBRARY) -compatibility_version 1 -current_version 1 -single_module + endif + endif + endif diff --git a/talimatname/genel/j/js38/talimat b/talimatname/genel/j/js38/talimat new file mode 100644 index 000000000..7312e9fcd --- /dev/null +++ b/talimatname/genel/j/js38/talimat @@ -0,0 +1,37 @@ +# Tanım: JavaScript tercüman ve kütüphaneleri - Sürüm 38 +# URL: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Releases/38 +# Paketçi: milisarge +# Gerekler: nspr icu libffi python zip + +isim=js38 +surum=38.8.0 +devir=2 +kaynak=(https://ftp.mozilla.org/pub/firefox/releases/38.8.0esr/source/firefox-38.8.0esr.source.tar.bz2 + mozjs38-fix-tracelogger.patch + mozjs38-install-name.patch + mozjs38-copy-headers.patch + mozjs38-1269317.patch) + +derle() { + cd mozilla-esr38 + patch -Np1 -i $SRC/mozjs38-fix-tracelogger.patch + patch -Np1 -i $SRC/mozjs38-install-name.patch + patch -Np1 -i $SRC/mozjs38-copy-headers.patch + patch -Np1 -i $SRC/mozjs38-1269317.patch + unset CPPFLAGS + CXXFLAGS+=' -fno-delete-null-pointer-checks -fpermissive -fno-tree-vrp -fno-strict-aliasing' + CFLAGS+=' -fno-delete-null-pointer-checks -fpermissive -fno-tree-vrp -fno-strict-aliasing' + export PYTHON=/usr/bin/python2 + export SHELL=/bin/sh + + cd $SRC/mozilla-esr38/js/src + ./configure --prefix=/usr --with-system-nspr --enable-system-ffi \ + --with-system-zlib --with-system-icu --with-intl-api --enable-ctypes \ + --enable-threadsafe --enable-system-ffi --enable-shared-js --enable-gcgenerational --disable-optimize --enable-pie + + SHELL=/bin/sh make || SHELL=/bin/sh make + SHELL=/bin/sh make DESTDIR="$PKG" install + rm -f "$PKG"/usr/lib/*.ajs + find "$PKG"/usr/{lib/pkgconfig,include} -type f -exec chmod -x {} + + mv $PKG/usr/lib/pkgconfig/js.pc $PKG/usr/lib/pkgconfig/mozjs-38.pc +} diff --git a/talimatname/genel/j/js52/mozjs52-disable-mozglue.patch b/talimatname/genel/j/js52/mozjs52-disable-mozglue.patch new file mode 100644 index 000000000..8355cf4b0 --- /dev/null +++ b/talimatname/genel/j/js52/mozjs52-disable-mozglue.patch @@ -0,0 +1,66 @@ +From 7e6d628456af3e99ebcb9a01a27e1461585082a4 Mon Sep 17 00:00:00 2001 +From: Till Schneidereit +Date: Thu, 1 Oct 2015 12:59:09 +0200 +Subject: [PATCH] Disable MOZ_GLUE_IN_PROGRAM in stand-alone builds on all + platforms + +Otherwise, build fails not being able to find HashBytes. + +Patch ported forward to mozjs52 by Philip Chimento +. + +https://bugzilla.mozilla.org/show_bug.cgi?id=1176787 +--- + js/src/old-configure.in | 23 ++++++++++++++--------- + mozglue/build/moz.build | 2 +- + 2 files changed, 15 insertions(+), 10 deletions(-) + +diff --git a/js/src/old-configure.in b/js/src/old-configure.in +index 1c5c9e21..ff0617e3 100644 +--- a/js/src/old-configure.in ++++ b/js/src/old-configure.in +@@ -1623,16 +1623,21 @@ dnl ======================================================== + dnl = Enable jemalloc + dnl ======================================================== + +-case "${OS_TARGET}" in +-Android|WINNT|Darwin) ++dnl In stand-alone builds we always only want to link executables against mozglue. ++if test "$JS_STANDALONE"; then + MOZ_GLUE_IN_PROGRAM= +- ;; +-*) +- dnl On !Android !Windows !OSX, we only want to link executables against mozglue +- MOZ_GLUE_IN_PROGRAM=1 +- AC_DEFINE(MOZ_GLUE_IN_PROGRAM) +- ;; +-esac ++else ++ case "${OS_TARGET}" in ++ Android|WINNT|Darwin) ++ MOZ_GLUE_IN_PROGRAM= ++ ;; ++ *) ++ dnl On !Android !Windows !OSX, we only want to link executables against mozglue ++ MOZ_GLUE_IN_PROGRAM=1 ++ AC_DEFINE(MOZ_GLUE_IN_PROGRAM) ++ ;; ++ esac ++fi + + if test "$MOZ_MEMORY"; then + if test "x$MOZ_DEBUG" = "x1"; then +diff --git a/mozglue/build/moz.build b/mozglue/build/moz.build +index d2897477..e3be5a2b 100644 +--- a/mozglue/build/moz.build ++++ b/mozglue/build/moz.build +@@ -6,7 +6,7 @@ + + # Build mozglue as a shared lib on Windows, OSX and Android. + # If this is ever changed, update MOZ_SHARED_MOZGLUE in browser/installer/Makefile.in +-if CONFIG['OS_TARGET'] in ('WINNT', 'Darwin', 'Android'): ++if CONFIG['OS_TARGET'] in ('WINNT', 'Darwin', 'Android') and not CONFIG['JS_STANDALONE']: + SharedLibrary('mozglue') + else: + Library('mozglue') + diff --git a/talimatname/genel/j/js52/talimat b/talimatname/genel/j/js52/talimat new file mode 100644 index 000000000..8a5ab02ac --- /dev/null +++ b/talimatname/genel/j/js52/talimat @@ -0,0 +1,37 @@ +# Tanım: JavaScript interpreter and libraries +# URL: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +# Paketçi: milisarge +# Gerekler: python zip autoconf2 nspr +# Grup: + +isim=js52 +surum=52.3.0esr +devir=1 +kaynak=(https://ftp.mozilla.org/pub/firefox/releases/52.3.0esr/source/firefox-52.3.0esr.source.tar.xz + mozjs52-disable-mozglue.patch) + +derle() { + cd firefox-$surum + # Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1236085 + patch -p1 -i ../mozjs52-disable-mozglue.patch + cd js/src + export SHELL=/bin/sh + rm configure + autoconf-2.13 + rm -r editline + rm -r ctypes/libffi + [[ -z "$MOZJS_DEBUG" ]] || DBG_OPTIONS='--enable-debug --disable-optimize' + cd ${SRC}/firefox-$surum/js/src + # spidermonkey is broken with ICU 59 and it won't be fix on FF52 + # https://bugzilla.mozilla.org/show_bug.cgi?id=1353650 + ./configure --prefix=/usr --with-system-nspr \ + --enable-readline $DBG_OPTIONS + + SHELL=/bin/sh make -j1 + #cd "$SRC/firefox-$surum/js/src/tests" + #python2 jstests.py ../js/src/js + #cd "$SRC/firefox-$surum/js/src/jit-test" + #python2 jit_test.py ../js/src/js + SHELL=/bin/sh make -j1 DESTDIR="$PKG" install + install -Dm644 mozglue/build/libmozglue.a "$PKG"/usr/lib/libmozglue.a +} diff --git a/talimatname/genel/j/json-c/talimat b/talimatname/genel/j/json-c/talimat new file mode 100644 index 000000000..66131c265 --- /dev/null +++ b/talimatname/genel/j/json-c/talimat @@ -0,0 +1,18 @@ +# Tanım: C'de bir JSON uygulaması +# URL: https://github.com/json-c/json-c/wiki +# Paketçi: milisarge +# Gerekler: + +isim=json-c +surum=0.12 +devir=1 +kaynak=(https://s3.amazonaws.com/${isim}_releases/releases/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + CFLAGS="$CFLAGS -Wno-error" + ./configure --prefix=/usr \ + --disable-static + make check + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/j/json-glib/talimat b/talimatname/genel/j/json-glib/talimat new file mode 100644 index 000000000..7fd6a77b5 --- /dev/null +++ b/talimatname/genel/j/json-glib/talimat @@ -0,0 +1,16 @@ +# Tanım: JavaScript Object Notation (JSON) için serileştirme ve serileştirmeden çıkarma desteği sağlayan bir kütüphanedir. +# URL: http://live.gnome.org/JsonGlib +# Paketçi: milisarge +# Gerekler: gobject-introspection + +isim=json-glib +surum=1.2.8 +devir=1 +kaynak=( http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz ) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/j/jsoncpp/talimat b/talimatname/genel/j/jsoncpp/talimat new file mode 100644 index 000000000..887db1567 --- /dev/null +++ b/talimatname/genel/j/jsoncpp/talimat @@ -0,0 +1,28 @@ +# Tanım: JSON C++ kütüphanesi +# URL: http://jsoncpp.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=jsoncpp +surum=1.8.4 +devir=1 +kaynak=(https://github.com/open-source-parsers/$isim/archive/$surum.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd ${isim}-${surum} + mkdir -p build + #python3 doxybuild.py --with-dot + cd build + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_STATIC_LIBS=ON \ + .. + make + cd .. + make -C build DESTDIR="${PKG}" install + install -Dm 644 LICENSE -t "${PKG}/usr/share/licenses/${isim}" +} diff --git a/talimatname/genel/j/jumpnbump/desktop.patch b/talimatname/genel/j/jumpnbump/desktop.patch new file mode 100644 index 000000000..7de78a86b --- /dev/null +++ b/talimatname/genel/j/jumpnbump/desktop.patch @@ -0,0 +1,14 @@ +--- jumpnbump-menu.desktop.orig 2017-05-21 20:14:40.172306054 +0200 ++++ jumpnbump-menu.desktop 2017-05-21 20:15:00.565445873 +0200 +@@ -1,10 +1,10 @@ + [Desktop Entry] +-Name=Jump 'n Bump Menu ++Name=Jump 'n Bump +-Comment=Level selection and config menu for the Jump 'n Bump game ++Comment=Jump on your opponents to make them explode + GenericName=Launcher for Jump 'n Bump + Exec=jumpnbump-menu + Icon=jumpnbump + Terminal=false + Type=Application + Categories=Game;ArcadeGame; diff --git a/talimatname/genel/j/jumpnbump/menu.patch b/talimatname/genel/j/jumpnbump/menu.patch new file mode 100644 index 000000000..0fa3ab4e1 --- /dev/null +++ b/talimatname/genel/j/jumpnbump/menu.patch @@ -0,0 +1,31 @@ +--- jumpnbump_menu.py.pre.orig 2017-05-21 20:06:53.393232483 +0200 ++++ jumpnbump_menu.py.pre 2017-05-21 20:10:36.387911904 +0200 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python2 + + # Author: Martin Willemoes Hansen + # License: Gnu GPL +@@ -147,11 +147,8 @@ + + def get_level(): + level = [] +- if (mirror.get_active()): +- level.append('-mirror') +- else: +- level.append('-dat') +- level.append(choosen_level) ++ level.append('-dat') ++ level.append(choosen_level) + + return level + +@@ -224,6 +221,8 @@ + noflies = gui.get_widget('noflies') + withmusic = gui.get_widget('withmusic') + image = gui.get_widget('image') ++ mainwindow = gui.get_widget('main') ++ mainwindow.set_icon_from_file('/usr/share/icons/jumpnbump.png') + + gui.signal_autoconnect({'standalone_mode': standalone_mode, + 'client_mode': client_mode, diff --git a/talimatname/genel/j/jumpnbump/talimat b/talimatname/genel/j/jumpnbump/talimat new file mode 100644 index 000000000..b94f925da --- /dev/null +++ b/talimatname/genel/j/jumpnbump/talimat @@ -0,0 +1,22 @@ +# Tanım: Çok oyunculu tavşan oyunu +# URL: https://github.com/MCMic/jumpnbump +# Paketçi: milisarge +# Gerekler: sdl2 sdl2-mixer sdl2_net python-gtk + +isim=jumpnbump +surum=1.60 +devir=1 +kaynak=(https://gitlab.com/LibreGames/jumpnbump/uploads/9f3a356c52f433e3af10f1ef800fce5d/jumpnbump-$surum.tar.xz + menu.patch + desktop.patch) + +derle() { + cd $SRC/${isim}-${surum}/menu + patch -p0 < $SRC/menu.patch || return 1 + cd "${SRC}/${isim}-${surum}/" + make -j1 PREFIX=/usr + make PREFIX="${PKG}/usr/" install + cd ${PKG}/usr/share/applications/ + rm "jumpnbump.desktop" + patch -p0 < ${SRC}/desktop.patch || return 1 +} diff --git a/talimatname/genel/j/junit/talimat b/talimatname/genel/j/junit/talimat new file mode 100644 index 000000000..abd0c2220 --- /dev/null +++ b/talimatname/genel/j/junit/talimat @@ -0,0 +1,24 @@ +# Tanım: JUnit paketi, tekrarlanabilir testler yazmak ve çalıştırmak için basit, açık kaynaklı bir çerçeve içerir. Birim sınama çerçeveleri için xUnit mimarisinin bir örneğidir. JUnit özellikleri beklenen sonuçları test etmek için iddialar, ortak test verilerini paylaşmak için test fikstürleri ve testler çalıştırmak için test koşucuları içerir. +# URL: http://junit.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: apache-ant unzip + +isim=junit +surum=4.12 +devir=1 +kaynak=(https://github.com/junit-team/junit4/releases/download/r4.12/junit-4.12.jar + https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/hamcrest/hamcrest-1.3.tgz) + +derle() { + cd hamcrest-1.3 + install -dm755 $PKG/usr/share/java/hamcrest + for j in core library generator integration; do + cp hamcrest-${j}-1.3.jar $PKG/usr/share/java/hamcrest/${j}-1.3.jar + ln -s ${j}-1.3.jar $PKG/usr/share/java/hamcrest/${j}.jar + ln -s hamcrest/${j}-1.3.jar $PKG/usr/share/java/hamcrest-${j}.jar + done + cd .. + + install -D -m 644 $SRC/$isim-$surum.jar $PKG/usr/share/java/$isim-$surum.jar + ln -s $isim-$surum.jar $PKG/usr/share/java/$isim.jar +} diff --git a/talimatname/genel/j/jwm/jwm-tr.po b/talimatname/genel/j/jwm/jwm-tr.po new file mode 100644 index 000000000..b47551592 --- /dev/null +++ b/talimatname/genel/j/jwm/jwm-tr.po @@ -0,0 +1,449 @@ +msgid "" +msgstr "" +"Project-Id-Version: jwm 2.3.7\n" +"Report-Msgid-Bugs-To: cihanalk@gmail.com\n" +"POT-Creation-Date: 2017-07-22 00:02+0000\n" +"PO-Revision-Date: 2013-03-11 14:25+0100\n" +"Last-Translator: Cihan Alkan \n" +"Language-Team: Turkish\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/action.c:44 +#, c-format +msgid "invalid action: \"%s\"" +msgstr "geçersiz eylem: \"%s\"" + +#: src/action.c:211 +#, c-format +msgid "action: root menu \"%s\" not defined" +msgstr "" + +#: src/background.c:137 +msgid "no value specified for background" +msgstr "arka plan için herhangi bir değer belirtilmemiş" + +#: src/background.c:149 +#, c-format +msgid "invalid background type: \"%s\"" +msgstr "geçersiz arkaplan türü: \"%s\"" + +#: src/background.c:294 +#, c-format +msgid "background image not found: \"%s\"" +msgstr "" + +#: src/client.c:905 +msgid "Kill this window?" +msgstr "" + +#: src/client.c:906 +msgid "This may cause data to be lost!" +msgstr "Bu verilerin kaybolmasına neden olabilir!" + +#: src/command.c:138 src/main.c:221 +#, c-format +msgid "exec failed: (%s) %s" +msgstr "" + +#: src/confirm.c:69 +msgid "OK" +msgstr "Tamam" + +#: src/confirm.c:74 +msgid "Cancel" +msgstr "İptal" + +#: src/confirm.c:308 +msgid "Confirm" +msgstr "Onayla" + +#: src/desktop.c:336 +msgid "empty Desktops Name tag" +msgstr "" + +#: src/dock.c:151 +msgid "only one Dock allowed" +msgstr "sadece bir Dock'a izin verilir" + +#: src/dock.c:232 +msgid "could not acquire system tray selection" +msgstr "sistem tepsisi seçimini alamadı" + +#: src/error.c:22 +#, c-format +msgid "JWM: error: " +msgstr "JWM: hata: " + +#: src/error.c:51 +#, c-format +msgid "JWM: warning: " +msgstr "JWM: uyarı: " + +#: src/error.c:77 +msgid "display is already managed" +msgstr "ekran zaten yönetiliyor" + +#: src/font.c:109 src/font.c:126 +#, c-format +msgid "could not load font: %s" +msgstr "" + +#: src/font.c:116 src/font.c:133 +#, c-format +msgid "could not load the default font: %s" +msgstr "" + +#: src/font.c:315 +msgid "empty Font tag" +msgstr "" + +#: src/group.c:115 +msgid "invalid group class" +msgstr "geçersiz grup sınıfı" + +#: src/group.c:126 +msgid "invalid group name" +msgstr "geçersiz grup adı" + +#: src/group.c:287 +#, c-format +msgid "invalid group desktop: %d" +msgstr "" + +#: src/image.c:220 +#, c-format +msgid "could not create read struct for PNG image: %s" +msgstr "" + +#: src/image.c:233 +#, c-format +msgid "error reading PNG image: %s" +msgstr "" + +#: src/image.c:241 +#, c-format +msgid "could not create info struct for PNG image: %s" +msgstr "" + +#: src/key.c:318 +msgid "Specified KeySym is not defined for any KeyCode" +msgstr "" + +#: src/key.c:326 +#, c-format +msgid "modifier not found for keysym 0x%0x" +msgstr "" + +#: src/key.c:356 +#, c-format +msgid "invalid modifier: \"%c\"" +msgstr "" + +#: src/key.c:371 +#, c-format +msgid "invalid key symbol: \"%s\"" +msgstr "" + +#: src/key.c:452 +msgid "neither key nor keycode specified for Key" +msgstr "" + +#: src/key.c:467 +#, c-format +msgid "key binding: root menu \"%s\" not defined" +msgstr "" + +#: src/lex.c:201 +#, c-format +msgid "%s[%u]: close tag \"%s\" does not match open tag \"%s\"" +msgstr "" + +#: src/lex.c:207 +#, c-format +msgid "%s[%u]: unexpected and invalid close tag" +msgstr "" + +#: src/lex.c:213 +#, c-format +msgid "%s[%u]: close tag \"%s\" without open tag" +msgstr "" + +#: src/lex.c:216 +#, c-format +msgid "%s[%u]: invalid close tag" +msgstr "" + +#: src/lex.c:234 +#, c-format +msgid "%s[%u]: invalid open tag" +msgstr "" + +#: src/lex.c:250 +#, c-format +msgid "%s[%u]: invalid tag" +msgstr "" + +#: src/lex.c:308 +#, c-format +msgid "%s[%u]: unexpected text: \"%s\"" +msgstr "" + +#: src/lex.c:367 +#, c-format +msgid "%s[%d]: invalid entity: \"%.8s\"" +msgstr "" + +#: src/lex.c:473 src/parse.c:1893 +msgid "out of memory" +msgstr "bellek taştı" + +#: src/parse.c:228 +#, c-format +msgid "could not open %s or %s" +msgstr "" + +#: src/parse.c:246 +#, c-format +msgid "include depth (%d) exceeded" +msgstr "" + +#: src/parse.c:384 +#, c-format +msgid "invalid start tag: %s" +msgstr "" + +#: src/parse.c:774 +#, c-format +msgid "invalid include: %s" +msgstr "" + +#: src/parse.c:824 +msgid "no action specified for Key" +msgstr "" + +#: src/parse.c:847 +#, c-format +msgid "invalid Key action: \"%s\"" +msgstr "" + +#: src/parse.c:871 +#, c-format +msgid "invalid text alignment: \"%s\"" +msgstr "" + +#: src/parse.c:957 +msgid "no include file specified" +msgstr "" + +#: src/parse.c:967 +#, c-format +msgid "could not process include: %s" +msgstr "" + +#: src/parse.c:971 +#, c-format +msgid "could not open included file: %s" +msgstr "" + +#: src/parse.c:1611 +#, c-format +msgid "invalid value for 'enabled': \"%s\"" +msgstr "" + +#: src/parse.c:1752 +#, c-format +msgid "invalid Group Option: %s" +msgstr "" + +#: src/parse.c:1767 +#, c-format +msgid "invalid decorations: %s" +msgstr "" + +#: src/parse.c:1829 +#, c-format +msgid "%s is empty" +msgstr "%s boş" + +#: src/parse.c:1836 +#, c-format +msgid "invalid %s: \"%s\"" +msgstr "geçersiz %s: \"%s\"" + +#: src/parse.c:1854 +#, c-format +msgid "invalid value for %s: \"%s\"" +msgstr "" + +#: src/parse.c:1880 +#, c-format +msgid "could not read file: %s" +msgstr "" + +#: src/parse.c:1967 src/parse.c:1984 +msgid "no value specified" +msgstr "" + +#: src/parse.c:1972 +#, c-format +msgid "invalid setting: %s" +msgstr "" + +#: src/parse.c:1989 +#, c-format +msgid "invalid opacity: %s" +msgstr "" + +#: src/parse.c:2010 +#, c-format +msgid "invalid layer: %s" +msgstr "" + +#: src/parse.c:2031 +#, c-format +msgid "invalid tag in %s: %s" +msgstr "" + +#: src/parse.c:2052 +msgid "configuration error" +msgstr "Yapılandırma hatası" + +#: src/root.c:131 +#, c-format +msgid "invalid root menu specified: \"%c\"" +msgstr "" + +#: src/root.c:223 +msgid "Exit JWM" +msgstr "JWM Çıkış" + +#: src/root.c:224 +msgid "Are you sure?" +msgstr "Emin misiniz?" + +#: src/swallow.c:85 +msgid "cannot swallow a client with no name" +msgstr "" + +#: src/taskbar.c:444 src/winmenu.c:48 +msgid "Close" +msgstr "Kapat" + +#: src/taskbar.c:451 src/winmenu.c:66 +msgid "Minimize" +msgstr "" + +#: src/taskbar.c:458 src/winmenu.c:95 src/winmenu.c:97 src/winmenu.c:99 +#: src/winmenu.c:106 +msgid "Restore" +msgstr "" + +#: src/taskbar.c:465 src/winmenu.c:179 +msgid "Send To" +msgstr "Gönder" + +#: src/taskbar.c:961 +#, c-format +msgid "invalid maxwidth for TaskList: %s" +msgstr "" + +#: src/taskbar.c:975 +#, c-format +msgid "invalid height for TaskList: %s" +msgstr "" + +#: src/traybutton.c:89 +#, c-format +msgid "could not load tray icon: \"%s\"" +msgstr "" + +#: src/traybutton.c:130 +msgid "no icon or label for TrayButton" +msgstr "" + +#: src/tray.c:1064 +#, c-format +msgid "invalid tray layout: \"%s\"" +msgstr "" + +#: src/tray.c:1102 +#, c-format +msgid "invalid tray horizontal alignment: \"%s\"" +msgstr "" + +#: src/tray.c:1125 +#, c-format +msgid "invalid tray vertical alignment: \"%s\"" +msgstr "" + +#: src/winmenu.c:49 +msgid "Kill" +msgstr "" + +#: src/winmenu.c:57 +msgid "Resize" +msgstr "Yeniden boyutlandır" + +#: src/winmenu.c:60 +msgid "Move" +msgstr "" + +#: src/winmenu.c:72 +msgid "Unshade" +msgstr "" + +#: src/winmenu.c:74 +msgid "Shade" +msgstr "" + +#: src/winmenu.c:81 +msgid "Maximize-y" +msgstr "" + +#: src/winmenu.c:86 +msgid "Maximize-x" +msgstr "" + +#: src/winmenu.c:90 +msgid "Maximize" +msgstr "" + +#: src/winmenu.c:112 +msgid "Unstick" +msgstr "" + +#: src/winmenu.c:114 +msgid "Stick" +msgstr "" + +#: src/winmenu.c:139 +msgid "Layer" +msgstr "" + +#: src/winmenu.c:148 +msgid "[Above]" +msgstr "" + +#: src/winmenu.c:150 +msgid "Above" +msgstr "" + +#: src/winmenu.c:153 +msgid "[Normal]" +msgstr "" + +#: src/winmenu.c:155 +msgid "Normal" +msgstr "" + +#: src/winmenu.c:158 +msgid "[Below]" +msgstr "" + +#: src/winmenu.c:160 +msgid "Below" +msgstr "" diff --git a/talimatname/genel/j/jwm/jwm.desktop b/talimatname/genel/j/jwm/jwm.desktop new file mode 100644 index 000000000..c328fe34c --- /dev/null +++ b/talimatname/genel/j/jwm/jwm.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=jwm +Comment=Launch a jwm session +Exec=jwm +Type=XSession diff --git a/talimatname/genel/j/jwm/jwm.readme b/talimatname/genel/j/jwm/jwm.readme new file mode 100644 index 000000000..4f3d392be --- /dev/null +++ b/talimatname/genel/j/jwm/jwm.readme @@ -0,0 +1,8 @@ +JWM is configured via an XML configuration file. +By default, this file is located in "/etc/system.jwmrc". +To customize JWM, copy this file to "$HOME/.jwmrc" and then modify it using your favorite text editor. +Although somewhat verbose, XML (which looks much like HTML) provides a convenient way +to represent hierarchical configuration, such as menus. +In addition, XML fairly easy to edit either by hand or programmatically. + +Be aware if no "$HOME/.jwmrc" file exist it will parse the "/etc/system.jwmrc" file. diff --git a/talimatname/genel/j/jwm/system.jwmrc b/talimatname/genel/j/jwm/system.jwmrc new file mode 100644 index 000000000..9929f9bd9 --- /dev/null +++ b/talimatname/genel/j/jwm/system.jwmrc @@ -0,0 +1,191 @@ + + + + + + xfce4-terminal + + vlc + xcalc + gimp + thunar + firefox + leafpad + + + xfontsel + + xprop | xmessage -file - + + + xwininfo | xmessage -file - + + + + + xlock -mode blank + + + + + + + + + + + + + Pidgin + + + + xterm + + + + xclock + + + + + + + + root:1 + + showdesktop + + + + + + + + + + + + + + Sans-9:bold + 4 + 21 + 3 + #FFFFFF + #555555 + #000000 + 0.5 + + #FFFFFF + #0077CC + #000000 + 1.0 + + + + Sans-9 + #333333 + #FFFFFF + #000000 + 0.75 + + + Sans-9 + + #FFFFFF + #555555 + + #FFFFFF + #333333 + + + #000000 + #555555 + #333333 + #FFFFFF + + #0077CC + #004488 + + + + Sans-9 + #FFFFFF + #333333 + #000000 + + #FFFFFF + #0077CC + + 0.85 + + + Sans-9 + #000000 + #999999 + + + + + /usr/share/icons/wm-icons/32x32-aquafusion + + + /usr/local/share/jwm + + + + + + + #111111 + + + + 400 + + + 2 + + + sloppy + + + border + + + opaque + + + opaque + + + up + down + right + left + left + down + up + right + select + escape + + nextstacked + close + desktop# + root:1 + window + maximize + rdesktop + ldesktop + udesktop + ddesktop + + diff --git a/talimatname/genel/j/jwm/talimat b/talimatname/genel/j/jwm/talimat new file mode 100644 index 000000000..f7b01445d --- /dev/null +++ b/talimatname/genel/j/jwm/talimat @@ -0,0 +1,27 @@ +# Tanım: Joe'nun pencere yöneticisi yalnızca Xlib'yi en az kullanır. +# URL: http://joewing.net/programs/jwm/ +# Paketçi: milisarge +# Gerekler: xorg xorg-libxt xorg-libxft xorg-libxmu xorg-mesa libpng libjpeg-turbo +# Gruplar: + +isim=jwm +surum=2.3.7 +devir=1 +kaynak=(http://joewing.net/projects/jwm/releases/$isim-$surum.tar.xz $isim.desktop $isim.readme jwm-tr.po system.jwmrc) + +derle() { +cd $isim-$surum +mv $SRC/$isim-tr.po po/tr.po +./configure --prefix=/usr \ +--disable-confirm \ +--disable-fribidi \ +--with-x \ +--sysconf=/etc +make || return 1 +mkdir -p $PKG/usr/share/xsessions +cp $SRC/$isim.desktop $PKG/usr/share/xsessions/ +sed -i "s|/usr/bin|$PKG/usr/bin|g" src/Makefile +make SYSCONF=$PKG/etc MANDIR=$PKG/usr/share/man install +rm $PKG/etc/system.jwmrc +mv $SRC/system.jwmrc $PKG/etc/ +} diff --git a/talimatname/genel/k/k3b/talimat b/talimatname/genel/k/k3b/talimat new file mode 100644 index 000000000..62f956c47 --- /dev/null +++ b/talimatname/genel/k/k3b/talimat @@ -0,0 +1,26 @@ +# Tanım: Özellik açısından zengin ve kullanımı kolay CD yazma uygulaması +# Url: https://userbase.kde.org/K3b +# Paketçi: alihan-ozturk28@hotmail.com oltulu +# Gerekler: git qt5 kf5-extra-cmake-modules qt5-webkit kf5-karchive kf5-kconfig kf5-kcoreaddons kf5-kdoctools kf5-kfilemetadata kf5-ki18n kf5-kiconthemes kf5-kjobwidgets kf5-kcmutils kf5-kio kf5-knotifications kf5-knewstuff kf5-knotifyconfig kf5-kservice kf5-solid kf5-kwidgetsaddons kf5-kxmlgui libkcddb libsamplerate libmad ffmpeg taglib libmpcdec libdvdread cdrkit xorg-libxft cdparanoia cdrdao dvd+rw-tools + +isim=k3b +surum=17.12.0 +devir=1 +grup=kde + +kaynak="https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz" + +derle() { + mkdir -p build + + cd build + cmake ../$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_INSTALL_LIBEXECDIR=lib \ + -DBUILD_TESTING=OFF \ + -DK3B_ENABLE_PERMISSION_HELPER=ON + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kaccounts-integration/talimat b/talimatname/genel/k/kaccounts-integration/talimat new file mode 100644 index 000000000..df99d1f49 --- /dev/null +++ b/talimatname/genel/k/kaccounts-integration/talimat @@ -0,0 +1,21 @@ +# Tanım: Google, Facebook, Owncloud, IMAP, Jabber vb. siteler ve hizmetleri için web hesaplarını yönetme sistemi +# URL: https://www.kde.org/applications/internet +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools kf5-kcmutils kf5-kio kf5-ki18n kf5-kwidgetsaddons kf5-kcoreaddons kf5-kcoreaddons kf5-kconfig kf5-kwallet kf5-kdbusaddons akonadi signon-kwallet-extension signon-plugin-oauth2 signon-ui kde5-l10n + +isim=kaccounts-integration +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kaccounts-providers/talimat b/talimatname/genel/k/kaccounts-providers/talimat new file mode 100644 index 000000000..c34a5bde5 --- /dev/null +++ b/talimatname/genel/k/kaccounts-providers/talimat @@ -0,0 +1,21 @@ +# Tanım: Google, Facebook, Owncloud, IMAP, Jabber vb. siteler ve hizmetleri için web hesaplarını yönetme sistemi +# URL: https://www.kde.org/applications/internet +# Paketçi: CihanAlkan +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools kaccounts-integration intltool + +isim=kaccounts-providers +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kaffeine/talimat b/talimatname/genel/k/kaffeine/talimat new file mode 100644 index 000000000..0efc54101 --- /dev/null +++ b/talimatname/genel/k/kaffeine/talimat @@ -0,0 +1,24 @@ +# Tanım: KDE media player +# URL: https://kaffeine.kde.org +# Paketçi: Cihan_Alkan +# Gerekler: kf5-extra-cmake-modules kf5-kparts kf5-kdoctools kf5-kio kf5-kidletime vlc +# Grup: kde + +isim=kaffeine +surum=2.0.14 +devir=1 + +kaynak=(https://download.kde.org/stable/$isim/$isim-$surum.tar.xz) + +derle() { + mkdir -p build + rm -r $isim-$surum/po/pt_BR/docs # derlenmiyor + + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kakoune/talimat b/talimatname/genel/k/kakoune/talimat new file mode 100644 index 000000000..c4a6025d3 --- /dev/null +++ b/talimatname/genel/k/kakoune/talimat @@ -0,0 +1,21 @@ +# Tanım: Kod editörü yoğun bir şekilde Vim'den ilham aldı +# URL: https://github.com/mawww/kakoune +# Paketçi: Cihan Alkan +# Gerekler: asciidoc +# Grup: ofis_düzenleyiciler + +isim=kakoune +surum=git +devir=1 +kaynak=() + +derle() { + git_indir https://github.com/mawww/kakoune.git $isim + cd "${SRC}/${isim}" + cd src + debug=no make + debug=no make install-strip DESTDIR="${PKG}" PREFIX=/usr + install -D ../UNLICENSE "${PKG}"/usr/share/licenses/${isim}/LICENSE + rm -rf $PKG/usr/share/doc + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/k/kalarmcal/talimat b/talimatname/genel/k/kalarmcal/talimat new file mode 100644 index 000000000..406ee820f --- /dev/null +++ b/talimatname/genel/k/kalarmcal/talimat @@ -0,0 +1,21 @@ +# Tanım: KAlarm takvim verilerine erişebilmenizi ve kullanabilmenizi sağlayan kütüphane +# URL : https://projects.kde.org/kalarcal +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost kf5-kdoctools kf5-kdelibs4support akonadi kcalcore kholidays kidentitymanagement + +isim=kalarmcal +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kashmir/talimat b/talimatname/genel/k/kashmir/talimat new file mode 100644 index 000000000..c907cc0d5 --- /dev/null +++ b/talimatname/genel/k/kashmir/talimat @@ -0,0 +1,16 @@ +# Tanım: Birçok yazılım projesinde gerekli olan, ancak C ++ standart kitaplığında bulunmayan işlevsellik sağlamayı amaçlayan salt başlık kütüphanesi +# URL: https://github.com/Corvusoft/kashmir-dependency +# Paketçi: milisarge +# Gerekler: + +isim=kashmir +surum=20150805 +devir=1 +kaynak=(https://github.com/Corvusoft/kashmir-dependency/archive/master.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd kashmir-dependency-master + install -D -m644 LICENSE_1_0.txt "${PKG}/usr/share/licenses/${isim}/LICENSE_1_0.txt" + install -d -m755 "${PKG}/usr/include/${isim}/" + cp -r "kashmir" "${PKG}/usr/include/" +} diff --git a/talimatname/genel/k/kate/talimat b/talimatname/genel/k/kate/talimat new file mode 100644 index 000000000..5b92d961b --- /dev/null +++ b/talimatname/genel/k/kate/talimat @@ -0,0 +1,23 @@ +# Tanım: Kate, sürüm 2.2'den bu yana KDE'nin bir parçası olan çoklu belge editörüdür. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-kcrash kf5-ki18n kf5-kjobwidgets kf5-kio kf5-kparts kf5-ktexteditor kf5-kwindowsystem kf5-kxmlgui kf5-kiconthemes kf5-kactivities kf5-kdoctools kf5-plasma-framework kf5-knewstuff kf5-threadweaver kf5-kitemmodels + +isim=kate +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kblog/talimat b/talimatname/genel/k/kblog/talimat new file mode 100644 index 000000000..da7472cb6 --- /dev/null +++ b/talimatname/genel/k/kblog/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE için bir blog yazısı kütüphanesi +# URL : https://projects.kde.org/kblog +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost kf5-kdoctools kf5-kxmlrpcclient syndication kcalcore +# Grup: kde + +isim=kblog +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kcalc/talimat b/talimatname/genel/k/kcalc/talimat new file mode 100644 index 000000000..ad6f180ba --- /dev/null +++ b/talimatname/genel/k/kcalc/talimat @@ -0,0 +1,23 @@ +# Tanım: Bilimsel hesap makinesi +# URL: http://gmplib.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-kconfigwidgets kf5-kdoctools kf5-kguiaddons kf5-ki18n kf5-kinit kf5-knotifications kf5-kxmlgui gmp + +isim=kcalc +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kcalcore/talimat b/talimatname/genel/k/kcalcore/talimat new file mode 100644 index 000000000..a2cfe0982 --- /dev/null +++ b/talimatname/genel/k/kcalcore/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE takvim erişim kitaplığı +# URL : https://projects.kde.org/kcalcore +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools libical kf5-kdelibs4support + +isim=kcalcore +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kcalutils/talimat b/talimatname/genel/k/kcalutils/talimat new file mode 100644 index 000000000..3ee5ae488 --- /dev/null +++ b/talimatname/genel/k/kcalutils/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE takvim yardımcı program kütüphanesi +# URL : https://projects.kde.org/projects/kde/ +# Paketçi: alihan-oztuk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kcalcore kidentitymanagement + +isim=kcalutils +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kcontacts/talimat b/talimatname/genel/k/kcontacts/talimat new file mode 100644 index 000000000..35012e1e4 --- /dev/null +++ b/talimatname/genel/k/kcontacts/talimat @@ -0,0 +1,21 @@ +# Tanım: Libkcontacts - KDE için yeni adres defteri API'sı +# URL : https://projects.kde.org/kcontacts +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kio kf5-kcodecs + +isim=kcontacts +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kcptun/talimat b/talimatname/genel/k/kcptun/talimat new file mode 100644 index 000000000..584cb9e4f --- /dev/null +++ b/talimatname/genel/k/kcptun/talimat @@ -0,0 +1,27 @@ +# Tanım: KCP'ye dayanan son derece basit bir udp tüneli +# URL: https://github.com/xtaci/kcptun +# Paketçi: Cihan_Alkan +# Gerekler: go18 +# Grup: ağ + +isim=kcptun +surum=20171201 +devir=1 +kaynak=(https://github.com/xtaci/kcptun/archive/v20171201.tar.gz::$isim-$surum.tar.gz) + +derle() { + mv kcptun-20171201 kcptun + mkdir -p "$SRC/${isim}/go_path" + cd "$SRC/${isim}/server" + GOPATH="$SRC/go_path" go get -d -v + GOPATH="$SRC/go_path" go build -v + + cd "$SRC/${isim}/client" + GOPATH="$SRC/go_path" go get -d -v + GOPATH="$SRC/go_path" go build -v + + install -Dm755 "$SRC/${isim}/client/client" \ + "$PKG/usr/bin/kcptun-client" + install -Dm755 "$SRC/${isim}/server/server" \ + "$PKG/usr/bin/kcptun-server" +} diff --git a/talimatname/genel/k/kde-app/talimat b/talimatname/genel/k/kde-app/talimat new file mode 100644 index 000000000..69a97582d --- /dev/null +++ b/talimatname/genel/k/kde-app/talimat @@ -0,0 +1,14 @@ +# Tanım: Bu paket KDE5 Uygulamalarını yükleyecek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: ark baloo-widgets dolphin dolphin-plugins gwenview k3b kate kcalc kde5-l10n kdeconnect kdepim kdepim-addons kdepim-apps-libs kdepim-runtime kirigami kio-extras kolourpaint konsole konversation okular partitionmanager print-manager spectacle yakuake + +isim=kde-app +devir=1 +surum=20160924 + +kaynak=(talimat) + +derle() { +echo "KDE Applications 5" +} diff --git a/talimatname/genel/k/kde-extra/talimat b/talimatname/genel/k/kde-extra/talimat new file mode 100644 index 000000000..3b5f442c1 --- /dev/null +++ b/talimatname/genel/k/kde-extra/talimat @@ -0,0 +1,14 @@ +# Tanım: Bu paket KDE5 Uygulamalarını yükleyecek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: akonadi akonadi-calendar akonadi-search akonadi-contacts akonadi-mime akonadi-notes calendarsupport eventviews ffmpegthumbs grantleetheme incidenceeditor kaccounts-integration kaccounts-providers kalarmcal kblog kcalcore kcalutils kcontacts kdegraphics-thumbnailers kdenlive kdgantt2 kdiamond khelpcenter kholidays kidentitymanagement kimap kldap kmahjongg kmailtransport kmbox kmime kmix kontactinterface kpat kpimtextedit ktnef libgravatar libkdcraw libkdegames libkdepim libkexiv2 libkgapi libkipi libkleo libkmahjongg libksane libksieve mailcommon mailimporter marble messagelib pimcommon signon-kwallet-extension syndication telepathy trojita + +isim=kde-extra +devir=1 +surum=20160924 + +kaynak=(talimat) + +derle() { +echo "KDE Applications 5 Extra" +} diff --git a/talimatname/genel/k/kde5-l10n/talimat b/talimatname/genel/k/kde5-l10n/talimat new file mode 100644 index 000000000..d45d99733 --- /dev/null +++ b/talimatname/genel/k/kde5-l10n/talimat @@ -0,0 +1,28 @@ +# Tanım: KDE5 için Birçok Yerelleştirme +# URL : http:/$langwww.kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-ki18n kf5-kdoctools phonon-qt5 + +isim=kde5-l10n +surum=16.08.2 +devir=1 + +kaynak=() + +derle() { + +for lang in de es fr it sv tr +do + cd $SRC + wget http://download.kde.org/stable/applications/$surum/src/kde-l10n/kde-l10n-$lang-$surum.tar.xz + tar xf kde-l10n-$lang-$surum.tar.xz + + cd kde-l10n-$lang-$surum/5/$lang + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR=$PKG install + + rm $PKG/usr/share/locale/$lang/LC_MESSAGES/khelpcenter.mo +done +} diff --git a/talimatname/genel/k/kde5/talimat b/talimatname/genel/k/kde5/talimat new file mode 100644 index 000000000..9978cb2b6 --- /dev/null +++ b/talimatname/genel/k/kde5/talimat @@ -0,0 +1,29 @@ +# Tanım: Bu paket KDE5'i ve bağımlılıklarını yükleyecek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5 plasma kde-app telepathy xorg phonon-backend-gstreamer-qt5 phonon-backend-vlc-qt5 oxygen-gtk2 oxygen-gtk3 gnupg alsa-plugins noto-fonts sddm + +isim=kde5 +devir=1 +surum=20161011 + +kaynak=(talimat) + +derle() { + +unset makeflags + +mkdir -pv $PKG/etc/profile.d/ + +cat > $PKG/etc/profile.d/kde5.sh << "EOF" +### Begin /etc/profile.d/kf5.sh +# +source /etc/profile.d/qt5.sh +# +export KF5_PREFIX=/usr +# +pathappend /usr/lib/qt5/plugins QT_PLUGIN_PATH +# +### End /etc/profile.d/kde5.sh +EOF +} diff --git a/talimatname/genel/k/kdeconnect/talimat b/talimatname/genel/k/kdeconnect/talimat new file mode 100644 index 000000000..2c1d852e7 --- /dev/null +++ b/talimatname/genel/k/kdeconnect/talimat @@ -0,0 +1,26 @@ +# Tanım: KDE ve akıllı telefonunuz arasında iletişim kurar +# URL : https://projects.kde.org/projects/playground/base/kdeconnect-kde +# Packdeconnectkager : alihan-ozturk28@hotmail.com +# Gerekler: git kf5-extra-cmake-modules kf5-kio kf5-kcmutils qca-qt5 libfakekey qjson sshfs-fuse hicolor-icon-theme kf5-kwayland + +isim=kdeconnect +surum=0.9g +devir=1 + +kaynak=() + +derle() { + +git clone git://anongit.kde.org/kdeconnect-kde.git + +mkdir -p build +cd build +cmake ../kdeconnect-kde \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib\ + -DLIBEXEC_INSTALL_DIR=/usr/lib \ + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdegraphics-thumbnailers/talimat b/talimatname/genel/k/kdegraphics-thumbnailers/talimat new file mode 100644 index 000000000..bbb8433af --- /dev/null +++ b/talimatname/genel/k/kdegraphics-thumbnailers/talimat @@ -0,0 +1,22 @@ +# Tanım: Çeşitli grafik dosyası formatları için küçük resim oluşturucular +# URL : https://projects.kde.org/projects/kde/kdegraphics/kdegraphics-thumbnailers +# Paketçi: Cihan_Alkan +# Gerekler: kf5-extra-cmake-modules kf5-kio libkdcraw libkexiv2 + +isim=kdegraphics-thumbnailers +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdenlive/talimat b/talimatname/genel/k/kdenlive/talimat new file mode 100644 index 000000000..02fc0bb75 --- /dev/null +++ b/talimatname/genel/k/kdenlive/talimat @@ -0,0 +1,23 @@ +# Tanım: Linux için MLT video çerçevesini kullanan doğrusal olmayan bir video düzenleyicisi +# URL: http://www.kdenlive.org/ +# Paketçi: milisarge +# Gerekler: kf5-knewstuff kf5-kplotting kf5-knotifyconfig kf5-kded kf5-kfilemetadata qt5-webkit mlt xorg-glu sdl-image hicolor-icon-theme qt5 kf5-extra-cmake-modules kf5-kdoctools v4l-utils ffmpeg cdrkit libdv recordmydesktop xine-ui dvdauthor plasma-desktop + +isim=kdenlive +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + mkdir -p build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kdepim-addons/talimat b/talimatname/genel/k/kdepim-addons/talimat new file mode 100644 index 000000000..c5ba0bf20 --- /dev/null +++ b/talimatname/genel/k/kdepim-addons/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE PIM uygulamaları için eklentiler +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-khtml mailcommon incidenceeditor ktnef libkgapi kf5-extra-cmake-modules kf5-kdoctools boost + +isim=kdepim-addons +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdepim-apps-libs/talimat b/talimatname/genel/k/kdepim-apps-libs/talimat new file mode 100644 index 000000000..9ad0f406c --- /dev/null +++ b/talimatname/genel/k/kdepim-apps-libs/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE PIM posta ile ilgili kütüphaneler +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libkleo pimcommon grantleetheme kf5-extra-cmake-modules kf5-kdoctools boost qt5 + +isim=kdepim-apps-libs +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdepim-runtime/talimat b/talimatname/genel/k/kdepim-runtime/talimat new file mode 100644 index 000000000..cec9990cb --- /dev/null +++ b/talimatname/genel/k/kdepim-runtime/talimat @@ -0,0 +1,21 @@ +# Tanım: Kişisel bilgi yönetimi ile ilgili her şeyi bir araya getirmeyi amaçlayan proje. +# URL: https://projects.kde.org/kdepim +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: grantlee-qt5 gpgme kf5-kcmutils kf5-extra-cmake-modules boost kf5-kdoctools kf5-kcodecs akonadi kf5-kdelibs4support kf5-kio kf5-kcompletion kf5-kcodecs phonon-qt5 kcontacts kcalcore kmime kf5-ki18n kf5-kitemviews kf5-kconfig kf5-solid qt5 kldap kmbox kf5-kwallet kf5-knewstuff kf5-kdewebkit kf5-karchive kf5-knotifyconfig kf5-kconfig kf5-khtml kf5-kservice kf5-kdbusaddons kf5-kauth kf5-ktexteditor kf5-kdnssd kf5-kglobalaccel kf5-sonnet kf5-kross kpimtextedit kidentitymanagement kmailtransport kcalutils kholidays ktnef kimap akonadi-calendar akonadi-search syndication gpgmepp kontactinterface kalarmcal kf5-kxmlrpcclient kblog akonadi-notes + +isim=kdepim-runtime +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdepim/talimat b/talimatname/genel/k/kdepim/talimat new file mode 100644 index 000000000..eb08b7c07 --- /dev/null +++ b/talimatname/genel/k/kdepim/talimat @@ -0,0 +1,22 @@ +# Tanım: Kişisel bilgi yönetimi ile ilgili her şeyi bir araya getirmeyi amaçlayan proje. +# URL: https://projects.kde.org/kdepim +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: grantlee-qt5 gpgme kf5-kcmutils kf5-extra-cmake-modules boost kf5-kdoctools kf5-kcodecs akonadi kf5-kdelibs4support kf5-kio kf5-kcompletion kf5-kcodecs phonon-qt5 kcontacts kcalcore kmime kf5-ki18n kf5-kitemviews kf5-kconfig kf5-solid qt5 kldap kmbox kf5-kwallet kf5-knewstuff kf5-kcmutils kf5-kdewebkit kf5-karchive kf5-knotifyconfig kf5-kconfig kf5-khtml kf5-kservice kf5-kdbusaddons kf5-kauth kf5-ktexteditor kf5-kdnssd kf5-kglobalaccel kf5-sonnet kf5-kross kpimtextedit kidentitymanagement kmailtransport kcalutils kholidays ktnef kimap akonadi-calendar akonadi-search syndication gpgmepp kontactinterface kalarmcal kf5-kxmlrpcclient kblog zip unzip libgravatar calendarsupport libkgapi mailimporter mailcommon incidenceeditor libksieve + +isim=kdepim +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdgantt2/talimat b/talimatname/genel/k/kdgantt2/talimat new file mode 100644 index 000000000..c910fe538 --- /dev/null +++ b/talimatname/genel/k/kdgantt2/talimat @@ -0,0 +1,22 @@ +# Tanım: Gantt desteği sağlayan kütüphane +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-ki18n qt5 +# Grup: kde + +isim=kdgantt2 +surum=17.12.1 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdiagram/talimat b/talimatname/genel/k/kdiagram/talimat new file mode 100644 index 000000000..de29a891c --- /dev/null +++ b/talimatname/genel/k/kdiagram/talimat @@ -0,0 +1,24 @@ +# Tanım: İş diyagramları oluşturmak için güçlü kütüphaneler +# URL: http://www.kde.org/ +# Paketçi: Cihan_Alkan +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kdiagram +surum=2.6.0 +devir=1 + +kaynak=(http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { + mkdir -p build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdialog/talimat b/talimatname/genel/k/kdialog/talimat new file mode 100644 index 000000000..4c37a9bce --- /dev/null +++ b/talimatname/genel/k/kdialog/talimat @@ -0,0 +1,20 @@ +# Tanım: Kabuk komut dosyalarından diyalog kutuları görüntülemek için bir yardımcı program +# URL: https://www.kde.org/ +# Paketçi: Cihan Alkan +# Gerekler: python kf5-kdelibs4support + +isim=kdialog +surum=17.04.2 +devir=1 +kaynak=(https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + mkdir -p build +cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kdiamond/kdiamond.kur-kos b/talimatname/genel/k/kdiamond/kdiamond.kur-kos new file mode 100644 index 000000000..b74f6d479 --- /dev/null +++ b/talimatname/genel/k/kdiamond/kdiamond.kur-kos @@ -0,0 +1 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null diff --git a/talimatname/genel/k/kdiamond/talimat b/talimatname/genel/k/kdiamond/talimat new file mode 100644 index 000000000..eb8b98448 --- /dev/null +++ b/talimatname/genel/k/kdiamond/talimat @@ -0,0 +1,22 @@ +# Tanım: Solitaire kart oyunları seçenekleri sunuyor +# URL: http://kde.org/applications/games/kpatience/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools libkdegames kf5-knotifyconfig hicolor-icon-theme xdg-utils +# Grup: kde + +isim=kdiamond +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/keepassx2/talimat b/talimatname/genel/k/keepassx2/talimat new file mode 100644 index 000000000..bf2f8d220 --- /dev/null +++ b/talimatname/genel/k/keepassx2/talimat @@ -0,0 +1,33 @@ +# Tanım: Şifre yöneticisi +# URL: http://www.keepassx.org/ +# Paketçi: milisarge +# Gerekler: qt4 libgcrypt + +isim=keepassx2 +surum=2.0.3 +devir=1 +kaynak=(https://github.com/keepassx/keepassx/archive/$surum.tar.gz) + +derle() { + + pushd */ + sed -r 's|(keepassx)|\12|g' -i CMakeLists.txt share/linux/keepassx.desktop + sed -r 's|(keepassx)(\.desktop\|\.xml)|\12\2|g' -i share/CMakeLists.txt + sed -r 's|(KeePassX)|\1 2|g' -i share/linux/keepassx.desktop + rename 'keepassx' 'keepassx2' share/linux/keepassx.{desktop,xml} + popd + + mkdir build + cd build + cmake ../*-$surum/ \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_BINDIR=/usr/bin \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib \ + -DCMAKE_VERBOSE_MAKEFILE=OFF \ + -DWITH_TESTS=OFF + make + make DESTDIR=$PKG install + + rename keepassx keepassx2 $PKG/usr/share/icons/hicolor/*/*/keepassx.png +} diff --git a/talimatname/genel/k/kerberos/kerberos.kur-kos b/talimatname/genel/k/kerberos/kerberos.kur-kos new file mode 100644 index 000000000..6e38883fe --- /dev/null +++ b/talimatname/genel/k/kerberos/kerberos.kur-kos @@ -0,0 +1,7 @@ +for INFOFILE in admin install user +do + if [ -f /usr/share/info/krb5-$INFOFILE.info ]; then + install-info --info-dir=/usr/share/info \ + /usr/share/info/krb5-$INFOFILE.info + fi +done diff --git a/talimatname/genel/k/kerberos/kerberos.okubeni b/talimatname/genel/k/kerberos/kerberos.okubeni new file mode 100644 index 000000000..f36937108 --- /dev/null +++ b/talimatname/genel/k/kerberos/kerberos.okubeni @@ -0,0 +1,37 @@ +Configuration: + /etc/krb5.conf + /var/lib/krb5kdc/kdc.conf + +Création d'un fichier de configuration: + +cat > /etc/krb5.conf << "EOF" +# Begin /etc/krb5.conf + +[libdefaults] + default_realm = + encrypt = true + +[realms] + = { + kdc = + admin_server = + dict_file = /usr/share/dict/words + } + +[domain_realm] + . = + +[logging] + kdc = SYSLOG[:INFO[:AUTH]] + admin_server = SYSLOG[INFO[:AUTH]] + default = SYSLOG[[:SYS]] + +# End /etc/krb5.conf +EOF + +Remplacez , et avec votre domaine + +Pour plus d'information, consultez la page de BLFS + +http://www.fr.linuxfromscratch.org/view/blfs-svn/postlfs/mitkrb.html + diff --git a/talimatname/genel/k/kerberos/talimat b/talimatname/genel/k/kerberos/talimat new file mode 100644 index 000000000..af28189d8 --- /dev/null +++ b/talimatname/genel/k/kerberos/talimat @@ -0,0 +1,55 @@ +# Tanım: Kerberos ağ kimlik doğrulama sistemi +# URL: http://web.mit.edu/kerberos/ +# Paketçi: milisarge +# Gerekler: + +isim=kerberos +surum=1.14 +devir=1 + +kaynak=(http://web.mit.edu/$isim/dist/krb5/1.14/krb5-$surum.tar.gz) + +derle() { + cd krb5-$surum + cd src + sed -e "s@python2.5/Python.h@& python2.7/Python.h@g" \ + -e "s@-lpython2.5]@&,\n AC_CHECK_LIB(python2.7,main,[PYTHON_LIB=-lpython2.7])@g" \ + -i configure.in + + sed -e 's@\^u}@^u cols 300}@' \ + -i tests/dejagnu/config/default.exp + +autoconf + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var/lib \ + --with-system-et \ + --with-system-ss \ + --with-system-verto=no \ + --enable-dns-for-realm +make +make DESTDIR=$PKG install + +for LIBRARY in gssapi_krb5 gssrpc k5crypto kadm5clnt_mit kadm5srv_mit kdb5 krb5 krb5support verto; do + chmod -v 755 $PKG/usr/lib/lib$LIBRARY.so.*.* +done + +unset LIBRARY + +mkdir -p $PKG/{bin,lib} +mv -v $PKG/usr/lib/libkrb5.so.3* $PKG/lib +mv -v $PKG/usr/lib/libk5crypto.so.3* $PKG/lib +mv -v $PKG/usr/lib/libkrb5support.so.0* $PKG/lib + +ln -v -sf ../../lib/libkrb5.so.3.3 $PKG/usr/lib/libkrb5.so +ln -v -sf ../../lib/libk5crypto.so.3.1 $PKG/usr/lib/libk5crypto.so +ln -v -sf ../../lib/libkrb5support.so.0.1 $PKG/usr/lib/libkrb5support.so + +mv -v $PKG/usr/bin/ksu $PKG/bin +chmod -v 755 $PKG/bin/ksu + +install -v -dm755 $PKG/usr/share/doc/krb5-$surum +cp -vfr ../doc/* $PKG/usr/share/doc/krb5-$surum + +} diff --git a/talimatname/genel/k/kernel/aufs4-base.patch b/talimatname/genel/k/kernel/aufs4-base.patch new file mode 100644 index 000000000..4de0c0749 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4-base.patch @@ -0,0 +1,332 @@ +SPDX-License-Identifier: GPL-2.0 +aufs4.15 base patch + +diff --git a/MAINTAINERS b/MAINTAINERS +index 845fc25..7dc2813 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -2486,6 +2486,19 @@ F: include/linux/audit.h + F: include/uapi/linux/audit.h + F: kernel/audit* + ++AUFS (advanced multi layered unification filesystem) FILESYSTEM ++M: "J. R. Okajima" ++L: linux-unionfs@vger.kernel.org ++L: aufs-users@lists.sourceforge.net (members only) ++W: http://aufs.sourceforge.net ++T: git://github.com/sfjro/aufs4-linux.git ++S: Supported ++F: Documentation/filesystems/aufs/ ++F: Documentation/ABI/testing/debugfs-aufs ++F: Documentation/ABI/testing/sysfs-aufs ++F: fs/aufs/ ++F: include/uapi/linux/aufs_type.h ++ + AUXILIARY DISPLAY DRIVERS + M: Miguel Ojeda Sandonis + W: http://miguelojeda.es/auxdisplay.htm +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index d5fe720..c292afa 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -691,6 +691,24 @@ static inline int is_loop_device(struct file *file) + return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR; + } + ++/* ++ * for AUFS ++ * no get/put for file. ++ */ ++struct file *loop_backing_file(struct super_block *sb) ++{ ++ struct file *ret; ++ struct loop_device *l; ++ ++ ret = NULL; ++ if (MAJOR(sb->s_dev) == LOOP_MAJOR) { ++ l = sb->s_bdev->bd_disk->private_data; ++ ret = l->lo_backing_file; ++ } ++ return ret; ++} ++EXPORT_SYMBOL_GPL(loop_backing_file); ++ + /* loop sysfs attributes */ + + static ssize_t loop_attr_show(struct device *dev, char *page, +diff --git a/fs/dcache.c b/fs/dcache.c +index 5c7df1d..019f14b 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -1197,7 +1197,7 @@ enum d_walk_ret { + * + * The @enter() and @finish() callbacks are called with d_lock held. + */ +-static void d_walk(struct dentry *parent, void *data, ++void d_walk(struct dentry *parent, void *data, + enum d_walk_ret (*enter)(void *, struct dentry *), + void (*finish)(void *)) + { +diff --git a/fs/fcntl.c b/fs/fcntl.c +index 0522e28..74c255d 100644 +--- a/fs/fcntl.c ++++ b/fs/fcntl.c +@@ -32,7 +32,7 @@ + + #define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME) + +-static int setfl(int fd, struct file * filp, unsigned long arg) ++int setfl(int fd, struct file * filp, unsigned long arg) + { + struct inode * inode = file_inode(filp); + int error = 0; +@@ -63,6 +63,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg) + + if (filp->f_op->check_flags) + error = filp->f_op->check_flags(arg); ++ if (!error && filp->f_op->setfl) ++ error = filp->f_op->setfl(filp, arg); + if (error) + return error; + +diff --git a/fs/inode.c b/fs/inode.c +index 03102d6..517883c 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -1655,7 +1655,7 @@ EXPORT_SYMBOL(generic_update_time); + * This does the actual work of updating an inodes time or version. Must have + * had called mnt_want_write() before calling this. + */ +-static int update_time(struct inode *inode, struct timespec *time, int flags) ++int update_time(struct inode *inode, struct timespec *time, int flags) + { + int (*update_time)(struct inode *, struct timespec *, int); + +diff --git a/fs/namespace.c b/fs/namespace.c +index 9d1374a..26ef600 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -846,6 +846,12 @@ static inline int check_mnt(struct mount *mnt) + return mnt->mnt_ns == current->nsproxy->mnt_ns; + } + ++/* for aufs, CONFIG_AUFS_BR_FUSE */ ++int is_current_mnt_ns(struct vfsmount *mnt) ++{ ++ return check_mnt(real_mount(mnt)); ++} ++ + /* + * vfsmount lock must be held for write + */ +diff --git a/fs/read_write.c b/fs/read_write.c +index f8547b8..0a5c47b 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -484,6 +484,28 @@ ssize_t __vfs_write(struct file *file, const char __user *p, size_t count, + return -EINVAL; + } + ++vfs_readf_t vfs_readf(struct file *file) ++{ ++ const struct file_operations *fop = file->f_op; ++ ++ if (fop->read) ++ return fop->read; ++ if (fop->read_iter) ++ return new_sync_read; ++ return ERR_PTR(-ENOSYS); ++} ++ ++vfs_writef_t vfs_writef(struct file *file) ++{ ++ const struct file_operations *fop = file->f_op; ++ ++ if (fop->write) ++ return fop->write; ++ if (fop->write_iter) ++ return new_sync_write; ++ return ERR_PTR(-ENOSYS); ++} ++ + ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) + { + mm_segment_t old_fs; +diff --git a/fs/splice.c b/fs/splice.c +index 39e2dc0..c5fb195 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -837,8 +837,8 @@ EXPORT_SYMBOL(generic_splice_sendpage); + /* + * Attempt to initiate a splice from pipe to file. + */ +-static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, +- loff_t *ppos, size_t len, unsigned int flags) ++long do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags) + { + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, + loff_t *, size_t, unsigned int); +@@ -854,9 +854,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, + /* + * Attempt to initiate a splice from a file to a pipe. + */ +-static long do_splice_to(struct file *in, loff_t *ppos, +- struct pipe_inode_info *pipe, size_t len, +- unsigned int flags) ++long do_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) + { + ssize_t (*splice_read)(struct file *, loff_t *, + struct pipe_inode_info *, size_t, unsigned int); +diff --git a/fs/sync.c b/fs/sync.c +index 6e0a2cb..a6891ee 100644 +--- a/fs/sync.c ++++ b/fs/sync.c +@@ -28,7 +28,7 @@ + * wait == 1 case since in that case write_inode() functions do + * sync_dirty_buffer() and thus effectively write one block at a time. + */ +-static int __sync_filesystem(struct super_block *sb, int wait) ++int __sync_filesystem(struct super_block *sb, int wait) + { + if (wait) + sync_inodes_sb(sb); +diff --git a/include/linux/file.h b/include/linux/file.h +index 279720d..76e38ea 100644 +--- a/include/linux/file.h ++++ b/include/linux/file.h +@@ -20,6 +20,7 @@ struct dentry; + struct path; + extern struct file *alloc_file(const struct path *, fmode_t mode, + const struct file_operations *fop); ++extern struct file *get_empty_filp(void); + + static inline void fput_light(struct file *file, int fput_needed) + { +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 511fbaa..96e05b3 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -1265,6 +1265,7 @@ extern void fasync_free(struct fasync_struct *); + /* can be called from interrupts */ + extern void kill_fasync(struct fasync_struct **, int, int); + ++extern int setfl(int fd, struct file * filp, unsigned long arg); + extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force); + extern int f_setown(struct file *filp, unsigned long arg, int force); + extern void f_delown(struct file *filp); +@@ -1712,6 +1713,7 @@ struct file_operations { + ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); + unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); + int (*check_flags)(int); ++ int (*setfl)(struct file *, unsigned long); + int (*flock) (struct file *, int, struct file_lock *); + ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); + ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); +@@ -1782,6 +1784,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, + struct iovec *fast_pointer, + struct iovec **ret_pointer); + ++typedef ssize_t (*vfs_readf_t)(struct file *, char __user *, size_t, loff_t *); ++typedef ssize_t (*vfs_writef_t)(struct file *, const char __user *, size_t, ++ loff_t *); ++vfs_readf_t vfs_readf(struct file *file); ++vfs_writef_t vfs_writef(struct file *file); ++ + extern ssize_t __vfs_read(struct file *, char __user *, size_t, loff_t *); + extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *); + extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *); +@@ -2201,6 +2209,7 @@ extern int current_umask(void); + extern void ihold(struct inode * inode); + extern void iput(struct inode *); + extern int generic_update_time(struct inode *, struct timespec *, int); ++extern int update_time(struct inode *, struct timespec *, int); + + /* /sys/fs */ + extern struct kobject *fs_kobj; +@@ -2481,6 +2490,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb) + return false; + } + #endif ++extern int __sync_filesystem(struct super_block *, int); + extern int sync_filesystem(struct super_block *); + extern const struct file_operations def_blk_fops; + extern const struct file_operations def_chr_fops; +diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h +index 3251d9c..0360952 100644 +--- a/include/linux/lockdep.h ++++ b/include/linux/lockdep.h +@@ -313,6 +313,8 @@ static inline int lockdep_match_key(struct lockdep_map *lock, + return lock->key == key; + } + ++struct lock_class *lockdep_hlock_class(struct held_lock *hlock); ++ + /* + * Acquire a lock. + * +@@ -442,6 +444,7 @@ struct lockdep_map { }; + + #define lockdep_depth(tsk) (0) + ++#define lockdep_is_held(lock) (1) + #define lockdep_is_held_type(l, r) (1) + + #define lockdep_assert_held(l) do { (void)(l); } while (0) +diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h +index 3594208..24f5fd1 100644 +--- a/include/linux/mnt_namespace.h ++++ b/include/linux/mnt_namespace.h +@@ -6,11 +6,14 @@ + struct mnt_namespace; + struct fs_struct; + struct user_namespace; ++struct vfsmount; + + extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, + struct user_namespace *, struct fs_struct *); + extern void put_mnt_ns(struct mnt_namespace *ns); + ++extern int is_current_mnt_ns(struct vfsmount *mnt); ++ + extern const struct file_operations proc_mounts_operations; + extern const struct file_operations proc_mountinfo_operations; + extern const struct file_operations proc_mountstats_operations; +diff --git a/include/linux/splice.h b/include/linux/splice.h +index 74b4911..19789fb 100644 +--- a/include/linux/splice.h ++++ b/include/linux/splice.h +@@ -87,4 +87,10 @@ extern void splice_shrink_spd(struct splice_pipe_desc *); + + extern const struct pipe_buf_operations page_cache_pipe_buf_ops; + extern const struct pipe_buf_operations default_pipe_buf_ops; ++ ++extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); ++extern long do_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags); + #endif +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 5216590..8b5f44d 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -140,7 +140,7 @@ static struct lock_list list_entries[MAX_LOCKDEP_ENTRIES]; + unsigned long nr_lock_classes; + static struct lock_class lock_classes[MAX_LOCKDEP_KEYS]; + +-static inline struct lock_class *hlock_class(struct held_lock *hlock) ++inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) + { + if (!hlock->class_idx) { + /* +@@ -151,6 +151,7 @@ static inline struct lock_class *hlock_class(struct held_lock *hlock) + } + return lock_classes + hlock->class_idx - 1; + } ++#define hlock_class(hlock) lockdep_hlock_class(hlock) + + #ifdef CONFIG_LOCK_STAT + static DEFINE_PER_CPU(struct lock_class_stats[MAX_LOCKDEP_KEYS], cpu_lock_stats); diff --git a/talimatname/genel/k/kernel/aufs4-kbuild.patch b/talimatname/genel/k/kernel/aufs4-kbuild.patch new file mode 100644 index 000000000..51946ada9 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4-kbuild.patch @@ -0,0 +1,24 @@ +SPDX-License-Identifier: GPL-2.0 +aufs4.15 kbuild patch + +diff --git a/fs/Kconfig b/fs/Kconfig +index 7aee6d6..ec92031 100644 +--- a/fs/Kconfig ++++ b/fs/Kconfig +@@ -248,6 +248,7 @@ source "fs/pstore/Kconfig" + source "fs/sysv/Kconfig" + source "fs/ufs/Kconfig" + source "fs/exofs/Kconfig" ++source "fs/aufs/Kconfig" + + endif # MISC_FILESYSTEMS + +diff --git a/fs/Makefile b/fs/Makefile +index ef772f1..51779e68c 100644 +--- a/fs/Makefile ++++ b/fs/Makefile +@@ -129,3 +129,4 @@ obj-y += exofs/ # Multiple modules + obj-$(CONFIG_CEPH_FS) += ceph/ + obj-$(CONFIG_PSTORE) += pstore/ + obj-$(CONFIG_EFIVAR_FS) += efivarfs/ ++obj-$(CONFIG_AUFS_FS) += aufs/ diff --git a/talimatname/genel/k/kernel/aufs4-loopback.patch b/talimatname/genel/k/kernel/aufs4-loopback.patch new file mode 100644 index 000000000..2dda88e30 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4-loopback.patch @@ -0,0 +1,243 @@ +SPDX-License-Identifier: GPL-2.0 +aufs4.15 loopback patch + +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index c292afa..a93038c 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -600,6 +600,15 @@ static inline void loop_update_dio(struct loop_device *lo) + lo->use_dio); + } + ++static struct file *loop_real_file(struct file *file) ++{ ++ struct file *f = NULL; ++ ++ if (file->f_path.dentry->d_sb->s_op->real_loop) ++ f = file->f_path.dentry->d_sb->s_op->real_loop(file); ++ return f; ++} ++ + static void loop_reread_partitions(struct loop_device *lo, + struct block_device *bdev) + { +@@ -634,6 +643,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + unsigned int arg) + { + struct file *file, *old_file; ++ struct file *f, *virt_file = NULL, *old_virt_file; + struct inode *inode; + int error; + +@@ -650,9 +660,16 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + file = fget(arg); + if (!file) + goto out; ++ f = loop_real_file(file); ++ if (f) { ++ virt_file = file; ++ file = f; ++ get_file(file); ++ } + + inode = file->f_mapping->host; + old_file = lo->lo_backing_file; ++ old_virt_file = lo->lo_backing_virt_file; + + error = -EINVAL; + +@@ -667,6 +684,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + blk_mq_freeze_queue(lo->lo_queue); + mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask); + lo->lo_backing_file = file; ++ lo->lo_backing_virt_file = virt_file; + lo->old_gfp_mask = mapping_gfp_mask(file->f_mapping); + mapping_set_gfp_mask(file->f_mapping, + lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); +@@ -674,12 +692,16 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, + blk_mq_unfreeze_queue(lo->lo_queue); + + fput(old_file); ++ if (old_virt_file) ++ fput(old_virt_file); + if (lo->lo_flags & LO_FLAGS_PARTSCAN) + loop_reread_partitions(lo, bdev); + return 0; + + out_putf: + fput(file); ++ if (virt_file) ++ fput(virt_file); + out: + return error; + } +@@ -873,7 +895,7 @@ static int loop_prepare_queue(struct loop_device *lo) + static int loop_set_fd(struct loop_device *lo, fmode_t mode, + struct block_device *bdev, unsigned int arg) + { +- struct file *file, *f; ++ struct file *file, *f, *virt_file = NULL; + struct inode *inode; + struct address_space *mapping; + int lo_flags = 0; +@@ -887,6 +909,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + file = fget(arg); + if (!file) + goto out; ++ f = loop_real_file(file); ++ if (f) { ++ virt_file = file; ++ file = f; ++ get_file(file); ++ } + + error = -EBUSY; + if (lo->lo_state != Lo_unbound) +@@ -935,6 +963,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + lo->lo_device = bdev; + lo->lo_flags = lo_flags; + lo->lo_backing_file = file; ++ lo->lo_backing_virt_file = virt_file; + lo->transfer = NULL; + lo->ioctl = NULL; + lo->lo_sizelimit = 0; +@@ -968,6 +997,8 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + + out_putf: + fput(file); ++ if (virt_file) ++ fput(virt_file); + out: + /* This is safe: open() is still holding a reference. */ + module_put(THIS_MODULE); +@@ -1014,6 +1045,7 @@ loop_init_xfer(struct loop_device *lo, struct loop_func_table *xfer, + static int loop_clr_fd(struct loop_device *lo) + { + struct file *filp = lo->lo_backing_file; ++ struct file *virt_filp = lo->lo_backing_virt_file; + gfp_t gfp = lo->old_gfp_mask; + struct block_device *bdev = lo->lo_device; + +@@ -1045,6 +1077,7 @@ static int loop_clr_fd(struct loop_device *lo) + spin_lock_irq(&lo->lo_lock); + lo->lo_state = Lo_rundown; + lo->lo_backing_file = NULL; ++ lo->lo_backing_virt_file = NULL; + spin_unlock_irq(&lo->lo_lock); + + loop_release_xfer(lo); +@@ -1092,6 +1125,8 @@ static int loop_clr_fd(struct loop_device *lo) + * bd_mutex which is usually taken before lo_ctl_mutex. + */ + fput(filp); ++ if (virt_filp) ++ fput(virt_filp); + return 0; + } + +diff --git a/drivers/block/loop.h b/drivers/block/loop.h +index 0f45416..101f193 100644 +--- a/drivers/block/loop.h ++++ b/drivers/block/loop.h +@@ -46,7 +46,7 @@ struct loop_device { + int (*ioctl)(struct loop_device *, int cmd, + unsigned long arg); + +- struct file * lo_backing_file; ++ struct file * lo_backing_file, *lo_backing_virt_file; + struct block_device *lo_device; + void *key_data; + +diff --git a/fs/aufs/f_op.c b/fs/aufs/f_op.c +index 0d4ea929..af293c2 100644 +--- a/fs/aufs/f_op.c ++++ b/fs/aufs/f_op.c +@@ -358,7 +358,7 @@ static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) + if (IS_ERR(h_file)) + goto out; + +- if (au_test_loopback_kthread()) { ++ if (0 && au_test_loopback_kthread()) { + au_warn_loopback(h_file->f_path.dentry->d_sb); + if (file->f_mapping != h_file->f_mapping) { + file->f_mapping = h_file->f_mapping; +diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c +index 3b217c2..0f5ab22 100644 +--- a/fs/aufs/loop.c ++++ b/fs/aufs/loop.c +@@ -133,3 +133,19 @@ void au_loopback_fin(void) + symbol_put(loop_backing_file); + kfree(au_warn_loopback_array); + } ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* support the loopback block device insude aufs */ ++ ++struct file *aufs_real_loop(struct file *file) ++{ ++ struct file *f; ++ ++ BUG_ON(!au_test_aufs(file->f_path.dentry->d_sb)); ++ fi_read_lock(file); ++ f = au_hf_top(file); ++ fi_read_unlock(file); ++ AuDebugOn(!f); ++ return f; ++} +diff --git a/fs/aufs/loop.h b/fs/aufs/loop.h +index 7d7bf34..ba7c188 100644 +--- a/fs/aufs/loop.h ++++ b/fs/aufs/loop.h +@@ -26,7 +26,11 @@ void au_warn_loopback(struct super_block *h_sb); + + int au_loopback_init(void); + void au_loopback_fin(void); ++ ++struct file *aufs_real_loop(struct file *file); + #else ++AuStub(struct file *, loop_backing_file, return NULL) ++ + AuStubInt0(au_test_loopback_overlap, struct super_block *sb, + struct dentry *h_adding) + AuStubInt0(au_test_loopback_kthread, void) +@@ -34,6 +38,8 @@ AuStubVoid(au_warn_loopback, struct super_block *h_sb) + + AuStubInt0(au_loopback_init, void) + AuStubVoid(au_loopback_fin, void) ++ ++AuStub(struct file *, aufs_real_loop, return NULL, struct file *file) + #endif /* BLK_DEV_LOOP */ + + #endif /* __KERNEL__ */ +diff --git a/fs/aufs/super.c b/fs/aufs/super.c +index 357bf04..c6614df 100644 +--- a/fs/aufs/super.c ++++ b/fs/aufs/super.c +@@ -839,7 +839,10 @@ static const struct super_operations aufs_sop = { + .statfs = aufs_statfs, + .put_super = aufs_put_super, + .sync_fs = aufs_sync_fs, +- .remount_fs = aufs_remount_fs ++ .remount_fs = aufs_remount_fs, ++#ifdef CONFIG_AUFS_BDEV_LOOP ++ .real_loop = aufs_real_loop ++#endif + }; + + /* ---------------------------------------------------------------------- */ +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 96e05b3..ba5e627 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -1840,6 +1840,10 @@ struct super_operations { + struct shrink_control *); + long (*free_cached_objects)(struct super_block *, + struct shrink_control *); ++#if defined(CONFIG_BLK_DEV_LOOP) || defined(CONFIG_BLK_DEV_LOOP_MODULE) ++ /* and aufs */ ++ struct file *(*real_loop)(struct file *); ++#endif + }; + + /* diff --git a/talimatname/genel/k/kernel/aufs4-mmap.patch b/talimatname/genel/k/kernel/aufs4-mmap.patch new file mode 100644 index 000000000..cc0d69fe1 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4-mmap.patch @@ -0,0 +1,398 @@ +SPDX-License-Identifier: GPL-2.0 +aufs4.15 mmap patch + +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 60316b5..ce5314e 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -1987,7 +1987,7 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) + down_read(&mm->mmap_sem); + vma = find_exact_vma(mm, vm_start, vm_end); + if (vma && vma->vm_file) { +- *path = vma->vm_file->f_path; ++ *path = vma_pr_or_file(vma)->f_path; + path_get(path); + rc = 0; + } +diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c +index 7563437..7c0dc0f 100644 +--- a/fs/proc/nommu.c ++++ b/fs/proc/nommu.c +@@ -45,7 +45,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region) + file = region->vm_file; + + if (file) { +- struct inode *inode = file_inode(region->vm_file); ++ struct inode *inode; ++ ++ file = vmr_pr_or_file(region); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + } +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 339e4c1..1138098 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -306,7 +306,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid) + const char *name = NULL; + + if (file) { +- struct inode *inode = file_inode(vma->vm_file); ++ struct inode *inode; ++ ++ file = vma_pr_or_file(vma); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; +@@ -1736,7 +1739,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid) + struct proc_maps_private *proc_priv = &numa_priv->proc_maps; + struct vm_area_struct *vma = v; + struct numa_maps *md = &numa_priv->md; +- struct file *file = vma->vm_file; ++ struct file *file = vma_pr_or_file(vma); + struct mm_struct *mm = vma->vm_mm; + struct mm_walk walk = { + .hugetlb_entry = gather_hugetlb_stats, +diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c +index 5b62f57..dfb4a3b 100644 +--- a/fs/proc/task_nommu.c ++++ b/fs/proc/task_nommu.c +@@ -156,7 +156,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma, + file = vma->vm_file; + + if (file) { +- struct inode *inode = file_inode(vma->vm_file); ++ struct inode *inode; ++ ++ file = vma_pr_or_file(vma); ++ inode = file_inode(file); + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; +diff --git a/include/linux/mm.h b/include/linux/mm.h +index ea818ff..fbd4799 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -1362,6 +1362,28 @@ static inline int fixup_user_fault(struct task_struct *tsk, + } + #endif + ++extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int); ++extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[], ++ int); ++extern void vma_do_get_file(struct vm_area_struct *, const char[], int); ++extern void vma_do_fput(struct vm_area_struct *, const char[], int); ++ ++#define vma_file_update_time(vma) vma_do_file_update_time(vma, __func__, \ ++ __LINE__) ++#define vma_pr_or_file(vma) vma_do_pr_or_file(vma, __func__, \ ++ __LINE__) ++#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__) ++#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__) ++ ++#ifndef CONFIG_MMU ++extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int); ++extern void vmr_do_fput(struct vm_region *, const char[], int); ++ ++#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \ ++ __LINE__) ++#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__) ++#endif /* !CONFIG_MMU */ ++ + extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, + unsigned int gup_flags); + extern int access_remote_vm(struct mm_struct *mm, unsigned long addr, +diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h +index cfd0ac4..135e11c 100644 +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -255,6 +255,7 @@ struct vm_region { + unsigned long vm_top; /* region allocated to here */ + unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */ + struct file *vm_file; /* the backing file or NULL */ ++ struct file *vm_prfile; /* the virtual backing file or NULL */ + + int vm_usage; /* region usage count (access under nommu_region_sem) */ + bool vm_icache_flushed : 1; /* true if the icache has been flushed for +@@ -329,6 +330,7 @@ struct vm_area_struct { + unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE + units */ + struct file * vm_file; /* File we map to (can be NULL). */ ++ struct file *vm_prfile; /* shadow of vm_file */ + void * vm_private_data; /* was vm_pte (shared mem) */ + + atomic_long_t swap_readahead_info; +diff --git a/kernel/fork.c b/kernel/fork.c +index 2295fc6..80e1fee 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -676,7 +676,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, + struct inode *inode = file_inode(file); + struct address_space *mapping = file->f_mapping; + +- get_file(file); ++ vma_get_file(tmp); + if (tmp->vm_flags & VM_DENYWRITE) + atomic_dec(&inode->i_writecount); + i_mmap_lock_write(mapping); +diff --git a/mm/Makefile b/mm/Makefile +index e669f02..9c36567 100644 +--- a/mm/Makefile ++++ b/mm/Makefile +@@ -39,7 +39,7 @@ obj-y := filemap.o mempool.o oom_kill.o \ + mm_init.o mmu_context.o percpu.o slab_common.o \ + compaction.o vmacache.o swap_slots.o \ + interval_tree.o list_lru.o workingset.o \ +- debug.o $(mmu-y) ++ prfile.o debug.o $(mmu-y) + + obj-y += init-mm.o + +diff --git a/mm/filemap.c b/mm/filemap.c +index ee83baa..7677d13 100644 +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -2704,7 +2704,7 @@ int filemap_page_mkwrite(struct vm_fault *vmf) + int ret = VM_FAULT_LOCKED; + + sb_start_pagefault(inode->i_sb); +- file_update_time(vmf->vma->vm_file); ++ vma_file_update_time(vmf->vma); + lock_page(page); + if (page->mapping != inode->i_mapping) { + unlock_page(page); +diff --git a/mm/mmap.c b/mm/mmap.c +index 9efdc021..d77f01f 100644 +--- a/mm/mmap.c ++++ b/mm/mmap.c +@@ -171,7 +171,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + mpol_put(vma_policy(vma)); + kmem_cache_free(vm_area_cachep, vma); + return next; +@@ -896,7 +896,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start, + if (remove_next) { + if (file) { + uprobe_munmap(next, next->vm_start, next->vm_end); +- fput(file); ++ vma_fput(vma); + } + if (next->anon_vma) + anon_vma_merge(vma, next); +@@ -1761,8 +1761,8 @@ unsigned long mmap_region(struct file *file, unsigned long addr, + return addr; + + unmap_and_free_vma: ++ vma_fput(vma); + vma->vm_file = NULL; +- fput(file); + + /* Undo any partial mapping done by a device driver. */ + unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end); +@@ -2586,7 +2586,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + goto out_free_mpol; + + if (new->vm_file) +- get_file(new->vm_file); ++ vma_get_file(new); + + if (new->vm_ops && new->vm_ops->open) + new->vm_ops->open(new); +@@ -2605,7 +2605,7 @@ int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, + if (new->vm_ops && new->vm_ops->close) + new->vm_ops->close(new); + if (new->vm_file) +- fput(new->vm_file); ++ vma_fput(new); + unlink_anon_vmas(new); + out_free_mpol: + mpol_put(vma_policy(new)); +@@ -2767,7 +2767,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + struct vm_area_struct *vma; + unsigned long populate = 0; + unsigned long ret = -EINVAL; +- struct file *file; ++ struct file *file, *prfile; + + pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. See Documentation/vm/remap_file_pages.txt.\n", + current->comm, current->pid); +@@ -2842,10 +2842,27 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, + } + } + +- file = get_file(vma->vm_file); ++ vma_get_file(vma); ++ file = vma->vm_file; ++ prfile = vma->vm_prfile; + ret = do_mmap_pgoff(vma->vm_file, start, size, + prot, flags, pgoff, &populate, NULL); ++ if (!IS_ERR_VALUE(ret) && file && prfile) { ++ struct vm_area_struct *new_vma; ++ ++ new_vma = find_vma(mm, ret); ++ if (!new_vma->vm_prfile) ++ new_vma->vm_prfile = prfile; ++ if (new_vma != vma) ++ get_file(prfile); ++ } ++ /* ++ * two fput()s instead of vma_fput(vma), ++ * coz vma may not be available anymore. ++ */ + fput(file); ++ if (prfile) ++ fput(prfile); + out: + up_write(&mm->mmap_sem); + if (populate) +@@ -3153,7 +3170,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, + if (anon_vma_clone(new_vma, vma)) + goto out_free_mempol; + if (new_vma->vm_file) +- get_file(new_vma->vm_file); ++ vma_get_file(new_vma); + if (new_vma->vm_ops && new_vma->vm_ops->open) + new_vma->vm_ops->open(new_vma); + vma_link(mm, new_vma, prev, rb_link, rb_parent); +diff --git a/mm/nommu.c b/mm/nommu.c +index 17c00d9..4bcdf94 100644 +--- a/mm/nommu.c ++++ b/mm/nommu.c +@@ -641,7 +641,7 @@ static void __put_nommu_region(struct vm_region *region) + up_write(&nommu_region_sem); + + if (region->vm_file) +- fput(region->vm_file); ++ vmr_fput(region); + + /* IO memory and memory shared directly out of the pagecache + * from ramfs/tmpfs mustn't be released here */ +@@ -799,7 +799,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma) + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + put_nommu_region(vma->vm_region); + kmem_cache_free(vm_area_cachep, vma); + } +@@ -1321,7 +1321,7 @@ unsigned long do_mmap(struct file *file, + goto error_just_free; + } + } +- fput(region->vm_file); ++ vmr_fput(region); + kmem_cache_free(vm_region_jar, region); + region = pregion; + result = start; +@@ -1396,10 +1396,10 @@ unsigned long do_mmap(struct file *file, + up_write(&nommu_region_sem); + error: + if (region->vm_file) +- fput(region->vm_file); ++ vmr_fput(region); + kmem_cache_free(vm_region_jar, region); + if (vma->vm_file) +- fput(vma->vm_file); ++ vma_fput(vma); + kmem_cache_free(vm_area_cachep, vma); + return ret; + +diff --git a/mm/prfile.c b/mm/prfile.c +new file mode 100644 +index 0000000..3f56669 +--- /dev/null ++++ b/mm/prfile.c +@@ -0,0 +1,86 @@ ++/* ++ * SPDX-License-Identifier: GPL-2.0 ++ * Mainly for aufs which mmap(2) different file and wants to print different ++ * path in /proc/PID/maps. ++ * Call these functions via macros defined in linux/mm.h. ++ * ++ * See Documentation/filesystems/aufs/design/06mmap.txt ++ * ++ * Copyright (c) 2014-2017 Junjro R. Okajima ++ * Copyright (c) 2014 Ian Campbell ++ */ ++ ++#include ++#include ++#include ++ ++/* #define PRFILE_TRACE */ ++static inline void prfile_trace(struct file *f, struct file *pr, ++ const char func[], int line, const char func2[]) ++{ ++#ifdef PRFILE_TRACE ++ if (pr) ++ pr_info("%s:%d: %s, %pD2\n", func, line, func2, f); ++#endif ++} ++ ++void vma_do_file_update_time(struct vm_area_struct *vma, const char func[], ++ int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ file_update_time(f); ++ if (f && pr) ++ file_update_time(pr); ++} ++ ++struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[], ++ int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ return (f && pr) ? pr : f; ++} ++ ++void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ get_file(f); ++ if (f && pr) ++ get_file(pr); ++} ++ ++void vma_do_fput(struct vm_area_struct *vma, const char func[], int line) ++{ ++ struct file *f = vma->vm_file, *pr = vma->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ fput(f); ++ if (f && pr) ++ fput(pr); ++} ++ ++#ifndef CONFIG_MMU ++struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[], ++ int line) ++{ ++ struct file *f = region->vm_file, *pr = region->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ return (f && pr) ? pr : f; ++} ++ ++void vmr_do_fput(struct vm_region *region, const char func[], int line) ++{ ++ struct file *f = region->vm_file, *pr = region->vm_prfile; ++ ++ prfile_trace(f, pr, func, line, __func__); ++ fput(f); ++ if (f && pr) ++ fput(pr); ++} ++#endif /* !CONFIG_MMU */ diff --git a/talimatname/genel/k/kernel/aufs4-standalone.patch b/talimatname/genel/k/kernel/aufs4-standalone.patch new file mode 100644 index 000000000..12986ee20 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4-standalone.patch @@ -0,0 +1,436 @@ +SPDX-License-Identifier: GPL-2.0 +aufs4.15 standalone patch + +diff --git a/fs/dcache.c b/fs/dcache.c +index 019f14b..10c1a6d 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -1305,6 +1305,7 @@ void d_walk(struct dentry *parent, void *data, + seq = 1; + goto again; + } ++EXPORT_SYMBOL_GPL(d_walk); + + struct check_mount { + struct vfsmount *mnt; +@@ -2892,6 +2893,7 @@ void d_exchange(struct dentry *dentry1, struct dentry *dentry2) + + write_sequnlock(&rename_lock); + } ++EXPORT_SYMBOL_GPL(d_exchange); + + /** + * d_ancestor - search for an ancestor +diff --git a/fs/exec.c b/fs/exec.c +index 7eb8d21..56d7985 100644 +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -109,6 +109,7 @@ bool path_noexec(const struct path *path) + return (path->mnt->mnt_flags & MNT_NOEXEC) || + (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC); + } ++EXPORT_SYMBOL_GPL(path_noexec); + + #ifdef CONFIG_USELIB + /* +diff --git a/fs/fcntl.c b/fs/fcntl.c +index 74c255d..ec53ee1 100644 +--- a/fs/fcntl.c ++++ b/fs/fcntl.c +@@ -85,6 +85,7 @@ int setfl(int fd, struct file * filp, unsigned long arg) + out: + return error; + } ++EXPORT_SYMBOL_GPL(setfl); + + static void f_modown(struct file *filp, struct pid *pid, enum pid_type type, + int force) +diff --git a/fs/file_table.c b/fs/file_table.c +index 2dc9f38..7bf57df 100644 +--- a/fs/file_table.c ++++ b/fs/file_table.c +@@ -148,6 +148,7 @@ struct file *get_empty_filp(void) + } + return ERR_PTR(-ENFILE); + } ++EXPORT_SYMBOL_GPL(get_empty_filp); + + /** + * alloc_file - allocate and initialize a 'struct file' +@@ -258,6 +259,7 @@ void flush_delayed_fput(void) + { + delayed_fput(NULL); + } ++EXPORT_SYMBOL_GPL(flush_delayed_fput); + + static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput); + +@@ -300,6 +302,7 @@ void __fput_sync(struct file *file) + } + + EXPORT_SYMBOL(fput); ++EXPORT_SYMBOL_GPL(__fput_sync); + + void put_filp(struct file *file) + { +@@ -308,6 +311,7 @@ void put_filp(struct file *file) + file_free(file); + } + } ++EXPORT_SYMBOL_GPL(put_filp); + + void __init files_init(void) + { +diff --git a/fs/inode.c b/fs/inode.c +index 517883c..5cece5e 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -1664,6 +1664,7 @@ int update_time(struct inode *inode, struct timespec *time, int flags) + + return update_time(inode, time, flags); + } ++EXPORT_SYMBOL_GPL(update_time); + + /** + * touch_atime - update the access time +diff --git a/fs/namespace.c b/fs/namespace.c +index 26ef600..a4b9707 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -517,6 +517,7 @@ void __mnt_drop_write(struct vfsmount *mnt) + mnt_dec_writers(real_mount(mnt)); + preempt_enable(); + } ++EXPORT_SYMBOL_GPL(__mnt_drop_write); + + /** + * mnt_drop_write - give up write access to a mount +@@ -851,6 +852,7 @@ int is_current_mnt_ns(struct vfsmount *mnt) + { + return check_mnt(real_mount(mnt)); + } ++EXPORT_SYMBOL_GPL(is_current_mnt_ns); + + /* + * vfsmount lock must be held for write +@@ -1887,6 +1889,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, + } + return 0; + } ++EXPORT_SYMBOL_GPL(iterate_mounts); + + static void cleanup_group_ids(struct mount *mnt, struct mount *end) + { +diff --git a/fs/notify/group.c b/fs/notify/group.c +index b7a4b6a..5a69d60 100644 +--- a/fs/notify/group.c ++++ b/fs/notify/group.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include + #include "fsnotify.h" +@@ -109,6 +110,7 @@ void fsnotify_get_group(struct fsnotify_group *group) + { + refcount_inc(&group->refcnt); + } ++EXPORT_SYMBOL_GPL(fsnotify_get_group); + + /* + * Drop a reference to a group. Free it if it's through. +@@ -118,6 +120,7 @@ void fsnotify_put_group(struct fsnotify_group *group) + if (refcount_dec_and_test(&group->refcnt)) + fsnotify_final_destroy_group(group); + } ++EXPORT_SYMBOL_GPL(fsnotify_put_group); + + /* + * Create a new fsnotify_group and hold a reference for the group returned. +@@ -147,6 +150,7 @@ struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops) + + return group; + } ++EXPORT_SYMBOL_GPL(fsnotify_alloc_group); + + int fsnotify_fasync(int fd, struct file *file, int on) + { +diff --git a/fs/notify/mark.c b/fs/notify/mark.c +index e9191b4..1f8ccfa 100644 +--- a/fs/notify/mark.c ++++ b/fs/notify/mark.c +@@ -108,6 +108,7 @@ void fsnotify_get_mark(struct fsnotify_mark *mark) + WARN_ON_ONCE(!refcount_read(&mark->refcnt)); + refcount_inc(&mark->refcnt); + } ++EXPORT_SYMBOL_GPL(fsnotify_put_mark); + + static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn) + { +@@ -392,6 +393,7 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark, + mutex_unlock(&group->mark_mutex); + fsnotify_free_mark(mark); + } ++EXPORT_SYMBOL_GPL(fsnotify_destroy_mark); + + /* + * Sorting function for lists of fsnotify marks. +@@ -606,6 +608,7 @@ int fsnotify_add_mark_locked(struct fsnotify_mark *mark, struct inode *inode, + fsnotify_put_mark(mark); + return ret; + } ++EXPORT_SYMBOL_GPL(fsnotify_add_mark); + + int fsnotify_add_mark(struct fsnotify_mark *mark, struct inode *inode, + struct vfsmount *mnt, int allow_dups) +@@ -741,6 +744,7 @@ void fsnotify_init_mark(struct fsnotify_mark *mark, + fsnotify_get_group(group); + mark->group = group; + } ++EXPORT_SYMBOL_GPL(fsnotify_init_mark); + + /* + * Destroy all marks in destroy_list, waits for SRCU period to finish before +diff --git a/fs/open.c b/fs/open.c +index 7ea1184..6e2e241 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, + inode_unlock(dentry->d_inode); + return ret; + } ++EXPORT_SYMBOL_GPL(do_truncate); + + long vfs_truncate(const struct path *path, loff_t length) + { +@@ -691,6 +692,7 @@ int open_check_o_direct(struct file *f) + } + return 0; + } ++EXPORT_SYMBOL_GPL(open_check_o_direct); + + static int do_dentry_open(struct file *f, + struct inode *inode, +diff --git a/fs/read_write.c b/fs/read_write.c +index 0a5c47b..d423a5f 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -454,6 +454,7 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) + + return ret; + } ++EXPORT_SYMBOL_GPL(vfs_read); + + static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) + { +@@ -494,6 +495,7 @@ vfs_readf_t vfs_readf(struct file *file) + return new_sync_read; + return ERR_PTR(-ENOSYS); + } ++EXPORT_SYMBOL_GPL(vfs_readf); + + vfs_writef_t vfs_writef(struct file *file) + { +@@ -505,6 +507,7 @@ vfs_writef_t vfs_writef(struct file *file) + return new_sync_write; + return ERR_PTR(-ENOSYS); + } ++EXPORT_SYMBOL_GPL(vfs_writef); + + ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos) + { +@@ -574,6 +577,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ + + return ret; + } ++EXPORT_SYMBOL_GPL(vfs_write); + + static inline loff_t file_pos_read(struct file *file) + { +diff --git a/fs/splice.c b/fs/splice.c +index c5fb195..ce01a74 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -850,6 +850,7 @@ long do_splice_from(struct pipe_inode_info *pipe, struct file *out, + + return splice_write(pipe, out, ppos, len, flags); + } ++EXPORT_SYMBOL_GPL(do_splice_from); + + /* + * Attempt to initiate a splice from a file to a pipe. +@@ -879,6 +880,7 @@ long do_splice_to(struct file *in, loff_t *ppos, + + return splice_read(in, ppos, pipe, len, flags); + } ++EXPORT_SYMBOL_GPL(do_splice_to); + + /** + * splice_direct_to_actor - splices data directly between two non-pipes +diff --git a/fs/sync.c b/fs/sync.c +index a6891ee..47a78bd 100644 +--- a/fs/sync.c ++++ b/fs/sync.c +@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block *sb, int wait) + sb->s_op->sync_fs(sb, wait); + return __sync_blockdev(sb->s_bdev, wait); + } ++EXPORT_SYMBOL_GPL(__sync_filesystem); + + /* + * Write out and wait upon all dirty data associated with this +diff --git a/fs/xattr.c b/fs/xattr.c +index 61cd28b..35570cd 100644 +--- a/fs/xattr.c ++++ b/fs/xattr.c +@@ -297,6 +297,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value, + *xattr_value = value; + return error; + } ++EXPORT_SYMBOL_GPL(vfs_getxattr_alloc); + + ssize_t + __vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name, +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 8b5f44d..979db63 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -151,6 +151,7 @@ inline struct lock_class *lockdep_hlock_class(struct held_lock *hlock) + } + return lock_classes + hlock->class_idx - 1; + } ++EXPORT_SYMBOL_GPL(lockdep_hlock_class); + #define hlock_class(hlock) lockdep_hlock_class(hlock) + + #ifdef CONFIG_LOCK_STAT +diff --git a/kernel/task_work.c b/kernel/task_work.c +index 0fef395..83fb1ec 100644 +--- a/kernel/task_work.c ++++ b/kernel/task_work.c +@@ -116,3 +116,4 @@ void task_work_run(void) + } while (work); + } + } ++EXPORT_SYMBOL_GPL(task_work_run); +diff --git a/security/commoncap.c b/security/commoncap.c +index 48620c9..4981104 100644 +--- a/security/commoncap.c ++++ b/security/commoncap.c +@@ -1330,12 +1330,14 @@ int cap_mmap_addr(unsigned long addr) + } + return ret; + } ++EXPORT_SYMBOL_GPL(cap_mmap_addr); + + int cap_mmap_file(struct file *file, unsigned long reqprot, + unsigned long prot, unsigned long flags) + { + return 0; + } ++EXPORT_SYMBOL_GPL(cap_mmap_file); + + #ifdef CONFIG_SECURITY + +diff --git a/security/device_cgroup.c b/security/device_cgroup.c +index c65b39b..e363d22 100644 +--- a/security/device_cgroup.c ++++ b/security/device_cgroup.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -824,3 +825,4 @@ int __devcgroup_check_permission(short type, u32 major, u32 minor, + + return 0; + } ++EXPORT_SYMBOL_GPL(__devcgroup_check_permission); +diff --git a/security/security.c b/security/security.c +index 1cd8526..f2e4736 100644 +--- a/security/security.c ++++ b/security/security.c +@@ -531,6 +531,7 @@ int security_path_rmdir(const struct path *dir, struct dentry *dentry) + return 0; + return call_int_hook(path_rmdir, 0, dir, dentry); + } ++EXPORT_SYMBOL_GPL(security_path_rmdir); + + int security_path_unlink(const struct path *dir, struct dentry *dentry) + { +@@ -547,6 +548,7 @@ int security_path_symlink(const struct path *dir, struct dentry *dentry, + return 0; + return call_int_hook(path_symlink, 0, dir, dentry, old_name); + } ++EXPORT_SYMBOL_GPL(security_path_symlink); + + int security_path_link(struct dentry *old_dentry, const struct path *new_dir, + struct dentry *new_dentry) +@@ -555,6 +557,7 @@ int security_path_link(struct dentry *old_dentry, const struct path *new_dir, + return 0; + return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry); + } ++EXPORT_SYMBOL_GPL(security_path_link); + + int security_path_rename(const struct path *old_dir, struct dentry *old_dentry, + const struct path *new_dir, struct dentry *new_dentry, +@@ -582,6 +585,7 @@ int security_path_truncate(const struct path *path) + return 0; + return call_int_hook(path_truncate, 0, path); + } ++EXPORT_SYMBOL_GPL(security_path_truncate); + + int security_path_chmod(const struct path *path, umode_t mode) + { +@@ -589,6 +593,7 @@ int security_path_chmod(const struct path *path, umode_t mode) + return 0; + return call_int_hook(path_chmod, 0, path, mode); + } ++EXPORT_SYMBOL_GPL(security_path_chmod); + + int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) + { +@@ -596,6 +601,7 @@ int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid) + return 0; + return call_int_hook(path_chown, 0, path, uid, gid); + } ++EXPORT_SYMBOL_GPL(security_path_chown); + + int security_path_chroot(const struct path *path) + { +@@ -681,6 +687,7 @@ int security_inode_readlink(struct dentry *dentry) + return 0; + return call_int_hook(inode_readlink, 0, dentry); + } ++EXPORT_SYMBOL_GPL(security_inode_readlink); + + int security_inode_follow_link(struct dentry *dentry, struct inode *inode, + bool rcu) +@@ -696,6 +703,7 @@ int security_inode_permission(struct inode *inode, int mask) + return 0; + return call_int_hook(inode_permission, 0, inode, mask); + } ++EXPORT_SYMBOL_GPL(security_inode_permission); + + int security_inode_setattr(struct dentry *dentry, struct iattr *attr) + { +@@ -867,6 +875,7 @@ int security_file_permission(struct file *file, int mask) + + return fsnotify_perm(file, mask); + } ++EXPORT_SYMBOL_GPL(security_file_permission); + + int security_file_alloc(struct file *file) + { +@@ -926,6 +935,7 @@ int security_mmap_file(struct file *file, unsigned long prot, + return ret; + return ima_file_mmap(file, prot); + } ++EXPORT_SYMBOL_GPL(security_mmap_file); + + int security_mmap_addr(unsigned long addr) + { diff --git a/talimatname/genel/k/kernel/aufs4.patch b/talimatname/genel/k/kernel/aufs4.patch new file mode 100644 index 000000000..a13fd1031 --- /dev/null +++ b/talimatname/genel/k/kernel/aufs4.patch @@ -0,0 +1,37214 @@ +diff -Naur null/Documentation/ABI/testing/debugfs-aufs linux-4.15/Documentation/ABI/testing/debugfs-aufs +--- /dev/null ++++ linux-4.15/Documentation/ABI/testing/debugfs-aufs 2018-02-25 02:38:09.195737146 +0100 +@@ -0,0 +1,50 @@ ++What: /debug/aufs/si_/ ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ Under /debug/aufs, a directory named si_ is created ++ per aufs mount, where is a unique id generated ++ internally. ++ ++What: /debug/aufs/si_/plink ++Date: Apr 2013 ++Contact: J. R. Okajima ++Description: ++ It has three lines and shows the information about the ++ pseudo-link. The first line is a single number ++ representing a number of buckets. The second line is a ++ number of pseudo-links per buckets (separated by a ++ blank). The last line is a single number representing a ++ total number of psedo-links. ++ When the aufs mount option 'noplink' is specified, it ++ will show "1\n0\n0\n". ++ ++What: /debug/aufs/si_/xib ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xib (External Inode Number ++ Bitmap), its block size and file size. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. ++ ++What: /debug/aufs/si_/xino0, xino1 ... xinoN ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xino (External Inode Number ++ Translation Table), its link count, block size and file ++ size. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. ++ ++What: /debug/aufs/si_/xigen ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the consumed blocks by xigen (External Inode ++ Generation Table), its block size and file size. ++ If CONFIG_AUFS_EXPORT is disabled, this entry will not ++ be created. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. +diff -Naur null/Documentation/ABI/testing/sysfs-aufs linux-4.15/Documentation/ABI/testing/sysfs-aufs +--- /dev/null ++++ linux-4.15/Documentation/ABI/testing/sysfs-aufs 2018-02-25 02:38:09.195737146 +0100 +@@ -0,0 +1,31 @@ ++What: /sys/fs/aufs/si_/ ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ Under /sys/fs/aufs, a directory named si_ is created ++ per aufs mount, where is a unique id generated ++ internally. ++ ++What: /sys/fs/aufs/si_/br0, br1 ... brN ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the abolute path of a member directory (which ++ is called branch) in aufs, and its permission. ++ ++What: /sys/fs/aufs/si_/brid0, brid1 ... bridN ++Date: July 2013 ++Contact: J. R. Okajima ++Description: ++ It shows the id of a member directory (which is called ++ branch) in aufs. ++ ++What: /sys/fs/aufs/si_/xi_path ++Date: March 2009 ++Contact: J. R. Okajima ++Description: ++ It shows the abolute path of XINO (External Inode Number ++ Bitmap, Translation Table and Generation Table) file ++ even if it is the default path. ++ When the aufs mount option 'noxino' is specified, it ++ will be empty. About XINO files, see the aufs manual. +diff -Naur null/Documentation/filesystems/aufs/design/01intro.txt linux-4.15/Documentation/filesystems/aufs/design/01intro.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/01intro.txt 2018-02-25 02:38:09.195737146 +0100 +@@ -0,0 +1,171 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Introduction ++---------------------------------------- ++ ++aufs [ei ju: ef es] | /ey-yoo-ef-es/ | [a u f s] ++1. abbrev. for "advanced multi-layered unification filesystem". ++2. abbrev. for "another unionfs". ++3. abbrev. for "auf das" in German which means "on the" in English. ++ Ex. "Butter aufs Brot"(G) means "butter onto bread"(E). ++ But "Filesystem aufs Filesystem" is hard to understand. ++4. abbrev. for "African Urban Fashion Show". ++ ++AUFS is a filesystem with features: ++- multi layered stackable unification filesystem, the member directory ++ is called as a branch. ++- branch permission and attribute, 'readonly', 'real-readonly', ++ 'readwrite', 'whiteout-able', 'link-able whiteout', etc. and their ++ combination. ++- internal "file copy-on-write". ++- logical deletion, whiteout. ++- dynamic branch manipulation, adding, deleting and changing permission. ++- allow bypassing aufs, user's direct branch access. ++- external inode number translation table and bitmap which maintains the ++ persistent aufs inode number. ++- seekable directory, including NFS readdir. ++- file mapping, mmap and sharing pages. ++- pseudo-link, hardlink over branches. ++- loopback mounted filesystem as a branch. ++- several policies to select one among multiple writable branches. ++- revert a single systemcall when an error occurs in aufs. ++- and more... ++ ++ ++Multi Layered Stackable Unification Filesystem ++---------------------------------------------------------------------- ++Most people already knows what it is. ++It is a filesystem which unifies several directories and provides a ++merged single directory. When users access a file, the access will be ++passed/re-directed/converted (sorry, I am not sure which English word is ++correct) to the real file on the member filesystem. The member ++filesystem is called 'lower filesystem' or 'branch' and has a mode ++'readonly' and 'readwrite.' And the deletion for a file on the lower ++readonly branch is handled by creating 'whiteout' on the upper writable ++branch. ++ ++On LKML, there have been discussions about UnionMount (Jan Blunck, ++Bharata B Rao and Valerie Aurora) and Unionfs (Erez Zadok). They took ++different approaches to implement the merged-view. ++The former tries putting it into VFS, and the latter implements as a ++separate filesystem. ++(If I misunderstand about these implementations, please let me know and ++I shall correct it. Because it is a long time ago when I read their ++source files last time). ++ ++UnionMount's approach will be able to small, but may be hard to share ++branches between several UnionMount since the whiteout in it is ++implemented in the inode on branch filesystem and always ++shared. According to Bharata's post, readdir does not seems to be ++finished yet. ++There are several missing features known in this implementations such as ++- for users, the inode number may change silently. eg. copy-up. ++- link(2) may break by copy-up. ++- read(2) may get an obsoleted filedata (fstat(2) too). ++- fcntl(F_SETLK) may be broken by copy-up. ++- unnecessary copy-up may happen, for example mmap(MAP_PRIVATE) after ++ open(O_RDWR). ++ ++In linux-3.18, "overlay" filesystem (formerly known as "overlayfs") was ++merged into mainline. This is another implementation of UnionMount as a ++separated filesystem. All the limitations and known problems which ++UnionMount are equally inherited to "overlay" filesystem. ++ ++Unionfs has a longer history. When I started implementing a stackable ++filesystem (Aug 2005), it already existed. It has virtual super_block, ++inode, dentry and file objects and they have an array pointing lower ++same kind objects. After contributing many patches for Unionfs, I ++re-started my project AUFS (Jun 2006). ++ ++In AUFS, the structure of filesystem resembles to Unionfs, but I ++implemented my own ideas, approaches and enhancements and it became ++totally different one. ++ ++Comparing DM snapshot and fs based implementation ++- the number of bytes to be copied between devices is much smaller. ++- the type of filesystem must be one and only. ++- the fs must be writable, no readonly fs, even for the lower original ++ device. so the compression fs will not be usable. but if we use ++ loopback mount, we may address this issue. ++ for instance, ++ mount /cdrom/squashfs.img /sq ++ losetup /sq/ext2.img ++ losetup /somewhere/cow ++ dmsetup "snapshot /dev/loop0 /dev/loop1 ..." ++- it will be difficult (or needs more operations) to extract the ++ difference between the original device and COW. ++- DM snapshot-merge may help a lot when users try merging. in the ++ fs-layer union, users will use rsync(1). ++ ++You may want to read my old paper "Filesystems in LiveCD" ++(http://aufs.sourceforge.net/aufs2/report/sq/sq.pdf). ++ ++ ++Several characters/aspects/persona of aufs ++---------------------------------------------------------------------- ++ ++Aufs has several characters, aspects or persona. ++1. a filesystem, callee of VFS helper ++2. sub-VFS, caller of VFS helper for branches ++3. a virtual filesystem which maintains persistent inode number ++4. reader/writer of files on branches such like an application ++ ++1. Callee of VFS Helper ++As an ordinary linux filesystem, aufs is a callee of VFS. For instance, ++unlink(2) from an application reaches sys_unlink() kernel function and ++then vfs_unlink() is called. vfs_unlink() is one of VFS helper and it ++calls filesystem specific unlink operation. Actually aufs implements the ++unlink operation but it behaves like a redirector. ++ ++2. Caller of VFS Helper for Branches ++aufs_unlink() passes the unlink request to the branch filesystem as if ++it were called from VFS. So the called unlink operation of the branch ++filesystem acts as usual. As a caller of VFS helper, aufs should handle ++every necessary pre/post operation for the branch filesystem. ++- acquire the lock for the parent dir on a branch ++- lookup in a branch ++- revalidate dentry on a branch ++- mnt_want_write() for a branch ++- vfs_unlink() for a branch ++- mnt_drop_write() for a branch ++- release the lock on a branch ++ ++3. Persistent Inode Number ++One of the most important issue for a filesystem is to maintain inode ++numbers. This is particularly important to support exporting a ++filesystem via NFS. Aufs is a virtual filesystem which doesn't have a ++backend block device for its own. But some storage is necessary to ++keep and maintain the inode numbers. It may be a large space and may not ++suit to keep in memory. Aufs rents some space from its first writable ++branch filesystem (by default) and creates file(s) on it. These files ++are created by aufs internally and removed soon (currently) keeping ++opened. ++Note: Because these files are removed, they are totally gone after ++ unmounting aufs. It means the inode numbers are not persistent ++ across unmount or reboot. I have a plan to make them really ++ persistent which will be important for aufs on NFS server. ++ ++4. Read/Write Files Internally (copy-on-write) ++Because a branch can be readonly, when you write a file on it, aufs will ++"copy-up" it to the upper writable branch internally. And then write the ++originally requested thing to the file. Generally kernel doesn't ++open/read/write file actively. In aufs, even a single write may cause a ++internal "file copy". This behaviour is very similar to cp(1) command. ++ ++Some people may think it is better to pass such work to user space ++helper, instead of doing in kernel space. Actually I am still thinking ++about it. But currently I have implemented it in kernel space. +diff -Naur null/Documentation/filesystems/aufs/design/02struct.txt linux-4.15/Documentation/filesystems/aufs/design/02struct.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/02struct.txt 2018-02-25 02:38:09.195737146 +0100 +@@ -0,0 +1,258 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Basic Aufs Internal Structure ++ ++Superblock/Inode/Dentry/File Objects ++---------------------------------------------------------------------- ++As like an ordinary filesystem, aufs has its own ++superblock/inode/dentry/file objects. All these objects have a ++dynamically allocated array and store the same kind of pointers to the ++lower filesystem, branch. ++For example, when you build a union with one readwrite branch and one ++readonly, mounted /au, /rw and /ro respectively. ++- /au = /rw + /ro ++- /ro/fileA exists but /rw/fileA ++ ++Aufs lookup operation finds /ro/fileA and gets dentry for that. These ++pointers are stored in a aufs dentry. The array in aufs dentry will be, ++- [0] = NULL (because /rw/fileA doesn't exist) ++- [1] = /ro/fileA ++ ++This style of an array is essentially same to the aufs ++superblock/inode/dentry/file objects. ++ ++Because aufs supports manipulating branches, ie. add/delete/change ++branches dynamically, these objects has its own generation. When ++branches are changed, the generation in aufs superblock is ++incremented. And a generation in other object are compared when it is ++accessed. When a generation in other objects are obsoleted, aufs ++refreshes the internal array. ++ ++ ++Superblock ++---------------------------------------------------------------------- ++Additionally aufs superblock has some data for policies to select one ++among multiple writable branches, XIB files, pseudo-links and kobject. ++See below in detail. ++About the policies which supports copy-down a directory, see ++wbr_policy.txt too. ++ ++ ++Branch and XINO(External Inode Number Translation Table) ++---------------------------------------------------------------------- ++Every branch has its own xino (external inode number translation table) ++file. The xino file is created and unlinked by aufs internally. When two ++members of a union exist on the same filesystem, they share the single ++xino file. ++The struct of a xino file is simple, just a sequence of aufs inode ++numbers which is indexed by the lower inode number. ++In the above sample, assume the inode number of /ro/fileA is i111 and ++aufs assigns the inode number i999 for fileA. Then aufs writes 999 as ++4(8) bytes at 111 * 4(8) bytes offset in the xino file. ++ ++When the inode numbers are not contiguous, the xino file will be sparse ++which has a hole in it and doesn't consume as much disk space as it ++might appear. If your branch filesystem consumes disk space for such ++holes, then you should specify 'xino=' option at mounting aufs. ++ ++Aufs has a mount option to free the disk blocks for such holes in XINO ++files on tmpfs or ramdisk. But it is not so effective actually. If you ++meet a problem of disk shortage due to XINO files, then you should try ++"tmpfs-ino.patch" (and "vfs-ino.patch" too) in aufs4-standalone.git. ++The patch localizes the assignment inumbers per tmpfs-mount and avoid ++the holes in XINO files. ++ ++Also a writable branch has three kinds of "whiteout bases". All these ++are existed when the branch is joined to aufs, and their names are ++whiteout-ed doubly, so that users will never see their names in aufs ++hierarchy. ++1. a regular file which will be hardlinked to all whiteouts. ++2. a directory to store a pseudo-link. ++3. a directory to store an "orphan"-ed file temporary. ++ ++1. Whiteout Base ++ When you remove a file on a readonly branch, aufs handles it as a ++ logical deletion and creates a whiteout on the upper writable branch ++ as a hardlink of this file in order not to consume inode on the ++ writable branch. ++2. Pseudo-link Dir ++ See below, Pseudo-link. ++3. Step-Parent Dir ++ When "fileC" exists on the lower readonly branch only and it is ++ opened and removed with its parent dir, and then user writes ++ something into it, then aufs copies-up fileC to this ++ directory. Because there is no other dir to store fileC. After ++ creating a file under this dir, the file is unlinked. ++ ++Because aufs supports manipulating branches, ie. add/delete/change ++dynamically, a branch has its own id. When the branch order changes, ++aufs finds the new index by searching the branch id. ++ ++ ++Pseudo-link ++---------------------------------------------------------------------- ++Assume "fileA" exists on the lower readonly branch only and it is ++hardlinked to "fileB" on the branch. When you write something to fileA, ++aufs copies-up it to the upper writable branch. Additionally aufs ++creates a hardlink under the Pseudo-link Directory of the writable ++branch. The inode of a pseudo-link is kept in aufs super_block as a ++simple list. If fileB is read after unlinking fileA, aufs returns ++filedata from the pseudo-link instead of the lower readonly ++branch. Because the pseudo-link is based upon the inode, to keep the ++inode number by xino (see above) is essentially necessary. ++ ++All the hardlinks under the Pseudo-link Directory of the writable branch ++should be restored in a proper location later. Aufs provides a utility ++to do this. The userspace helpers executed at remounting and unmounting ++aufs by default. ++During this utility is running, it puts aufs into the pseudo-link ++maintenance mode. In this mode, only the process which began the ++maintenance mode (and its child processes) is allowed to operate in ++aufs. Some other processes which are not related to the pseudo-link will ++be allowed to run too, but the rest have to return an error or wait ++until the maintenance mode ends. If a process already acquires an inode ++mutex (in VFS), it has to return an error. ++ ++ ++XIB(external inode number bitmap) ++---------------------------------------------------------------------- ++Addition to the xino file per a branch, aufs has an external inode number ++bitmap in a superblock object. It is also an internal file such like a ++xino file. ++It is a simple bitmap to mark whether the aufs inode number is in-use or ++not. ++To reduce the file I/O, aufs prepares a single memory page to cache xib. ++ ++As well as XINO files, aufs has a feature to truncate/refresh XIB to ++reduce the number of consumed disk blocks for these files. ++ ++ ++Virtual or Vertical Dir, and Readdir in Userspace ++---------------------------------------------------------------------- ++In order to support multiple layers (branches), aufs readdir operation ++constructs a virtual dir block on memory. For readdir, aufs calls ++vfs_readdir() internally for each dir on branches, merges their entries ++with eliminating the whiteout-ed ones, and sets it to file (dir) ++object. So the file object has its entry list until it is closed. The ++entry list will be updated when the file position is zero and becomes ++obsoleted. This decision is made in aufs automatically. ++ ++The dynamically allocated memory block for the name of entries has a ++unit of 512 bytes (by default) and stores the names contiguously (no ++padding). Another block for each entry is handled by kmem_cache too. ++During building dir blocks, aufs creates hash list and judging whether ++the entry is whiteouted by its upper branch or already listed. ++The merged result is cached in the corresponding inode object and ++maintained by a customizable life-time option. ++ ++Some people may call it can be a security hole or invite DoS attack ++since the opened and once readdir-ed dir (file object) holds its entry ++list and becomes a pressure for system memory. But I'd say it is similar ++to files under /proc or /sys. The virtual files in them also holds a ++memory page (generally) while they are opened. When an idea to reduce ++memory for them is introduced, it will be applied to aufs too. ++For those who really hate this situation, I've developed readdir(3) ++library which operates this merging in userspace. You just need to set ++LD_PRELOAD environment variable, and aufs will not consume no memory in ++kernel space for readdir(3). ++ ++ ++Workqueue ++---------------------------------------------------------------------- ++Aufs sometimes requires privilege access to a branch. For instance, ++in copy-up/down operation. When a user process is going to make changes ++to a file which exists in the lower readonly branch only, and the mode ++of one of ancestor directories may not be writable by a user ++process. Here aufs copy-up the file with its ancestors and they may ++require privilege to set its owner/group/mode/etc. ++This is a typical case of a application character of aufs (see ++Introduction). ++ ++Aufs uses workqueue synchronously for this case. It creates its own ++workqueue. The workqueue is a kernel thread and has privilege. Aufs ++passes the request to call mkdir or write (for example), and wait for ++its completion. This approach solves a problem of a signal handler ++simply. ++If aufs didn't adopt the workqueue and changed the privilege of the ++process, then the process may receive the unexpected SIGXFSZ or other ++signals. ++ ++Also aufs uses the system global workqueue ("events" kernel thread) too ++for asynchronous tasks, such like handling inotify/fsnotify, re-creating a ++whiteout base and etc. This is unrelated to a privilege. ++Most of aufs operation tries acquiring a rw_semaphore for aufs ++superblock at the beginning, at the same time waits for the completion ++of all queued asynchronous tasks. ++ ++ ++Whiteout ++---------------------------------------------------------------------- ++The whiteout in aufs is very similar to Unionfs's. That is represented ++by its filename. UnionMount takes an approach of a file mode, but I am ++afraid several utilities (find(1) or something) will have to support it. ++ ++Basically the whiteout represents "logical deletion" which stops aufs to ++lookup further, but also it represents "dir is opaque" which also stop ++further lookup. ++ ++In aufs, rmdir(2) and rename(2) for dir uses whiteout alternatively. ++In order to make several functions in a single systemcall to be ++revertible, aufs adopts an approach to rename a directory to a temporary ++unique whiteouted name. ++For example, in rename(2) dir where the target dir already existed, aufs ++renames the target dir to a temporary unique whiteouted name before the ++actual rename on a branch, and then handles other actions (make it opaque, ++update the attributes, etc). If an error happens in these actions, aufs ++simply renames the whiteouted name back and returns an error. If all are ++succeeded, aufs registers a function to remove the whiteouted unique ++temporary name completely and asynchronously to the system global ++workqueue. ++ ++ ++Copy-up ++---------------------------------------------------------------------- ++It is a well-known feature or concept. ++When user modifies a file on a readonly branch, aufs operate "copy-up" ++internally and makes change to the new file on the upper writable branch. ++When the trigger systemcall does not update the timestamps of the parent ++dir, aufs reverts it after copy-up. ++ ++ ++Move-down (aufs3.9 and later) ++---------------------------------------------------------------------- ++"Copy-up" is one of the essential feature in aufs. It copies a file from ++the lower readonly branch to the upper writable branch when a user ++changes something about the file. ++"Move-down" is an opposite action of copy-up. Basically this action is ++ran manually instead of automatically and internally. ++For desgin and implementation, aufs has to consider these issues. ++- whiteout for the file may exist on the lower branch. ++- ancestor directories may not exist on the lower branch. ++- diropq for the ancestor directories may exist on the upper branch. ++- free space on the lower branch will reduce. ++- another access to the file may happen during moving-down, including ++ UDBA (see "Revalidate Dentry and UDBA"). ++- the file should not be hard-linked nor pseudo-linked. they should be ++ handled by auplink utility later. ++ ++Sometimes users want to move-down a file from the upper writable branch ++to the lower readonly or writable branch. For instance, ++- the free space of the upper writable branch is going to run out. ++- create a new intermediate branch between the upper and lower branch. ++- etc. ++ ++For this purpose, use "aumvdown" command in aufs-util.git. +diff -Naur null/Documentation/filesystems/aufs/design/03atomic_open.txt linux-4.15/Documentation/filesystems/aufs/design/03atomic_open.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/03atomic_open.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,85 @@ ++ ++# Copyright (C) 2015-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Support for a branch who has its ->atomic_open() ++---------------------------------------------------------------------- ++The filesystems who implement its ->atomic_open() are not majority. For ++example NFSv4 does, and aufs should call NFSv4 ->atomic_open, ++particularly for open(O_CREAT|O_EXCL, 0400) case. Other than ++->atomic_open(), NFSv4 returns an error for this open(2). While I am not ++sure whether all filesystems who have ->atomic_open() behave like this, ++but NFSv4 surely returns the error. ++ ++In order to support ->atomic_open() for aufs, there are a few ++approaches. ++ ++A. Introduce aufs_atomic_open() ++ - calls one of VFS:do_last(), lookup_open() or atomic_open() for ++ branch fs. ++B. Introduce aufs_atomic_open() calling create, open and chmod. this is ++ an aufs user Pip Cet's approach ++ - calls aufs_create(), VFS finish_open() and notify_change(). ++ - pass fake-mode to finish_open(), and then correct the mode by ++ notify_change(). ++C. Extend aufs_open() to call branch fs's ->atomic_open() ++ - no aufs_atomic_open(). ++ - aufs_lookup() registers the TID to an aufs internal object. ++ - aufs_create() does nothing when the matching TID is registered, but ++ registers the mode. ++ - aufs_open() calls branch fs's ->atomic_open() when the matching ++ TID is registered. ++D. Extend aufs_open() to re-try branch fs's ->open() with superuser's ++ credential ++ - no aufs_atomic_open(). ++ - aufs_create() registers the TID to an internal object. this info ++ represents "this process created this file just now." ++ - when aufs gets EACCES from branch fs's ->open(), then confirm the ++ registered TID and re-try open() with superuser's credential. ++ ++Pros and cons for each approach. ++ ++A. ++ - straightforward but highly depends upon VFS internal. ++ - the atomic behavaiour is kept. ++ - some of parameters such as nameidata are hard to reproduce for ++ branch fs. ++ - large overhead. ++B. ++ - easy to implement. ++ - the atomic behavaiour is lost. ++C. ++ - the atomic behavaiour is kept. ++ - dirty and tricky. ++ - VFS checks whether the file is created correctly after calling ++ ->create(), which means this approach doesn't work. ++D. ++ - easy to implement. ++ - the atomic behavaiour is lost. ++ - to open a file with superuser's credential and give it to a user ++ process is a bad idea, since the file object keeps the credential ++ in it. It may affect LSM or something. This approach doesn't work ++ either. ++ ++The approach A is ideal, but it hard to implement. So here is a ++variation of A, which is to be implemented. ++ ++A-1. Introduce aufs_atomic_open() ++ - calls branch fs ->atomic_open() if exists. otherwise calls ++ vfs_create() and finish_open(). ++ - the demerit is that the several checks after branch fs ++ ->atomic_open() are lost. in the ordinary case, the checks are ++ done by VFS:do_last(), lookup_open() and atomic_open(). some can ++ be implemented in aufs, but not all I am afraid. +diff -Naur null/Documentation/filesystems/aufs/design/03lookup.txt linux-4.15/Documentation/filesystems/aufs/design/03lookup.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/03lookup.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,113 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Lookup in a Branch ++---------------------------------------------------------------------- ++Since aufs has a character of sub-VFS (see Introduction), it operates ++lookup for branches as VFS does. It may be a heavy work. But almost all ++lookup operation in aufs is the simplest case, ie. lookup only an entry ++directly connected to its parent. Digging down the directory hierarchy ++is unnecessary. VFS has a function lookup_one_len() for that use, and ++aufs calls it. ++ ++When a branch is a remote filesystem, aufs basically relies upon its ++->d_revalidate(), also aufs forces the hardest revalidate tests for ++them. ++For d_revalidate, aufs implements three levels of revalidate tests. See ++"Revalidate Dentry and UDBA" in detail. ++ ++ ++Test Only the Highest One for the Directory Permission (dirperm1 option) ++---------------------------------------------------------------------- ++Let's try case study. ++- aufs has two branches, upper readwrite and lower readonly. ++ /au = /rw + /ro ++- "dirA" exists under /ro, but /rw. and its mode is 0700. ++- user invoked "chmod a+rx /au/dirA" ++- the internal copy-up is activated and "/rw/dirA" is created and its ++ permission bits are set to world readable. ++- then "/au/dirA" becomes world readable? ++ ++In this case, /ro/dirA is still 0700 since it exists in readonly branch, ++or it may be a natively readonly filesystem. If aufs respects the lower ++branch, it should not respond readdir request from other users. But user ++allowed it by chmod. Should really aufs rejects showing the entries ++under /ro/dirA? ++ ++To be honest, I don't have a good solution for this case. So aufs ++implements 'dirperm1' and 'nodirperm1' mount options, and leave it to ++users. ++When dirperm1 is specified, aufs checks only the highest one for the ++directory permission, and shows the entries. Otherwise, as usual, checks ++every dir existing on all branches and rejects the request. ++ ++As a side effect, dirperm1 option improves the performance of aufs ++because the number of permission check is reduced when the number of ++branch is many. ++ ++ ++Revalidate Dentry and UDBA (User's Direct Branch Access) ++---------------------------------------------------------------------- ++Generally VFS helpers re-validate a dentry as a part of lookup. ++0. digging down the directory hierarchy. ++1. lock the parent dir by its i_mutex. ++2. lookup the final (child) entry. ++3. revalidate it. ++4. call the actual operation (create, unlink, etc.) ++5. unlock the parent dir ++ ++If the filesystem implements its ->d_revalidate() (step 3), then it is ++called. Actually aufs implements it and checks the dentry on a branch is ++still valid. ++But it is not enough. Because aufs has to release the lock for the ++parent dir on a branch at the end of ->lookup() (step 2) and ++->d_revalidate() (step 3) while the i_mutex of the aufs dir is still ++held by VFS. ++If the file on a branch is changed directly, eg. bypassing aufs, after ++aufs released the lock, then the subsequent operation may cause ++something unpleasant result. ++ ++This situation is a result of VFS architecture, ->lookup() and ++->d_revalidate() is separated. But I never say it is wrong. It is a good ++design from VFS's point of view. It is just not suitable for sub-VFS ++character in aufs. ++ ++Aufs supports such case by three level of revalidation which is ++selectable by user. ++1. Simple Revalidate ++ Addition to the native flow in VFS's, confirm the child-parent ++ relationship on the branch just after locking the parent dir on the ++ branch in the "actual operation" (step 4). When this validation ++ fails, aufs returns EBUSY. ->d_revalidate() (step 3) in aufs still ++ checks the validation of the dentry on branches. ++2. Monitor Changes Internally by Inotify/Fsnotify ++ Addition to above, in the "actual operation" (step 4) aufs re-lookup ++ the dentry on the branch, and returns EBUSY if it finds different ++ dentry. ++ Additionally, aufs sets the inotify/fsnotify watch for every dir on branches ++ during it is in cache. When the event is notified, aufs registers a ++ function to kernel 'events' thread by schedule_work(). And the ++ function sets some special status to the cached aufs dentry and inode ++ private data. If they are not cached, then aufs has nothing to ++ do. When the same file is accessed through aufs (step 0-3) later, ++ aufs will detect the status and refresh all necessary data. ++ In this mode, aufs has to ignore the event which is fired by aufs ++ itself. ++3. No Extra Validation ++ This is the simplest test and doesn't add any additional revalidation ++ test, and skip the revalidation in step 4. It is useful and improves ++ aufs performance when system surely hide the aufs branches from user, ++ by over-mounting something (or another method). +diff -Naur null/Documentation/filesystems/aufs/design/04branch.txt linux-4.15/Documentation/filesystems/aufs/design/04branch.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/04branch.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,74 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Branch Manipulation ++ ++Since aufs supports dynamic branch manipulation, ie. add/remove a branch ++and changing its permission/attribute, there are a lot of works to do. ++ ++ ++Add a Branch ++---------------------------------------------------------------------- ++o Confirm the adding dir exists outside of aufs, including loopback ++ mount, and its various attributes. ++o Initialize the xino file and whiteout bases if necessary. ++ See struct.txt. ++ ++o Check the owner/group/mode of the directory ++ When the owner/group/mode of the adding directory differs from the ++ existing branch, aufs issues a warning because it may impose a ++ security risk. ++ For example, when a upper writable branch has a world writable empty ++ top directory, a malicious user can create any files on the writable ++ branch directly, like copy-up and modify manually. If something like ++ /etc/{passwd,shadow} exists on the lower readonly branch but the upper ++ writable branch, and the writable branch is world-writable, then a ++ malicious guy may create /etc/passwd on the writable branch directly ++ and the infected file will be valid in aufs. ++ I am afraid it can be a security issue, but aufs can do nothing except ++ producing a warning. ++ ++ ++Delete a Branch ++---------------------------------------------------------------------- ++o Confirm the deleting branch is not busy ++ To be general, there is one merit to adopt "remount" interface to ++ manipulate branches. It is to discard caches. At deleting a branch, ++ aufs checks the still cached (and connected) dentries and inodes. If ++ there are any, then they are all in-use. An inode without its ++ corresponding dentry can be alive alone (for example, inotify/fsnotify case). ++ ++ For the cached one, aufs checks whether the same named entry exists on ++ other branches. ++ If the cached one is a directory, because aufs provides a merged view ++ to users, as long as one dir is left on any branch aufs can show the ++ dir to users. In this case, the branch can be removed from aufs. ++ Otherwise aufs rejects deleting the branch. ++ ++ If any file on the deleting branch is opened by aufs, then aufs ++ rejects deleting. ++ ++ ++Modify the Permission of a Branch ++---------------------------------------------------------------------- ++o Re-initialize or remove the xino file and whiteout bases if necessary. ++ See struct.txt. ++ ++o rw --> ro: Confirm the modifying branch is not busy ++ Aufs rejects the request if any of these conditions are true. ++ - a file on the branch is mmap-ed. ++ - a regular file on the branch is opened for write and there is no ++ same named entry on the upper branch. +diff -Naur null/Documentation/filesystems/aufs/design/05wbr_policy.txt linux-4.15/Documentation/filesystems/aufs/design/05wbr_policy.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/05wbr_policy.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,64 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Policies to Select One among Multiple Writable Branches ++---------------------------------------------------------------------- ++When the number of writable branch is more than one, aufs has to decide ++the target branch for file creation or copy-up. By default, the highest ++writable branch which has the parent (or ancestor) dir of the target ++file is chosen (top-down-parent policy). ++By user's request, aufs implements some other policies to select the ++writable branch, for file creation several policies, round-robin, ++most-free-space, and other policies. For copy-up, top-down-parent, ++bottom-up-parent, bottom-up and others. ++ ++As expected, the round-robin policy selects the branch in circular. When ++you have two writable branches and creates 10 new files, 5 files will be ++created for each branch. mkdir(2) systemcall is an exception. When you ++create 10 new directories, all will be created on the same branch. ++And the most-free-space policy selects the one which has most free ++space among the writable branches. The amount of free space will be ++checked by aufs internally, and users can specify its time interval. ++ ++The policies for copy-up is more simple, ++top-down-parent is equivalent to the same named on in create policy, ++bottom-up-parent selects the writable branch where the parent dir ++exists and the nearest upper one from the copyup-source, ++bottom-up selects the nearest upper writable branch from the ++copyup-source, regardless the existence of the parent dir. ++ ++There are some rules or exceptions to apply these policies. ++- If there is a readonly branch above the policy-selected branch and ++ the parent dir is marked as opaque (a variation of whiteout), or the ++ target (creating) file is whiteout-ed on the upper readonly branch, ++ then the result of the policy is ignored and the target file will be ++ created on the nearest upper writable branch than the readonly branch. ++- If there is a writable branch above the policy-selected branch and ++ the parent dir is marked as opaque or the target file is whiteouted ++ on the branch, then the result of the policy is ignored and the target ++ file will be created on the highest one among the upper writable ++ branches who has diropq or whiteout. In case of whiteout, aufs removes ++ it as usual. ++- link(2) and rename(2) systemcalls are exceptions in every policy. ++ They try selecting the branch where the source exists as possible ++ since copyup a large file will take long time. If it can't be, ++ ie. the branch where the source exists is readonly, then they will ++ follow the copyup policy. ++- There is an exception for rename(2) when the target exists. ++ If the rename target exists, aufs compares the index of the branches ++ where the source and the target exists and selects the higher ++ one. If the selected branch is readonly, then aufs follows the ++ copyup policy. +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.dot linux-4.15/Documentation/filesystems/aufs/design/06dirren.dot +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/06dirren.dot 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,31 @@ ++ ++// to view this graph, run dot(1) command in GRAPHVIZ. ++ ++digraph G { ++node [shape=box]; ++whinfo [label="detailed info file\n(lower_brid_root-hinum, h_inum, namelen, old name)"]; ++ ++node [shape=oval]; ++ ++aufs_rename -> whinfo [label="store/remove"]; ++ ++node [shape=oval]; ++inode_list [label="h_inum list in branch\ncache"]; ++ ++node [shape=box]; ++whinode [label="h_inum list file"]; ++ ++node [shape=oval]; ++brmgmt [label="br_add/del/mod/umount"]; ++ ++brmgmt -> inode_list [label="create/remove"]; ++brmgmt -> whinode [label="load/store"]; ++ ++inode_list -> whinode [style=dashed,dir=both]; ++ ++aufs_rename -> inode_list [label="add/del"]; ++ ++aufs_lookup -> inode_list [label="search"]; ++ ++aufs_lookup -> whinfo [label="load/remove"]; ++} +diff -Naur null/Documentation/filesystems/aufs/design/06dirren.txt linux-4.15/Documentation/filesystems/aufs/design/06dirren.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/06dirren.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,102 @@ ++ ++# Copyright (C) 2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Special handling for renaming a directory (DIRREN) ++---------------------------------------------------------------------- ++First, let's assume we have a simple usecase. ++ ++- /u = /rw + /ro ++- /rw/dirA exists ++- /ro/dirA and /ro/dirA/file exist too ++- there is no dirB on both branches ++- a user issues rename("dirA", "dirB") ++ ++Now, what should aufs behave against this rename(2)? ++There are a few possible cases. ++ ++A. returns EROFS. ++ since dirA exists on a readonly branch which cannot be renamed. ++B. returns EXDEV. ++ it is possible to copy-up dirA (only the dir itself), but the child ++ entries ("file" in this case) should not be. it must be a bad ++ approach to copy-up recursively. ++C. returns a success. ++ even the branch /ro is readonly, aufs tries renaming it. Obviously it ++ is a violation of aufs' policy. ++D. construct an extra information which indicates that /ro/dirA should ++ be handled as the name of dirB. ++ overlayfs has a similar feature called REDIRECT. ++ ++Until now, aufs implements the case B only which returns EXDEV, and ++expects the userspace application behaves like mv(1) which tries ++issueing rename(2) recursively. ++ ++A new aufs feature called DIRREN is introduced which implements the case ++D. There are several "extra information" added. ++ ++1. detailed info per renamed directory ++ path: /rw/dirB/$AUFS_WH_DR_INFO_PFX. ++2. the inode-number list of directories on a branch ++ path: /rw/dirB/$AUFS_WH_DR_BRHINO ++ ++The filename of "detailed info per directory" represents the lower ++branch, and its format is ++- a type of the branch id ++ one of these. ++ + uuid (not implemented yet) ++ + fsid ++ + dev ++- the inode-number of the branch root dir ++ ++And it contains these info in a single regular file. ++- magic number ++- branch's inode-number of the logically renamed dir ++- the name of the before-renamed dir ++ ++The "detailed info per directory" file is created in aufs rename(2), and ++loaded in any lookup. ++The info is considered in lookup for the matching case only. Here ++"matching" means that the root of branch (in the info filename) is same ++to the current looking-up branch. After looking-up the before-renamed ++name, the inode-number is compared. And the matched dentry is used. ++ ++The "inode-number list of directories" is a regular file which contains ++simply the inode-numbers on the branch. The file is created or updated ++in removing the branch, and loaded in adding the branch. Its lifetime is ++equal to the branch. ++The list is refered in lookup, and when the current target inode is ++found in the list, the aufs tries loading the "detailed info per ++directory" and get the changed and valid name of the dir. ++ ++Theoretically these "extra informaiton" may be able to be put into XATTR ++in the dir inode. But aufs doesn't choose this way because ++1. XATTR may not be supported by the branch (or its configuration) ++2. XATTR may have its size limit. ++3. XATTR may be less easy to convert than a regular file, when the ++ format of the info is changed in the future. ++At the same time, I agree that the regular file approach is much slower ++than XATTR approach. So, in the future, aufs may take the XATTR or other ++better approach. ++ ++This DIRREN feature is enabled by aufs configuration, and is activated ++by a new mount option. ++ ++For the more complicated case, there is a work with UDBA option, which ++is to dected the direct access to the branches (by-passing aufs) and to ++maintain the cashes in aufs. Since a single cached aufs dentry may ++contains two names, before- and after-rename, the name comparision in ++UDBA handler may not work correctly. In this case, the behaviour will be ++equivalen to udba=reval case. +diff -Naur null/Documentation/filesystems/aufs/design/06fhsm.txt linux-4.15/Documentation/filesystems/aufs/design/06fhsm.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/06fhsm.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,120 @@ ++ ++# Copyright (C) 2011-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++ ++File-based Hierarchical Storage Management (FHSM) ++---------------------------------------------------------------------- ++Hierarchical Storage Management (or HSM) is a well-known feature in the ++storage world. Aufs provides this feature as file-based with multiple ++writable branches, based upon the principle of "Colder, the Lower". ++Here the word "colder" means that the less used files, and "lower" means ++that the position in the order of the stacked branches vertically. ++These multiple writable branches are prioritized, ie. the topmost one ++should be the fastest drive and be used heavily. ++ ++o Characters in aufs FHSM story ++- aufs itself and a new branch attribute. ++- a new ioctl interface to move-down and to establish a connection with ++ the daemon ("move-down" is a converse of "copy-up"). ++- userspace tool and daemon. ++ ++The userspace daemon establishes a connection with aufs and waits for ++the notification. The notified information is very similar to struct ++statfs containing the number of consumed blocks and inodes. ++When the consumed blocks/inodes of a branch exceeds the user-specified ++upper watermark, the daemon activates its move-down process until the ++consumed blocks/inodes reaches the user-specified lower watermark. ++ ++The actual move-down is done by aufs based upon the request from ++user-space since we need to maintain the inode number and the internal ++pointer arrays in aufs. ++ ++Currently aufs FHSM handles the regular files only. Additionally they ++must not be hard-linked nor pseudo-linked. ++ ++ ++o Cowork of aufs and the user-space daemon ++ During the userspace daemon established the connection, aufs sends a ++ small notification to it whenever aufs writes something into the ++ writable branch. But it may cost high since aufs issues statfs(2) ++ internally. So user can specify a new option to cache the ++ info. Actually the notification is controlled by these factors. ++ + the specified cache time. ++ + classified as "force" by aufs internally. ++ Until the specified time expires, aufs doesn't send the info ++ except the forced cases. When aufs decide forcing, the info is always ++ notified to userspace. ++ For example, the number of free inodes is generally large enough and ++ the shortage of it happens rarely. So aufs doesn't force the ++ notification when creating a new file, directory and others. This is ++ the typical case which aufs doesn't force. ++ When aufs writes the actual filedata and the files consumes any of new ++ blocks, the aufs forces notifying. ++ ++ ++o Interfaces in aufs ++- New branch attribute. ++ + fhsm ++ Specifies that the branch is managed by FHSM feature. In other word, ++ participant in the FHSM. ++ When nofhsm is set to the branch, it will not be the source/target ++ branch of the move-down operation. This attribute is set ++ independently from coo and moo attributes, and if you want full ++ FHSM, you should specify them as well. ++- New mount option. ++ + fhsm_sec ++ Specifies a second to suppress many less important info to be ++ notified. ++- New ioctl. ++ + AUFS_CTL_FHSM_FD ++ create a new file descriptor which userspace can read the notification ++ (a subset of struct statfs) from aufs. ++- Module parameter 'brs' ++ It has to be set to 1. Otherwise the new mount option 'fhsm' will not ++ be set. ++- mount helpers /sbin/mount.aufs and /sbin/umount.aufs ++ When there are two or more branches with fhsm attributes, ++ /sbin/mount.aufs invokes the user-space daemon and /sbin/umount.aufs ++ terminates it. As a result of remounting and branch-manipulation, the ++ number of branches with fhsm attribute can be one. In this case, ++ /sbin/mount.aufs will terminate the user-space daemon. ++ ++ ++Finally the operation is done as these steps in kernel-space. ++- make sure that, ++ + no one else is using the file. ++ + the file is not hard-linked. ++ + the file is not pseudo-linked. ++ + the file is a regular file. ++ + the parent dir is not opaqued. ++- find the target writable branch. ++- make sure the file is not whiteout-ed by the upper (than the target) ++ branch. ++- make the parent dir on the target branch. ++- mutex lock the inode on the branch. ++- unlink the whiteout on the target branch (if exists). ++- lookup and create the whiteout-ed temporary name on the target branch. ++- copy the file as the whiteout-ed temporary name on the target branch. ++- rename the whiteout-ed temporary name to the original name. ++- unlink the file on the source branch. ++- maintain the internal pointer array and the external inode number ++ table (XINO). ++- maintain the timestamps and other attributes of the parent dir and the ++ file. ++ ++And of course, in every step, an error may happen. So the operation ++should restore the original file state after an error happens. +diff -Naur null/Documentation/filesystems/aufs/design/06mmap.txt linux-4.15/Documentation/filesystems/aufs/design/06mmap.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/06mmap.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,72 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++mmap(2) -- File Memory Mapping ++---------------------------------------------------------------------- ++In aufs, the file-mapped pages are handled by a branch fs directly, no ++interaction with aufs. It means aufs_mmap() calls the branch fs's ++->mmap(). ++This approach is simple and good, but there is one problem. ++Under /proc, several entries show the mmapped files by its path (with ++device and inode number), and the printed path will be the path on the ++branch fs's instead of virtual aufs's. ++This is not a problem in most cases, but some utilities lsof(1) (and its ++user) may expect the path on aufs. ++ ++To address this issue, aufs adds a new member called vm_prfile in struct ++vm_area_struct (and struct vm_region). The original vm_file points to ++the file on the branch fs in order to handle everything correctly as ++usual. The new vm_prfile points to a virtual file in aufs, and the ++show-functions in procfs refers to vm_prfile if it is set. ++Also we need to maintain several other places where touching vm_file ++such like ++- fork()/clone() copies vma and the reference count of vm_file is ++ incremented. ++- merging vma maintains the ref count too. ++ ++This is not a good approach. It just fakes the printed path. But it ++leaves all behaviour around f_mapping unchanged. This is surely an ++advantage. ++Actually aufs had adopted another complicated approach which calls ++generic_file_mmap() and handles struct vm_operations_struct. In this ++approach, aufs met a hard problem and I could not solve it without ++switching the approach. ++ ++There may be one more another approach which is ++- bind-mount the branch-root onto the aufs-root internally ++- grab the new vfsmount (ie. struct mount) ++- lazy-umount the branch-root internally ++- in open(2) the aufs-file, open the branch-file with the hidden ++ vfsmount (instead of the original branch's vfsmount) ++- ideally this "bind-mount and lazy-umount" should be done atomically, ++ but it may be possible from userspace by the mount helper. ++ ++Adding the internal hidden vfsmount and using it in opening a file, the ++file path under /proc will be printed correctly. This approach looks ++smarter, but is not possible I am afraid. ++- aufs-root may be bind-mount later. when it happens, another hidden ++ vfsmount will be required. ++- it is hard to get the chance to bind-mount and lazy-umount ++ + in kernel-space, FS can have vfsmount in open(2) via ++ file->f_path, and aufs can know its vfsmount. But several locks are ++ already acquired, and if aufs tries to bind-mount and lazy-umount ++ here, then it may cause a deadlock. ++ + in user-space, bind-mount doesn't invoke the mount helper. ++- since /proc shows dev and ino, aufs has to give vma these info. it ++ means a new member vm_prinode will be necessary. this is essentially ++ equivalent to vm_prfile described above. ++ ++I have to give up this "looks-smater" approach. +diff -Naur null/Documentation/filesystems/aufs/design/06xattr.txt linux-4.15/Documentation/filesystems/aufs/design/06xattr.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/06xattr.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,96 @@ ++ ++# Copyright (C) 2014-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ ++ ++Listing XATTR/EA and getting the value ++---------------------------------------------------------------------- ++For the inode standard attributes (owner, group, timestamps, etc.), aufs ++shows the values from the topmost existing file. This behaviour is good ++for the non-dir entries since the bahaviour exactly matches the shown ++information. But for the directories, aufs considers all the same named ++entries on the lower branches. Which means, if one of the lower entry ++rejects readdir call, then aufs returns an error even if the topmost ++entry allows it. This behaviour is necessary to respect the branch fs's ++security, but can make users confused since the user-visible standard ++attributes don't match the behaviour. ++To address this issue, aufs has a mount option called dirperm1 which ++checks the permission for the topmost entry only, and ignores the lower ++entry's permission. ++ ++A similar issue can happen around XATTR. ++getxattr(2) and listxattr(2) families behave as if dirperm1 option is ++always set. Otherwise these very unpleasant situation would happen. ++- listxattr(2) may return the duplicated entries. ++- users may not be able to remove or reset the XATTR forever, ++ ++ ++XATTR/EA support in the internal (copy,move)-(up,down) ++---------------------------------------------------------------------- ++Generally the extended attributes of inode are categorized as these. ++- "security" for LSM and capability. ++- "system" for posix ACL, 'acl' mount option is required for the branch ++ fs generally. ++- "trusted" for userspace, CAP_SYS_ADMIN is required. ++- "user" for userspace, 'user_xattr' mount option is required for the ++ branch fs generally. ++ ++Moreover there are some other categories. Aufs handles these rather ++unpopular categories as the ordinary ones, ie. there is no special ++condition nor exception. ++ ++In copy-up, the support for XATTR on the dst branch may differ from the ++src branch. In this case, the copy-up operation will get an error and ++the original user operation which triggered the copy-up will fail. It ++can happen that even all copy-up will fail. ++When both of src and dst branches support XATTR and if an error occurs ++during copying XATTR, then the copy-up should fail obviously. That is a ++good reason and aufs should return an error to userspace. But when only ++the src branch support that XATTR, aufs should not return an error. ++For example, the src branch supports ACL but the dst branch doesn't ++because the dst branch may natively un-support it or temporary ++un-support it due to "noacl" mount option. Of course, the dst branch fs ++may NOT return an error even if the XATTR is not supported. It is ++totally up to the branch fs. ++ ++Anyway when the aufs internal copy-up gets an error from the dst branch ++fs, then aufs tries removing the just copied entry and returns the error ++to the userspace. The worst case of this situation will be all copy-up ++will fail. ++ ++For the copy-up operation, there two basic approaches. ++- copy the specified XATTR only (by category above), and return the ++ error unconditionally if it happens. ++- copy all XATTR, and ignore the error on the specified category only. ++ ++In order to support XATTR and to implement the correct behaviour, aufs ++chooses the latter approach and introduces some new branch attributes, ++"icexsec", "icexsys", "icextr", "icexusr", and "icexoth". ++They correspond to the XATTR namespaces (see above). Additionally, to be ++convenient, "icex" is also provided which means all "icex*" attributes ++are set (here the word "icex" stands for "ignore copy-error on XATTR"). ++ ++The meaning of these attributes is to ignore the error from setting ++XATTR on that branch. ++Note that aufs tries copying all XATTR unconditionally, and ignores the ++error from the dst branch according to the specified attributes. ++ ++Some XATTR may have its default value. The default value may come from ++the parent dir or the environment. If the default value is set at the ++file creating-time, it will be overwritten by copy-up. ++Some contradiction may happen I am afraid. ++Do we need another attribute to stop copying XATTR? I am unsure. For ++now, aufs implements the branch attributes to ignore the error. +diff -Naur null/Documentation/filesystems/aufs/design/07export.txt linux-4.15/Documentation/filesystems/aufs/design/07export.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/07export.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,58 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Export Aufs via NFS ++---------------------------------------------------------------------- ++Here is an approach. ++- like xino/xib, add a new file 'xigen' which stores aufs inode ++ generation. ++- iget_locked(): initialize aufs inode generation for a new inode, and ++ store it in xigen file. ++- destroy_inode(): increment aufs inode generation and store it in xigen ++ file. it is necessary even if it is not unlinked, because any data of ++ inode may be changed by UDBA. ++- encode_fh(): for a root dir, simply return FILEID_ROOT. otherwise ++ build file handle by ++ + branch id (4 bytes) ++ + superblock generation (4 bytes) ++ + inode number (4 or 8 bytes) ++ + parent dir inode number (4 or 8 bytes) ++ + inode generation (4 bytes)) ++ + return value of exportfs_encode_fh() for the parent on a branch (4 ++ bytes) ++ + file handle for a branch (by exportfs_encode_fh()) ++- fh_to_dentry(): ++ + find the index of a branch from its id in handle, and check it is ++ still exist in aufs. ++ + 1st level: get the inode number from handle and search it in cache. ++ + 2nd level: if not found in cache, get the parent inode number from ++ the handle and search it in cache. and then open the found parent ++ dir, find the matching inode number by vfs_readdir() and get its ++ name, and call lookup_one_len() for the target dentry. ++ + 3rd level: if the parent dir is not cached, call ++ exportfs_decode_fh() for a branch and get the parent on a branch, ++ build a pathname of it, convert it a pathname in aufs, call ++ path_lookup(). now aufs gets a parent dir dentry, then handle it as ++ the 2nd level. ++ + to open the dir, aufs needs struct vfsmount. aufs keeps vfsmount ++ for every branch, but not itself. to get this, (currently) aufs ++ searches in current->nsproxy->mnt_ns list. it may not be a good ++ idea, but I didn't get other approach. ++ + test the generation of the gotten inode. ++- every inode operation: they may get EBUSY due to UDBA. in this case, ++ convert it into ESTALE for NFSD. ++- readdir(): call lockdep_on/off() because filldir in NFSD calls ++ lookup_one_len(), vfs_getattr(), encode_fh() and others. +diff -Naur null/Documentation/filesystems/aufs/design/08shwh.txt linux-4.15/Documentation/filesystems/aufs/design/08shwh.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/08shwh.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,52 @@ ++ ++# Copyright (C) 2005-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Show Whiteout Mode (shwh) ++---------------------------------------------------------------------- ++Generally aufs hides the name of whiteouts. But in some cases, to show ++them is very useful for users. For instance, creating a new middle layer ++(branch) by merging existing layers. ++ ++(borrowing aufs1 HOW-TO from a user, Michael Towers) ++When you have three branches, ++- Bottom: 'system', squashfs (underlying base system), read-only ++- Middle: 'mods', squashfs, read-only ++- Top: 'overlay', ram (tmpfs), read-write ++ ++The top layer is loaded at boot time and saved at shutdown, to preserve ++the changes made to the system during the session. ++When larger changes have been made, or smaller changes have accumulated, ++the size of the saved top layer data grows. At this point, it would be ++nice to be able to merge the two overlay branches ('mods' and 'overlay') ++and rewrite the 'mods' squashfs, clearing the top layer and thus ++restoring save and load speed. ++ ++This merging is simplified by the use of another aufs mount, of just the ++two overlay branches using the 'shwh' option. ++# mount -t aufs -o ro,shwh,br:/livesys/overlay=ro+wh:/livesys/mods=rr+wh \ ++ aufs /livesys/merge_union ++ ++A merged view of these two branches is then available at ++/livesys/merge_union, and the new feature is that the whiteouts are ++visible! ++Note that in 'shwh' mode the aufs mount must be 'ro', which will disable ++writing to all branches. Also the default mode for all branches is 'ro'. ++It is now possible to save the combined contents of the two overlay ++branches to a new squashfs, e.g.: ++# mksquashfs /livesys/merge_union /path/to/newmods.squash ++ ++This new squashfs archive can be stored on the boot device and the ++initramfs will use it to replace the old one at the next boot. +diff -Naur null/Documentation/filesystems/aufs/design/10dynop.txt linux-4.15/Documentation/filesystems/aufs/design/10dynop.txt +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/design/10dynop.txt 2018-02-25 02:38:09.196737254 +0100 +@@ -0,0 +1,47 @@ ++ ++# Copyright (C) 2010-2017 Junjiro R. Okajima ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++Dynamically customizable FS operations ++---------------------------------------------------------------------- ++Generally FS operations (struct inode_operations, struct ++address_space_operations, struct file_operations, etc.) are defined as ++"static const", but it never means that FS have only one set of ++operation. Some FS have multiple sets of them. For instance, ext2 has ++three sets, one for XIP, for NOBH, and for normal. ++Since aufs overrides and redirects these operations, sometimes aufs has ++to change its behaviour according to the branch FS type. More importantly ++VFS acts differently if a function (member in the struct) is set or ++not. It means aufs should have several sets of operations and select one ++among them according to the branch FS definition. ++ ++In order to solve this problem and not to affect the behaviour of VFS, ++aufs defines these operations dynamically. For instance, aufs defines ++dummy direct_IO function for struct address_space_operations, but it may ++not be set to the address_space_operations actually. When the branch FS ++doesn't have it, aufs doesn't set it to its address_space_operations ++while the function definition itself is still alive. So the behaviour ++itself will not change, and it will return an error when direct_IO is ++not set. ++ ++The lifetime of these dynamically generated operation object is ++maintained by aufs branch object. When the branch is removed from aufs, ++the reference counter of the object is decremented. When it reaches ++zero, the dynamically generated operation object will be freed. ++ ++This approach is designed to support AIO (io_submit), Direct I/O and ++XIP (DAX) mainly. ++Currently this approach is applied to address_space_operations for ++regular files only. +diff -Naur null/Documentation/filesystems/aufs/README linux-4.15/Documentation/filesystems/aufs/README +--- /dev/null ++++ linux-4.15/Documentation/filesystems/aufs/README 2018-02-25 02:38:09.195737146 +0100 +@@ -0,0 +1,393 @@ ++ ++Aufs4 -- advanced multi layered unification filesystem version 4.x ++http://aufs.sf.net ++Junjiro R. Okajima ++ ++ ++0. Introduction ++---------------------------------------- ++In the early days, aufs was entirely re-designed and re-implemented ++Unionfs Version 1.x series. Adding many original ideas, approaches, ++improvements and implementations, it becomes totally different from ++Unionfs while keeping the basic features. ++Recently, Unionfs Version 2.x series begin taking some of the same ++approaches to aufs1's. ++Unionfs is being developed by Professor Erez Zadok at Stony Brook ++University and his team. ++ ++Aufs4 supports linux-4.0 and later, and for linux-3.x series try aufs3. ++If you want older kernel version support, try aufs2-2.6.git or ++aufs2-standalone.git repository, aufs1 from CVS on SourceForge. ++ ++Note: it becomes clear that "Aufs was rejected. Let's give it up." ++ According to Christoph Hellwig, linux rejects all union-type ++ filesystems but UnionMount. ++ ++ ++PS. Al Viro seems have a plan to merge aufs as well as overlayfs and ++ UnionMount, and he pointed out an issue around a directory mutex ++ lock and aufs addressed it. But it is still unsure whether aufs will ++ be merged (or any other union solution). ++ ++ ++ ++1. Features ++---------------------------------------- ++- unite several directories into a single virtual filesystem. The member ++ directory is called as a branch. ++- you can specify the permission flags to the branch, which are 'readonly', ++ 'readwrite' and 'whiteout-able.' ++- by upper writable branch, internal copyup and whiteout, files/dirs on ++ readonly branch are modifiable logically. ++- dynamic branch manipulation, add, del. ++- etc... ++ ++Also there are many enhancements in aufs, such as: ++- test only the highest one for the directory permission (dirperm1) ++- copyup on open (coo=) ++- 'move' policy for copy-up between two writable branches, after ++ checking free space. ++- xattr, acl ++- readdir(3) in userspace. ++- keep inode number by external inode number table ++- keep the timestamps of file/dir in internal copyup operation ++- seekable directory, supporting NFS readdir. ++- whiteout is hardlinked in order to reduce the consumption of inodes ++ on branch ++- do not copyup, nor create a whiteout when it is unnecessary ++- revert a single systemcall when an error occurs in aufs ++- remount interface instead of ioctl ++- maintain /etc/mtab by an external command, /sbin/mount.aufs. ++- loopback mounted filesystem as a branch ++- kernel thread for removing the dir who has a plenty of whiteouts ++- support copyup sparse file (a file which has a 'hole' in it) ++- default permission flags for branches ++- selectable permission flags for ro branch, whether whiteout can ++ exist or not ++- export via NFS. ++- support /fs/aufs and /aufs. ++- support multiple writable branches, some policies to select one ++ among multiple writable branches. ++- a new semantics for link(2) and rename(2) to support multiple ++ writable branches. ++- no glibc changes are required. ++- pseudo hardlink (hardlink over branches) ++- allow a direct access manually to a file on branch, e.g. bypassing aufs. ++ including NFS or remote filesystem branch. ++- userspace wrapper for pathconf(3)/fpathconf(3) with _PC_LINK_MAX. ++- and more... ++ ++Currently these features are dropped temporary from aufs4. ++See design/08plan.txt in detail. ++- nested mount, i.e. aufs as readonly no-whiteout branch of another aufs ++ (robr) ++- statistics of aufs thread (/sys/fs/aufs/stat) ++ ++Features or just an idea in the future (see also design/*.txt), ++- reorder the branch index without del/re-add. ++- permanent xino files for NFSD ++- an option for refreshing the opened files after add/del branches ++- light version, without branch manipulation. (unnecessary?) ++- copyup in userspace ++- inotify in userspace ++- readv/writev ++ ++ ++2. Download ++---------------------------------------- ++There are three GIT trees for aufs4, aufs4-linux.git, ++aufs4-standalone.git, and aufs-util.git. Note that there is no "4" in ++"aufs-util.git." ++While the aufs-util is always necessary, you need either of aufs4-linux ++or aufs4-standalone. ++ ++The aufs4-linux tree includes the whole linux mainline GIT tree, ++git://git.kernel.org/.../torvalds/linux.git. ++And you cannot select CONFIG_AUFS_FS=m for this version, eg. you cannot ++build aufs4 as an external kernel module. ++Several extra patches are not included in this tree. Only ++aufs4-standalone tree contains them. They are described in the later ++section "Configuration and Compilation." ++ ++On the other hand, the aufs4-standalone tree has only aufs source files ++and necessary patches, and you can select CONFIG_AUFS_FS=m. ++But you need to apply all aufs patches manually. ++ ++You will find GIT branches whose name is in form of "aufs4.x" where "x" ++represents the linux kernel version, "linux-4.x". For instance, ++"aufs4.0" is for linux-4.0. For latest "linux-4.x-rcN", use ++"aufs4.x-rcN" branch. ++ ++o aufs4-linux tree ++$ git clone --reference /your/linux/git/tree \ ++ git://github.com/sfjro/aufs4-linux.git aufs4-linux.git ++- if you don't have linux GIT tree, then remove "--reference ..." ++$ cd aufs4-linux.git ++$ git checkout origin/aufs4.0 ++ ++Or You may want to directly git-pull aufs into your linux GIT tree, and ++leave the patch-work to GIT. ++$ cd /your/linux/git/tree ++$ git remote add aufs4 git://github.com/sfjro/aufs4-linux.git ++$ git fetch aufs4 ++$ git checkout -b my4.0 v4.0 ++$ (add your local change...) ++$ git pull aufs4 aufs4.0 ++- now you have v4.0 + your_changes + aufs4.0 in you my4.0 branch. ++- you may need to solve some conflicts between your_changes and ++ aufs4.0. in this case, git-rerere is recommended so that you can ++ solve the similar conflicts automatically when you upgrade to 4.1 or ++ later in the future. ++ ++o aufs4-standalone tree ++$ git clone git://github.com/sfjro/aufs4-standalone.git aufs4-standalone.git ++$ cd aufs4-standalone.git ++$ git checkout origin/aufs4.0 ++ ++o aufs-util tree ++$ git clone git://git.code.sf.net/p/aufs/aufs-util aufs-util.git ++- note that the public aufs-util.git is on SourceForge instead of ++ GitHUB. ++$ cd aufs-util.git ++$ git checkout origin/aufs4.0 ++ ++Note: The 4.x-rcN branch is to be used with `rc' kernel versions ONLY. ++The minor version number, 'x' in '4.x', of aufs may not always ++follow the minor version number of the kernel. ++Because changes in the kernel that cause the use of a new ++minor version number do not always require changes to aufs-util. ++ ++Since aufs-util has its own minor version number, you may not be ++able to find a GIT branch in aufs-util for your kernel's ++exact minor version number. ++In this case, you should git-checkout the branch for the ++nearest lower number. ++ ++For (an unreleased) example: ++If you are using "linux-4.10" and the "aufs4.10" branch ++does not exist in aufs-util repository, then "aufs4.9", "aufs4.8" ++or something numerically smaller is the branch for your kernel. ++ ++Also you can view all branches by ++ $ git branch -a ++ ++ ++3. Configuration and Compilation ++---------------------------------------- ++Make sure you have git-checkout'ed the correct branch. ++ ++For aufs4-linux tree, ++- enable CONFIG_AUFS_FS. ++- set other aufs configurations if necessary. ++ ++For aufs4-standalone tree, ++There are several ways to build. ++ ++1. ++- apply ./aufs4-kbuild.patch to your kernel source files. ++- apply ./aufs4-base.patch too. ++- apply ./aufs4-mmap.patch too. ++- apply ./aufs4-standalone.patch too, if you have a plan to set ++ CONFIG_AUFS_FS=m. otherwise you don't need ./aufs4-standalone.patch. ++- copy ./{Documentation,fs,include/uapi/linux/aufs_type.h} files to your ++ kernel source tree. Never copy $PWD/include/uapi/linux/Kbuild. ++- enable CONFIG_AUFS_FS, you can select either ++ =m or =y. ++- and build your kernel as usual. ++- install the built kernel. ++ Note: Since linux-3.9, every filesystem module requires an alias ++ "fs-". You should make sure that "fs-aufs" is listed in your ++ modules.aliases file if you set CONFIG_AUFS_FS=m. ++- install the header files too by "make headers_install" to the ++ directory where you specify. By default, it is $PWD/usr. ++ "make help" shows a brief note for headers_install. ++- and reboot your system. ++ ++2. ++- module only (CONFIG_AUFS_FS=m). ++- apply ./aufs4-base.patch to your kernel source files. ++- apply ./aufs4-mmap.patch too. ++- apply ./aufs4-standalone.patch too. ++- build your kernel, don't forget "make headers_install", and reboot. ++- edit ./config.mk and set other aufs configurations if necessary. ++ Note: You should read $PWD/fs/aufs/Kconfig carefully which describes ++ every aufs configurations. ++- build the module by simple "make". ++ Note: Since linux-3.9, every filesystem module requires an alias ++ "fs-". You should make sure that "fs-aufs" is listed in your ++ modules.aliases file. ++- you can specify ${KDIR} make variable which points to your kernel ++ source tree. ++- install the files ++ + run "make install" to install the aufs module, or copy the built ++ $PWD/aufs.ko to /lib/modules/... and run depmod -a (or reboot simply). ++ + run "make install_headers" (instead of headers_install) to install ++ the modified aufs header file (you can specify DESTDIR which is ++ available in aufs standalone version's Makefile only), or copy ++ $PWD/usr/include/linux/aufs_type.h to /usr/include/linux or wherever ++ you like manually. By default, the target directory is $PWD/usr. ++- no need to apply aufs4-kbuild.patch, nor copying source files to your ++ kernel source tree. ++ ++Note: The header file aufs_type.h is necessary to build aufs-util ++ as well as "make headers_install" in the kernel source tree. ++ headers_install is subject to be forgotten, but it is essentially ++ necessary, not only for building aufs-util. ++ You may not meet problems without headers_install in some older ++ version though. ++ ++And then, ++- read README in aufs-util, build and install it ++- note that your distribution may contain an obsoleted version of ++ aufs_type.h in /usr/include/linux or something. When you build aufs ++ utilities, make sure that your compiler refers the correct aufs header ++ file which is built by "make headers_install." ++- if you want to use readdir(3) in userspace or pathconf(3) wrapper, ++ then run "make install_ulib" too. And refer to the aufs manual in ++ detail. ++ ++There several other patches in aufs4-standalone.git. They are all ++optional. When you meet some problems, they will help you. ++- aufs4-loopback.patch ++ Supports a nested loopback mount in a branch-fs. This patch is ++ unnecessary until aufs produces a message like "you may want to try ++ another patch for loopback file". ++- vfs-ino.patch ++ Modifies a system global kernel internal function get_next_ino() in ++ order to stop assigning 0 for an inode-number. Not directly related to ++ aufs, but recommended generally. ++- tmpfs-idr.patch ++ Keeps the tmpfs inode number as the lowest value. Effective to reduce ++ the size of aufs XINO files for tmpfs branch. Also it prevents the ++ duplication of inode number, which is important for backup tools and ++ other utilities. When you find aufs XINO files for tmpfs branch ++ growing too much, try this patch. ++- lockdep-debug.patch ++ Because aufs is not only an ordinary filesystem (callee of VFS), but ++ also a caller of VFS functions for branch filesystems, subclassing of ++ the internal locks for LOCKDEP is necessary. LOCKDEP is a debugging ++ feature of linux kernel. If you enable CONFIG_LOCKDEP, then you will ++ need to apply this debug patch to expand several constant values. ++ If don't know what LOCKDEP, then you don't have apply this patch. ++ ++ ++4. Usage ++---------------------------------------- ++At first, make sure aufs-util are installed, and please read the aufs ++manual, aufs.5 in aufs-util.git tree. ++$ man -l aufs.5 ++ ++And then, ++$ mkdir /tmp/rw /tmp/aufs ++# mount -t aufs -o br=/tmp/rw:${HOME} none /tmp/aufs ++ ++Here is another example. The result is equivalent. ++# mount -t aufs -o br=/tmp/rw=rw:${HOME}=ro none /tmp/aufs ++ Or ++# mount -t aufs -o br:/tmp/rw none /tmp/aufs ++# mount -o remount,append:${HOME} /tmp/aufs ++ ++Then, you can see whole tree of your home dir through /tmp/aufs. If ++you modify a file under /tmp/aufs, the one on your home directory is ++not affected, instead the same named file will be newly created under ++/tmp/rw. And all of your modification to a file will be applied to ++the one under /tmp/rw. This is called the file based Copy on Write ++(COW) method. ++Aufs mount options are described in aufs.5. ++If you run chroot or something and make your aufs as a root directory, ++then you need to customize the shutdown script. See the aufs manual in ++detail. ++ ++Additionally, there are some sample usages of aufs which are a ++diskless system with network booting, and LiveCD over NFS. ++See sample dir in CVS tree on SourceForge. ++ ++ ++5. Contact ++---------------------------------------- ++When you have any problems or strange behaviour in aufs, please let me ++know with: ++- /proc/mounts (instead of the output of mount(8)) ++- /sys/module/aufs/* ++- /sys/fs/aufs/* (if you have them) ++- /debug/aufs/* (if you have them) ++- linux kernel version ++ if your kernel is not plain, for example modified by distributor, ++ the url where i can download its source is necessary too. ++- aufs version which was printed at loading the module or booting the ++ system, instead of the date you downloaded. ++- configuration (define/undefine CONFIG_AUFS_xxx) ++- kernel configuration or /proc/config.gz (if you have it) ++- behaviour which you think to be incorrect ++- actual operation, reproducible one is better ++- mailto: aufs-users at lists.sourceforge.net ++ ++Usually, I don't watch the Public Areas(Bugs, Support Requests, Patches, ++and Feature Requests) on SourceForge. Please join and write to ++aufs-users ML. ++ ++ ++6. Acknowledgements ++---------------------------------------- ++Thanks to everyone who have tried and are using aufs, whoever ++have reported a bug or any feedback. ++ ++Especially donators: ++Tomas Matejicek(slax.org) made a donation (much more than once). ++ Since Apr 2010, Tomas M (the author of Slax and Linux Live ++ scripts) is making "doubling" donations. ++ Unfortunately I cannot list all of the donators, but I really ++ appreciate. ++ It ends Aug 2010, but the ordinary donation URL is still available. ++ ++Dai Itasaka made a donation (2007/8). ++Chuck Smith made a donation (2008/4, 10 and 12). ++Henk Schoneveld made a donation (2008/9). ++Chih-Wei Huang, ASUS, CTC donated Eee PC 4G (2008/10). ++Francois Dupoux made a donation (2008/11). ++Bruno Cesar Ribas and Luis Carlos Erpen de Bona, C3SL serves public ++ aufs2 GIT tree (2009/2). ++William Grant made a donation (2009/3). ++Patrick Lane made a donation (2009/4). ++The Mail Archive (mail-archive.com) made donations (2009/5). ++Nippy Networks (Ed Wildgoose) made a donation (2009/7). ++New Dream Network, LLC (www.dreamhost.com) made a donation (2009/11). ++Pavel Pronskiy made a donation (2011/2). ++Iridium and Inmarsat satellite phone retailer (www.mailasail.com), Nippy ++ Networks (Ed Wildgoose) made a donation for hardware (2011/3). ++Max Lekomcev (DOM-TV project) made a donation (2011/7, 12, 2012/3, 6 and ++11). ++Sam Liddicott made a donation (2011/9). ++Era Scarecrow made a donation (2013/4). ++Bor Ratajc made a donation (2013/4). ++Alessandro Gorreta made a donation (2013/4). ++POIRETTE Marc made a donation (2013/4). ++Alessandro Gorreta made a donation (2013/4). ++lauri kasvandik made a donation (2013/5). ++"pemasu from Finland" made a donation (2013/7). ++The Parted Magic Project made a donation (2013/9 and 11). ++Pavel Barta made a donation (2013/10). ++Nikolay Pertsev made a donation (2014/5). ++James B made a donation (2014/7 and 2015/7). ++Stefano Di Biase made a donation (2014/8). ++Daniel Epellei made a donation (2015/1). ++OmegaPhil made a donation (2016/1). ++Tomasz Szewczyk made a donation (2016/4). ++James Burry made a donation (2016/12). ++ ++Thank you very much. ++Donations are always, including future donations, very important and ++helpful for me to keep on developing aufs. ++ ++ ++7. ++---------------------------------------- ++If you are an experienced user, no explanation is needed. Aufs is ++just a linux filesystem. ++ ++ ++Enjoy! ++ ++# Local variables: ; ++# mode: text; ++# End: ; +diff -Naur null/fs/aufs/aufs.h linux-4.15/fs/aufs/aufs.h +--- /dev/null ++++ linux-4.15/fs/aufs/aufs.h 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * all header files ++ */ ++ ++#ifndef __AUFS_H__ ++#define __AUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++#define AuStub(type, name, body, ...) \ ++ static inline type name(__VA_ARGS__) { body; } ++ ++#define AuStubVoid(name, ...) \ ++ AuStub(void, name, , __VA_ARGS__) ++#define AuStubInt0(name, ...) \ ++ AuStub(int, name, return 0, __VA_ARGS__) ++ ++#include "debug.h" ++ ++#include "branch.h" ++#include "cpup.h" ++#include "dcsub.h" ++#include "dbgaufs.h" ++#include "dentry.h" ++#include "dir.h" ++#include "dirren.h" ++#include "dynop.h" ++#include "file.h" ++#include "fstype.h" ++#include "hbl.h" ++#include "inode.h" ++#include "loop.h" ++#include "module.h" ++#include "opts.h" ++#include "rwsem.h" ++#include "super.h" ++#include "sysaufs.h" ++#include "vfsub.h" ++#include "whout.h" ++#include "wkq.h" ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_H__ */ +diff -Naur null/fs/aufs/branch.c linux-4.15/fs/aufs/branch.c +--- /dev/null ++++ linux-4.15/fs/aufs/branch.c 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,1432 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * branch management ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++/* ++ * free a single branch ++ */ ++static void au_br_do_free(struct au_branch *br) ++{ ++ int i; ++ struct au_wbr *wbr; ++ struct au_dykey **key; ++ ++ au_hnotify_fin_br(br); ++ /* always, regardless the mount option */ ++ au_dr_hino_free(&br->br_dirren); ++ ++ if (br->br_xino.xi_file) ++ fput(br->br_xino.xi_file); ++ for (i = br->br_xino.xi_nondir.total - 1; i >= 0; i--) ++ AuDebugOn(br->br_xino.xi_nondir.array[i]); ++ kfree(br->br_xino.xi_nondir.array); ++ ++ AuDebugOn(au_br_count(br)); ++ au_br_count_fin(br); ++ ++ wbr = br->br_wbr; ++ if (wbr) { ++ for (i = 0; i < AuBrWh_Last; i++) ++ dput(wbr->wbr_wh[i]); ++ AuDebugOn(atomic_read(&wbr->wbr_wh_running)); ++ AuRwDestroy(&wbr->wbr_wh_rwsem); ++ } ++ ++ if (br->br_fhsm) { ++ au_br_fhsm_fin(br->br_fhsm); ++ kfree(br->br_fhsm); ++ } ++ ++ key = br->br_dykey; ++ for (i = 0; i < AuBrDynOp; i++, key++) ++ if (*key) ++ au_dy_put(*key); ++ else ++ break; ++ ++ /* recursive lock, s_umount of branch's */ ++ lockdep_off(); ++ path_put(&br->br_path); ++ lockdep_on(); ++ kfree(wbr); ++ kfree(br); ++} ++ ++/* ++ * frees all branches ++ */ ++void au_br_free(struct au_sbinfo *sbinfo) ++{ ++ aufs_bindex_t bmax; ++ struct au_branch **br; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ bmax = sbinfo->si_bbot + 1; ++ br = sbinfo->si_branch; ++ while (bmax--) ++ au_br_do_free(*br++); ++} ++ ++/* ++ * find the index of a branch which is specified by @br_id. ++ */ ++int au_br_index(struct super_block *sb, aufs_bindex_t br_id) ++{ ++ aufs_bindex_t bindex, bbot; ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (au_sbr_id(sb, bindex) == br_id) ++ return bindex; ++ return -1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * add a branch ++ */ ++ ++static int test_overlap(struct super_block *sb, struct dentry *h_adding, ++ struct dentry *h_root) ++{ ++ if (unlikely(h_adding == h_root ++ || au_test_loopback_overlap(sb, h_adding))) ++ return 1; ++ if (h_adding->d_sb != h_root->d_sb) ++ return 0; ++ return au_test_subdir(h_adding, h_root) ++ || au_test_subdir(h_root, h_adding); ++} ++ ++/* ++ * returns a newly allocated branch. @new_nbranch is a number of branches ++ * after adding a branch. ++ */ ++static struct au_branch *au_br_alloc(struct super_block *sb, int new_nbranch, ++ int perm) ++{ ++ struct au_branch *add_branch; ++ struct dentry *root; ++ struct inode *inode; ++ int err; ++ ++ err = -ENOMEM; ++ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS); ++ if (unlikely(!add_branch)) ++ goto out; ++ add_branch->br_xino.xi_nondir.total = 8; /* initial size */ ++ add_branch->br_xino.xi_nondir.array ++ = kcalloc(add_branch->br_xino.xi_nondir.total, sizeof(ino_t), ++ GFP_NOFS); ++ if (unlikely(!add_branch->br_xino.xi_nondir.array)) ++ goto out_br; ++ ++ err = au_hnotify_init_br(add_branch, perm); ++ if (unlikely(err)) ++ goto out_xinondir; ++ ++ if (au_br_writable(perm)) { ++ /* may be freed separately at changing the branch permission */ ++ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr), ++ GFP_NOFS); ++ if (unlikely(!add_branch->br_wbr)) ++ goto out_hnotify; ++ } ++ ++ if (au_br_fhsm(perm)) { ++ err = au_fhsm_br_alloc(add_branch); ++ if (unlikely(err)) ++ goto out_wbr; ++ } ++ ++ root = sb->s_root; ++ err = au_sbr_realloc(au_sbi(sb), new_nbranch, /*may_shrink*/0); ++ if (!err) ++ err = au_di_realloc(au_di(root), new_nbranch, /*may_shrink*/0); ++ if (!err) { ++ inode = d_inode(root); ++ err = au_hinode_realloc(au_ii(inode), new_nbranch, ++ /*may_shrink*/0); ++ } ++ if (!err) ++ return add_branch; /* success */ ++ ++out_wbr: ++ kfree(add_branch->br_wbr); ++out_hnotify: ++ au_hnotify_fin_br(add_branch); ++out_xinondir: ++ kfree(add_branch->br_xino.xi_nondir.array); ++out_br: ++ kfree(add_branch); ++out: ++ return ERR_PTR(err); ++} ++ ++/* ++ * test if the branch permission is legal or not. ++ */ ++static int test_br(struct inode *inode, int brperm, char *path) ++{ ++ int err; ++ ++ err = (au_br_writable(brperm) && IS_RDONLY(inode)); ++ if (!err) ++ goto out; ++ ++ err = -EINVAL; ++ pr_err("write permission for readonly mount or inode, %s\n", path); ++ ++out: ++ return err; ++} ++ ++/* ++ * returns: ++ * 0: success, the caller will add it ++ * plus: success, it is already unified, the caller should ignore it ++ * minus: error ++ */ ++static int test_add(struct super_block *sb, struct au_opt_add *add, int remount) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct dentry *root, *h_dentry; ++ struct inode *inode, *h_inode; ++ ++ root = sb->s_root; ++ bbot = au_sbbot(sb); ++ if (unlikely(bbot >= 0 ++ && au_find_dbindex(root, add->path.dentry) >= 0)) { ++ err = 1; ++ if (!remount) { ++ err = -EINVAL; ++ pr_err("%s duplicated\n", add->pathname); ++ } ++ goto out; ++ } ++ ++ err = -ENOSPC; /* -E2BIG; */ ++ if (unlikely(AUFS_BRANCH_MAX <= add->bindex ++ || AUFS_BRANCH_MAX - 1 <= bbot)) { ++ pr_err("number of branches exceeded %s\n", add->pathname); ++ goto out; ++ } ++ ++ err = -EDOM; ++ if (unlikely(add->bindex < 0 || bbot + 1 < add->bindex)) { ++ pr_err("bad index %d\n", add->bindex); ++ goto out; ++ } ++ ++ inode = d_inode(add->path.dentry); ++ err = -ENOENT; ++ if (unlikely(!inode->i_nlink)) { ++ pr_err("no existence %s\n", add->pathname); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ if (unlikely(inode->i_sb == sb)) { ++ pr_err("%s must be outside\n", add->pathname); ++ goto out; ++ } ++ ++ if (unlikely(au_test_fs_unsuppoted(inode->i_sb))) { ++ pr_err("unsupported filesystem, %s (%s)\n", ++ add->pathname, au_sbtype(inode->i_sb)); ++ goto out; ++ } ++ ++ if (unlikely(inode->i_sb->s_stack_depth)) { ++ pr_err("already stacked, %s (%s)\n", ++ add->pathname, au_sbtype(inode->i_sb)); ++ goto out; ++ } ++ ++ err = test_br(d_inode(add->path.dentry), add->perm, add->pathname); ++ if (unlikely(err)) ++ goto out; ++ ++ if (bbot < 0) ++ return 0; /* success */ ++ ++ err = -EINVAL; ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (unlikely(test_overlap(sb, add->path.dentry, ++ au_h_dptr(root, bindex)))) { ++ pr_err("%s is overlapped\n", add->pathname); ++ goto out; ++ } ++ ++ err = 0; ++ if (au_opt_test(au_mntflags(sb), WARN_PERM)) { ++ h_dentry = au_h_dptr(root, 0); ++ h_inode = d_inode(h_dentry); ++ if ((h_inode->i_mode & S_IALLUGO) != (inode->i_mode & S_IALLUGO) ++ || !uid_eq(h_inode->i_uid, inode->i_uid) ++ || !gid_eq(h_inode->i_gid, inode->i_gid)) ++ pr_warn("uid/gid/perm %s %u/%u/0%o, %u/%u/0%o\n", ++ add->pathname, ++ i_uid_read(inode), i_gid_read(inode), ++ (inode->i_mode & S_IALLUGO), ++ i_uid_read(h_inode), i_gid_read(h_inode), ++ (h_inode->i_mode & S_IALLUGO)); ++ } ++ ++out: ++ return err; ++} ++ ++/* ++ * initialize or clean the whiteouts for an adding branch ++ */ ++static int au_br_init_wh(struct super_block *sb, struct au_branch *br, ++ int new_perm) ++{ ++ int err, old_perm; ++ aufs_bindex_t bindex; ++ struct inode *h_inode; ++ struct au_wbr *wbr; ++ struct au_hinode *hdir; ++ struct dentry *h_dentry; ++ ++ err = vfsub_mnt_want_write(au_br_mnt(br)); ++ if (unlikely(err)) ++ goto out; ++ ++ wbr = br->br_wbr; ++ old_perm = br->br_perm; ++ br->br_perm = new_perm; ++ hdir = NULL; ++ h_inode = NULL; ++ bindex = au_br_index(sb, br->br_id); ++ if (0 <= bindex) { ++ hdir = au_hi(d_inode(sb->s_root), bindex); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ } else { ++ h_dentry = au_br_dentry(br); ++ h_inode = d_inode(h_dentry); ++ inode_lock_nested(h_inode, AuLsc_I_PARENT); ++ } ++ if (!wbr) ++ err = au_wh_init(br, sb); ++ else { ++ wbr_wh_write_lock(wbr); ++ err = au_wh_init(br, sb); ++ wbr_wh_write_unlock(wbr); ++ } ++ if (hdir) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(h_inode); ++ vfsub_mnt_drop_write(au_br_mnt(br)); ++ br->br_perm = old_perm; ++ ++ if (!err && wbr && !au_br_writable(new_perm)) { ++ kfree(wbr); ++ br->br_wbr = NULL; ++ } ++ ++out: ++ return err; ++} ++ ++static int au_wbr_init(struct au_branch *br, struct super_block *sb, ++ int perm) ++{ ++ int err; ++ struct kstatfs kst; ++ struct au_wbr *wbr; ++ ++ wbr = br->br_wbr; ++ au_rw_init(&wbr->wbr_wh_rwsem); ++ atomic_set(&wbr->wbr_wh_running, 0); ++ ++ /* ++ * a limit for rmdir/rename a dir ++ * cf. AUFS_MAX_NAMELEN in include/uapi/linux/aufs_type.h ++ */ ++ err = vfs_statfs(&br->br_path, &kst); ++ if (unlikely(err)) ++ goto out; ++ err = -EINVAL; ++ if (kst.f_namelen >= NAME_MAX) ++ err = au_br_init_wh(sb, br, perm); ++ else ++ pr_err("%pd(%s), unsupported namelen %ld\n", ++ au_br_dentry(br), ++ au_sbtype(au_br_dentry(br)->d_sb), kst.f_namelen); ++ ++out: ++ return err; ++} ++ ++/* initialize a new branch */ ++static int au_br_init(struct au_branch *br, struct super_block *sb, ++ struct au_opt_add *add) ++{ ++ int err; ++ struct inode *h_inode; ++ ++ err = 0; ++ spin_lock_init(&br->br_xino.xi_nondir.spin); ++ init_waitqueue_head(&br->br_xino.xi_nondir.wqh); ++ br->br_perm = add->perm; ++ br->br_path = add->path; /* set first, path_get() later */ ++ spin_lock_init(&br->br_dykey_lock); ++ au_br_count_init(br); ++ atomic_set(&br->br_xino_running, 0); ++ br->br_id = au_new_br_id(sb); ++ AuDebugOn(br->br_id < 0); ++ ++ /* always, regardless the given option */ ++ err = au_dr_br_init(sb, br, &add->path); ++ if (unlikely(err)) ++ goto out_err; ++ ++ if (au_br_writable(add->perm)) { ++ err = au_wbr_init(br, sb, add->perm); ++ if (unlikely(err)) ++ goto out_err; ++ } ++ ++ if (au_opt_test(au_mntflags(sb), XINO)) { ++ h_inode = d_inode(add->path.dentry); ++ err = au_xino_br(sb, br, h_inode->i_ino, ++ au_sbr(sb, 0)->br_xino.xi_file, /*do_test*/1); ++ if (unlikely(err)) { ++ AuDebugOn(br->br_xino.xi_file); ++ goto out_err; ++ } ++ } ++ ++ sysaufs_br_init(br); ++ path_get(&br->br_path); ++ goto out; /* success */ ++ ++out_err: ++ memset(&br->br_path, 0, sizeof(br->br_path)); ++out: ++ return err; ++} ++ ++static void au_br_do_add_brp(struct au_sbinfo *sbinfo, aufs_bindex_t bindex, ++ struct au_branch *br, aufs_bindex_t bbot, ++ aufs_bindex_t amount) ++{ ++ struct au_branch **brp; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ brp = sbinfo->si_branch + bindex; ++ memmove(brp + 1, brp, sizeof(*brp) * amount); ++ *brp = br; ++ sbinfo->si_bbot++; ++ if (unlikely(bbot < 0)) ++ sbinfo->si_bbot = 0; ++} ++ ++static void au_br_do_add_hdp(struct au_dinfo *dinfo, aufs_bindex_t bindex, ++ aufs_bindex_t bbot, aufs_bindex_t amount) ++{ ++ struct au_hdentry *hdp; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ hdp = au_hdentry(dinfo, bindex); ++ memmove(hdp + 1, hdp, sizeof(*hdp) * amount); ++ au_h_dentry_init(hdp); ++ dinfo->di_bbot++; ++ if (unlikely(bbot < 0)) ++ dinfo->di_btop = 0; ++} ++ ++static void au_br_do_add_hip(struct au_iinfo *iinfo, aufs_bindex_t bindex, ++ aufs_bindex_t bbot, aufs_bindex_t amount) ++{ ++ struct au_hinode *hip; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ hip = au_hinode(iinfo, bindex); ++ memmove(hip + 1, hip, sizeof(*hip) * amount); ++ au_hinode_init(hip); ++ iinfo->ii_bbot++; ++ if (unlikely(bbot < 0)) ++ iinfo->ii_btop = 0; ++} ++ ++static void au_br_do_add(struct super_block *sb, struct au_branch *br, ++ aufs_bindex_t bindex) ++{ ++ struct dentry *root, *h_dentry; ++ struct inode *root_inode, *h_inode; ++ aufs_bindex_t bbot, amount; ++ ++ root = sb->s_root; ++ root_inode = d_inode(root); ++ bbot = au_sbbot(sb); ++ amount = bbot + 1 - bindex; ++ h_dentry = au_br_dentry(br); ++ au_sbilist_lock(); ++ au_br_do_add_brp(au_sbi(sb), bindex, br, bbot, amount); ++ au_br_do_add_hdp(au_di(root), bindex, bbot, amount); ++ au_br_do_add_hip(au_ii(root_inode), bindex, bbot, amount); ++ au_set_h_dptr(root, bindex, dget(h_dentry)); ++ h_inode = d_inode(h_dentry); ++ au_set_h_iptr(root_inode, bindex, au_igrab(h_inode), /*flags*/0); ++ au_sbilist_unlock(); ++} ++ ++int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount) ++{ ++ int err; ++ aufs_bindex_t bbot, add_bindex; ++ struct dentry *root, *h_dentry; ++ struct inode *root_inode; ++ struct au_branch *add_branch; ++ ++ root = sb->s_root; ++ root_inode = d_inode(root); ++ IMustLock(root_inode); ++ IiMustWriteLock(root_inode); ++ err = test_add(sb, add, remount); ++ if (unlikely(err < 0)) ++ goto out; ++ if (err) { ++ err = 0; ++ goto out; /* success */ ++ } ++ ++ bbot = au_sbbot(sb); ++ add_branch = au_br_alloc(sb, bbot + 2, add->perm); ++ err = PTR_ERR(add_branch); ++ if (IS_ERR(add_branch)) ++ goto out; ++ ++ err = au_br_init(add_branch, sb, add); ++ if (unlikely(err)) { ++ au_br_do_free(add_branch); ++ goto out; ++ } ++ ++ add_bindex = add->bindex; ++ if (!remount) ++ au_br_do_add(sb, add_branch, add_bindex); ++ else { ++ sysaufs_brs_del(sb, add_bindex); ++ au_br_do_add(sb, add_branch, add_bindex); ++ sysaufs_brs_add(sb, add_bindex); ++ } ++ ++ h_dentry = add->path.dentry; ++ if (!add_bindex) { ++ au_cpup_attr_all(root_inode, /*force*/1); ++ sb->s_maxbytes = h_dentry->d_sb->s_maxbytes; ++ } else ++ au_add_nlink(root_inode, d_inode(h_dentry)); ++ ++ /* ++ * this test/set prevents aufs from handling unnecesary notify events ++ * of xino files, in case of re-adding a writable branch which was ++ * once detached from aufs. ++ */ ++ if (au_xino_brid(sb) < 0 ++ && au_br_writable(add_branch->br_perm) ++ && !au_test_fs_bad_xino(h_dentry->d_sb) ++ && add_branch->br_xino.xi_file ++ && add_branch->br_xino.xi_file->f_path.dentry->d_parent == h_dentry) ++ au_xino_brid_set(sb, add_branch->br_id); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static unsigned long long au_farray_cb(struct super_block *sb, void *a, ++ unsigned long long max __maybe_unused, ++ void *arg) ++{ ++ unsigned long long n; ++ struct file **p, *f; ++ struct hlist_bl_head *files; ++ struct hlist_bl_node *pos; ++ struct au_finfo *finfo; ++ ++ n = 0; ++ p = a; ++ files = &au_sbi(sb)->si_files; ++ hlist_bl_lock(files); ++ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { ++ f = finfo->fi_file; ++ if (file_count(f) ++ && !special_file(file_inode(f)->i_mode)) { ++ get_file(f); ++ *p++ = f; ++ n++; ++ AuDebugOn(n > max); ++ } ++ } ++ hlist_bl_unlock(files); ++ ++ return n; ++} ++ ++static struct file **au_farray_alloc(struct super_block *sb, ++ unsigned long long *max) ++{ ++ *max = au_nfiles(sb); ++ return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL); ++} ++ ++static void au_farray_free(struct file **a, unsigned long long max) ++{ ++ unsigned long long ull; ++ ++ for (ull = 0; ull < max; ull++) ++ if (a[ull]) ++ fput(a[ull]); ++ kvfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * delete a branch ++ */ ++ ++/* to show the line number, do not make it inlined function */ ++#define AuVerbose(do_info, fmt, ...) do { \ ++ if (do_info) \ ++ pr_info(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++static int au_test_ibusy(struct inode *inode, aufs_bindex_t btop, ++ aufs_bindex_t bbot) ++{ ++ return (inode && !S_ISDIR(inode->i_mode)) || btop == bbot; ++} ++ ++static int au_test_dbusy(struct dentry *dentry, aufs_bindex_t btop, ++ aufs_bindex_t bbot) ++{ ++ return au_test_ibusy(d_inode(dentry), btop, bbot); ++} ++ ++/* ++ * test if the branch is deletable or not. ++ */ ++static int test_dentry_busy(struct dentry *root, aufs_bindex_t bindex, ++ unsigned int sigen, const unsigned int verbose) ++{ ++ int err, i, j, ndentry; ++ aufs_bindex_t btop, bbot; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry *d; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, root, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ for (i = 0; !err && i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = 0; !err && j < ndentry; j++) { ++ d = dpage->dentries[j]; ++ AuDebugOn(au_dcount(d) <= 0); ++ if (!au_digen_test(d, sigen)) { ++ di_read_lock_child(d, AuLock_IR); ++ if (unlikely(au_dbrange_test(d))) { ++ di_read_unlock(d, AuLock_IR); ++ continue; ++ } ++ } else { ++ di_write_lock_child(d); ++ if (unlikely(au_dbrange_test(d))) { ++ di_write_unlock(d); ++ continue; ++ } ++ err = au_reval_dpath(d, sigen); ++ if (!err) ++ di_downgrade_lock(d, AuLock_IR); ++ else { ++ di_write_unlock(d); ++ break; ++ } ++ } ++ ++ /* AuDbgDentry(d); */ ++ btop = au_dbtop(d); ++ bbot = au_dbbot(d); ++ if (btop <= bindex ++ && bindex <= bbot ++ && au_h_dptr(d, bindex) ++ && au_test_dbusy(d, btop, bbot)) { ++ err = -EBUSY; ++ AuVerbose(verbose, "busy %pd\n", d); ++ AuDbgDentry(d); ++ } ++ di_read_unlock(d, AuLock_IR); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int test_inode_busy(struct super_block *sb, aufs_bindex_t bindex, ++ unsigned int sigen, const unsigned int verbose) ++{ ++ int err; ++ unsigned long long max, ull; ++ struct inode *i, **array; ++ aufs_bindex_t btop, bbot; ++ ++ array = au_iarray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ AuDbg("b%d\n", bindex); ++ for (ull = 0; !err && ull < max; ull++) { ++ i = array[ull]; ++ if (unlikely(!i)) ++ break; ++ if (i->i_ino == AUFS_ROOT_INO) ++ continue; ++ ++ /* AuDbgInode(i); */ ++ if (au_iigen(i, NULL) == sigen) ++ ii_read_lock_child(i); ++ else { ++ ii_write_lock_child(i); ++ err = au_refresh_hinode_self(i); ++ au_iigen_dec(i); ++ if (!err) ++ ii_downgrade_lock(i); ++ else { ++ ii_write_unlock(i); ++ break; ++ } ++ } ++ ++ btop = au_ibtop(i); ++ bbot = au_ibbot(i); ++ if (btop <= bindex ++ && bindex <= bbot ++ && au_h_iptr(i, bindex) ++ && au_test_ibusy(i, btop, bbot)) { ++ err = -EBUSY; ++ AuVerbose(verbose, "busy i%lu\n", i->i_ino); ++ AuDbgInode(i); ++ } ++ ii_read_unlock(i); ++ } ++ au_iarray_free(array, max); ++ ++out: ++ return err; ++} ++ ++static int test_children_busy(struct dentry *root, aufs_bindex_t bindex, ++ const unsigned int verbose) ++{ ++ int err; ++ unsigned int sigen; ++ ++ sigen = au_sigen(root->d_sb); ++ DiMustNoWaiters(root); ++ IiMustNoWaiters(d_inode(root)); ++ di_write_unlock(root); ++ err = test_dentry_busy(root, bindex, sigen, verbose); ++ if (!err) ++ err = test_inode_busy(root->d_sb, bindex, sigen, verbose); ++ di_write_lock_child(root); /* aufs_write_lock() calls ..._child() */ ++ ++ return err; ++} ++ ++static int test_dir_busy(struct file *file, aufs_bindex_t br_id, ++ struct file **to_free, int *idx) ++{ ++ int err; ++ unsigned char matched, root; ++ aufs_bindex_t bindex, bbot; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ ++ err = 0; ++ root = IS_ROOT(file->f_path.dentry); ++ if (root) { ++ get_file(file); ++ to_free[*idx] = file; ++ (*idx)++; ++ goto out; ++ } ++ ++ matched = 0; ++ fidir = au_fi(file)->fi_hdir; ++ AuDebugOn(!fidir); ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ if (!hfile->hf_file) ++ continue; ++ ++ if (hfile->hf_br->br_id == br_id) { ++ matched = 1; ++ break; ++ } ++ } ++ if (matched) ++ err = -EBUSY; ++ ++out: ++ return err; ++} ++ ++static int test_file_busy(struct super_block *sb, aufs_bindex_t br_id, ++ struct file **to_free, int opened) ++{ ++ int err, idx; ++ unsigned long long ull, max; ++ aufs_bindex_t btop; ++ struct file *file, **array; ++ struct dentry *root; ++ struct au_hfile *hfile; ++ ++ array = au_farray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ idx = 0; ++ root = sb->s_root; ++ di_write_unlock(root); ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ fi_read_lock(file); ++ btop = au_fbtop(file); ++ if (!d_is_dir(file->f_path.dentry)) { ++ hfile = &au_fi(file)->fi_htop; ++ if (hfile->hf_br->br_id == br_id) ++ err = -EBUSY; ++ } else ++ err = test_dir_busy(file, br_id, to_free, &idx); ++ fi_read_unlock(file); ++ if (unlikely(err)) ++ break; ++ } ++ di_write_lock_child(root); ++ au_farray_free(array, max); ++ AuDebugOn(idx > opened); ++ ++out: ++ return err; ++} ++ ++static void br_del_file(struct file **to_free, unsigned long long opened, ++ aufs_bindex_t br_id) ++{ ++ unsigned long long ull; ++ aufs_bindex_t bindex, btop, bbot, bfound; ++ struct file *file; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ ++ for (ull = 0; ull < opened; ull++) { ++ file = to_free[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ AuDebugOn(!d_is_dir(file->f_path.dentry)); ++ bfound = -1; ++ fidir = au_fi(file)->fi_hdir; ++ AuDebugOn(!fidir); ++ fi_write_lock(file); ++ btop = au_fbtop(file); ++ bbot = au_fbbot_dir(file); ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ if (!hfile->hf_file) ++ continue; ++ ++ if (hfile->hf_br->br_id == br_id) { ++ bfound = bindex; ++ break; ++ } ++ } ++ AuDebugOn(bfound < 0); ++ au_set_h_fptr(file, bfound, NULL); ++ if (bfound == btop) { ++ for (btop++; btop <= bbot; btop++) ++ if (au_hf_dir(file, btop)) { ++ au_set_fbtop(file, btop); ++ break; ++ } ++ } ++ fi_write_unlock(file); ++ } ++} ++ ++static void au_br_do_del_brp(struct au_sbinfo *sbinfo, ++ const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_branch **brp, **p; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ brp = sbinfo->si_branch + bindex; ++ if (bindex < bbot) ++ memmove(brp, brp + 1, sizeof(*brp) * (bbot - bindex)); ++ sbinfo->si_branch[0 + bbot] = NULL; ++ sbinfo->si_bbot--; ++ ++ p = au_krealloc(sbinfo->si_branch, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ sbinfo->si_branch = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del_hdp(struct au_dinfo *dinfo, const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_hdentry *hdp, *p; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ hdp = au_hdentry(dinfo, bindex); ++ if (bindex < bbot) ++ memmove(hdp, hdp + 1, sizeof(*hdp) * (bbot - bindex)); ++ /* au_h_dentry_init(au_hdentry(dinfo, bbot); */ ++ dinfo->di_bbot--; ++ ++ p = au_krealloc(dinfo->di_hdentry, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ dinfo->di_hdentry = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del_hip(struct au_iinfo *iinfo, const aufs_bindex_t bindex, ++ const aufs_bindex_t bbot) ++{ ++ struct au_hinode *hip, *p; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ hip = au_hinode(iinfo, bindex); ++ if (bindex < bbot) ++ memmove(hip, hip + 1, sizeof(*hip) * (bbot - bindex)); ++ /* au_hinode_init(au_hinode(iinfo, bbot)); */ ++ iinfo->ii_bbot--; ++ ++ p = au_krealloc(iinfo->ii_hinode, sizeof(*p) * bbot, AuGFP_SBILIST, ++ /*may_shrink*/1); ++ if (p) ++ iinfo->ii_hinode = p; ++ /* harmless error */ ++} ++ ++static void au_br_do_del(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_branch *br) ++{ ++ aufs_bindex_t bbot; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root, *h_root; ++ struct inode *inode, *h_inode; ++ struct au_hinode *hinode; ++ ++ SiMustWriteLock(sb); ++ ++ root = sb->s_root; ++ inode = d_inode(root); ++ sbinfo = au_sbi(sb); ++ bbot = sbinfo->si_bbot; ++ ++ h_root = au_h_dptr(root, bindex); ++ hinode = au_hi(inode, bindex); ++ h_inode = au_igrab(hinode->hi_inode); ++ au_hiput(hinode); ++ ++ au_sbilist_lock(); ++ au_br_do_del_brp(sbinfo, bindex, bbot); ++ au_br_do_del_hdp(au_di(root), bindex, bbot); ++ au_br_do_del_hip(au_ii(inode), bindex, bbot); ++ au_sbilist_unlock(); ++ ++ /* ignore an error */ ++ au_dr_br_fin(sb, br); /* always, regardless the mount option */ ++ ++ dput(h_root); ++ iput(h_inode); ++ au_br_do_free(br); ++} ++ ++static unsigned long long empty_cb(struct super_block *sb, void *array, ++ unsigned long long max, void *arg) ++{ ++ return max; ++} ++ ++int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount) ++{ ++ int err, rerr, i; ++ unsigned long long opened; ++ unsigned int mnt_flags; ++ aufs_bindex_t bindex, bbot, br_id; ++ unsigned char do_wh, verbose; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *root; ++ struct file **to_free; ++ ++ err = 0; ++ opened = 0; ++ to_free = NULL; ++ root = sb->s_root; ++ bindex = au_find_dbindex(root, del->h_path.dentry); ++ if (bindex < 0) { ++ if (remount) ++ goto out; /* success */ ++ err = -ENOENT; ++ pr_err("%s no such branch\n", del->pathname); ++ goto out; ++ } ++ AuDbg("bindex b%d\n", bindex); ++ ++ err = -EBUSY; ++ mnt_flags = au_mntflags(sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ bbot = au_sbbot(sb); ++ if (unlikely(!bbot)) { ++ AuVerbose(verbose, "no more branches left\n"); ++ goto out; ++ } ++ br = au_sbr(sb, bindex); ++ AuDebugOn(!path_equal(&br->br_path, &del->h_path)); ++ ++ br_id = br->br_id; ++ opened = au_br_count(br); ++ if (unlikely(opened)) { ++ to_free = au_array_alloc(&opened, empty_cb, sb, NULL); ++ err = PTR_ERR(to_free); ++ if (IS_ERR(to_free)) ++ goto out; ++ ++ err = test_file_busy(sb, br_id, to_free, opened); ++ if (unlikely(err)) { ++ AuVerbose(verbose, "%llu file(s) opened\n", opened); ++ goto out; ++ } ++ } ++ ++ wbr = br->br_wbr; ++ do_wh = wbr && (wbr->wbr_whbase || wbr->wbr_plink || wbr->wbr_orph); ++ if (do_wh) { ++ /* instead of WbrWhMustWriteLock(wbr) */ ++ SiMustWriteLock(sb); ++ for (i = 0; i < AuBrWh_Last; i++) { ++ dput(wbr->wbr_wh[i]); ++ wbr->wbr_wh[i] = NULL; ++ } ++ } ++ ++ err = test_children_busy(root, bindex, verbose); ++ if (unlikely(err)) { ++ if (do_wh) ++ goto out_wh; ++ goto out; ++ } ++ ++ err = 0; ++ if (to_free) { ++ /* ++ * now we confirmed the branch is deletable. ++ * let's free the remaining opened dirs on the branch. ++ */ ++ di_write_unlock(root); ++ br_del_file(to_free, opened, br_id); ++ di_write_lock_child(root); ++ } ++ ++ if (!remount) ++ au_br_do_del(sb, bindex, br); ++ else { ++ sysaufs_brs_del(sb, bindex); ++ au_br_do_del(sb, bindex, br); ++ sysaufs_brs_add(sb, bindex); ++ } ++ ++ if (!bindex) { ++ au_cpup_attr_all(d_inode(root), /*force*/1); ++ sb->s_maxbytes = au_sbr_sb(sb, 0)->s_maxbytes; ++ } else ++ au_sub_nlink(d_inode(root), d_inode(del->h_path.dentry)); ++ if (au_opt_test(mnt_flags, PLINK)) ++ au_plink_half_refresh(sb, br_id); ++ ++ if (au_xino_brid(sb) == br_id) ++ au_xino_brid_set(sb, -1); ++ goto out; /* success */ ++ ++out_wh: ++ /* revert */ ++ rerr = au_br_init_wh(sb, br, br->br_perm); ++ if (rerr) ++ pr_warn("failed re-creating base whiteout, %s. (%d)\n", ++ del->pathname, rerr); ++out: ++ if (to_free) ++ au_farray_free(to_free, opened); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_ibusy(struct super_block *sb, struct aufs_ibusy __user *arg) ++{ ++ int err; ++ aufs_bindex_t btop, bbot; ++ struct aufs_ibusy ibusy; ++ struct inode *inode, *h_inode; ++ ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = copy_from_user(&ibusy, arg, sizeof(ibusy)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, &arg->h_ino, sizeof(arg->h_ino)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ si_read_lock(sb, AuLock_FLUSH); ++ if (unlikely(ibusy.bindex < 0 || ibusy.bindex > au_sbbot(sb))) ++ goto out_unlock; ++ ++ err = 0; ++ ibusy.h_ino = 0; /* invalid */ ++ inode = ilookup(sb, ibusy.ino); ++ if (!inode ++ || inode->i_ino == AUFS_ROOT_INO ++ || au_is_bad_inode(inode)) ++ goto out_unlock; ++ ++ ii_read_lock_child(inode); ++ btop = au_ibtop(inode); ++ bbot = au_ibbot(inode); ++ if (btop <= ibusy.bindex && ibusy.bindex <= bbot) { ++ h_inode = au_h_iptr(inode, ibusy.bindex); ++ if (h_inode && au_test_ibusy(inode, btop, bbot)) ++ ibusy.h_ino = h_inode->i_ino; ++ } ++ ii_read_unlock(inode); ++ iput(inode); ++ ++out_unlock: ++ si_read_unlock(sb); ++ if (!err) { ++ err = __put_user(ibusy.h_ino, &arg->h_ino); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ } ++out: ++ return err; ++} ++ ++long au_ibusy_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_ibusy(file->f_path.dentry->d_sb, (void __user *)arg); ++} ++ ++#ifdef CONFIG_COMPAT ++long au_ibusy_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_ibusy(file->f_path.dentry->d_sb, compat_ptr(arg)); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * change a branch permission ++ */ ++ ++static void au_warn_ima(void) ++{ ++#ifdef CONFIG_IMA ++ /* since it doesn't support mark_files_ro() */ ++ AuWarn1("RW -> RO makes IMA to produce wrong message\n"); ++#endif ++} ++ ++static int do_need_sigen_inc(int a, int b) ++{ ++ return au_br_whable(a) && !au_br_whable(b); ++} ++ ++static int need_sigen_inc(int old, int new) ++{ ++ return do_need_sigen_inc(old, new) ++ || do_need_sigen_inc(new, old); ++} ++ ++static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ int err, do_warn; ++ unsigned int mnt_flags; ++ unsigned long long ull, max; ++ aufs_bindex_t br_id; ++ unsigned char verbose, writer; ++ struct file *file, *hf, **array; ++ struct au_hfile *hfile; ++ ++ mnt_flags = au_mntflags(sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ ++ array = au_farray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ do_warn = 0; ++ br_id = au_sbr_id(sb, bindex); ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (unlikely(!file)) ++ break; ++ ++ /* AuDbg("%pD\n", file); */ ++ fi_read_lock(file); ++ if (unlikely(au_test_mmapped(file))) { ++ err = -EBUSY; ++ AuVerbose(verbose, "mmapped %pD\n", file); ++ AuDbgFile(file); ++ FiMustNoWaiters(file); ++ fi_read_unlock(file); ++ goto out_array; ++ } ++ ++ hfile = &au_fi(file)->fi_htop; ++ hf = hfile->hf_file; ++ if (!d_is_reg(file->f_path.dentry) ++ || !(file->f_mode & FMODE_WRITE) ++ || hfile->hf_br->br_id != br_id ++ || !(hf->f_mode & FMODE_WRITE)) ++ array[ull] = NULL; ++ else { ++ do_warn = 1; ++ get_file(file); ++ } ++ ++ FiMustNoWaiters(file); ++ fi_read_unlock(file); ++ fput(file); ++ } ++ ++ err = 0; ++ if (do_warn) ++ au_warn_ima(); ++ ++ for (ull = 0; ull < max; ull++) { ++ file = array[ull]; ++ if (!file) ++ continue; ++ ++ /* todo: already flushed? */ ++ /* ++ * fs/super.c:mark_files_ro() is gone, but aufs keeps its ++ * approach which resets f_mode and calls mnt_drop_write() and ++ * file_release_write() for each file, because the branch ++ * attribute in aufs world is totally different from the native ++ * fs rw/ro mode. ++ */ ++ /* fi_read_lock(file); */ ++ hfile = &au_fi(file)->fi_htop; ++ hf = hfile->hf_file; ++ /* fi_read_unlock(file); */ ++ spin_lock(&hf->f_lock); ++ writer = !!(hf->f_mode & FMODE_WRITER); ++ hf->f_mode &= ~(FMODE_WRITE | FMODE_WRITER); ++ spin_unlock(&hf->f_lock); ++ if (writer) { ++ put_write_access(file_inode(hf)); ++ __mnt_drop_write(hf->f_path.mnt); ++ } ++ } ++ ++out_array: ++ au_farray_free(array, max); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, ++ int *do_refresh) ++{ ++ int err, rerr; ++ aufs_bindex_t bindex; ++ struct dentry *root; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ root = sb->s_root; ++ bindex = au_find_dbindex(root, mod->h_root); ++ if (bindex < 0) { ++ if (remount) ++ return 0; /* success */ ++ err = -ENOENT; ++ pr_err("%s no such branch\n", mod->path); ++ goto out; ++ } ++ AuDbg("bindex b%d\n", bindex); ++ ++ err = test_br(d_inode(mod->h_root), mod->perm, mod->path); ++ if (unlikely(err)) ++ goto out; ++ ++ br = au_sbr(sb, bindex); ++ AuDebugOn(mod->h_root != au_br_dentry(br)); ++ if (br->br_perm == mod->perm) ++ return 0; /* success */ ++ ++ /* pre-allocate for non-fhsm --> fhsm */ ++ bf = NULL; ++ if (!au_br_fhsm(br->br_perm) && au_br_fhsm(mod->perm)) { ++ err = au_fhsm_br_alloc(br); ++ if (unlikely(err)) ++ goto out; ++ bf = br->br_fhsm; ++ br->br_fhsm = NULL; ++ } ++ ++ if (au_br_writable(br->br_perm)) { ++ /* remove whiteout base */ ++ err = au_br_init_wh(sb, br, mod->perm); ++ if (unlikely(err)) ++ goto out_bf; ++ ++ if (!au_br_writable(mod->perm)) { ++ /* rw --> ro, file might be mmapped */ ++ DiMustNoWaiters(root); ++ IiMustNoWaiters(d_inode(root)); ++ di_write_unlock(root); ++ err = au_br_mod_files_ro(sb, bindex); ++ /* aufs_write_lock() calls ..._child() */ ++ di_write_lock_child(root); ++ ++ if (unlikely(err)) { ++ rerr = -ENOMEM; ++ br->br_wbr = kzalloc(sizeof(*br->br_wbr), ++ GFP_NOFS); ++ if (br->br_wbr) ++ rerr = au_wbr_init(br, sb, br->br_perm); ++ if (unlikely(rerr)) { ++ AuIOErr("nested error %d (%d)\n", ++ rerr, err); ++ br->br_perm = mod->perm; ++ } ++ } ++ } ++ } else if (au_br_writable(mod->perm)) { ++ /* ro --> rw */ ++ err = -ENOMEM; ++ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS); ++ if (br->br_wbr) { ++ err = au_wbr_init(br, sb, mod->perm); ++ if (unlikely(err)) { ++ kfree(br->br_wbr); ++ br->br_wbr = NULL; ++ } ++ } ++ } ++ if (unlikely(err)) ++ goto out_bf; ++ ++ if (au_br_fhsm(br->br_perm)) { ++ if (!au_br_fhsm(mod->perm)) { ++ /* fhsm --> non-fhsm */ ++ au_br_fhsm_fin(br->br_fhsm); ++ kfree(br->br_fhsm); ++ br->br_fhsm = NULL; ++ } ++ } else if (au_br_fhsm(mod->perm)) ++ /* non-fhsm --> fhsm */ ++ br->br_fhsm = bf; ++ ++ *do_refresh |= need_sigen_inc(br->br_perm, mod->perm); ++ br->br_perm = mod->perm; ++ goto out; /* success */ ++ ++out_bf: ++ kfree(bf); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs) ++{ ++ int err; ++ struct kstatfs kstfs; ++ ++ err = vfs_statfs(&br->br_path, &kstfs); ++ if (!err) { ++ stfs->f_blocks = kstfs.f_blocks; ++ stfs->f_bavail = kstfs.f_bavail; ++ stfs->f_files = kstfs.f_files; ++ stfs->f_ffree = kstfs.f_ffree; ++ } ++ ++ return err; ++} +diff -Naur null/fs/aufs/branch.h linux-4.15/fs/aufs/branch.h +--- /dev/null ++++ linux-4.15/fs/aufs/branch.h 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,333 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * branch filesystems and xino for them ++ */ ++ ++#ifndef __AUFS_BRANCH_H__ ++#define __AUFS_BRANCH_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "dirren.h" ++#include "dynop.h" ++#include "rwsem.h" ++#include "super.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* a xino file */ ++struct au_xino_file { ++ struct file *xi_file; ++ struct { ++ spinlock_t spin; ++ ino_t *array; ++ int total; ++ /* reserved for future use */ ++ /* unsigned long *bitmap; */ ++ wait_queue_head_t wqh; ++ } xi_nondir; ++ ++ /* todo: make xino files an array to support huge inode number */ ++ ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *xi_dbgaufs; ++#endif ++}; ++ ++/* File-based Hierarchical Storage Management */ ++struct au_br_fhsm { ++#ifdef CONFIG_AUFS_FHSM ++ struct mutex bf_lock; ++ unsigned long bf_jiffy; ++ struct aufs_stfs bf_stfs; ++ int bf_readable; ++#endif ++}; ++ ++/* members for writable branch only */ ++enum {AuBrWh_BASE, AuBrWh_PLINK, AuBrWh_ORPH, AuBrWh_Last}; ++struct au_wbr { ++ struct au_rwsem wbr_wh_rwsem; ++ struct dentry *wbr_wh[AuBrWh_Last]; ++ atomic_t wbr_wh_running; ++#define wbr_whbase wbr_wh[AuBrWh_BASE] /* whiteout base */ ++#define wbr_plink wbr_wh[AuBrWh_PLINK] /* pseudo-link dir */ ++#define wbr_orph wbr_wh[AuBrWh_ORPH] /* dir for orphans */ ++ ++ /* mfs mode */ ++ unsigned long long wbr_bytes; ++}; ++ ++/* ext2 has 3 types of operations at least, ext3 has 4 */ ++#define AuBrDynOp (AuDyLast * 4) ++ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++/* support for asynchronous destruction */ ++struct au_br_hfsnotify { ++ struct fsnotify_group *hfsn_group; ++}; ++#endif ++ ++/* sysfs entries */ ++struct au_brsysfs { ++ char name[16]; ++ struct attribute attr; ++}; ++ ++enum { ++ AuBrSysfs_BR, ++ AuBrSysfs_BRID, ++ AuBrSysfs_Last ++}; ++ ++/* protected by superblock rwsem */ ++struct au_branch { ++ struct au_xino_file br_xino; ++ ++ aufs_bindex_t br_id; ++ ++ int br_perm; ++ struct path br_path; ++ spinlock_t br_dykey_lock; ++ struct au_dykey *br_dykey[AuBrDynOp]; ++ struct percpu_counter br_count; ++ ++ struct au_wbr *br_wbr; ++ struct au_br_fhsm *br_fhsm; ++ ++ /* xino truncation */ ++ atomic_t br_xino_running; ++ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ struct au_br_hfsnotify *br_hfsn; ++#endif ++ ++#ifdef CONFIG_SYSFS ++ /* entries under sysfs per mount-point */ ++ struct au_brsysfs br_sysfs[AuBrSysfs_Last]; ++#endif ++ ++ struct au_dr_br br_dirren; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct vfsmount *au_br_mnt(struct au_branch *br) ++{ ++ return br->br_path.mnt; ++} ++ ++static inline struct dentry *au_br_dentry(struct au_branch *br) ++{ ++ return br->br_path.dentry; ++} ++ ++static inline struct super_block *au_br_sb(struct au_branch *br) ++{ ++ return au_br_mnt(br)->mnt_sb; ++} ++ ++static inline void au_br_get(struct au_branch *br) ++{ ++ percpu_counter_inc(&br->br_count); ++} ++ ++static inline void au_br_put(struct au_branch *br) ++{ ++ percpu_counter_dec(&br->br_count); ++} ++ ++static inline s64 au_br_count(struct au_branch *br) ++{ ++ return percpu_counter_sum(&br->br_count); ++} ++ ++static inline void au_br_count_init(struct au_branch *br) ++{ ++ percpu_counter_init(&br->br_count, 0, GFP_NOFS); ++} ++ ++static inline void au_br_count_fin(struct au_branch *br) ++{ ++ percpu_counter_destroy(&br->br_count); ++} ++ ++static inline int au_br_rdonly(struct au_branch *br) ++{ ++ return (sb_rdonly(au_br_sb(br)) ++ || !au_br_writable(br->br_perm)) ++ ? -EROFS : 0; ++} ++ ++static inline int au_br_hnotifyable(int brperm __maybe_unused) ++{ ++#ifdef CONFIG_AUFS_HNOTIFY ++ return !(brperm & AuBrPerm_RR); ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_br_test_oflag(int oflag, struct au_branch *br) ++{ ++ int err, exec_flag; ++ ++ err = 0; ++ exec_flag = oflag & __FMODE_EXEC; ++ if (unlikely(exec_flag && path_noexec(&br->br_path))) ++ err = -EACCES; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* branch.c */ ++struct au_sbinfo; ++void au_br_free(struct au_sbinfo *sinfo); ++int au_br_index(struct super_block *sb, aufs_bindex_t br_id); ++struct au_opt_add; ++int au_br_add(struct super_block *sb, struct au_opt_add *add, int remount); ++struct au_opt_del; ++int au_br_del(struct super_block *sb, struct au_opt_del *del, int remount); ++long au_ibusy_ioctl(struct file *file, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_ibusy_compat_ioctl(struct file *file, unsigned long arg); ++#endif ++struct au_opt_mod; ++int au_br_mod(struct super_block *sb, struct au_opt_mod *mod, int remount, ++ int *do_refresh); ++struct aufs_stfs; ++int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs); ++ ++/* xino.c */ ++static const loff_t au_loff_max = LLONG_MAX; ++ ++int au_xib_trunc(struct super_block *sb); ++ssize_t xino_fread(vfs_readf_t func, struct file *file, void *buf, size_t size, ++ loff_t *pos); ++ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++struct file *au_xino_create2(struct file *base_file, struct file *copy_src); ++struct file *au_xino_create(struct super_block *sb, char *fname, int silent); ++ino_t au_xino_new_ino(struct super_block *sb); ++void au_xino_delete_inode(struct inode *inode, const int unlinked); ++int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t ino); ++int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t *ino); ++int au_xino_br(struct super_block *sb, struct au_branch *br, ino_t hino, ++ struct file *base_file, int do_test); ++int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex); ++ ++struct au_opt_xino; ++int au_xino_set(struct super_block *sb, struct au_opt_xino *xino, int remount); ++void au_xino_clr(struct super_block *sb); ++struct file *au_xino_def(struct super_block *sb); ++int au_xino_path(struct seq_file *seq, struct file *file); ++ ++void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, int idx); ++int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ int *idx); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Superblock to branch */ ++static inline ++aufs_bindex_t au_sbr_id(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_sbr(sb, bindex)->br_id; ++} ++ ++static inline ++struct vfsmount *au_sbr_mnt(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_mnt(au_sbr(sb, bindex)); ++} ++ ++static inline ++struct super_block *au_sbr_sb(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_sb(au_sbr(sb, bindex)); ++} ++ ++static inline void au_sbr_get(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ au_br_get(au_sbr(sb, bindex)); ++} ++ ++static inline void au_sbr_put(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ au_br_put(au_sbr(sb, bindex)); ++} ++ ++static inline int au_sbr_perm(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_sbr(sb, bindex)->br_perm; ++} ++ ++static inline int au_sbr_whable(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ return au_br_whable(au_sbr_perm(sb, bindex)); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define wbr_wh_read_lock(wbr) au_rw_read_lock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_lock(wbr) au_rw_write_lock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_read_trylock(wbr) au_rw_read_trylock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_trylock(wbr) au_rw_write_trylock(&(wbr)->wbr_wh_rwsem) ++/* ++#define wbr_wh_read_trylock_nested(wbr) \ ++ au_rw_read_trylock_nested(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_trylock_nested(wbr) \ ++ au_rw_write_trylock_nested(&(wbr)->wbr_wh_rwsem) ++*/ ++ ++#define wbr_wh_read_unlock(wbr) au_rw_read_unlock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_write_unlock(wbr) au_rw_write_unlock(&(wbr)->wbr_wh_rwsem) ++#define wbr_wh_downgrade_lock(wbr) au_rw_dgrade_lock(&(wbr)->wbr_wh_rwsem) ++ ++#define WbrWhMustNoWaiters(wbr) AuRwMustNoWaiters(&(wbr)->wbr_wh_rwsem) ++#define WbrWhMustAnyLock(wbr) AuRwMustAnyLock(&(wbr)->wbr_wh_rwsem) ++#define WbrWhMustWriteLock(wbr) AuRwMustWriteLock(&(wbr)->wbr_wh_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_FHSM ++static inline void au_br_fhsm_init(struct au_br_fhsm *brfhsm) ++{ ++ mutex_init(&brfhsm->bf_lock); ++ brfhsm->bf_jiffy = 0; ++ brfhsm->bf_readable = 0; ++} ++ ++static inline void au_br_fhsm_fin(struct au_br_fhsm *brfhsm) ++{ ++ mutex_destroy(&brfhsm->bf_lock); ++} ++#else ++AuStubVoid(au_br_fhsm_init, struct au_br_fhsm *brfhsm) ++AuStubVoid(au_br_fhsm_fin, struct au_br_fhsm *brfhsm) ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_BRANCH_H__ */ +diff -Naur null/fs/aufs/conf.mk linux-4.15/fs/aufs/conf.mk +--- /dev/null ++++ linux-4.15/fs/aufs/conf.mk 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,40 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS} ++ ++define AuConf ++ifdef ${1} ++AuConfStr += ${1}=${${1}} ++endif ++endef ++ ++AuConfAll = BRANCH_MAX_127 BRANCH_MAX_511 BRANCH_MAX_1023 BRANCH_MAX_32767 \ ++ SBILIST \ ++ HNOTIFY HFSNOTIFY \ ++ EXPORT INO_T_64 \ ++ XATTR \ ++ FHSM \ ++ RDU \ ++ DIRREN \ ++ SHWH \ ++ BR_RAMFS \ ++ BR_FUSE POLL \ ++ BR_HFSPLUS \ ++ BDEV_LOOP \ ++ DEBUG MAGIC_SYSRQ ++$(foreach i, ${AuConfAll}, \ ++ $(eval $(call AuConf,CONFIG_AUFS_${i}))) ++ ++AuConfName = ${obj}/conf.str ++${AuConfName}.tmp: FORCE ++ @echo ${AuConfStr} | tr ' ' '\n' | sed -e 's/^/"/' -e 's/$$/\\n"/' > $@ ++${AuConfName}: ${AuConfName}.tmp ++ @diff -q $< $@ > /dev/null 2>&1 || { \ ++ echo ' GEN ' $@; \ ++ cp -p $< $@; \ ++ } ++FORCE: ++clean-files += ${AuConfName} ${AuConfName}.tmp ++${obj}/sysfs.o: ${AuConfName} ++ ++-include ${srctree}/${src}/conf_priv.mk +diff -Naur null/fs/aufs/cpup.c linux-4.15/fs/aufs/cpup.c +--- /dev/null ++++ linux-4.15/fs/aufs/cpup.c 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,1442 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * copy-up functions, see wbr_policy.c for copy-down ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++void au_cpup_attr_flags(struct inode *dst, unsigned int iflags) ++{ ++ const unsigned int mask = S_DEAD | S_SWAPFILE | S_PRIVATE ++ | S_NOATIME | S_NOCMTIME | S_AUTOMOUNT; ++ ++ BUILD_BUG_ON(sizeof(iflags) != sizeof(dst->i_flags)); ++ ++ dst->i_flags |= iflags & ~mask; ++ if (au_test_fs_notime(dst->i_sb)) ++ dst->i_flags |= S_NOATIME | S_NOCMTIME; ++} ++ ++void au_cpup_attr_timesizes(struct inode *inode) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ fsstack_copy_attr_times(inode, h_inode); ++ fsstack_copy_inode_size(inode, h_inode); ++} ++ ++void au_cpup_attr_nlink(struct inode *inode, int force) ++{ ++ struct inode *h_inode; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ ++ sb = inode->i_sb; ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (!force ++ && !S_ISDIR(h_inode->i_mode) ++ && au_opt_test(au_mntflags(sb), PLINK) ++ && au_plink_test(inode)) ++ return; ++ ++ /* ++ * 0 can happen in revalidating. ++ * h_inode->i_mutex may not be held here, but it is harmless since once ++ * i_nlink reaches 0, it will never become positive except O_TMPFILE ++ * case. ++ * todo: O_TMPFILE+linkat(AT_SYMLINK_FOLLOW) bypassing aufs may cause ++ * the incorrect link count. ++ */ ++ set_nlink(inode, h_inode->i_nlink); ++ ++ /* ++ * fewer nlink makes find(1) noisy, but larger nlink doesn't. ++ * it may includes whplink directory. ++ */ ++ if (S_ISDIR(h_inode->i_mode)) { ++ bbot = au_ibbot(inode); ++ for (bindex++; bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (h_inode) ++ au_add_nlink(inode, h_inode); ++ } ++ } ++} ++ ++void au_cpup_attr_changeable(struct inode *inode) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ inode->i_mode = h_inode->i_mode; ++ inode->i_uid = h_inode->i_uid; ++ inode->i_gid = h_inode->i_gid; ++ au_cpup_attr_timesizes(inode); ++ au_cpup_attr_flags(inode, h_inode->i_flags); ++} ++ ++void au_cpup_igen(struct inode *inode, struct inode *h_inode) ++{ ++ struct au_iinfo *iinfo = au_ii(inode); ++ ++ IiMustWriteLock(inode); ++ ++ iinfo->ii_higen = h_inode->i_generation; ++ iinfo->ii_hsb1 = h_inode->i_sb; ++} ++ ++void au_cpup_attr_all(struct inode *inode, int force) ++{ ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ au_cpup_attr_changeable(inode); ++ if (inode->i_nlink > 0) ++ au_cpup_attr_nlink(inode, force); ++ inode->i_rdev = h_inode->i_rdev; ++ inode->i_blkbits = h_inode->i_blkbits; ++ au_cpup_igen(inode, h_inode); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Note: dt_dentry and dt_h_dentry are not dget/dput-ed */ ++ ++/* keep the timestamps of the parent dir when cpup */ ++void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, ++ struct path *h_path) ++{ ++ struct inode *h_inode; ++ ++ dt->dt_dentry = dentry; ++ dt->dt_h_path = *h_path; ++ h_inode = d_inode(h_path->dentry); ++ dt->dt_atime = h_inode->i_atime; ++ dt->dt_mtime = h_inode->i_mtime; ++ /* smp_mb(); */ ++} ++ ++void au_dtime_revert(struct au_dtime *dt) ++{ ++ struct iattr attr; ++ int err; ++ ++ attr.ia_atime = dt->dt_atime; ++ attr.ia_mtime = dt->dt_mtime; ++ attr.ia_valid = ATTR_FORCE | ATTR_MTIME | ATTR_MTIME_SET ++ | ATTR_ATIME | ATTR_ATIME_SET; ++ ++ /* no delegation since this is a directory */ ++ err = vfsub_notify_change(&dt->dt_h_path, &attr, /*delegated*/NULL); ++ if (unlikely(err)) ++ pr_warn("restoring timestamps failed(%d). ignored\n", err); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* internal use only */ ++struct au_cpup_reg_attr { ++ int valid; ++ struct kstat st; ++ unsigned int iflags; /* inode->i_flags */ ++}; ++ ++static noinline_for_stack ++int cpup_iattr(struct dentry *dst, aufs_bindex_t bindex, struct dentry *h_src, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err, sbits, icex; ++ unsigned int mnt_flags; ++ unsigned char verbose; ++ struct iattr ia; ++ struct path h_path; ++ struct inode *h_isrc, *h_idst; ++ struct kstat *h_st; ++ struct au_branch *br; ++ ++ h_path.dentry = au_h_dptr(dst, bindex); ++ h_idst = d_inode(h_path.dentry); ++ br = au_sbr(dst->d_sb, bindex); ++ h_path.mnt = au_br_mnt(br); ++ h_isrc = d_inode(h_src); ++ ia.ia_valid = ATTR_FORCE | ATTR_UID | ATTR_GID ++ | ATTR_ATIME | ATTR_MTIME ++ | ATTR_ATIME_SET | ATTR_MTIME_SET; ++ if (h_src_attr && h_src_attr->valid) { ++ h_st = &h_src_attr->st; ++ ia.ia_uid = h_st->uid; ++ ia.ia_gid = h_st->gid; ++ ia.ia_atime = h_st->atime; ++ ia.ia_mtime = h_st->mtime; ++ if (h_idst->i_mode != h_st->mode ++ && !S_ISLNK(h_idst->i_mode)) { ++ ia.ia_valid |= ATTR_MODE; ++ ia.ia_mode = h_st->mode; ++ } ++ sbits = !!(h_st->mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(h_idst, h_src_attr->iflags); ++ } else { ++ ia.ia_uid = h_isrc->i_uid; ++ ia.ia_gid = h_isrc->i_gid; ++ ia.ia_atime = h_isrc->i_atime; ++ ia.ia_mtime = h_isrc->i_mtime; ++ if (h_idst->i_mode != h_isrc->i_mode ++ && !S_ISLNK(h_idst->i_mode)) { ++ ia.ia_valid |= ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ } ++ sbits = !!(h_isrc->i_mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(h_idst, h_isrc->i_flags); ++ } ++ /* no delegation since it is just created */ ++ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ ++ /* is this nfs only? */ ++ if (!err && sbits && au_test_nfs(h_path.dentry->d_sb)) { ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ err = vfsub_notify_change(&h_path, &ia, /*delegated*/NULL); ++ } ++ ++ icex = br->br_perm & AuBrAttr_ICEX; ++ if (!err) { ++ mnt_flags = au_mntflags(dst->d_sb); ++ verbose = !!au_opt_test(mnt_flags, VERBOSE); ++ err = au_cpup_xattr(h_path.dentry, h_src, icex, verbose); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_copy_file(struct file *dst, struct file *src, loff_t len, ++ char *buf, unsigned long blksize) ++{ ++ int err; ++ size_t sz, rbytes, wbytes; ++ unsigned char all_zero; ++ char *p, *zp; ++ struct inode *h_inode; ++ /* reduce stack usage */ ++ struct iattr *ia; ++ ++ zp = page_address(ZERO_PAGE(0)); ++ if (unlikely(!zp)) ++ return -ENOMEM; /* possible? */ ++ ++ err = 0; ++ all_zero = 0; ++ while (len) { ++ AuDbg("len %lld\n", len); ++ sz = blksize; ++ if (len < blksize) ++ sz = len; ++ ++ rbytes = 0; ++ /* todo: signal_pending? */ ++ while (!rbytes || err == -EAGAIN || err == -EINTR) { ++ rbytes = vfsub_read_k(src, buf, sz, &src->f_pos); ++ err = rbytes; ++ } ++ if (unlikely(err < 0)) ++ break; ++ ++ all_zero = 0; ++ if (len >= rbytes && rbytes == blksize) ++ all_zero = !memcmp(buf, zp, rbytes); ++ if (!all_zero) { ++ wbytes = rbytes; ++ p = buf; ++ while (wbytes) { ++ size_t b; ++ ++ b = vfsub_write_k(dst, p, wbytes, &dst->f_pos); ++ err = b; ++ /* todo: signal_pending? */ ++ if (unlikely(err == -EAGAIN || err == -EINTR)) ++ continue; ++ if (unlikely(err < 0)) ++ break; ++ wbytes -= b; ++ p += b; ++ } ++ if (unlikely(err < 0)) ++ break; ++ } else { ++ loff_t res; ++ ++ AuLabel(hole); ++ res = vfsub_llseek(dst, rbytes, SEEK_CUR); ++ err = res; ++ if (unlikely(res < 0)) ++ break; ++ } ++ len -= rbytes; ++ err = 0; ++ } ++ ++ /* the last block may be a hole */ ++ if (!err && all_zero) { ++ AuLabel(last hole); ++ ++ err = 1; ++ if (au_test_nfs(dst->f_path.dentry->d_sb)) { ++ /* nfs requires this step to make last hole */ ++ /* is this only nfs? */ ++ do { ++ /* todo: signal_pending? */ ++ err = vfsub_write_k(dst, "\0", 1, &dst->f_pos); ++ } while (err == -EAGAIN || err == -EINTR); ++ if (err == 1) ++ dst->f_pos--; ++ } ++ ++ if (err == 1) { ++ ia = (void *)buf; ++ ia->ia_size = dst->f_pos; ++ ia->ia_valid = ATTR_SIZE | ATTR_FILE; ++ ia->ia_file = dst; ++ h_inode = file_inode(dst); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD2); ++ /* no delegation since it is just created */ ++ err = vfsub_notify_change(&dst->f_path, ia, ++ /*delegated*/NULL); ++ inode_unlock(h_inode); ++ } ++ } ++ ++ return err; ++} ++ ++int au_copy_file(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ unsigned long blksize; ++ unsigned char do_kfree; ++ char *buf; ++ ++ err = -ENOMEM; ++ blksize = dst->f_path.dentry->d_sb->s_blocksize; ++ if (!blksize || PAGE_SIZE < blksize) ++ blksize = PAGE_SIZE; ++ AuDbg("blksize %lu\n", blksize); ++ do_kfree = (blksize != PAGE_SIZE && blksize >= sizeof(struct iattr *)); ++ if (do_kfree) ++ buf = kmalloc(blksize, GFP_NOFS); ++ else ++ buf = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!buf)) ++ goto out; ++ ++ if (len > (1 << 22)) ++ AuDbg("copying a large file %lld\n", (long long)len); ++ ++ src->f_pos = 0; ++ dst->f_pos = 0; ++ err = au_do_copy_file(dst, src, len, buf, blksize); ++ if (do_kfree) ++ kfree(buf); ++ else ++ free_page((unsigned long)buf); ++ ++out: ++ return err; ++} ++ ++static int au_do_copy(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ struct super_block *h_src_sb; ++ struct inode *h_src_inode; ++ ++ h_src_inode = file_inode(src); ++ h_src_sb = h_src_inode->i_sb; ++ ++ /* XFS acquires inode_lock */ ++ if (!au_test_xfs(h_src_sb)) ++ err = au_copy_file(dst, src, len); ++ else { ++ inode_unlock_shared(h_src_inode); ++ err = au_copy_file(dst, src, len); ++ vfsub_inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ } ++ ++ return err; ++} ++ ++static int au_clone_or_copy(struct file *dst, struct file *src, loff_t len) ++{ ++ int err; ++ struct super_block *h_src_sb; ++ struct inode *h_src_inode; ++ ++ h_src_inode = file_inode(src); ++ h_src_sb = h_src_inode->i_sb; ++ if (h_src_sb != file_inode(dst)->i_sb ++ || !dst->f_op->clone_file_range) { ++ err = au_do_copy(dst, src, len); ++ goto out; ++ } ++ ++ if (!au_test_nfs(h_src_sb)) { ++ inode_unlock_shared(h_src_inode); ++ err = vfsub_clone_file_range(src, dst, len); ++ vfsub_inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ } else ++ err = vfsub_clone_file_range(src, dst, len); ++ /* older XFS has a condition in cloning */ ++ if (unlikely(err != -EOPNOTSUPP)) ++ goto out; ++ ++ /* the backend fs on NFS may not support cloning */ ++ err = au_do_copy(dst, src, len); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * to support a sparse file which is opened with O_APPEND, ++ * we need to close the file. ++ */ ++static int au_cp_regular(struct au_cp_generic *cpg) ++{ ++ int err, i; ++ enum { SRC, DST }; ++ struct { ++ aufs_bindex_t bindex; ++ unsigned int flags; ++ struct dentry *dentry; ++ int force_wr; ++ struct file *file; ++ void *label; ++ } *f, file[] = { ++ { ++ .bindex = cpg->bsrc, ++ .flags = O_RDONLY | O_NOATIME | O_LARGEFILE, ++ .label = &&out ++ }, ++ { ++ .bindex = cpg->bdst, ++ .flags = O_WRONLY | O_NOATIME | O_LARGEFILE, ++ .force_wr = !!au_ftest_cpup(cpg->flags, RWDST), ++ .label = &&out_src ++ } ++ }; ++ struct super_block *sb, *h_src_sb; ++ struct inode *h_src_inode; ++ struct task_struct *tsk = current; ++ ++ /* bsrc branch can be ro/rw. */ ++ sb = cpg->dentry->d_sb; ++ f = file; ++ for (i = 0; i < 2; i++, f++) { ++ f->dentry = au_h_dptr(cpg->dentry, f->bindex); ++ f->file = au_h_open(cpg->dentry, f->bindex, f->flags, ++ /*file*/NULL, f->force_wr); ++ err = PTR_ERR(f->file); ++ if (IS_ERR(f->file)) ++ goto *f->label; ++ } ++ ++ /* try stopping to update while we copyup */ ++ h_src_inode = d_inode(file[SRC].dentry); ++ h_src_sb = h_src_inode->i_sb; ++ if (!au_test_nfs(h_src_sb)) ++ IMustLock(h_src_inode); ++ err = au_clone_or_copy(file[DST].file, file[SRC].file, cpg->len); ++ ++ /* i wonder if we had O_NO_DELAY_FPUT flag */ ++ if (tsk->flags & PF_KTHREAD) ++ __fput_sync(file[DST].file); ++ else { ++ /* it happend actually */ ++ fput(file[DST].file); ++ /* ++ * too bad. ++ * we have to call both since we don't know which place the file ++ * was added to. ++ */ ++ task_work_run(); ++ flush_delayed_fput(); ++ } ++ au_sbr_put(sb, file[DST].bindex); ++ ++out_src: ++ fput(file[SRC].file); ++ au_sbr_put(sb, file[SRC].bindex); ++out: ++ return err; ++} ++ ++static int au_do_cpup_regular(struct au_cp_generic *cpg, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err, rerr; ++ loff_t l; ++ struct path h_path; ++ struct inode *h_src_inode, *h_dst_inode; ++ ++ err = 0; ++ h_src_inode = au_h_iptr(d_inode(cpg->dentry), cpg->bsrc); ++ l = i_size_read(h_src_inode); ++ if (cpg->len == -1 || l < cpg->len) ++ cpg->len = l; ++ if (cpg->len) { ++ /* try stopping to update while we are referencing */ ++ vfsub_inode_lock_shared_nested(h_src_inode, AuLsc_I_CHILD); ++ au_pin_hdir_unlock(cpg->pin); ++ ++ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bsrc); ++ h_path.mnt = au_sbr_mnt(cpg->dentry->d_sb, cpg->bsrc); ++ h_src_attr->iflags = h_src_inode->i_flags; ++ if (!au_test_nfs(h_src_inode->i_sb)) ++ err = vfsub_getattr(&h_path, &h_src_attr->st); ++ else { ++ inode_unlock_shared(h_src_inode); ++ err = vfsub_getattr(&h_path, &h_src_attr->st); ++ vfsub_inode_lock_shared_nested(h_src_inode, ++ AuLsc_I_CHILD); ++ } ++ if (unlikely(err)) { ++ inode_unlock_shared(h_src_inode); ++ goto out; ++ } ++ h_src_attr->valid = 1; ++ if (!au_test_nfs(h_src_inode->i_sb)) { ++ err = au_cp_regular(cpg); ++ inode_unlock_shared(h_src_inode); ++ } else { ++ inode_unlock_shared(h_src_inode); ++ err = au_cp_regular(cpg); ++ } ++ rerr = au_pin_hdir_relock(cpg->pin); ++ if (!err && rerr) ++ err = rerr; ++ } ++ if (!err && (h_src_inode->i_state & I_LINKABLE)) { ++ h_path.dentry = au_h_dptr(cpg->dentry, cpg->bdst); ++ h_dst_inode = d_inode(h_path.dentry); ++ spin_lock(&h_dst_inode->i_lock); ++ h_dst_inode->i_state |= I_LINKABLE; ++ spin_unlock(&h_dst_inode->i_lock); ++ } ++ ++out: ++ return err; ++} ++ ++static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src, ++ struct inode *h_dir) ++{ ++ int err, symlen; ++ mm_segment_t old_fs; ++ union { ++ char *k; ++ char __user *u; ++ } sym; ++ ++ err = -ENOMEM; ++ sym.k = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!sym.k)) ++ goto out; ++ ++ /* unnecessary to support mmap_sem since symlink is not mmap-able */ ++ old_fs = get_fs(); ++ set_fs(KERNEL_DS); ++ symlen = vfs_readlink(h_src, sym.u, PATH_MAX); ++ err = symlen; ++ set_fs(old_fs); ++ ++ if (symlen > 0) { ++ sym.k[symlen] = 0; ++ err = vfsub_symlink(h_dir, h_path, sym.k); ++ } ++ free_page((unsigned long)sym.k); ++ ++out: ++ return err; ++} ++ ++/* ++ * regardless 'acl' option, reset all ACL. ++ * All ACL will be copied up later from the original entry on the lower branch. ++ */ ++static int au_reset_acl(struct inode *h_dir, struct path *h_path, umode_t mode) ++{ ++ int err; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_dentry = h_path->dentry; ++ h_inode = d_inode(h_dentry); ++ /* forget_all_cached_acls(h_inode)); */ ++ err = vfsub_removexattr(h_dentry, XATTR_NAME_POSIX_ACL_ACCESS); ++ AuTraceErr(err); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ if (!err) ++ err = vfsub_acl_chmod(h_inode, mode); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_do_cpup_dir(struct au_cp_generic *cpg, struct dentry *dst_parent, ++ struct inode *h_dir, struct path *h_path) ++{ ++ int err; ++ struct inode *dir, *inode; ++ ++ err = vfsub_removexattr(h_path->dentry, XATTR_NAME_POSIX_ACL_DEFAULT); ++ AuTraceErr(err); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * strange behaviour from the users view, ++ * particularry setattr case ++ */ ++ dir = d_inode(dst_parent); ++ if (au_ibtop(dir) == cpg->bdst) ++ au_cpup_attr_nlink(dir, /*force*/1); ++ inode = d_inode(cpg->dentry); ++ au_cpup_attr_nlink(inode, /*force*/1); ++ ++out: ++ return err; ++} ++ ++static noinline_for_stack ++int cpup_entry(struct au_cp_generic *cpg, struct dentry *dst_parent, ++ struct au_cpup_reg_attr *h_src_attr) ++{ ++ int err; ++ umode_t mode; ++ unsigned int mnt_flags; ++ unsigned char isdir, isreg, force; ++ const unsigned char do_dt = !!au_ftest_cpup(cpg->flags, DTIME); ++ struct au_dtime dt; ++ struct path h_path; ++ struct dentry *h_src, *h_dst, *h_parent; ++ struct inode *h_inode, *h_dir; ++ struct super_block *sb; ++ ++ /* bsrc branch can be ro/rw. */ ++ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); ++ h_inode = d_inode(h_src); ++ AuDebugOn(h_inode != au_h_iptr(d_inode(cpg->dentry), cpg->bsrc)); ++ ++ /* try stopping to be referenced while we are creating */ ++ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); ++ if (au_ftest_cpup(cpg->flags, RENAME)) ++ AuDebugOn(strncmp(h_dst->d_name.name, AUFS_WH_PFX, ++ AUFS_WH_PFX_LEN)); ++ h_parent = h_dst->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ AuDebugOn(h_parent != h_dst->d_parent); ++ ++ sb = cpg->dentry->d_sb; ++ h_path.mnt = au_sbr_mnt(sb, cpg->bdst); ++ if (do_dt) { ++ h_path.dentry = h_parent; ++ au_dtime_store(&dt, dst_parent, &h_path); ++ } ++ h_path.dentry = h_dst; ++ ++ isreg = 0; ++ isdir = 0; ++ mode = h_inode->i_mode; ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ isreg = 1; ++ err = vfsub_create(h_dir, &h_path, S_IRUSR | S_IWUSR, ++ /*want_excl*/true); ++ if (!err) ++ err = au_do_cpup_regular(cpg, h_src_attr); ++ break; ++ case S_IFDIR: ++ isdir = 1; ++ err = vfsub_mkdir(h_dir, &h_path, mode); ++ if (!err) ++ err = au_do_cpup_dir(cpg, dst_parent, h_dir, &h_path); ++ break; ++ case S_IFLNK: ++ err = au_do_cpup_symlink(&h_path, h_src, h_dir); ++ break; ++ case S_IFCHR: ++ case S_IFBLK: ++ AuDebugOn(!capable(CAP_MKNOD)); ++ /*FALLTHROUGH*/ ++ case S_IFIFO: ++ case S_IFSOCK: ++ err = vfsub_mknod(h_dir, &h_path, mode, h_inode->i_rdev); ++ break; ++ default: ++ AuIOErr("Unknown inode type 0%o\n", mode); ++ err = -EIO; ++ } ++ if (!err) ++ err = au_reset_acl(h_dir, &h_path, mode); ++ ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, UDBA_NONE) ++ && !isdir ++ && au_opt_test(mnt_flags, XINO) ++ && (h_inode->i_nlink == 1 ++ || (h_inode->i_state & I_LINKABLE)) ++ /* todo: unnecessary? */ ++ /* && d_inode(cpg->dentry)->i_nlink == 1 */ ++ && cpg->bdst < cpg->bsrc ++ && !au_ftest_cpup(cpg->flags, KEEPLINO)) ++ au_xino_write(sb, cpg->bsrc, h_inode->i_ino, /*ino*/0); ++ /* ignore this error */ ++ ++ if (!err) { ++ force = 0; ++ if (isreg) { ++ force = !!cpg->len; ++ if (cpg->len == -1) ++ force = !!i_size_read(h_inode); ++ } ++ au_fhsm_wrote(sb, cpg->bdst, force); ++ } ++ ++ if (do_dt) ++ au_dtime_revert(&dt); ++ return err; ++} ++ ++static int au_do_ren_after_cpup(struct au_cp_generic *cpg, struct path *h_path) ++{ ++ int err; ++ struct dentry *dentry, *h_dentry, *h_parent, *parent; ++ struct inode *h_dir; ++ aufs_bindex_t bdst; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ h_dentry = au_h_dptr(dentry, bdst); ++ if (!au_ftest_cpup(cpg->flags, OVERWRITE)) { ++ dget(h_dentry); ++ au_set_h_dptr(dentry, bdst, NULL); ++ err = au_lkup_neg(dentry, bdst, /*wh*/0); ++ if (!err) ++ h_path->dentry = dget(au_h_dptr(dentry, bdst)); ++ au_set_h_dptr(dentry, bdst, h_dentry); ++ } else { ++ err = 0; ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ dput(parent); ++ h_path->dentry = vfsub_lkup_one(&dentry->d_name, h_parent); ++ if (IS_ERR(h_path->dentry)) ++ err = PTR_ERR(h_path->dentry); ++ } ++ if (unlikely(err)) ++ goto out; ++ ++ h_parent = h_dentry->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ AuDbg("%pd %pd\n", h_dentry, h_path->dentry); ++ /* no delegation since it is just created */ ++ err = vfsub_rename(h_dir, h_dentry, h_dir, h_path, /*delegated*/NULL, ++ /*flags*/0); ++ dput(h_path->dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * copyup the @dentry from @bsrc to @bdst. ++ * the caller must set the both of lower dentries. ++ * @len is for truncating when it is -1 copyup the entire file. ++ * in link/rename cases, @dst_parent may be different from the real one. ++ * basic->bsrc can be larger than basic->bdst. ++ * aufs doesn't touch the credential so ++ * security_inode_copy_up{,_xattr}() are unnecrssary. ++ */ ++static int au_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) ++{ ++ int err, rerr; ++ aufs_bindex_t old_ibtop; ++ unsigned char isdir, plink; ++ struct dentry *h_src, *h_dst, *h_parent; ++ struct inode *dst_inode, *h_dir, *inode, *delegated, *src_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ /* to reuduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct path h_path; ++ struct au_cpup_reg_attr h_src_attr; ++ } *a; ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ a->h_src_attr.valid = 0; ++ ++ sb = cpg->dentry->d_sb; ++ br = au_sbr(sb, cpg->bdst); ++ a->h_path.mnt = au_br_mnt(br); ++ h_dst = au_h_dptr(cpg->dentry, cpg->bdst); ++ h_parent = h_dst->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ h_src = au_h_dptr(cpg->dentry, cpg->bsrc); ++ inode = d_inode(cpg->dentry); ++ ++ if (!dst_parent) ++ dst_parent = dget_parent(cpg->dentry); ++ else ++ dget(dst_parent); ++ ++ plink = !!au_opt_test(au_mntflags(sb), PLINK); ++ dst_inode = au_h_iptr(inode, cpg->bdst); ++ if (dst_inode) { ++ if (unlikely(!plink)) { ++ err = -EIO; ++ AuIOErr("hi%lu(i%lu) exists on b%d " ++ "but plink is disabled\n", ++ dst_inode->i_ino, inode->i_ino, cpg->bdst); ++ goto out_parent; ++ } ++ ++ if (dst_inode->i_nlink) { ++ const int do_dt = au_ftest_cpup(cpg->flags, DTIME); ++ ++ h_src = au_plink_lkup(inode, cpg->bdst); ++ err = PTR_ERR(h_src); ++ if (IS_ERR(h_src)) ++ goto out_parent; ++ if (unlikely(d_is_negative(h_src))) { ++ err = -EIO; ++ AuIOErr("i%lu exists on b%d " ++ "but not pseudo-linked\n", ++ inode->i_ino, cpg->bdst); ++ dput(h_src); ++ goto out_parent; ++ } ++ ++ if (do_dt) { ++ a->h_path.dentry = h_parent; ++ au_dtime_store(&a->dt, dst_parent, &a->h_path); ++ } ++ ++ a->h_path.dentry = h_dst; ++ delegated = NULL; ++ err = vfsub_link(h_src, h_dir, &a->h_path, &delegated); ++ if (!err && au_ftest_cpup(cpg->flags, RENAME)) ++ err = au_do_ren_after_cpup(cpg, &a->h_path); ++ if (do_dt) ++ au_dtime_revert(&a->dt); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ dput(h_src); ++ goto out_parent; ++ } else ++ /* todo: cpup_wh_file? */ ++ /* udba work */ ++ au_update_ibrange(inode, /*do_put_zero*/1); ++ } ++ ++ isdir = S_ISDIR(inode->i_mode); ++ old_ibtop = au_ibtop(inode); ++ err = cpup_entry(cpg, dst_parent, &a->h_src_attr); ++ if (unlikely(err)) ++ goto out_rev; ++ dst_inode = d_inode(h_dst); ++ inode_lock_nested(dst_inode, AuLsc_I_CHILD2); ++ /* todo: necessary? */ ++ /* au_pin_hdir_unlock(cpg->pin); */ ++ ++ err = cpup_iattr(cpg->dentry, cpg->bdst, h_src, &a->h_src_attr); ++ if (unlikely(err)) { ++ /* todo: necessary? */ ++ /* au_pin_hdir_relock(cpg->pin); */ /* ignore an error */ ++ inode_unlock(dst_inode); ++ goto out_rev; ++ } ++ ++ if (cpg->bdst < old_ibtop) { ++ if (S_ISREG(inode->i_mode)) { ++ err = au_dy_iaop(inode, cpg->bdst, dst_inode); ++ if (unlikely(err)) { ++ /* ignore an error */ ++ /* au_pin_hdir_relock(cpg->pin); */ ++ inode_unlock(dst_inode); ++ goto out_rev; ++ } ++ } ++ au_set_ibtop(inode, cpg->bdst); ++ } else ++ au_set_ibbot(inode, cpg->bdst); ++ au_set_h_iptr(inode, cpg->bdst, au_igrab(dst_inode), ++ au_hi_flags(inode, isdir)); ++ ++ /* todo: necessary? */ ++ /* err = au_pin_hdir_relock(cpg->pin); */ ++ inode_unlock(dst_inode); ++ if (unlikely(err)) ++ goto out_rev; ++ ++ src_inode = d_inode(h_src); ++ if (!isdir ++ && (src_inode->i_nlink > 1 ++ || src_inode->i_state & I_LINKABLE) ++ && plink) ++ au_plink_append(inode, cpg->bdst, h_dst); ++ ++ if (au_ftest_cpup(cpg->flags, RENAME)) { ++ a->h_path.dentry = h_dst; ++ err = au_do_ren_after_cpup(cpg, &a->h_path); ++ } ++ if (!err) ++ goto out_parent; /* success */ ++ ++ /* revert */ ++out_rev: ++ a->h_path.dentry = h_parent; ++ au_dtime_store(&a->dt, dst_parent, &a->h_path); ++ a->h_path.dentry = h_dst; ++ rerr = 0; ++ if (d_is_positive(h_dst)) { ++ if (!isdir) { ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(h_dir, &a->h_path, ++ /*delegated*/NULL, /*force*/0); ++ } else ++ rerr = vfsub_rmdir(h_dir, &a->h_path); ++ } ++ au_dtime_revert(&a->dt); ++ if (rerr) { ++ AuIOErr("failed removing broken entry(%d, %d)\n", err, rerr); ++ err = -EIO; ++ } ++out_parent: ++ dput(dst_parent); ++ kfree(a); ++out: ++ return err; ++} ++ ++#if 0 /* reserved */ ++struct au_cpup_single_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++ struct dentry *dst_parent; ++}; ++ ++static void au_call_cpup_single(void *args) ++{ ++ struct au_cpup_single_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_single(a->cpg, a->dst_parent); ++ au_pin_hdir_release(a->cpg->pin); ++} ++#endif ++ ++/* ++ * prevent SIGXFSZ in copy-up. ++ * testing CAP_MKNOD is for generic fs, ++ * but CAP_FSETID is for xfs only, currently. ++ */ ++static int au_cpup_sio_test(struct au_pin *pin, umode_t mode) ++{ ++ int do_sio; ++ struct super_block *sb; ++ struct inode *h_dir; ++ ++ do_sio = 0; ++ sb = au_pinned_parent(pin)->d_sb; ++ if (!au_wkq_test() ++ && (!au_sbi(sb)->si_plink_maint_pid ++ || au_plink_maint(sb, AuLock_NOPLM))) { ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ /* no condition about RLIMIT_FSIZE and the file size */ ++ do_sio = 1; ++ break; ++ case S_IFCHR: ++ case S_IFBLK: ++ do_sio = !capable(CAP_MKNOD); ++ break; ++ } ++ if (!do_sio) ++ do_sio = ((mode & (S_ISUID | S_ISGID)) ++ && !capable(CAP_FSETID)); ++ /* this workaround may be removed in the future */ ++ if (!do_sio) { ++ h_dir = au_pinned_h_dir(pin); ++ do_sio = h_dir->i_mode & S_ISVTX; ++ } ++ } ++ ++ return do_sio; ++} ++ ++#if 0 /* reserved */ ++int au_sio_cpup_single(struct au_cp_generic *cpg, struct dentry *dst_parent) ++{ ++ int err, wkq_err; ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(cpg->dentry, cpg->bsrc); ++ if (!au_cpup_sio_test(pin, d_inode(h_dentry)->i_mode)) ++ err = au_cpup_single(cpg, dst_parent); ++ else { ++ struct au_cpup_single_args args = { ++ .errp = &err, ++ .cpg = cpg, ++ .dst_parent = dst_parent ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_single, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++#endif ++ ++/* ++ * copyup the @dentry from the first active lower branch to @bdst, ++ * using au_cpup_single(). ++ */ ++static int au_cpup_simple(struct au_cp_generic *cpg) ++{ ++ int err; ++ unsigned int flags_orig; ++ struct dentry *dentry; ++ ++ AuDebugOn(cpg->bsrc < 0); ++ ++ dentry = cpg->dentry; ++ DiMustWriteLock(dentry); ++ ++ err = au_lkup_neg(dentry, cpg->bdst, /*wh*/1); ++ if (!err) { ++ flags_orig = cpg->flags; ++ au_fset_cpup(cpg->flags, RENAME); ++ err = au_cpup_single(cpg, NULL); ++ cpg->flags = flags_orig; ++ if (!err) ++ return 0; /* success */ ++ ++ /* revert */ ++ au_set_h_dptr(dentry, cpg->bdst, NULL); ++ au_set_dbtop(dentry, cpg->bsrc); ++ } ++ ++ return err; ++} ++ ++struct au_cpup_simple_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++}; ++ ++static void au_call_cpup_simple(void *args) ++{ ++ struct au_cpup_simple_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_simple(a->cpg); ++ au_pin_hdir_release(a->cpg->pin); ++} ++ ++static int au_do_sio_cpup_simple(struct au_cp_generic *cpg) ++{ ++ int err, wkq_err; ++ struct dentry *dentry, *parent; ++ struct file *h_file; ++ struct inode *h_dir; ++ ++ dentry = cpg->dentry; ++ h_file = NULL; ++ if (au_ftest_cpup(cpg->flags, HOPEN)) { ++ AuDebugOn(cpg->bsrc < 0); ++ h_file = au_h_open_pre(dentry, cpg->bsrc, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ } ++ ++ parent = dget_parent(dentry); ++ h_dir = au_h_iptr(d_inode(parent), cpg->bdst); ++ if (!au_test_h_perm_sio(h_dir, MAY_EXEC | MAY_WRITE) ++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) ++ err = au_cpup_simple(cpg); ++ else { ++ struct au_cpup_simple_args args = { ++ .errp = &err, ++ .cpg = cpg ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_simple, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ dput(parent); ++ if (h_file) ++ au_h_open_post(dentry, cpg->bsrc, h_file); ++ ++out: ++ return err; ++} ++ ++int au_sio_cpup_simple(struct au_cp_generic *cpg) ++{ ++ aufs_bindex_t bsrc, bbot; ++ struct dentry *dentry, *h_dentry; ++ ++ if (cpg->bsrc < 0) { ++ dentry = cpg->dentry; ++ bbot = au_dbbot(dentry); ++ for (bsrc = cpg->bdst + 1; bsrc <= bbot; bsrc++) { ++ h_dentry = au_h_dptr(dentry, bsrc); ++ if (h_dentry) { ++ AuDebugOn(d_is_negative(h_dentry)); ++ break; ++ } ++ } ++ AuDebugOn(bsrc > bbot); ++ cpg->bsrc = bsrc; ++ } ++ AuDebugOn(cpg->bsrc <= cpg->bdst); ++ return au_do_sio_cpup_simple(cpg); ++} ++ ++int au_sio_cpdown_simple(struct au_cp_generic *cpg) ++{ ++ AuDebugOn(cpg->bdst <= cpg->bsrc); ++ return au_do_sio_cpup_simple(cpg); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * copyup the deleted file for writing. ++ */ ++static int au_do_cpup_wh(struct au_cp_generic *cpg, struct dentry *wh_dentry, ++ struct file *file) ++{ ++ int err; ++ unsigned int flags_orig; ++ aufs_bindex_t bsrc_orig; ++ struct au_dinfo *dinfo; ++ struct { ++ struct au_hdentry *hd; ++ struct dentry *h_dentry; ++ } hdst, hsrc; ++ ++ dinfo = au_di(cpg->dentry); ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ bsrc_orig = cpg->bsrc; ++ cpg->bsrc = dinfo->di_btop; ++ hdst.hd = au_hdentry(dinfo, cpg->bdst); ++ hdst.h_dentry = hdst.hd->hd_dentry; ++ hdst.hd->hd_dentry = wh_dentry; ++ dinfo->di_btop = cpg->bdst; ++ ++ hsrc.h_dentry = NULL; ++ if (file) { ++ hsrc.hd = au_hdentry(dinfo, cpg->bsrc); ++ hsrc.h_dentry = hsrc.hd->hd_dentry; ++ hsrc.hd->hd_dentry = au_hf_top(file)->f_path.dentry; ++ } ++ flags_orig = cpg->flags; ++ cpg->flags = !AuCpup_DTIME; ++ err = au_cpup_single(cpg, /*h_parent*/NULL); ++ cpg->flags = flags_orig; ++ if (file) { ++ if (!err) ++ err = au_reopen_nondir(file); ++ hsrc.hd->hd_dentry = hsrc.h_dentry; ++ } ++ hdst.hd->hd_dentry = hdst.h_dentry; ++ dinfo->di_btop = cpg->bsrc; ++ cpg->bsrc = bsrc_orig; ++ ++ return err; ++} ++ ++static int au_cpup_wh(struct au_cp_generic *cpg, struct file *file) ++{ ++ int err; ++ aufs_bindex_t bdst; ++ struct au_dtime dt; ++ struct dentry *dentry, *parent, *h_parent, *wh_dentry; ++ struct au_branch *br; ++ struct path h_path; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ br = au_sbr(dentry->d_sb, bdst); ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ wh_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out; ++ ++ h_path.dentry = h_parent; ++ h_path.mnt = au_br_mnt(br); ++ au_dtime_store(&dt, parent, &h_path); ++ err = au_do_cpup_wh(cpg, wh_dentry, file); ++ if (unlikely(err)) ++ goto out_wh; ++ ++ dget(wh_dentry); ++ h_path.dentry = wh_dentry; ++ if (!d_is_dir(wh_dentry)) { ++ /* no delegation since it is just created */ ++ err = vfsub_unlink(d_inode(h_parent), &h_path, ++ /*delegated*/NULL, /*force*/0); ++ } else ++ err = vfsub_rmdir(d_inode(h_parent), &h_path); ++ if (unlikely(err)) { ++ AuIOErr("failed remove copied-up tmp file %pd(%d)\n", ++ wh_dentry, err); ++ err = -EIO; ++ } ++ au_dtime_revert(&dt); ++ au_set_hi_wh(d_inode(dentry), bdst, wh_dentry); ++ ++out_wh: ++ dput(wh_dentry); ++out: ++ dput(parent); ++ return err; ++} ++ ++struct au_cpup_wh_args { ++ int *errp; ++ struct au_cp_generic *cpg; ++ struct file *file; ++}; ++ ++static void au_call_cpup_wh(void *args) ++{ ++ struct au_cpup_wh_args *a = args; ++ ++ au_pin_hdir_acquire_nest(a->cpg->pin); ++ *a->errp = au_cpup_wh(a->cpg, a->file); ++ au_pin_hdir_release(a->cpg->pin); ++} ++ ++int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file) ++{ ++ int err, wkq_err; ++ aufs_bindex_t bdst; ++ struct dentry *dentry, *parent, *h_orph, *h_parent; ++ struct inode *dir, *h_dir, *h_tmpdir; ++ struct au_wbr *wbr; ++ struct au_pin wh_pin, *pin_orig; ++ ++ dentry = cpg->dentry; ++ bdst = cpg->bdst; ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ h_orph = NULL; ++ h_parent = NULL; ++ h_dir = au_igrab(au_h_iptr(dir, bdst)); ++ h_tmpdir = h_dir; ++ pin_orig = NULL; ++ if (!h_dir->i_nlink) { ++ wbr = au_sbr(dentry->d_sb, bdst)->br_wbr; ++ h_orph = wbr->wbr_orph; ++ ++ h_parent = dget(au_h_dptr(parent, bdst)); ++ au_set_h_dptr(parent, bdst, dget(h_orph)); ++ h_tmpdir = d_inode(h_orph); ++ au_set_h_iptr(dir, bdst, au_igrab(h_tmpdir), /*flags*/0); ++ ++ inode_lock_nested(h_tmpdir, AuLsc_I_PARENT3); ++ /* todo: au_h_open_pre()? */ ++ ++ pin_orig = cpg->pin; ++ au_pin_init(&wh_pin, dentry, bdst, AuLsc_DI_PARENT, ++ AuLsc_I_PARENT3, cpg->pin->udba, AuPin_DI_LOCKED); ++ cpg->pin = &wh_pin; ++ } ++ ++ if (!au_test_h_perm_sio(h_tmpdir, MAY_EXEC | MAY_WRITE) ++ && !au_cpup_sio_test(cpg->pin, d_inode(dentry)->i_mode)) ++ err = au_cpup_wh(cpg, file); ++ else { ++ struct au_cpup_wh_args args = { ++ .errp = &err, ++ .cpg = cpg, ++ .file = file ++ }; ++ wkq_err = au_wkq_wait(au_call_cpup_wh, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ if (h_orph) { ++ inode_unlock(h_tmpdir); ++ /* todo: au_h_open_post()? */ ++ au_set_h_iptr(dir, bdst, au_igrab(h_dir), /*flags*/0); ++ au_set_h_dptr(parent, bdst, h_parent); ++ AuDebugOn(!pin_orig); ++ cpg->pin = pin_orig; ++ } ++ iput(h_dir); ++ dput(parent); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * generic routine for both of copy-up and copy-down. ++ */ ++/* cf. revalidate function in file.c */ ++int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, ++ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg), ++ void *arg) ++{ ++ int err; ++ struct au_pin pin; ++ struct dentry *d, *parent, *h_parent, *real_parent, *h_dentry; ++ ++ err = 0; ++ parent = dget_parent(dentry); ++ if (IS_ROOT(parent)) ++ goto out; ++ ++ au_pin_init(&pin, dentry, bdst, AuLsc_DI_PARENT2, AuLsc_I_PARENT2, ++ au_opt_udba(dentry->d_sb), AuPin_MNT_WRITE); ++ ++ /* do not use au_dpage */ ++ real_parent = parent; ++ while (1) { ++ dput(parent); ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bdst); ++ if (h_parent) ++ goto out; /* success */ ++ ++ /* find top dir which is necessary to cpup */ ++ do { ++ d = parent; ++ dput(parent); ++ parent = dget_parent(d); ++ di_read_lock_parent3(parent, !AuLock_IR); ++ h_parent = au_h_dptr(parent, bdst); ++ di_read_unlock(parent, !AuLock_IR); ++ } while (!h_parent); ++ ++ if (d != real_parent) ++ di_write_lock_child3(d); ++ ++ /* somebody else might create while we were sleeping */ ++ h_dentry = au_h_dptr(d, bdst); ++ if (!h_dentry || d_is_negative(h_dentry)) { ++ if (h_dentry) ++ au_update_dbtop(d); ++ ++ au_pin_set_dentry(&pin, d); ++ err = au_do_pin(&pin); ++ if (!err) { ++ err = cp(d, bdst, &pin, h_parent, arg); ++ au_unpin(&pin); ++ } ++ } ++ ++ if (d != real_parent) ++ di_write_unlock(d); ++ if (unlikely(err)) ++ break; ++ } ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++static int au_cpup_dir(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent __maybe_unused, ++ void *arg __maybe_unused) ++{ ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = bdst, ++ .bsrc = -1, ++ .len = 0, ++ .pin = pin, ++ .flags = AuCpup_DTIME ++ }; ++ return au_sio_cpup_simple(&cpg); ++} ++ ++int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ return au_cp_dirs(dentry, bdst, au_cpup_dir, NULL); ++} ++ ++int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ int err; ++ struct dentry *parent; ++ struct inode *dir; ++ ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ err = 0; ++ if (au_h_iptr(dir, bdst)) ++ goto out; ++ ++ di_read_unlock(parent, AuLock_IR); ++ di_write_lock_parent(parent); ++ /* someone else might change our inode while we were sleeping */ ++ if (!au_h_iptr(dir, bdst)) ++ err = au_cpup_dirs(dentry, bdst); ++ di_downgrade_lock(parent, AuLock_IR); ++ ++out: ++ dput(parent); ++ return err; ++} +diff -Naur null/fs/aufs/cpup.h linux-4.15/fs/aufs/cpup.h +--- /dev/null ++++ linux-4.15/fs/aufs/cpup.h 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,99 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * copy-up/down functions ++ */ ++ ++#ifndef __AUFS_CPUP_H__ ++#define __AUFS_CPUP_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct inode; ++struct file; ++struct au_pin; ++ ++void au_cpup_attr_flags(struct inode *dst, unsigned int iflags); ++void au_cpup_attr_timesizes(struct inode *inode); ++void au_cpup_attr_nlink(struct inode *inode, int force); ++void au_cpup_attr_changeable(struct inode *inode); ++void au_cpup_igen(struct inode *inode, struct inode *h_inode); ++void au_cpup_attr_all(struct inode *inode, int force); ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_cp_generic { ++ struct dentry *dentry; ++ aufs_bindex_t bdst, bsrc; ++ loff_t len; ++ struct au_pin *pin; ++ unsigned int flags; ++}; ++ ++/* cpup flags */ ++#define AuCpup_DTIME 1 /* do dtime_store/revert */ ++#define AuCpup_KEEPLINO (1 << 1) /* do not clear the lower xino, ++ for link(2) */ ++#define AuCpup_RENAME (1 << 2) /* rename after cpup */ ++#define AuCpup_HOPEN (1 << 3) /* call h_open_pre/post() in ++ cpup */ ++#define AuCpup_OVERWRITE (1 << 4) /* allow overwriting the ++ existing entry */ ++#define AuCpup_RWDST (1 << 5) /* force write target even if ++ the branch is marked as RO */ ++ ++#ifndef CONFIG_AUFS_BR_HFSPLUS ++#undef AuCpup_HOPEN ++#define AuCpup_HOPEN 0 ++#endif ++ ++#define au_ftest_cpup(flags, name) ((flags) & AuCpup_##name) ++#define au_fset_cpup(flags, name) \ ++ do { (flags) |= AuCpup_##name; } while (0) ++#define au_fclr_cpup(flags, name) \ ++ do { (flags) &= ~AuCpup_##name; } while (0) ++ ++int au_copy_file(struct file *dst, struct file *src, loff_t len); ++int au_sio_cpup_simple(struct au_cp_generic *cpg); ++int au_sio_cpdown_simple(struct au_cp_generic *cpg); ++int au_sio_cpup_wh(struct au_cp_generic *cpg, struct file *file); ++ ++int au_cp_dirs(struct dentry *dentry, aufs_bindex_t bdst, ++ int (*cp)(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg), ++ void *arg); ++int au_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++int au_test_and_cpup_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* keep timestamps when copyup */ ++struct au_dtime { ++ struct dentry *dt_dentry; ++ struct path dt_h_path; ++ struct timespec dt_atime, dt_mtime; ++}; ++void au_dtime_store(struct au_dtime *dt, struct dentry *dentry, ++ struct path *h_path); ++void au_dtime_revert(struct au_dtime *dt); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_CPUP_H__ */ +diff -Naur null/fs/aufs/dbgaufs.c linux-4.15/fs/aufs/dbgaufs.c +--- /dev/null ++++ linux-4.15/fs/aufs/dbgaufs.c 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,437 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * debugfs interface ++ */ ++ ++#include ++#include "aufs.h" ++ ++#ifndef CONFIG_SYSFS ++#error DEBUG_FS depends upon SYSFS ++#endif ++ ++static struct dentry *dbgaufs; ++static const mode_t dbgaufs_mode = S_IRUSR | S_IRGRP | S_IROTH; ++ ++/* 20 is max digits length of ulong 64 */ ++struct dbgaufs_arg { ++ int n; ++ char a[20 * 4]; ++}; ++ ++/* ++ * common function for all XINO files ++ */ ++static int dbgaufs_xi_release(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ kfree(file->private_data); ++ return 0; ++} ++ ++static int dbgaufs_xi_open(struct file *xf, struct file *file, int do_fcnt) ++{ ++ int err; ++ struct kstat st; ++ struct dbgaufs_arg *p; ++ ++ err = -ENOMEM; ++ p = kmalloc(sizeof(*p), GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = 0; ++ p->n = 0; ++ file->private_data = p; ++ if (!xf) ++ goto out; ++ ++ err = vfsub_getattr(&xf->f_path, &st); ++ if (!err) { ++ if (do_fcnt) ++ p->n = snprintf ++ (p->a, sizeof(p->a), "%ld, %llux%u %lld\n", ++ (long)file_count(xf), st.blocks, st.blksize, ++ (long long)st.size); ++ else ++ p->n = snprintf(p->a, sizeof(p->a), "%llux%u %lld\n", ++ st.blocks, st.blksize, ++ (long long)st.size); ++ AuDebugOn(p->n >= sizeof(p->a)); ++ } else { ++ p->n = snprintf(p->a, sizeof(p->a), "err %d\n", err); ++ err = 0; ++ } ++ ++out: ++ return err; ++ ++} ++ ++static ssize_t dbgaufs_xi_read(struct file *file, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ struct dbgaufs_arg *p; ++ ++ p = file->private_data; ++ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dbgaufs_plink_arg { ++ int n; ++ char a[]; ++}; ++ ++static int dbgaufs_plink_release(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ free_page((unsigned long)file->private_data); ++ return 0; ++} ++ ++static int dbgaufs_plink_open(struct inode *inode, struct file *file) ++{ ++ int err, i, limit; ++ unsigned long n, sum; ++ struct dbgaufs_plink_arg *p; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct hlist_bl_head *hbl; ++ ++ err = -ENOMEM; ++ p = (void *)get_zeroed_page(GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = -EFBIG; ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ limit = PAGE_SIZE - sizeof(p->n); ++ ++ /* the number of buckets */ ++ n = snprintf(p->a + p->n, limit, "%d\n", AuPlink_NHASH); ++ p->n += n; ++ limit -= n; ++ ++ sum = 0; ++ for (i = 0, hbl = sbinfo->si_plink; i < AuPlink_NHASH; ++ i++, hbl++) { ++ n = au_hbl_count(hbl); ++ sum += n; ++ ++ n = snprintf(p->a + p->n, limit, "%lu ", n); ++ p->n += n; ++ limit -= n; ++ if (unlikely(limit <= 0)) ++ goto out_free; ++ } ++ p->a[p->n - 1] = '\n'; ++ ++ /* the sum of plinks */ ++ n = snprintf(p->a + p->n, limit, "%lu\n", sum); ++ p->n += n; ++ limit -= n; ++ if (unlikely(limit <= 0)) ++ goto out_free; ++ } else { ++#define str "1\n0\n0\n" ++ p->n = sizeof(str) - 1; ++ strcpy(p->a, str); ++#undef str ++ } ++ si_read_unlock(sb); ++ ++ err = 0; ++ file->private_data = p; ++ goto out; /* success */ ++ ++out_free: ++ free_page((unsigned long)p); ++out: ++ return err; ++} ++ ++static ssize_t dbgaufs_plink_read(struct file *file, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ struct dbgaufs_plink_arg *p; ++ ++ p = file->private_data; ++ return simple_read_from_buffer(buf, count, ppos, p->a, p->n); ++} ++ ++static const struct file_operations dbgaufs_plink_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_plink_open, ++ .release = dbgaufs_plink_release, ++ .read = dbgaufs_plink_read ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int dbgaufs_xib_open(struct inode *inode, struct file *file) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ err = dbgaufs_xi_open(sbinfo->si_xib, file, /*do_fcnt*/0); ++ si_read_unlock(sb); ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xib_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xib_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define DbgaufsXi_PREFIX "xi" ++ ++static int dbgaufs_xino_open(struct inode *inode, struct file *file) ++{ ++ int err; ++ long l; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct file *xf; ++ struct qstr *name; ++ ++ err = -ENOENT; ++ xf = NULL; ++ name = &file->f_path.dentry->d_name; ++ if (unlikely(name->len < sizeof(DbgaufsXi_PREFIX) ++ || memcmp(name->name, DbgaufsXi_PREFIX, ++ sizeof(DbgaufsXi_PREFIX) - 1))) ++ goto out; ++ err = kstrtol(name->name + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l); ++ if (unlikely(err)) ++ goto out; ++ ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ if (l <= au_sbbot(sb)) { ++ xf = au_sbr(sb, (aufs_bindex_t)l)->br_xino.xi_file; ++ err = dbgaufs_xi_open(xf, file, /*do_fcnt*/1); ++ } else ++ err = -ENOENT; ++ si_read_unlock(sb); ++ ++out: ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xino_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xino_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ aufs_bindex_t bbot; ++ struct au_branch *br; ++ struct au_xino_file *xi; ++ ++ if (!au_sbi(sb)->si_dbgaufs) ++ return; ++ ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ xi = &br->br_xino; ++ /* debugfs acquires the parent i_mutex */ ++ lockdep_off(); ++ debugfs_remove(xi->xi_dbgaufs); ++ lockdep_on(); ++ xi->xi_dbgaufs = NULL; ++ } ++} ++ ++void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ struct au_sbinfo *sbinfo; ++ struct dentry *parent; ++ struct au_branch *br; ++ struct au_xino_file *xi; ++ aufs_bindex_t bbot; ++ char name[sizeof(DbgaufsXi_PREFIX) + 5]; /* "xi" bindex NULL */ ++ ++ sbinfo = au_sbi(sb); ++ parent = sbinfo->si_dbgaufs; ++ if (!parent) ++ return; ++ ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ snprintf(name, sizeof(name), DbgaufsXi_PREFIX "%d", bindex); ++ br = au_sbr(sb, bindex); ++ xi = &br->br_xino; ++ AuDebugOn(xi->xi_dbgaufs); ++ /* debugfs acquires the parent i_mutex */ ++ lockdep_off(); ++ xi->xi_dbgaufs = debugfs_create_file(name, dbgaufs_mode, parent, ++ sbinfo, &dbgaufs_xino_fop); ++ lockdep_on(); ++ /* ignore an error */ ++ if (unlikely(!xi->xi_dbgaufs)) ++ AuWarn1("failed %s under debugfs\n", name); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++static int dbgaufs_xigen_open(struct inode *inode, struct file *file) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ ++ sbinfo = inode->i_private; ++ sb = sbinfo->si_sb; ++ si_noflush_read_lock(sb); ++ err = dbgaufs_xi_open(sbinfo->si_xigen, file, /*do_fcnt*/0); ++ si_read_unlock(sb); ++ return err; ++} ++ ++static const struct file_operations dbgaufs_xigen_fop = { ++ .owner = THIS_MODULE, ++ .open = dbgaufs_xigen_open, ++ .release = dbgaufs_xi_release, ++ .read = dbgaufs_xi_read ++}; ++ ++static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ err = -EIO; ++ sbinfo->si_dbgaufs_xigen = debugfs_create_file ++ ("xigen", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_xigen_fop); ++ if (sbinfo->si_dbgaufs_xigen) ++ err = 0; ++ ++ return err; ++} ++#else ++static int dbgaufs_xigen_init(struct au_sbinfo *sbinfo) ++{ ++ return 0; ++} ++#endif /* CONFIG_AUFS_EXPORT */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++void dbgaufs_si_fin(struct au_sbinfo *sbinfo) ++{ ++ /* ++ * This function is a dynamic '__fin' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ debugfs_remove_recursive(sbinfo->si_dbgaufs); ++ sbinfo->si_dbgaufs = NULL; ++ kobject_put(&sbinfo->si_kobj); ++} ++ ++int dbgaufs_si_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ char name[SysaufsSiNameLen]; ++ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++ ++ err = -ENOENT; ++ if (!dbgaufs) { ++ AuErr1("/debug/aufs is uninitialized\n"); ++ goto out; ++ } ++ ++ err = -EIO; ++ sysaufs_name(sbinfo, name); ++ sbinfo->si_dbgaufs = debugfs_create_dir(name, dbgaufs); ++ if (unlikely(!sbinfo->si_dbgaufs)) ++ goto out; ++ kobject_get(&sbinfo->si_kobj); ++ ++ sbinfo->si_dbgaufs_xib = debugfs_create_file ++ ("xib", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_xib_fop); ++ if (unlikely(!sbinfo->si_dbgaufs_xib)) ++ goto out_dir; ++ ++ sbinfo->si_dbgaufs_plink = debugfs_create_file ++ ("plink", dbgaufs_mode, sbinfo->si_dbgaufs, sbinfo, ++ &dbgaufs_plink_fop); ++ if (unlikely(!sbinfo->si_dbgaufs_plink)) ++ goto out_dir; ++ ++ err = dbgaufs_xigen_init(sbinfo); ++ if (!err) ++ goto out; /* success */ ++ ++out_dir: ++ dbgaufs_si_fin(sbinfo); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void dbgaufs_fin(void) ++{ ++ debugfs_remove(dbgaufs); ++} ++ ++int __init dbgaufs_init(void) ++{ ++ int err; ++ ++ err = -EIO; ++ dbgaufs = debugfs_create_dir(AUFS_NAME, NULL); ++ if (dbgaufs) ++ err = 0; ++ return err; ++} +diff -Naur null/fs/aufs/dbgaufs.h linux-4.15/fs/aufs/dbgaufs.h +--- /dev/null ++++ linux-4.15/fs/aufs/dbgaufs.h 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * debugfs interface ++ */ ++ ++#ifndef __DBGAUFS_H__ ++#define __DBGAUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++struct super_block; ++struct au_sbinfo; ++ ++#ifdef CONFIG_DEBUG_FS ++/* dbgaufs.c */ ++void dbgaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); ++void dbgaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); ++void dbgaufs_si_fin(struct au_sbinfo *sbinfo); ++int dbgaufs_si_init(struct au_sbinfo *sbinfo); ++void dbgaufs_fin(void); ++int __init dbgaufs_init(void); ++#else ++AuStubVoid(dbgaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(dbgaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(dbgaufs_si_fin, struct au_sbinfo *sbinfo) ++AuStubInt0(dbgaufs_si_init, struct au_sbinfo *sbinfo) ++AuStubVoid(dbgaufs_fin, void) ++AuStubInt0(__init dbgaufs_init, void) ++#endif /* CONFIG_DEBUG_FS */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __DBGAUFS_H__ */ +diff -Naur null/fs/aufs/dcsub.c linux-4.15/fs/aufs/dcsub.c +--- /dev/null ++++ linux-4.15/fs/aufs/dcsub.c 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,225 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sub-routines for dentry cache ++ */ ++ ++#include "aufs.h" ++ ++static void au_dpage_free(struct au_dpage *dpage) ++{ ++ int i; ++ struct dentry **p; ++ ++ p = dpage->dentries; ++ for (i = 0; i < dpage->ndentry; i++) ++ dput(*p++); ++ free_page((unsigned long)dpage->dentries); ++} ++ ++int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp) ++{ ++ int err; ++ void *p; ++ ++ err = -ENOMEM; ++ dpages->dpages = kmalloc(sizeof(*dpages->dpages), gfp); ++ if (unlikely(!dpages->dpages)) ++ goto out; ++ ++ p = (void *)__get_free_page(gfp); ++ if (unlikely(!p)) ++ goto out_dpages; ++ ++ dpages->dpages[0].ndentry = 0; ++ dpages->dpages[0].dentries = p; ++ dpages->ndpage = 1; ++ return 0; /* success */ ++ ++out_dpages: ++ kfree(dpages->dpages); ++out: ++ return err; ++} ++ ++void au_dpages_free(struct au_dcsub_pages *dpages) ++{ ++ int i; ++ struct au_dpage *p; ++ ++ p = dpages->dpages; ++ for (i = 0; i < dpages->ndpage; i++) ++ au_dpage_free(p++); ++ kfree(dpages->dpages); ++} ++ ++static int au_dpages_append(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, gfp_t gfp) ++{ ++ int err, sz; ++ struct au_dpage *dpage; ++ void *p; ++ ++ dpage = dpages->dpages + dpages->ndpage - 1; ++ sz = PAGE_SIZE / sizeof(dentry); ++ if (unlikely(dpage->ndentry >= sz)) { ++ AuLabel(new dpage); ++ err = -ENOMEM; ++ sz = dpages->ndpage * sizeof(*dpages->dpages); ++ p = au_kzrealloc(dpages->dpages, sz, ++ sz + sizeof(*dpages->dpages), gfp, ++ /*may_shrink*/0); ++ if (unlikely(!p)) ++ goto out; ++ ++ dpages->dpages = p; ++ dpage = dpages->dpages + dpages->ndpage; ++ p = (void *)__get_free_page(gfp); ++ if (unlikely(!p)) ++ goto out; ++ ++ dpage->ndentry = 0; ++ dpage->dentries = p; ++ dpages->ndpage++; ++ } ++ ++ AuDebugOn(au_dcount(dentry) <= 0); ++ dpage->dentries[dpage->ndentry++] = dget_dlock(dentry); ++ return 0; /* success */ ++ ++out: ++ return err; ++} ++ ++/* todo: BAD approach */ ++/* copied from linux/fs/dcache.c */ ++enum d_walk_ret { ++ D_WALK_CONTINUE, ++ D_WALK_QUIT, ++ D_WALK_NORETRY, ++ D_WALK_SKIP, ++}; ++ ++extern void d_walk(struct dentry *parent, void *data, ++ enum d_walk_ret (*enter)(void *, struct dentry *), ++ void (*finish)(void *)); ++ ++struct ac_dpages_arg { ++ int err; ++ struct au_dcsub_pages *dpages; ++ struct super_block *sb; ++ au_dpages_test test; ++ void *arg; ++}; ++ ++static enum d_walk_ret au_call_dpages_append(void *_arg, struct dentry *dentry) ++{ ++ enum d_walk_ret ret; ++ struct ac_dpages_arg *arg = _arg; ++ ++ ret = D_WALK_CONTINUE; ++ if (dentry->d_sb == arg->sb ++ && !IS_ROOT(dentry) ++ && au_dcount(dentry) > 0 ++ && au_di(dentry) ++ && (!arg->test || arg->test(dentry, arg->arg))) { ++ arg->err = au_dpages_append(arg->dpages, dentry, GFP_ATOMIC); ++ if (unlikely(arg->err)) ++ ret = D_WALK_QUIT; ++ } ++ ++ return ret; ++} ++ ++int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, ++ au_dpages_test test, void *arg) ++{ ++ struct ac_dpages_arg args = { ++ .err = 0, ++ .dpages = dpages, ++ .sb = root->d_sb, ++ .test = test, ++ .arg = arg ++ }; ++ ++ d_walk(root, &args, au_call_dpages_append, NULL); ++ ++ return args.err; ++} ++ ++int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, ++ int do_include, au_dpages_test test, void *arg) ++{ ++ int err; ++ ++ err = 0; ++ write_seqlock(&rename_lock); ++ spin_lock(&dentry->d_lock); ++ if (do_include ++ && au_dcount(dentry) > 0 ++ && (!test || test(dentry, arg))) ++ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); ++ spin_unlock(&dentry->d_lock); ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * RCU for vfsmount is unnecessary since this is a traverse in a single ++ * mount ++ */ ++ while (!IS_ROOT(dentry)) { ++ dentry = dentry->d_parent; /* rename_lock is locked */ ++ spin_lock(&dentry->d_lock); ++ if (au_dcount(dentry) > 0 ++ && (!test || test(dentry, arg))) ++ err = au_dpages_append(dpages, dentry, GFP_ATOMIC); ++ spin_unlock(&dentry->d_lock); ++ if (unlikely(err)) ++ break; ++ } ++ ++out: ++ write_sequnlock(&rename_lock); ++ return err; ++} ++ ++static inline int au_dcsub_dpages_aufs(struct dentry *dentry, void *arg) ++{ ++ return au_di(dentry) && dentry->d_sb == arg; ++} ++ ++int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, int do_include) ++{ ++ return au_dcsub_pages_rev(dpages, dentry, do_include, ++ au_dcsub_dpages_aufs, dentry->d_sb); ++} ++ ++int au_test_subdir(struct dentry *d1, struct dentry *d2) ++{ ++ struct path path[2] = { ++ { ++ .dentry = d1 ++ }, ++ { ++ .dentry = d2 ++ } ++ }; ++ ++ return path_is_under(path + 0, path + 1); ++} +diff -Naur null/fs/aufs/dcsub.h linux-4.15/fs/aufs/dcsub.h +--- /dev/null ++++ linux-4.15/fs/aufs/dcsub.h 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sub-routines for dentry cache ++ */ ++ ++#ifndef __AUFS_DCSUB_H__ ++#define __AUFS_DCSUB_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++ ++struct au_dpage { ++ int ndentry; ++ struct dentry **dentries; ++}; ++ ++struct au_dcsub_pages { ++ int ndpage; ++ struct au_dpage *dpages; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dcsub.c */ ++int au_dpages_init(struct au_dcsub_pages *dpages, gfp_t gfp); ++void au_dpages_free(struct au_dcsub_pages *dpages); ++typedef int (*au_dpages_test)(struct dentry *dentry, void *arg); ++int au_dcsub_pages(struct au_dcsub_pages *dpages, struct dentry *root, ++ au_dpages_test test, void *arg); ++int au_dcsub_pages_rev(struct au_dcsub_pages *dpages, struct dentry *dentry, ++ int do_include, au_dpages_test test, void *arg); ++int au_dcsub_pages_rev_aufs(struct au_dcsub_pages *dpages, ++ struct dentry *dentry, int do_include); ++int au_test_subdir(struct dentry *d1, struct dentry *d2); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * todo: in linux-3.13, several similar (but faster) helpers are added to ++ * include/linux/dcache.h. Try them (in the future). ++ */ ++ ++static inline int au_d_hashed_positive(struct dentry *d) ++{ ++ int err; ++ struct inode *inode = d_inode(d); ++ ++ err = 0; ++ if (unlikely(d_unhashed(d) ++ || d_is_negative(d) ++ || !inode->i_nlink)) ++ err = -ENOENT; ++ return err; ++} ++ ++static inline int au_d_linkable(struct dentry *d) ++{ ++ int err; ++ struct inode *inode = d_inode(d); ++ ++ err = au_d_hashed_positive(d); ++ if (err ++ && d_is_positive(d) ++ && (inode->i_state & I_LINKABLE)) ++ err = 0; ++ return err; ++} ++ ++static inline int au_d_alive(struct dentry *d) ++{ ++ int err; ++ struct inode *inode; ++ ++ err = 0; ++ if (!IS_ROOT(d)) ++ err = au_d_hashed_positive(d); ++ else { ++ inode = d_inode(d); ++ if (unlikely(d_unlinked(d) ++ || d_is_negative(d) ++ || !inode->i_nlink)) ++ err = -ENOENT; ++ } ++ return err; ++} ++ ++static inline int au_alive_dir(struct dentry *d) ++{ ++ int err; ++ ++ err = au_d_alive(d); ++ if (unlikely(err || IS_DEADDIR(d_inode(d)))) ++ err = -ENOENT; ++ return err; ++} ++ ++static inline int au_qstreq(struct qstr *a, struct qstr *b) ++{ ++ return a->len == b->len ++ && !memcmp(a->name, b->name, a->len); ++} ++ ++/* ++ * by the commit ++ * 360f547 2015-01-25 dcache: let the dentry count go down to zero without ++ * taking d_lock ++ * the type of d_lockref.count became int, but the inlined function d_count() ++ * still returns unsigned int. ++ * I don't know why. Maybe it is for every d_count() users? ++ * Anyway au_dcount() lives on. ++ */ ++static inline int au_dcount(struct dentry *d) ++{ ++ return (int)d_count(d); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DCSUB_H__ */ +diff -Naur null/fs/aufs/debug.c linux-4.15/fs/aufs/debug.c +--- /dev/null ++++ linux-4.15/fs/aufs/debug.c 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,440 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * debug print functions ++ */ ++ ++#include "aufs.h" ++ ++/* Returns 0, or -errno. arg is in kp->arg. */ ++static int param_atomic_t_set(const char *val, const struct kernel_param *kp) ++{ ++ int err, n; ++ ++ err = kstrtoint(val, 0, &n); ++ if (!err) { ++ if (n > 0) ++ au_debug_on(); ++ else ++ au_debug_off(); ++ } ++ return err; ++} ++ ++/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ ++static int param_atomic_t_get(char *buffer, const struct kernel_param *kp) ++{ ++ atomic_t *a; ++ ++ a = kp->arg; ++ return sprintf(buffer, "%d", atomic_read(a)); ++} ++ ++static struct kernel_param_ops param_ops_atomic_t = { ++ .set = param_atomic_t_set, ++ .get = param_atomic_t_get ++ /* void (*free)(void *arg) */ ++}; ++ ++atomic_t aufs_debug = ATOMIC_INIT(0); ++MODULE_PARM_DESC(debug, "debug print"); ++module_param_named(debug, aufs_debug, atomic_t, S_IRUGO | S_IWUSR | S_IWGRP); ++ ++DEFINE_MUTEX(au_dbg_mtx); /* just to serialize the dbg msgs */ ++char *au_plevel = KERN_DEBUG; ++#define dpri(fmt, ...) do { \ ++ if ((au_plevel \ ++ && strcmp(au_plevel, KERN_DEBUG)) \ ++ || au_debug_test()) \ ++ printk("%s" fmt, au_plevel, ##__VA_ARGS__); \ ++} while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_dpri_whlist(struct au_nhash *whlist) ++{ ++ unsigned long ul, n; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (ul = 0; ul < n; ul++) { ++ hlist_for_each_entry(pos, head, wh_hash) ++ dpri("b%d, %.*s, %d\n", ++ pos->wh_bindex, ++ pos->wh_str.len, pos->wh_str.name, ++ pos->wh_str.len); ++ head++; ++ } ++} ++ ++void au_dpri_vdir(struct au_vdir *vdir) ++{ ++ unsigned long ul; ++ union au_vdir_deblk_p p; ++ unsigned char *o; ++ ++ if (!vdir || IS_ERR(vdir)) { ++ dpri("err %ld\n", PTR_ERR(vdir)); ++ return; ++ } ++ ++ dpri("deblk %u, nblk %lu, deblk %p, last{%lu, %p}, ver %lu\n", ++ vdir->vd_deblk_sz, vdir->vd_nblk, vdir->vd_deblk, ++ vdir->vd_last.ul, vdir->vd_last.p.deblk, vdir->vd_version); ++ for (ul = 0; ul < vdir->vd_nblk; ul++) { ++ p.deblk = vdir->vd_deblk[ul]; ++ o = p.deblk; ++ dpri("[%lu]: %p\n", ul, o); ++ } ++} ++ ++static int do_pri_inode(aufs_bindex_t bindex, struct inode *inode, int hn, ++ struct dentry *wh) ++{ ++ char *n = NULL; ++ int l = 0; ++ ++ if (!inode || IS_ERR(inode)) { ++ dpri("i%d: err %ld\n", bindex, PTR_ERR(inode)); ++ return -1; ++ } ++ ++ /* the type of i_blocks depends upon CONFIG_LBDAF */ ++ BUILD_BUG_ON(sizeof(inode->i_blocks) != sizeof(unsigned long) ++ && sizeof(inode->i_blocks) != sizeof(u64)); ++ if (wh) { ++ n = (void *)wh->d_name.name; ++ l = wh->d_name.len; ++ } ++ ++ dpri("i%d: %p, i%lu, %s, cnt %d, nl %u, 0%o, sz %llu, blk %llu," ++ " hn %d, ct %lld, np %lu, st 0x%lx, f 0x%x, v %llu, g %x%s%.*s\n", ++ bindex, inode, ++ inode->i_ino, inode->i_sb ? au_sbtype(inode->i_sb) : "??", ++ atomic_read(&inode->i_count), inode->i_nlink, inode->i_mode, ++ i_size_read(inode), (unsigned long long)inode->i_blocks, ++ hn, (long long)timespec_to_ns(&inode->i_ctime) & 0x0ffff, ++ inode->i_mapping ? inode->i_mapping->nrpages : 0, ++ inode->i_state, inode->i_flags, inode->i_version, ++ inode->i_generation, ++ l ? ", wh " : "", l, n); ++ return 0; ++} ++ ++void au_dpri_inode(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ aufs_bindex_t bindex; ++ int err, hn; ++ ++ err = do_pri_inode(-1, inode, -1, NULL); ++ if (err || !au_test_aufs(inode->i_sb) || au_is_bad_inode(inode)) ++ return; ++ ++ iinfo = au_ii(inode); ++ dpri("i-1: btop %d, bbot %d, gen %d\n", ++ iinfo->ii_btop, iinfo->ii_bbot, au_iigen(inode, NULL)); ++ if (iinfo->ii_btop < 0) ++ return; ++ hn = 0; ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; bindex++) { ++ hi = au_hinode(iinfo, bindex); ++ hn = !!au_hn(hi); ++ do_pri_inode(bindex, hi->hi_inode, hn, hi->hi_whdentry); ++ } ++} ++ ++void au_dpri_dalias(struct inode *inode) ++{ ++ struct dentry *d; ++ ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) ++ au_dpri_dentry(d); ++ spin_unlock(&inode->i_lock); ++} ++ ++static int do_pri_dentry(aufs_bindex_t bindex, struct dentry *dentry) ++{ ++ struct dentry *wh = NULL; ++ int hn; ++ struct inode *inode; ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ ++ if (!dentry || IS_ERR(dentry)) { ++ dpri("d%d: err %ld\n", bindex, PTR_ERR(dentry)); ++ return -1; ++ } ++ /* do not call dget_parent() here */ ++ /* note: access d_xxx without d_lock */ ++ dpri("d%d: %p, %pd2?, %s, cnt %d, flags 0x%x, %shashed\n", ++ bindex, dentry, dentry, ++ dentry->d_sb ? au_sbtype(dentry->d_sb) : "??", ++ au_dcount(dentry), dentry->d_flags, ++ d_unhashed(dentry) ? "un" : ""); ++ hn = -1; ++ inode = NULL; ++ if (d_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (inode ++ && au_test_aufs(dentry->d_sb) ++ && bindex >= 0 ++ && !au_is_bad_inode(inode)) { ++ iinfo = au_ii(inode); ++ hi = au_hinode(iinfo, bindex); ++ hn = !!au_hn(hi); ++ wh = hi->hi_whdentry; ++ } ++ do_pri_inode(bindex, inode, hn, wh); ++ return 0; ++} ++ ++void au_dpri_dentry(struct dentry *dentry) ++{ ++ struct au_dinfo *dinfo; ++ aufs_bindex_t bindex; ++ int err; ++ ++ err = do_pri_dentry(-1, dentry); ++ if (err || !au_test_aufs(dentry->d_sb)) ++ return; ++ ++ dinfo = au_di(dentry); ++ if (!dinfo) ++ return; ++ dpri("d-1: btop %d, bbot %d, bwh %d, bdiropq %d, gen %d, tmp %d\n", ++ dinfo->di_btop, dinfo->di_bbot, ++ dinfo->di_bwh, dinfo->di_bdiropq, au_digen(dentry), ++ dinfo->di_tmpfile); ++ if (dinfo->di_btop < 0) ++ return; ++ for (bindex = dinfo->di_btop; bindex <= dinfo->di_bbot; bindex++) ++ do_pri_dentry(bindex, au_hdentry(dinfo, bindex)->hd_dentry); ++} ++ ++static int do_pri_file(aufs_bindex_t bindex, struct file *file) ++{ ++ char a[32]; ++ ++ if (!file || IS_ERR(file)) { ++ dpri("f%d: err %ld\n", bindex, PTR_ERR(file)); ++ return -1; ++ } ++ a[0] = 0; ++ if (bindex < 0 ++ && !IS_ERR_OR_NULL(file->f_path.dentry) ++ && au_test_aufs(file->f_path.dentry->d_sb) ++ && au_fi(file)) ++ snprintf(a, sizeof(a), ", gen %d, mmapped %d", ++ au_figen(file), atomic_read(&au_fi(file)->fi_mmapped)); ++ dpri("f%d: mode 0x%x, flags 0%o, cnt %ld, v %llu, pos %llu%s\n", ++ bindex, file->f_mode, file->f_flags, (long)file_count(file), ++ file->f_version, file->f_pos, a); ++ if (!IS_ERR_OR_NULL(file->f_path.dentry)) ++ do_pri_dentry(bindex, file->f_path.dentry); ++ return 0; ++} ++ ++void au_dpri_file(struct file *file) ++{ ++ struct au_finfo *finfo; ++ struct au_fidir *fidir; ++ struct au_hfile *hfile; ++ aufs_bindex_t bindex; ++ int err; ++ ++ err = do_pri_file(-1, file); ++ if (err ++ || IS_ERR_OR_NULL(file->f_path.dentry) ++ || !au_test_aufs(file->f_path.dentry->d_sb)) ++ return; ++ ++ finfo = au_fi(file); ++ if (!finfo) ++ return; ++ if (finfo->fi_btop < 0) ++ return; ++ fidir = finfo->fi_hdir; ++ if (!fidir) ++ do_pri_file(finfo->fi_btop, finfo->fi_htop.hf_file); ++ else ++ for (bindex = finfo->fi_btop; ++ bindex >= 0 && bindex <= fidir->fd_bbot; ++ bindex++) { ++ hfile = fidir->fd_hfile + bindex; ++ do_pri_file(bindex, hfile ? hfile->hf_file : NULL); ++ } ++} ++ ++static int do_pri_br(aufs_bindex_t bindex, struct au_branch *br) ++{ ++ struct vfsmount *mnt; ++ struct super_block *sb; ++ ++ if (!br || IS_ERR(br)) ++ goto out; ++ mnt = au_br_mnt(br); ++ if (!mnt || IS_ERR(mnt)) ++ goto out; ++ sb = mnt->mnt_sb; ++ if (!sb || IS_ERR(sb)) ++ goto out; ++ ++ dpri("s%d: {perm 0x%x, id %d, cnt %lld, wbr %p}, " ++ "%s, dev 0x%02x%02x, flags 0x%lx, cnt %d, active %d, " ++ "xino %d\n", ++ bindex, br->br_perm, br->br_id, au_br_count(br), ++ br->br_wbr, au_sbtype(sb), MAJOR(sb->s_dev), MINOR(sb->s_dev), ++ sb->s_flags, sb->s_count, ++ atomic_read(&sb->s_active), !!br->br_xino.xi_file); ++ return 0; ++ ++out: ++ dpri("s%d: err %ld\n", bindex, PTR_ERR(br)); ++ return -1; ++} ++ ++void au_dpri_sb(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ aufs_bindex_t bindex; ++ int err; ++ /* to reuduce stack size */ ++ struct { ++ struct vfsmount mnt; ++ struct au_branch fake; ++ } *a; ++ ++ /* this function can be called from magic sysrq */ ++ a = kzalloc(sizeof(*a), GFP_ATOMIC); ++ if (unlikely(!a)) { ++ dpri("no memory\n"); ++ return; ++ } ++ ++ a->mnt.mnt_sb = sb; ++ a->fake.br_path.mnt = &a->mnt; ++ au_br_count_init(&a->fake); ++ err = do_pri_br(-1, &a->fake); ++ au_br_count_fin(&a->fake); ++ kfree(a); ++ dpri("dev 0x%x\n", sb->s_dev); ++ if (err || !au_test_aufs(sb)) ++ return; ++ ++ sbinfo = au_sbi(sb); ++ if (!sbinfo) ++ return; ++ dpri("nw %d, gen %u, kobj %d\n", ++ atomic_read(&sbinfo->si_nowait.nw_len), sbinfo->si_generation, ++ kref_read(&sbinfo->si_kobj.kref)); ++ for (bindex = 0; bindex <= sbinfo->si_bbot; bindex++) ++ do_pri_br(bindex, sbinfo->si_branch[0 + bindex]); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line) ++{ ++ struct inode *h_inode, *inode = d_inode(dentry); ++ struct dentry *h_dentry; ++ aufs_bindex_t bindex, bbot, bi; ++ ++ if (!inode /* || au_di(dentry)->di_lsc == AuLsc_DI_TMP */) ++ return; ++ ++ bbot = au_dbbot(dentry); ++ bi = au_ibbot(inode); ++ if (bi < bbot) ++ bbot = bi; ++ bindex = au_dbtop(dentry); ++ bi = au_ibtop(inode); ++ if (bi > bindex) ++ bindex = bi; ++ ++ for (; bindex <= bbot; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(h_inode != d_inode(h_dentry))) { ++ au_debug_on(); ++ AuDbg("b%d, %s:%d\n", bindex, func, line); ++ AuDbgDentry(dentry); ++ AuDbgInode(inode); ++ au_debug_off(); ++ BUG(); ++ } ++ } ++} ++ ++void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen) ++{ ++ int err, i, j; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ AuDebugOn(err); ++ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/1); ++ AuDebugOn(err); ++ for (i = dpages.ndpage - 1; !err && i >= 0; i--) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ for (j = dpage->ndentry - 1; !err && j >= 0; j--) ++ AuDebugOn(au_digen_test(dentries[j], sigen)); ++ } ++ au_dpages_free(&dpages); ++} ++ ++void au_dbg_verify_kthread(void) ++{ ++ if (au_wkq_test()) { ++ au_dbg_blocked(); ++ /* ++ * It may be recursive, but udba=notify between two aufs mounts, ++ * where a single ro branch is shared, is not a problem. ++ */ ++ /* WARN_ON(1); */ ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int __init au_debug_init(void) ++{ ++ aufs_bindex_t bindex; ++ struct au_vdir_destr destr; ++ ++ bindex = -1; ++ AuDebugOn(bindex >= 0); ++ ++ destr.len = -1; ++ AuDebugOn(destr.len < NAME_MAX); ++ ++#ifdef CONFIG_4KSTACKS ++ pr_warn("CONFIG_4KSTACKS is defined.\n"); ++#endif ++ ++ return 0; ++} +diff -Naur null/fs/aufs/debug.h linux-4.15/fs/aufs/debug.h +--- /dev/null ++++ linux-4.15/fs/aufs/debug.h 2018-02-25 02:38:09.198737468 +0100 +@@ -0,0 +1,225 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * debug print functions ++ */ ++ ++#ifndef __AUFS_DEBUG_H__ ++#define __AUFS_DEBUG_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++ ++#ifdef CONFIG_AUFS_DEBUG ++#define AuDebugOn(a) BUG_ON(a) ++ ++/* module parameter */ ++extern atomic_t aufs_debug; ++static inline void au_debug_on(void) ++{ ++ atomic_inc(&aufs_debug); ++} ++static inline void au_debug_off(void) ++{ ++ atomic_dec_if_positive(&aufs_debug); ++} ++ ++static inline int au_debug_test(void) ++{ ++ return atomic_read(&aufs_debug) > 0; ++} ++#else ++#define AuDebugOn(a) do {} while (0) ++AuStubVoid(au_debug_on, void) ++AuStubVoid(au_debug_off, void) ++AuStubInt0(au_debug_test, void) ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++#define param_check_atomic_t(name, p) __param_check(name, p, atomic_t) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* debug print */ ++ ++#define AuDbg(fmt, ...) do { \ ++ if (au_debug_test()) \ ++ pr_debug("DEBUG: " fmt, ##__VA_ARGS__); \ ++} while (0) ++#define AuLabel(l) AuDbg(#l "\n") ++#define AuIOErr(fmt, ...) pr_err("I/O Error, " fmt, ##__VA_ARGS__) ++#define AuWarn1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ pr_warn(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuErr1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ pr_err(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuIOErr1(fmt, ...) do { \ ++ static unsigned char _c; \ ++ if (!_c++) \ ++ AuIOErr(fmt, ##__VA_ARGS__); \ ++} while (0) ++ ++#define AuUnsupportMsg "This operation is not supported." \ ++ " Please report this application to aufs-users ML." ++#define AuUnsupport(fmt, ...) do { \ ++ pr_err(AuUnsupportMsg "\n" fmt, ##__VA_ARGS__); \ ++ dump_stack(); \ ++} while (0) ++ ++#define AuTraceErr(e) do { \ ++ if (unlikely((e) < 0)) \ ++ AuDbg("err %d\n", (int)(e)); \ ++} while (0) ++ ++#define AuTraceErrPtr(p) do { \ ++ if (IS_ERR(p)) \ ++ AuDbg("err %ld\n", PTR_ERR(p)); \ ++} while (0) ++ ++/* dirty macros for debug print, use with "%.*s" and caution */ ++#define AuLNPair(qstr) (qstr)->len, (qstr)->name ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry; ++#ifdef CONFIG_AUFS_DEBUG ++extern struct mutex au_dbg_mtx; ++extern char *au_plevel; ++struct au_nhash; ++void au_dpri_whlist(struct au_nhash *whlist); ++struct au_vdir; ++void au_dpri_vdir(struct au_vdir *vdir); ++struct inode; ++void au_dpri_inode(struct inode *inode); ++void au_dpri_dalias(struct inode *inode); ++void au_dpri_dentry(struct dentry *dentry); ++struct file; ++void au_dpri_file(struct file *filp); ++struct super_block; ++void au_dpri_sb(struct super_block *sb); ++ ++#define au_dbg_verify_dinode(d) __au_dbg_verify_dinode(d, __func__, __LINE__) ++void __au_dbg_verify_dinode(struct dentry *dentry, const char *func, int line); ++void au_dbg_verify_gen(struct dentry *parent, unsigned int sigen); ++void au_dbg_verify_kthread(void); ++ ++int __init au_debug_init(void); ++ ++#define AuDbgWhlist(w) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#w "\n"); \ ++ au_dpri_whlist(w); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgVdir(v) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#v "\n"); \ ++ au_dpri_vdir(v); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgInode(i) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#i "\n"); \ ++ au_dpri_inode(i); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgDAlias(i) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#i "\n"); \ ++ au_dpri_dalias(i); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgDentry(d) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#d "\n"); \ ++ au_dpri_dentry(d); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgFile(f) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#f "\n"); \ ++ au_dpri_file(f); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgSb(sb) do { \ ++ mutex_lock(&au_dbg_mtx); \ ++ AuDbg(#sb "\n"); \ ++ au_dpri_sb(sb); \ ++ mutex_unlock(&au_dbg_mtx); \ ++} while (0) ++ ++#define AuDbgSym(addr) do { \ ++ char sym[KSYM_SYMBOL_LEN]; \ ++ sprint_symbol(sym, (unsigned long)addr); \ ++ AuDbg("%s\n", sym); \ ++} while (0) ++#else ++AuStubVoid(au_dbg_verify_dinode, struct dentry *dentry) ++AuStubVoid(au_dbg_verify_gen, struct dentry *parent, unsigned int sigen) ++AuStubVoid(au_dbg_verify_kthread, void) ++AuStubInt0(__init au_debug_init, void) ++ ++#define AuDbgWhlist(w) do {} while (0) ++#define AuDbgVdir(v) do {} while (0) ++#define AuDbgInode(i) do {} while (0) ++#define AuDbgDAlias(i) do {} while (0) ++#define AuDbgDentry(d) do {} while (0) ++#define AuDbgFile(f) do {} while (0) ++#define AuDbgSb(sb) do {} while (0) ++#define AuDbgSym(addr) do {} while (0) ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_MAGIC_SYSRQ ++int __init au_sysrq_init(void); ++void au_sysrq_fin(void); ++ ++#ifdef CONFIG_HW_CONSOLE ++#define au_dbg_blocked() do { \ ++ WARN_ON(1); \ ++ handle_sysrq('w'); \ ++} while (0) ++#else ++AuStubVoid(au_dbg_blocked, void) ++#endif ++ ++#else ++AuStubInt0(__init au_sysrq_init, void) ++AuStubVoid(au_sysrq_fin, void) ++AuStubVoid(au_dbg_blocked, void) ++#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DEBUG_H__ */ +diff -Naur null/fs/aufs/dentry.c linux-4.15/fs/aufs/dentry.c +--- /dev/null ++++ linux-4.15/fs/aufs/dentry.c 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,1152 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * lookup and dentry operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* ++ * returns positive/negative dentry, NULL or an error. ++ * NULL means whiteout-ed or not-found. ++ */ ++static struct dentry* ++au_do_lookup(struct dentry *h_parent, struct dentry *dentry, ++ aufs_bindex_t bindex, struct au_do_lookup_args *args) ++{ ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_branch *br; ++ int wh_found, opq; ++ unsigned char wh_able; ++ const unsigned char allow_neg = !!au_ftest_lkup(args->flags, ALLOW_NEG); ++ const unsigned char ignore_perm = !!au_ftest_lkup(args->flags, ++ IGNORE_PERM); ++ ++ wh_found = 0; ++ br = au_sbr(dentry->d_sb, bindex); ++ wh_able = !!au_br_whable(br->br_perm); ++ if (wh_able) ++ wh_found = au_wh_test(h_parent, &args->whname, ignore_perm); ++ h_dentry = ERR_PTR(wh_found); ++ if (!wh_found) ++ goto real_lookup; ++ if (unlikely(wh_found < 0)) ++ goto out; ++ ++ /* We found a whiteout */ ++ /* au_set_dbbot(dentry, bindex); */ ++ au_set_dbwh(dentry, bindex); ++ if (!allow_neg) ++ return NULL; /* success */ ++ ++real_lookup: ++ if (!ignore_perm) ++ h_dentry = vfsub_lkup_one(args->name, h_parent); ++ else ++ h_dentry = au_sio_lkup_one(args->name, h_parent); ++ if (IS_ERR(h_dentry)) { ++ if (PTR_ERR(h_dentry) == -ENAMETOOLONG ++ && !allow_neg) ++ h_dentry = NULL; ++ goto out; ++ } ++ ++ h_inode = d_inode(h_dentry); ++ if (d_is_negative(h_dentry)) { ++ if (!allow_neg) ++ goto out_neg; ++ } else if (wh_found ++ || (args->type && args->type != (h_inode->i_mode & S_IFMT))) ++ goto out_neg; ++ else if (au_ftest_lkup(args->flags, DIRREN) ++ /* && h_inode */ ++ && !au_dr_lkup_h_ino(args, bindex, h_inode->i_ino)) { ++ AuDbg("b%d %pd ignored hi%llu\n", bindex, h_dentry, ++ (unsigned long long)h_inode->i_ino); ++ goto out_neg; ++ } ++ ++ if (au_dbbot(dentry) <= bindex) ++ au_set_dbbot(dentry, bindex); ++ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) ++ au_set_dbtop(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, h_dentry); ++ ++ if (!d_is_dir(h_dentry) ++ || !wh_able ++ || (d_really_is_positive(dentry) && !d_is_dir(dentry))) ++ goto out; /* success */ ++ ++ vfsub_inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); ++ opq = au_diropq_test(h_dentry); ++ inode_unlock_shared(h_inode); ++ if (opq > 0) ++ au_set_dbdiropq(dentry, bindex); ++ else if (unlikely(opq < 0)) { ++ au_set_h_dptr(dentry, bindex, NULL); ++ h_dentry = ERR_PTR(opq); ++ } ++ goto out; ++ ++out_neg: ++ dput(h_dentry); ++ h_dentry = NULL; ++out: ++ return h_dentry; ++} ++ ++static int au_test_shwh(struct super_block *sb, const struct qstr *name) ++{ ++ if (unlikely(!au_opt_test(au_mntflags(sb), SHWH) ++ && !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))) ++ return -EPERM; ++ return 0; ++} ++ ++/* ++ * returns the number of lower positive dentries, ++ * otherwise an error. ++ * can be called at unlinking with @type is zero. ++ */ ++int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, ++ unsigned int flags) ++{ ++ int npositive, err; ++ aufs_bindex_t bindex, btail, bdiropq; ++ unsigned char isdir, dirperm1, dirren; ++ struct au_do_lookup_args args = { ++ .flags = flags, ++ .name = &dentry->d_name ++ }; ++ struct dentry *parent; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ err = au_test_shwh(sb, args.name); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_wh_name_alloc(&args.whname, args.name); ++ if (unlikely(err)) ++ goto out; ++ ++ isdir = !!d_is_dir(dentry); ++ dirperm1 = !!au_opt_test(au_mntflags(sb), DIRPERM1); ++ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); ++ if (dirren) ++ au_fset_lkup(args.flags, DIRREN); ++ ++ npositive = 0; ++ parent = dget_parent(dentry); ++ btail = au_dbtaildir(parent); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ struct dentry *h_parent, *h_dentry; ++ struct inode *h_inode, *h_dir; ++ struct au_branch *br; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) { ++ if (d_is_positive(h_dentry)) ++ npositive++; ++ break; ++ } ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || !d_is_dir(h_parent)) ++ continue; ++ ++ if (dirren) { ++ /* if the inum matches, then use the prepared name */ ++ err = au_dr_lkup_name(&args, bindex); ++ if (unlikely(err)) ++ goto out_parent; ++ } ++ ++ h_dir = d_inode(h_parent); ++ vfsub_inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ h_dentry = au_do_lookup(h_parent, dentry, bindex, &args); ++ inode_unlock_shared(h_dir); ++ err = PTR_ERR(h_dentry); ++ if (IS_ERR(h_dentry)) ++ goto out_parent; ++ if (h_dentry) ++ au_fclr_lkup(args.flags, ALLOW_NEG); ++ if (dirperm1) ++ au_fset_lkup(args.flags, IGNORE_PERM); ++ ++ if (au_dbwh(dentry) == bindex) ++ break; ++ if (!h_dentry) ++ continue; ++ if (d_is_negative(h_dentry)) ++ continue; ++ h_inode = d_inode(h_dentry); ++ npositive++; ++ if (!args.type) ++ args.type = h_inode->i_mode & S_IFMT; ++ if (args.type != S_IFDIR) ++ break; ++ else if (isdir) { ++ /* the type of lower may be different */ ++ bdiropq = au_dbdiropq(dentry); ++ if (bdiropq >= 0 && bdiropq <= bindex) ++ break; ++ } ++ br = au_sbr(sb, bindex); ++ if (dirren ++ && au_dr_hino_test_add(&br->br_dirren, h_inode->i_ino, ++ /*add_ent*/NULL)) { ++ /* prepare next name to lookup */ ++ err = au_dr_lkup(&args, dentry, bindex); ++ if (unlikely(err)) ++ goto out_parent; ++ } ++ } ++ ++ if (npositive) { ++ AuLabel(positive); ++ au_update_dbtop(dentry); ++ } ++ err = npositive; ++ if (unlikely(!au_opt_test(au_mntflags(sb), UDBA_NONE) ++ && au_dbtop(dentry) < 0)) { ++ err = -EIO; ++ AuIOErr("both of real entry and whiteout found, %pd, err %d\n", ++ dentry, err); ++ } ++ ++out_parent: ++ dput(parent); ++ kfree(args.whname.name); ++ if (dirren) ++ au_dr_lkup_fin(&args); ++out: ++ return err; ++} ++ ++struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent) ++{ ++ struct dentry *dentry; ++ int wkq_err; ++ ++ if (!au_test_h_perm_sio(d_inode(parent), MAY_EXEC)) ++ dentry = vfsub_lkup_one(name, parent); ++ else { ++ struct vfsub_lkup_one_args args = { ++ .errp = &dentry, ++ .name = name, ++ .parent = parent ++ }; ++ ++ wkq_err = au_wkq_wait(vfsub_call_lkup_one, &args); ++ if (unlikely(wkq_err)) ++ dentry = ERR_PTR(wkq_err); ++ } ++ ++ return dentry; ++} ++ ++/* ++ * lookup @dentry on @bindex which should be negative. ++ */ ++int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh) ++{ ++ int err; ++ struct dentry *parent, *h_parent, *h_dentry; ++ struct au_branch *br; ++ ++ parent = dget_parent(dentry); ++ h_parent = au_h_dptr(parent, bindex); ++ br = au_sbr(dentry->d_sb, bindex); ++ if (wh) ++ h_dentry = au_whtmp_lkup(h_parent, br, &dentry->d_name); ++ else ++ h_dentry = au_sio_lkup_one(&dentry->d_name, h_parent); ++ err = PTR_ERR(h_dentry); ++ if (IS_ERR(h_dentry)) ++ goto out; ++ if (unlikely(d_is_positive(h_dentry))) { ++ err = -EIO; ++ AuIOErr("%pd should be negative on b%d.\n", h_dentry, bindex); ++ dput(h_dentry); ++ goto out; ++ } ++ ++ err = 0; ++ if (bindex < au_dbtop(dentry)) ++ au_set_dbtop(dentry, bindex); ++ if (au_dbbot(dentry) < bindex) ++ au_set_dbbot(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, h_dentry); ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* subset of struct inode */ ++struct au_iattr { ++ unsigned long i_ino; ++ /* unsigned int i_nlink; */ ++ kuid_t i_uid; ++ kgid_t i_gid; ++ u64 i_version; ++/* ++ loff_t i_size; ++ blkcnt_t i_blocks; ++*/ ++ umode_t i_mode; ++}; ++ ++static void au_iattr_save(struct au_iattr *ia, struct inode *h_inode) ++{ ++ ia->i_ino = h_inode->i_ino; ++ /* ia->i_nlink = h_inode->i_nlink; */ ++ ia->i_uid = h_inode->i_uid; ++ ia->i_gid = h_inode->i_gid; ++ ia->i_version = h_inode->i_version; ++/* ++ ia->i_size = h_inode->i_size; ++ ia->i_blocks = h_inode->i_blocks; ++*/ ++ ia->i_mode = (h_inode->i_mode & S_IFMT); ++} ++ ++static int au_iattr_test(struct au_iattr *ia, struct inode *h_inode) ++{ ++ return ia->i_ino != h_inode->i_ino ++ /* || ia->i_nlink != h_inode->i_nlink */ ++ || !uid_eq(ia->i_uid, h_inode->i_uid) ++ || !gid_eq(ia->i_gid, h_inode->i_gid) ++ || ia->i_version != h_inode->i_version ++/* ++ || ia->i_size != h_inode->i_size ++ || ia->i_blocks != h_inode->i_blocks ++*/ ++ || ia->i_mode != (h_inode->i_mode & S_IFMT); ++} ++ ++static int au_h_verify_dentry(struct dentry *h_dentry, struct dentry *h_parent, ++ struct au_branch *br) ++{ ++ int err; ++ struct au_iattr ia; ++ struct inode *h_inode; ++ struct dentry *h_d; ++ struct super_block *h_sb; ++ ++ err = 0; ++ memset(&ia, -1, sizeof(ia)); ++ h_sb = h_dentry->d_sb; ++ h_inode = NULL; ++ if (d_is_positive(h_dentry)) { ++ h_inode = d_inode(h_dentry); ++ au_iattr_save(&ia, h_inode); ++ } else if (au_test_nfs(h_sb) || au_test_fuse(h_sb)) ++ /* nfs d_revalidate may return 0 for negative dentry */ ++ /* fuse d_revalidate always return 0 for negative dentry */ ++ goto out; ++ ++ /* main purpose is namei.c:cached_lookup() and d_revalidate */ ++ h_d = vfsub_lkup_one(&h_dentry->d_name, h_parent); ++ err = PTR_ERR(h_d); ++ if (IS_ERR(h_d)) ++ goto out; ++ ++ err = 0; ++ if (unlikely(h_d != h_dentry ++ || d_inode(h_d) != h_inode ++ || (h_inode && au_iattr_test(&ia, h_inode)))) ++ err = au_busy_or_stale(); ++ dput(h_d); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, ++ struct dentry *h_parent, struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ if (udba == AuOpt_UDBA_REVAL ++ && !au_test_fs_remote(h_dentry->d_sb)) { ++ IMustLock(h_dir); ++ err = (d_inode(h_dentry->d_parent) != h_dir); ++ } else if (udba != AuOpt_UDBA_NONE) ++ err = au_h_verify_dentry(h_dentry, h_parent, br); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_refresh_hdentry(struct dentry *dentry, struct dentry *parent) ++{ ++ int err; ++ aufs_bindex_t new_bindex, bindex, bbot, bwh, bdiropq; ++ struct au_hdentry tmp, *p, *q; ++ struct au_dinfo *dinfo; ++ struct super_block *sb; ++ ++ DiMustWriteLock(dentry); ++ ++ sb = dentry->d_sb; ++ dinfo = au_di(dentry); ++ bbot = dinfo->di_bbot; ++ bwh = dinfo->di_bwh; ++ bdiropq = dinfo->di_bdiropq; ++ bindex = dinfo->di_btop; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, p++) { ++ if (!p->hd_dentry) ++ continue; ++ ++ new_bindex = au_br_index(sb, p->hd_id); ++ if (new_bindex == bindex) ++ continue; ++ ++ if (dinfo->di_bwh == bindex) ++ bwh = new_bindex; ++ if (dinfo->di_bdiropq == bindex) ++ bdiropq = new_bindex; ++ if (new_bindex < 0) { ++ au_hdput(p); ++ p->hd_dentry = NULL; ++ continue; ++ } ++ ++ /* swap two lower dentries, and loop again */ ++ q = au_hdentry(dinfo, new_bindex); ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hd_dentry) { ++ bindex--; ++ p--; ++ } ++ } ++ ++ dinfo->di_bwh = -1; ++ if (bwh >= 0 && bwh <= au_sbbot(sb) && au_sbr_whable(sb, bwh)) ++ dinfo->di_bwh = bwh; ++ ++ dinfo->di_bdiropq = -1; ++ if (bdiropq >= 0 ++ && bdiropq <= au_sbbot(sb) ++ && au_sbr_whable(sb, bdiropq)) ++ dinfo->di_bdiropq = bdiropq; ++ ++ err = -EIO; ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ bbot = au_dbbot(parent); ++ bindex = 0; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, p++) ++ if (p->hd_dentry) { ++ dinfo->di_btop = bindex; ++ break; ++ } ++ ++ if (dinfo->di_btop >= 0) { ++ bindex = bbot; ++ p = au_hdentry(dinfo, bindex); ++ for (; bindex >= 0; bindex--, p--) ++ if (p->hd_dentry) { ++ dinfo->di_bbot = bindex; ++ err = 0; ++ break; ++ } ++ } ++ ++ return err; ++} ++ ++static void au_do_hide(struct dentry *dentry) ++{ ++ struct inode *inode; ++ ++ if (d_really_is_positive(dentry)) { ++ inode = d_inode(dentry); ++ if (!d_is_dir(dentry)) { ++ if (inode->i_nlink && !d_unhashed(dentry)) ++ drop_nlink(inode); ++ } else { ++ clear_nlink(inode); ++ /* stop next lookup */ ++ inode->i_flags |= S_DEAD; ++ } ++ smp_mb(); /* necessary? */ ++ } ++ d_drop(dentry); ++} ++ ++static int au_hide_children(struct dentry *parent) ++{ ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry *dentry; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, parent, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ /* in reverse order */ ++ for (i = dpages.ndpage - 1; i >= 0; i--) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = ndentry - 1; j >= 0; j--) { ++ dentry = dpage->dentries[j]; ++ if (dentry != parent) ++ au_do_hide(dentry); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static void au_hide(struct dentry *dentry) ++{ ++ int err; ++ ++ AuDbgDentry(dentry); ++ if (d_is_dir(dentry)) { ++ /* shrink_dcache_parent(dentry); */ ++ err = au_hide_children(dentry); ++ if (unlikely(err)) ++ AuIOErr("%pd, failed hiding children, ignored %d\n", ++ dentry, err); ++ } ++ au_do_hide(dentry); ++} ++ ++/* ++ * By adding a dirty branch, a cached dentry may be affected in various ways. ++ * ++ * a dirty branch is added ++ * - on the top of layers ++ * - in the middle of layers ++ * - to the bottom of layers ++ * ++ * on the added branch there exists ++ * - a whiteout ++ * - a diropq ++ * - a same named entry ++ * + exist ++ * * negative --> positive ++ * * positive --> positive ++ * - type is unchanged ++ * - type is changed ++ * + doesn't exist ++ * * negative --> negative ++ * * positive --> negative (rejected by au_br_del() for non-dir case) ++ * - none ++ */ ++static int au_refresh_by_dinfo(struct dentry *dentry, struct au_dinfo *dinfo, ++ struct au_dinfo *tmp) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct { ++ struct dentry *dentry; ++ struct inode *inode; ++ mode_t mode; ++ } orig_h, tmp_h = { ++ .dentry = NULL ++ }; ++ struct au_hdentry *hd; ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry; ++ ++ err = 0; ++ AuDebugOn(dinfo->di_btop < 0); ++ orig_h.mode = 0; ++ orig_h.dentry = au_hdentry(dinfo, dinfo->di_btop)->hd_dentry; ++ orig_h.inode = NULL; ++ if (d_is_positive(orig_h.dentry)) { ++ orig_h.inode = d_inode(orig_h.dentry); ++ orig_h.mode = orig_h.inode->i_mode & S_IFMT; ++ } ++ if (tmp->di_btop >= 0) { ++ tmp_h.dentry = au_hdentry(tmp, tmp->di_btop)->hd_dentry; ++ if (d_is_positive(tmp_h.dentry)) { ++ tmp_h.inode = d_inode(tmp_h.dentry); ++ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT; ++ } ++ } ++ ++ inode = NULL; ++ if (d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (!orig_h.inode) { ++ AuDbg("nagative originally\n"); ++ if (inode) { ++ au_hide(dentry); ++ goto out; ++ } ++ AuDebugOn(inode); ++ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); ++ AuDebugOn(dinfo->di_bdiropq != -1); ++ ++ if (!tmp_h.inode) { ++ AuDbg("negative --> negative\n"); ++ /* should have only one negative lower */ ++ if (tmp->di_btop >= 0 ++ && tmp->di_btop < dinfo->di_btop) { ++ AuDebugOn(tmp->di_btop != tmp->di_bbot); ++ AuDebugOn(dinfo->di_btop != dinfo->di_bbot); ++ au_set_h_dptr(dentry, dinfo->di_btop, NULL); ++ au_di_cp(dinfo, tmp); ++ hd = au_hdentry(tmp, tmp->di_btop); ++ au_set_h_dptr(dentry, tmp->di_btop, ++ dget(hd->hd_dentry)); ++ } ++ au_dbg_verify_dinode(dentry); ++ } else { ++ AuDbg("negative --> positive\n"); ++ /* ++ * similar to the behaviour of creating with bypassing ++ * aufs. ++ * unhash it in order to force an error in the ++ * succeeding create operation. ++ * we should not set S_DEAD here. ++ */ ++ d_drop(dentry); ++ /* au_di_swap(tmp, dinfo); */ ++ au_dbg_verify_dinode(dentry); ++ } ++ } else { ++ AuDbg("positive originally\n"); ++ /* inode may be NULL */ ++ AuDebugOn(inode && (inode->i_mode & S_IFMT) != orig_h.mode); ++ if (!tmp_h.inode) { ++ AuDbg("positive --> negative\n"); ++ /* or bypassing aufs */ ++ au_hide(dentry); ++ if (tmp->di_bwh >= 0 && tmp->di_bwh <= dinfo->di_btop) ++ dinfo->di_bwh = tmp->di_bwh; ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } else if (orig_h.mode == tmp_h.mode) { ++ AuDbg("positive --> positive, same type\n"); ++ if (!S_ISDIR(orig_h.mode) ++ && dinfo->di_btop > tmp->di_btop) { ++ /* ++ * similar to the behaviour of removing and ++ * creating. ++ */ ++ au_hide(dentry); ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } else { ++ /* fill empty slots */ ++ if (dinfo->di_btop > tmp->di_btop) ++ dinfo->di_btop = tmp->di_btop; ++ if (dinfo->di_bbot < tmp->di_bbot) ++ dinfo->di_bbot = tmp->di_bbot; ++ dinfo->di_bwh = tmp->di_bwh; ++ dinfo->di_bdiropq = tmp->di_bdiropq; ++ bbot = dinfo->di_bbot; ++ bindex = tmp->di_btop; ++ hd = au_hdentry(tmp, bindex); ++ for (; bindex <= bbot; bindex++, hd++) { ++ if (au_h_dptr(dentry, bindex)) ++ continue; ++ h_dentry = hd->hd_dentry; ++ if (!h_dentry) ++ continue; ++ AuDebugOn(d_is_negative(h_dentry)); ++ h_inode = d_inode(h_dentry); ++ AuDebugOn(orig_h.mode ++ != (h_inode->i_mode ++ & S_IFMT)); ++ au_set_h_dptr(dentry, bindex, ++ dget(h_dentry)); ++ } ++ if (inode) ++ err = au_refresh_hinode(inode, dentry); ++ au_dbg_verify_dinode(dentry); ++ } ++ } else { ++ AuDbg("positive --> positive, different type\n"); ++ /* similar to the behaviour of removing and creating */ ++ au_hide(dentry); ++ if (inode) ++ err = au_refresh_hinode_self(inode); ++ au_dbg_verify_dinode(dentry); ++ } ++ } ++ ++out: ++ return err; ++} ++ ++void au_refresh_dop(struct dentry *dentry, int force_reval) ++{ ++ const struct dentry_operations *dop ++ = force_reval ? &aufs_dop : dentry->d_sb->s_d_op; ++ static const unsigned int mask ++ = DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE; ++ ++ BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags)); ++ ++ if (dentry->d_op == dop) ++ return; ++ ++ AuDbg("%pd\n", dentry); ++ spin_lock(&dentry->d_lock); ++ if (dop == &aufs_dop) ++ dentry->d_flags |= mask; ++ else ++ dentry->d_flags &= ~mask; ++ dentry->d_op = dop; ++ spin_unlock(&dentry->d_lock); ++} ++ ++int au_refresh_dentry(struct dentry *dentry, struct dentry *parent) ++{ ++ int err, ebrange, nbr; ++ unsigned int sigen; ++ struct au_dinfo *dinfo, *tmp; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ DiMustWriteLock(dentry); ++ AuDebugOn(IS_ROOT(dentry)); ++ AuDebugOn(d_really_is_negative(parent)); ++ ++ sb = dentry->d_sb; ++ sigen = au_sigen(sb); ++ err = au_digen_test(parent, sigen); ++ if (unlikely(err)) ++ goto out; ++ ++ nbr = au_sbbot(sb) + 1; ++ dinfo = au_di(dentry); ++ err = au_di_realloc(dinfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ ebrange = au_dbrange_test(dentry); ++ if (!ebrange) ++ ebrange = au_do_refresh_hdentry(dentry, parent); ++ ++ if (d_unhashed(dentry) || ebrange /* || dinfo->di_tmpfile */) { ++ AuDebugOn(au_dbtop(dentry) < 0 && au_dbbot(dentry) >= 0); ++ if (d_really_is_positive(dentry)) { ++ inode = d_inode(dentry); ++ err = au_refresh_hinode_self(inode); ++ } ++ au_dbg_verify_dinode(dentry); ++ if (!err) ++ goto out_dgen; /* success */ ++ goto out; ++ } ++ ++ /* temporary dinfo */ ++ AuDbgDentry(dentry); ++ err = -ENOMEM; ++ tmp = au_di_alloc(sb, AuLsc_DI_TMP); ++ if (unlikely(!tmp)) ++ goto out; ++ au_di_swap(tmp, dinfo); ++ /* returns the number of positive dentries */ ++ /* ++ * if current working dir is removed, it returns an error. ++ * but the dentry is legal. ++ */ ++ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); ++ AuDbgDentry(dentry); ++ au_di_swap(tmp, dinfo); ++ if (err == -ENOENT) ++ err = 0; ++ if (err >= 0) { ++ /* compare/refresh by dinfo */ ++ AuDbgDentry(dentry); ++ err = au_refresh_by_dinfo(dentry, dinfo, tmp); ++ au_dbg_verify_dinode(dentry); ++ AuTraceErr(err); ++ } ++ au_di_realloc(dinfo, nbr, /*may_shrink*/1); /* harmless if err */ ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ if (unlikely(err)) ++ goto out; ++ ++out_dgen: ++ au_update_digen(dentry); ++out: ++ if (unlikely(err && !(dentry->d_flags & DCACHE_NFSFS_RENAMED))) { ++ AuIOErr("failed refreshing %pd, %d\n", dentry, err); ++ AuDbgDentry(dentry); ++ } ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_do_h_d_reval(struct dentry *h_dentry, unsigned int flags, ++ struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ int err, valid; ++ ++ err = 0; ++ if (!(h_dentry->d_flags & DCACHE_OP_REVALIDATE)) ++ goto out; ++ ++ AuDbg("b%d\n", bindex); ++ /* ++ * gave up supporting LOOKUP_CREATE/OPEN for lower fs, ++ * due to whiteout and branch permission. ++ */ ++ flags &= ~(/*LOOKUP_PARENT |*/ LOOKUP_OPEN | LOOKUP_CREATE ++ | LOOKUP_FOLLOW | LOOKUP_EXCL); ++ /* it may return tri-state */ ++ valid = h_dentry->d_op->d_revalidate(h_dentry, flags); ++ ++ if (unlikely(valid < 0)) ++ err = valid; ++ else if (!valid) ++ err = -EINVAL; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* todo: remove this */ ++static int h_d_revalidate(struct dentry *dentry, struct inode *inode, ++ unsigned int flags, int do_udba, int dirren) ++{ ++ int err; ++ umode_t mode, h_mode; ++ aufs_bindex_t bindex, btail, btop, ibs, ibe; ++ unsigned char plus, unhashed, is_root, h_plus, h_nfs, tmpfile; ++ struct inode *h_inode, *h_cached_inode; ++ struct dentry *h_dentry; ++ struct qstr *name, *h_name; ++ ++ err = 0; ++ plus = 0; ++ mode = 0; ++ ibs = -1; ++ ibe = -1; ++ unhashed = !!d_unhashed(dentry); ++ is_root = !!IS_ROOT(dentry); ++ name = &dentry->d_name; ++ tmpfile = au_di(dentry)->di_tmpfile; ++ ++ /* ++ * Theoretically, REVAL test should be unnecessary in case of ++ * {FS,I}NOTIFY. ++ * But {fs,i}notify doesn't fire some necessary events, ++ * IN_ATTRIB for atime/nlink/pageio ++ * Let's do REVAL test too. ++ */ ++ if (do_udba && inode) { ++ mode = (inode->i_mode & S_IFMT); ++ plus = (inode->i_nlink > 0); ++ ibs = au_ibtop(inode); ++ ibe = au_ibbot(inode); ++ } ++ ++ btop = au_dbtop(dentry); ++ btail = btop; ++ if (inode && S_ISDIR(inode->i_mode)) ++ btail = au_dbtaildir(dentry); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ ++ AuDbg("b%d, %pd\n", bindex, h_dentry); ++ h_nfs = !!au_test_nfs(h_dentry->d_sb); ++ spin_lock(&h_dentry->d_lock); ++ h_name = &h_dentry->d_name; ++ if (unlikely(do_udba ++ && !is_root ++ && ((!h_nfs ++ && (unhashed != !!d_unhashed(h_dentry) ++ || (!tmpfile && !dirren ++ && !au_qstreq(name, h_name)) ++ )) ++ || (h_nfs ++ && !(flags & LOOKUP_OPEN) ++ && (h_dentry->d_flags ++ & DCACHE_NFSFS_RENAMED))) ++ )) { ++ int h_unhashed; ++ ++ h_unhashed = d_unhashed(h_dentry); ++ spin_unlock(&h_dentry->d_lock); ++ AuDbg("unhash 0x%x 0x%x, %pd %pd\n", ++ unhashed, h_unhashed, dentry, h_dentry); ++ goto err; ++ } ++ spin_unlock(&h_dentry->d_lock); ++ ++ err = au_do_h_d_reval(h_dentry, flags, dentry, bindex); ++ if (unlikely(err)) ++ /* do not goto err, to keep the errno */ ++ break; ++ ++ /* todo: plink too? */ ++ if (!do_udba) ++ continue; ++ ++ /* UDBA tests */ ++ if (unlikely(!!inode != d_is_positive(h_dentry))) ++ goto err; ++ ++ h_inode = NULL; ++ if (d_is_positive(h_dentry)) ++ h_inode = d_inode(h_dentry); ++ h_plus = plus; ++ h_mode = mode; ++ h_cached_inode = h_inode; ++ if (h_inode) { ++ h_mode = (h_inode->i_mode & S_IFMT); ++ h_plus = (h_inode->i_nlink > 0); ++ } ++ if (inode && ibs <= bindex && bindex <= ibe) ++ h_cached_inode = au_h_iptr(inode, bindex); ++ ++ if (!h_nfs) { ++ if (unlikely(plus != h_plus && !tmpfile)) ++ goto err; ++ } else { ++ if (unlikely(!(h_dentry->d_flags & DCACHE_NFSFS_RENAMED) ++ && !is_root ++ && !IS_ROOT(h_dentry) ++ && unhashed != d_unhashed(h_dentry))) ++ goto err; ++ } ++ if (unlikely(mode != h_mode ++ || h_cached_inode != h_inode)) ++ goto err; ++ continue; ++ ++err: ++ err = -EINVAL; ++ break; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* todo: consolidate with do_refresh() and au_reval_for_attr() */ ++static int simple_reval_dpath(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *parent; ++ ++ if (!au_digen_test(dentry, sigen)) ++ return 0; ++ ++ parent = dget_parent(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ AuDebugOn(au_digen_test(parent, sigen)); ++ au_dbg_verify_gen(parent, sigen); ++ err = au_refresh_dentry(dentry, parent); ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_reval_dpath(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *d, *parent; ++ ++ if (!au_ftest_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR)) ++ return simple_reval_dpath(dentry, sigen); ++ ++ /* slow loop, keep it simple and stupid */ ++ /* cf: au_cpup_dirs() */ ++ err = 0; ++ parent = NULL; ++ while (au_digen_test(dentry, sigen)) { ++ d = dentry; ++ while (1) { ++ dput(parent); ++ parent = dget_parent(d); ++ if (!au_digen_test(parent, sigen)) ++ break; ++ d = parent; ++ } ++ ++ if (d != dentry) ++ di_write_lock_child2(d); ++ ++ /* someone might update our dentry while we were sleeping */ ++ if (au_digen_test(d, sigen)) { ++ /* ++ * todo: consolidate with simple_reval_dpath(), ++ * do_refresh() and au_reval_for_attr(). ++ */ ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(d, parent); ++ di_read_unlock(parent, AuLock_IR); ++ } ++ ++ if (d != dentry) ++ di_write_unlock(d); ++ dput(parent); ++ if (unlikely(err)) ++ break; ++ } ++ ++ return err; ++} ++ ++/* ++ * if valid returns 1, otherwise 0. ++ */ ++static int aufs_d_revalidate(struct dentry *dentry, unsigned int flags) ++{ ++ int valid, err; ++ unsigned int sigen; ++ unsigned char do_udba, dirren; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ /* todo: support rcu-walk? */ ++ if (flags & LOOKUP_RCU) ++ return -ECHILD; ++ ++ valid = 0; ++ if (unlikely(!au_di(dentry))) ++ goto out; ++ ++ valid = 1; ++ sb = dentry->d_sb; ++ /* ++ * todo: very ugly ++ * i_mutex of parent dir may be held, ++ * but we should not return 'invalid' due to busy. ++ */ ++ err = aufs_read_lock(dentry, AuLock_FLUSH | AuLock_DW | AuLock_NOPLM); ++ if (unlikely(err)) { ++ valid = err; ++ AuTraceErr(err); ++ goto out; ++ } ++ inode = NULL; ++ if (d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (unlikely(inode && au_is_bad_inode(inode))) { ++ err = -EINVAL; ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ if (unlikely(au_dbrange_test(dentry))) { ++ err = -EINVAL; ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ ++ sigen = au_sigen(sb); ++ if (au_digen_test(dentry, sigen)) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_dpath(dentry, sigen); ++ if (unlikely(err)) { ++ AuTraceErr(err); ++ goto out_dgrade; ++ } ++ } ++ di_downgrade_lock(dentry, AuLock_IR); ++ ++ err = -EINVAL; ++ if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY)) ++ && inode ++ && !(inode->i_state && I_LINKABLE) ++ && (IS_DEADDIR(inode) || !inode->i_nlink)) { ++ AuTraceErr(err); ++ goto out_inval; ++ } ++ ++ do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE); ++ if (do_udba && inode) { ++ aufs_bindex_t btop = au_ibtop(inode); ++ struct inode *h_inode; ++ ++ if (btop >= 0) { ++ h_inode = au_h_iptr(inode, btop); ++ if (h_inode && au_test_higen(inode, h_inode)) { ++ AuTraceErr(err); ++ goto out_inval; ++ } ++ } ++ } ++ ++ dirren = !!au_opt_test(au_mntflags(sb), DIRREN); ++ err = h_d_revalidate(dentry, inode, flags, do_udba, dirren); ++ if (unlikely(!err && do_udba && au_dbtop(dentry) < 0)) { ++ err = -EIO; ++ AuDbg("both of real entry and whiteout found, %p, err %d\n", ++ dentry, err); ++ } ++ goto out_inval; ++ ++out_dgrade: ++ di_downgrade_lock(dentry, AuLock_IR); ++out_inval: ++ aufs_read_unlock(dentry, AuLock_IR); ++ AuTraceErr(err); ++ valid = !err; ++out: ++ if (!valid) { ++ AuDbg("%pd invalid, %d\n", dentry, valid); ++ d_drop(dentry); ++ } ++ return valid; ++} ++ ++static void aufs_d_release(struct dentry *dentry) ++{ ++ if (au_di(dentry)) { ++ au_di_fin(dentry); ++ au_hn_di_reinit(dentry); ++ } ++} ++ ++const struct dentry_operations aufs_dop = { ++ .d_revalidate = aufs_d_revalidate, ++ .d_weak_revalidate = aufs_d_revalidate, ++ .d_release = aufs_d_release ++}; ++ ++/* aufs_dop without d_revalidate */ ++const struct dentry_operations aufs_dop_noreval = { ++ .d_release = aufs_d_release ++}; +diff -Naur null/fs/aufs/dentry.h linux-4.15/fs/aufs/dentry.h +--- /dev/null ++++ linux-4.15/fs/aufs/dentry.h 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,266 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * lookup and dentry operations ++ */ ++ ++#ifndef __AUFS_DENTRY_H__ ++#define __AUFS_DENTRY_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "dirren.h" ++#include "rwsem.h" ++ ++struct au_hdentry { ++ struct dentry *hd_dentry; ++ aufs_bindex_t hd_id; ++}; ++ ++struct au_dinfo { ++ atomic_t di_generation; ++ ++ struct au_rwsem di_rwsem; ++ aufs_bindex_t di_btop, di_bbot, di_bwh, di_bdiropq; ++ unsigned char di_tmpfile; /* to allow the different name */ ++ struct au_hdentry *di_hdentry; ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* flags for au_lkup_dentry() */ ++#define AuLkup_ALLOW_NEG 1 ++#define AuLkup_IGNORE_PERM (1 << 1) ++#define AuLkup_DIRREN (1 << 2) ++#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name) ++#define au_fset_lkup(flags, name) \ ++ do { (flags) |= AuLkup_##name; } while (0) ++#define au_fclr_lkup(flags, name) \ ++ do { (flags) &= ~AuLkup_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuLkup_DIRREN ++#define AuLkup_DIRREN 0 ++#endif ++ ++struct au_do_lookup_args { ++ unsigned int flags; ++ mode_t type; ++ struct qstr whname, *name; ++ struct au_dr_lookup dirren; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dentry.c */ ++extern const struct dentry_operations aufs_dop, aufs_dop_noreval; ++struct au_branch; ++struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent); ++int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir, ++ struct dentry *h_parent, struct au_branch *br); ++ ++int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t btop, ++ unsigned int flags); ++int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh); ++int au_refresh_dentry(struct dentry *dentry, struct dentry *parent); ++int au_reval_dpath(struct dentry *dentry, unsigned int sigen); ++void au_refresh_dop(struct dentry *dentry, int force_reval); ++ ++/* dinfo.c */ ++void au_di_init_once(void *_di); ++struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc); ++void au_di_free(struct au_dinfo *dinfo); ++void au_di_swap(struct au_dinfo *a, struct au_dinfo *b); ++void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src); ++int au_di_init(struct dentry *dentry); ++void au_di_fin(struct dentry *dentry); ++int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink); ++ ++void di_read_lock(struct dentry *d, int flags, unsigned int lsc); ++void di_read_unlock(struct dentry *d, int flags); ++void di_downgrade_lock(struct dentry *d, int flags); ++void di_write_lock(struct dentry *d, unsigned int lsc); ++void di_write_unlock(struct dentry *d); ++void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir); ++void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir); ++void di_write_unlock2(struct dentry *d1, struct dentry *d2); ++ ++struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex); ++struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex); ++aufs_bindex_t au_dbtail(struct dentry *dentry); ++aufs_bindex_t au_dbtaildir(struct dentry *dentry); ++ ++void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++int au_digen_test(struct dentry *dentry, unsigned int sigen); ++int au_dbrange_test(struct dentry *dentry); ++void au_update_digen(struct dentry *dentry); ++void au_update_dbrange(struct dentry *dentry, int do_put_zero); ++void au_update_dbtop(struct dentry *dentry); ++void au_update_dbbot(struct dentry *dentry); ++int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_dinfo *au_di(struct dentry *dentry) ++{ ++ return dentry->d_fsdata; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for dinfo */ ++enum { ++ AuLsc_DI_CHILD, /* child first */ ++ AuLsc_DI_CHILD2, /* rename(2), link(2), and cpup at hnotify */ ++ AuLsc_DI_CHILD3, /* copyup dirs */ ++ AuLsc_DI_PARENT, ++ AuLsc_DI_PARENT2, ++ AuLsc_DI_PARENT3, ++ AuLsc_DI_TMP /* temp for replacing dinfo */ ++}; ++ ++/* ++ * di_read_lock_child, di_write_lock_child, ++ * di_read_lock_child2, di_write_lock_child2, ++ * di_read_lock_child3, di_write_lock_child3, ++ * di_read_lock_parent, di_write_lock_parent, ++ * di_read_lock_parent2, di_write_lock_parent2, ++ * di_read_lock_parent3, di_write_lock_parent3, ++ */ ++#define AuReadLockFunc(name, lsc) \ ++static inline void di_read_lock_##name(struct dentry *d, int flags) \ ++{ di_read_lock(d, flags, AuLsc_DI_##lsc); } ++ ++#define AuWriteLockFunc(name, lsc) \ ++static inline void di_write_lock_##name(struct dentry *d) \ ++{ di_write_lock(d, AuLsc_DI_##lsc); } ++ ++#define AuRWLockFuncs(name, lsc) \ ++ AuReadLockFunc(name, lsc) \ ++ AuWriteLockFunc(name, lsc) ++ ++AuRWLockFuncs(child, CHILD); ++AuRWLockFuncs(child2, CHILD2); ++AuRWLockFuncs(child3, CHILD3); ++AuRWLockFuncs(parent, PARENT); ++AuRWLockFuncs(parent2, PARENT2); ++AuRWLockFuncs(parent3, PARENT3); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define DiMustNoWaiters(d) AuRwMustNoWaiters(&au_di(d)->di_rwsem) ++#define DiMustAnyLock(d) AuRwMustAnyLock(&au_di(d)->di_rwsem) ++#define DiMustWriteLock(d) AuRwMustWriteLock(&au_di(d)->di_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: memory barrier? */ ++static inline unsigned int au_digen(struct dentry *d) ++{ ++ return atomic_read(&au_di(d)->di_generation); ++} ++ ++static inline void au_h_dentry_init(struct au_hdentry *hdentry) ++{ ++ hdentry->hd_dentry = NULL; ++} ++ ++static inline struct au_hdentry *au_hdentry(struct au_dinfo *di, ++ aufs_bindex_t bindex) ++{ ++ return di->di_hdentry + bindex; ++} ++ ++static inline void au_hdput(struct au_hdentry *hd) ++{ ++ if (hd) ++ dput(hd->hd_dentry); ++} ++ ++static inline aufs_bindex_t au_dbtop(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_btop; ++} ++ ++static inline aufs_bindex_t au_dbbot(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bbot; ++} ++ ++static inline aufs_bindex_t au_dbwh(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bwh; ++} ++ ++static inline aufs_bindex_t au_dbdiropq(struct dentry *dentry) ++{ ++ DiMustAnyLock(dentry); ++ return au_di(dentry)->di_bdiropq; ++} ++ ++/* todo: hard/soft set? */ ++static inline void au_set_dbtop(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_btop = bindex; ++} ++ ++static inline void au_set_dbbot(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_bbot = bindex; ++} ++ ++static inline void au_set_dbwh(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ /* dbwh can be outside of btop - bbot range */ ++ au_di(dentry)->di_bwh = bindex; ++} ++ ++static inline void au_set_dbdiropq(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ DiMustWriteLock(dentry); ++ au_di(dentry)->di_bdiropq = bindex; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_HNOTIFY ++static inline void au_digen_dec(struct dentry *d) ++{ ++ atomic_dec(&au_di(d)->di_generation); ++} ++ ++static inline void au_hn_di_reinit(struct dentry *dentry) ++{ ++ dentry->d_fsdata = NULL; ++} ++#else ++AuStubVoid(au_hn_di_reinit, struct dentry *dentry __maybe_unused) ++#endif /* CONFIG_AUFS_HNOTIFY */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DENTRY_H__ */ +diff -Naur null/fs/aufs/dinfo.c linux-4.15/fs/aufs/dinfo.c +--- /dev/null ++++ linux-4.15/fs/aufs/dinfo.c 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,553 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * dentry private data ++ */ ++ ++#include "aufs.h" ++ ++void au_di_init_once(void *_dinfo) ++{ ++ struct au_dinfo *dinfo = _dinfo; ++ ++ au_rw_init(&dinfo->di_rwsem); ++} ++ ++struct au_dinfo *au_di_alloc(struct super_block *sb, unsigned int lsc) ++{ ++ struct au_dinfo *dinfo; ++ int nbr, i; ++ ++ dinfo = au_cache_alloc_dinfo(); ++ if (unlikely(!dinfo)) ++ goto out; ++ ++ nbr = au_sbbot(sb) + 1; ++ if (nbr <= 0) ++ nbr = 1; ++ dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS); ++ if (dinfo->di_hdentry) { ++ au_rw_write_lock_nested(&dinfo->di_rwsem, lsc); ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ dinfo->di_bwh = -1; ++ dinfo->di_bdiropq = -1; ++ dinfo->di_tmpfile = 0; ++ for (i = 0; i < nbr; i++) ++ dinfo->di_hdentry[i].hd_id = -1; ++ goto out; ++ } ++ ++ au_cache_free_dinfo(dinfo); ++ dinfo = NULL; ++ ++out: ++ return dinfo; ++} ++ ++void au_di_free(struct au_dinfo *dinfo) ++{ ++ struct au_hdentry *p; ++ aufs_bindex_t bbot, bindex; ++ ++ /* dentry may not be revalidated */ ++ bindex = dinfo->di_btop; ++ if (bindex >= 0) { ++ bbot = dinfo->di_bbot; ++ p = au_hdentry(dinfo, bindex); ++ while (bindex++ <= bbot) ++ au_hdput(p++); ++ } ++ kfree(dinfo->di_hdentry); ++ au_cache_free_dinfo(dinfo); ++} ++ ++void au_di_swap(struct au_dinfo *a, struct au_dinfo *b) ++{ ++ struct au_hdentry *p; ++ aufs_bindex_t bi; ++ ++ AuRwMustWriteLock(&a->di_rwsem); ++ AuRwMustWriteLock(&b->di_rwsem); ++ ++#define DiSwap(v, name) \ ++ do { \ ++ v = a->di_##name; \ ++ a->di_##name = b->di_##name; \ ++ b->di_##name = v; \ ++ } while (0) ++ ++ DiSwap(p, hdentry); ++ DiSwap(bi, btop); ++ DiSwap(bi, bbot); ++ DiSwap(bi, bwh); ++ DiSwap(bi, bdiropq); ++ /* smp_mb(); */ ++ ++#undef DiSwap ++} ++ ++void au_di_cp(struct au_dinfo *dst, struct au_dinfo *src) ++{ ++ AuRwMustWriteLock(&dst->di_rwsem); ++ AuRwMustWriteLock(&src->di_rwsem); ++ ++ dst->di_btop = src->di_btop; ++ dst->di_bbot = src->di_bbot; ++ dst->di_bwh = src->di_bwh; ++ dst->di_bdiropq = src->di_bdiropq; ++ /* smp_mb(); */ ++} ++ ++int au_di_init(struct dentry *dentry) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_dinfo *dinfo; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ dinfo = au_di_alloc(sb, AuLsc_DI_CHILD); ++ if (dinfo) { ++ atomic_set(&dinfo->di_generation, au_sigen(sb)); ++ /* smp_mb(); */ /* atomic_set */ ++ dentry->d_fsdata = dinfo; ++ } else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++void au_di_fin(struct dentry *dentry) ++{ ++ struct au_dinfo *dinfo; ++ ++ dinfo = au_di(dentry); ++ AuRwDestroy(&dinfo->di_rwsem); ++ au_di_free(dinfo); ++} ++ ++int au_di_realloc(struct au_dinfo *dinfo, int nbr, int may_shrink) ++{ ++ int err, sz; ++ struct au_hdentry *hdp; ++ ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ err = -ENOMEM; ++ sz = sizeof(*hdp) * (dinfo->di_bbot + 1); ++ if (!sz) ++ sz = sizeof(*hdp); ++ hdp = au_kzrealloc(dinfo->di_hdentry, sz, sizeof(*hdp) * nbr, GFP_NOFS, ++ may_shrink); ++ if (hdp) { ++ dinfo->di_hdentry = hdp; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void do_ii_write_lock(struct inode *inode, unsigned int lsc) ++{ ++ switch (lsc) { ++ case AuLsc_DI_CHILD: ++ ii_write_lock_child(inode); ++ break; ++ case AuLsc_DI_CHILD2: ++ ii_write_lock_child2(inode); ++ break; ++ case AuLsc_DI_CHILD3: ++ ii_write_lock_child3(inode); ++ break; ++ case AuLsc_DI_PARENT: ++ ii_write_lock_parent(inode); ++ break; ++ case AuLsc_DI_PARENT2: ++ ii_write_lock_parent2(inode); ++ break; ++ case AuLsc_DI_PARENT3: ++ ii_write_lock_parent3(inode); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++static void do_ii_read_lock(struct inode *inode, unsigned int lsc) ++{ ++ switch (lsc) { ++ case AuLsc_DI_CHILD: ++ ii_read_lock_child(inode); ++ break; ++ case AuLsc_DI_CHILD2: ++ ii_read_lock_child2(inode); ++ break; ++ case AuLsc_DI_CHILD3: ++ ii_read_lock_child3(inode); ++ break; ++ case AuLsc_DI_PARENT: ++ ii_read_lock_parent(inode); ++ break; ++ case AuLsc_DI_PARENT2: ++ ii_read_lock_parent2(inode); ++ break; ++ case AuLsc_DI_PARENT3: ++ ii_read_lock_parent3(inode); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++void di_read_lock(struct dentry *d, int flags, unsigned int lsc) ++{ ++ struct inode *inode; ++ ++ au_rw_read_lock_nested(&au_di(d)->di_rwsem, lsc); ++ if (d_really_is_positive(d)) { ++ inode = d_inode(d); ++ if (au_ftest_lock(flags, IW)) ++ do_ii_write_lock(inode, lsc); ++ else if (au_ftest_lock(flags, IR)) ++ do_ii_read_lock(inode, lsc); ++ } ++} ++ ++void di_read_unlock(struct dentry *d, int flags) ++{ ++ struct inode *inode; ++ ++ if (d_really_is_positive(d)) { ++ inode = d_inode(d); ++ if (au_ftest_lock(flags, IW)) { ++ au_dbg_verify_dinode(d); ++ ii_write_unlock(inode); ++ } else if (au_ftest_lock(flags, IR)) { ++ au_dbg_verify_dinode(d); ++ ii_read_unlock(inode); ++ } ++ } ++ au_rw_read_unlock(&au_di(d)->di_rwsem); ++} ++ ++void di_downgrade_lock(struct dentry *d, int flags) ++{ ++ if (d_really_is_positive(d) && au_ftest_lock(flags, IR)) ++ ii_downgrade_lock(d_inode(d)); ++ au_rw_dgrade_lock(&au_di(d)->di_rwsem); ++} ++ ++void di_write_lock(struct dentry *d, unsigned int lsc) ++{ ++ au_rw_write_lock_nested(&au_di(d)->di_rwsem, lsc); ++ if (d_really_is_positive(d)) ++ do_ii_write_lock(d_inode(d), lsc); ++} ++ ++void di_write_unlock(struct dentry *d) ++{ ++ au_dbg_verify_dinode(d); ++ if (d_really_is_positive(d)) ++ ii_write_unlock(d_inode(d)); ++ au_rw_write_unlock(&au_di(d)->di_rwsem); ++} ++ ++void di_write_lock2_child(struct dentry *d1, struct dentry *d2, int isdir) ++{ ++ AuDebugOn(d1 == d2 ++ || d_inode(d1) == d_inode(d2) ++ || d1->d_sb != d2->d_sb); ++ ++ if ((isdir && au_test_subdir(d1, d2)) ++ || d1 < d2) { ++ di_write_lock_child(d1); ++ di_write_lock_child2(d2); ++ } else { ++ di_write_lock_child(d2); ++ di_write_lock_child2(d1); ++ } ++} ++ ++void di_write_lock2_parent(struct dentry *d1, struct dentry *d2, int isdir) ++{ ++ AuDebugOn(d1 == d2 ++ || d_inode(d1) == d_inode(d2) ++ || d1->d_sb != d2->d_sb); ++ ++ if ((isdir && au_test_subdir(d1, d2)) ++ || d1 < d2) { ++ di_write_lock_parent(d1); ++ di_write_lock_parent2(d2); ++ } else { ++ di_write_lock_parent(d2); ++ di_write_lock_parent2(d1); ++ } ++} ++ ++void di_write_unlock2(struct dentry *d1, struct dentry *d2) ++{ ++ di_write_unlock(d1); ++ if (d_inode(d1) == d_inode(d2)) ++ au_rw_write_unlock(&au_di(d2)->di_rwsem); ++ else ++ di_write_unlock(d2); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry *au_h_dptr(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ struct dentry *d; ++ ++ DiMustAnyLock(dentry); ++ ++ if (au_dbtop(dentry) < 0 || bindex < au_dbtop(dentry)) ++ return NULL; ++ AuDebugOn(bindex < 0); ++ d = au_hdentry(au_di(dentry), bindex)->hd_dentry; ++ AuDebugOn(d && au_dcount(d) <= 0); ++ return d; ++} ++ ++/* ++ * extended version of au_h_dptr(). ++ * returns a hashed and positive (or linkable) h_dentry in bindex, NULL, or ++ * error. ++ */ ++struct dentry *au_h_d_alias(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ struct dentry *h_dentry; ++ struct inode *inode, *h_inode; ++ ++ AuDebugOn(d_really_is_negative(dentry)); ++ ++ h_dentry = NULL; ++ if (au_dbtop(dentry) <= bindex ++ && bindex <= au_dbbot(dentry)) ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && !au_d_linkable(h_dentry)) { ++ dget(h_dentry); ++ goto out; /* success */ ++ } ++ ++ inode = d_inode(dentry); ++ AuDebugOn(bindex < au_ibtop(inode)); ++ AuDebugOn(au_ibbot(inode) < bindex); ++ h_inode = au_h_iptr(inode, bindex); ++ h_dentry = d_find_alias(h_inode); ++ if (h_dentry) { ++ if (!IS_ERR(h_dentry)) { ++ if (!au_d_linkable(h_dentry)) ++ goto out; /* success */ ++ dput(h_dentry); ++ } else ++ goto out; ++ } ++ ++ if (au_opt_test(au_mntflags(dentry->d_sb), PLINK)) { ++ h_dentry = au_plink_lkup(inode, bindex); ++ AuDebugOn(!h_dentry); ++ if (!IS_ERR(h_dentry)) { ++ if (!au_d_hashed_positive(h_dentry)) ++ goto out; /* success */ ++ dput(h_dentry); ++ h_dentry = NULL; ++ } ++ } ++ ++out: ++ AuDbgDentry(h_dentry); ++ return h_dentry; ++} ++ ++aufs_bindex_t au_dbtail(struct dentry *dentry) ++{ ++ aufs_bindex_t bbot, bwh; ++ ++ bbot = au_dbbot(dentry); ++ if (0 <= bbot) { ++ bwh = au_dbwh(dentry); ++ if (!bwh) ++ return bwh; ++ if (0 < bwh && bwh < bbot) ++ return bwh - 1; ++ } ++ return bbot; ++} ++ ++aufs_bindex_t au_dbtaildir(struct dentry *dentry) ++{ ++ aufs_bindex_t bbot, bopq; ++ ++ bbot = au_dbtail(dentry); ++ if (0 <= bbot) { ++ bopq = au_dbdiropq(dentry); ++ if (0 <= bopq && bopq < bbot) ++ bbot = bopq; ++ } ++ return bbot; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_set_h_dptr(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_dentry) ++{ ++ struct au_dinfo *dinfo; ++ struct au_hdentry *hd; ++ struct au_branch *br; ++ ++ DiMustWriteLock(dentry); ++ ++ dinfo = au_di(dentry); ++ hd = au_hdentry(dinfo, bindex); ++ au_hdput(hd); ++ hd->hd_dentry = h_dentry; ++ if (h_dentry) { ++ br = au_sbr(dentry->d_sb, bindex); ++ hd->hd_id = br->br_id; ++ } ++} ++ ++int au_dbrange_test(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t btop, bbot; ++ ++ err = 0; ++ btop = au_dbtop(dentry); ++ bbot = au_dbbot(dentry); ++ if (btop >= 0) ++ AuDebugOn(bbot < 0 && btop > bbot); ++ else { ++ err = -EIO; ++ AuDebugOn(bbot >= 0); ++ } ++ ++ return err; ++} ++ ++int au_digen_test(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(au_digen(dentry) != sigen ++ || au_iigen_test(d_inode(dentry), sigen))) ++ err = -EIO; ++ ++ return err; ++} ++ ++void au_update_digen(struct dentry *dentry) ++{ ++ atomic_set(&au_di(dentry)->di_generation, au_sigen(dentry->d_sb)); ++ /* smp_mb(); */ /* atomic_set */ ++} ++ ++void au_update_dbrange(struct dentry *dentry, int do_put_zero) ++{ ++ struct au_dinfo *dinfo; ++ struct dentry *h_d; ++ struct au_hdentry *hdp; ++ aufs_bindex_t bindex, bbot; ++ ++ DiMustWriteLock(dentry); ++ ++ dinfo = au_di(dentry); ++ if (!dinfo || dinfo->di_btop < 0) ++ return; ++ ++ if (do_put_zero) { ++ bbot = dinfo->di_bbot; ++ bindex = dinfo->di_btop; ++ hdp = au_hdentry(dinfo, bindex); ++ for (; bindex <= bbot; bindex++, hdp++) { ++ h_d = hdp->hd_dentry; ++ if (h_d && d_is_negative(h_d)) ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++ } ++ ++ dinfo->di_btop = 0; ++ hdp = au_hdentry(dinfo, dinfo->di_btop); ++ for (; dinfo->di_btop <= dinfo->di_bbot; dinfo->di_btop++, hdp++) ++ if (hdp->hd_dentry) ++ break; ++ if (dinfo->di_btop > dinfo->di_bbot) { ++ dinfo->di_btop = -1; ++ dinfo->di_bbot = -1; ++ return; ++ } ++ ++ hdp = au_hdentry(dinfo, dinfo->di_bbot); ++ for (; dinfo->di_bbot >= 0; dinfo->di_bbot--, hdp--) ++ if (hdp->hd_dentry) ++ break; ++ AuDebugOn(dinfo->di_btop > dinfo->di_bbot || dinfo->di_bbot < 0); ++} ++ ++void au_update_dbtop(struct dentry *dentry) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct dentry *h_dentry; ++ ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ if (d_is_positive(h_dentry)) { ++ au_set_dbtop(dentry, bindex); ++ return; ++ } ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++} ++ ++void au_update_dbbot(struct dentry *dentry) ++{ ++ aufs_bindex_t bindex, btop; ++ struct dentry *h_dentry; ++ ++ btop = au_dbtop(dentry); ++ for (bindex = au_dbbot(dentry); bindex >= btop; bindex--) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ if (d_is_positive(h_dentry)) { ++ au_set_dbbot(dentry, bindex); ++ return; ++ } ++ au_set_h_dptr(dentry, bindex, NULL); ++ } ++} ++ ++int au_find_dbindex(struct dentry *dentry, struct dentry *h_dentry) ++{ ++ aufs_bindex_t bindex, bbot; ++ ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) ++ if (au_h_dptr(dentry, bindex) == h_dentry) ++ return bindex; ++ return -1; ++} +diff -Naur null/fs/aufs/dir.c linux-4.15/fs/aufs/dir.c +--- /dev/null ++++ linux-4.15/fs/aufs/dir.c 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,759 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * directory operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++void au_add_nlink(struct inode *dir, struct inode *h_dir) ++{ ++ unsigned int nlink; ++ ++ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); ++ ++ nlink = dir->i_nlink; ++ nlink += h_dir->i_nlink - 2; ++ if (h_dir->i_nlink < 2) ++ nlink += 2; ++ smp_mb(); /* for i_nlink */ ++ /* 0 can happen in revaliding */ ++ set_nlink(dir, nlink); ++} ++ ++void au_sub_nlink(struct inode *dir, struct inode *h_dir) ++{ ++ unsigned int nlink; ++ ++ AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode)); ++ ++ nlink = dir->i_nlink; ++ nlink -= h_dir->i_nlink - 2; ++ if (h_dir->i_nlink < 2) ++ nlink -= 2; ++ smp_mb(); /* for i_nlink */ ++ /* nlink == 0 means the branch-fs is broken */ ++ set_nlink(dir, nlink); ++} ++ ++loff_t au_dir_size(struct file *file, struct dentry *dentry) ++{ ++ loff_t sz; ++ aufs_bindex_t bindex, bbot; ++ struct file *h_file; ++ struct dentry *h_dentry; ++ ++ sz = 0; ++ if (file) { ++ AuDebugOn(!d_is_dir(file->f_path.dentry)); ++ ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); ++ bindex <= bbot && sz < KMALLOC_MAX_SIZE; ++ bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (h_file && file_inode(h_file)) ++ sz += vfsub_f_size_read(h_file); ++ } ++ } else { ++ AuDebugOn(!dentry); ++ AuDebugOn(!d_is_dir(dentry)); ++ ++ bbot = au_dbtaildir(dentry); ++ for (bindex = au_dbtop(dentry); ++ bindex <= bbot && sz < KMALLOC_MAX_SIZE; ++ bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) ++ sz += i_size_read(d_inode(h_dentry)); ++ } ++ } ++ if (sz < KMALLOC_MAX_SIZE) ++ sz = roundup_pow_of_two(sz); ++ if (sz > KMALLOC_MAX_SIZE) ++ sz = KMALLOC_MAX_SIZE; ++ else if (sz < NAME_MAX) { ++ BUILD_BUG_ON(AUFS_RDBLK_DEF < NAME_MAX); ++ sz = AUFS_RDBLK_DEF; ++ } ++ return sz; ++} ++ ++struct au_dir_ts_arg { ++ struct dentry *dentry; ++ aufs_bindex_t brid; ++}; ++ ++static void au_do_dir_ts(void *arg) ++{ ++ struct au_dir_ts_arg *a = arg; ++ struct au_dtime dt; ++ struct path h_path; ++ struct inode *dir, *h_dir; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_hinode *hdir; ++ int err; ++ aufs_bindex_t btop, bindex; ++ ++ sb = a->dentry->d_sb; ++ if (d_really_is_negative(a->dentry)) ++ goto out; ++ /* no dir->i_mutex lock */ ++ aufs_read_lock(a->dentry, AuLock_DW); /* noflush */ ++ ++ dir = d_inode(a->dentry); ++ btop = au_ibtop(dir); ++ bindex = au_br_index(sb, a->brid); ++ if (bindex < btop) ++ goto out_unlock; ++ ++ br = au_sbr(sb, bindex); ++ h_path.dentry = au_h_dptr(a->dentry, bindex); ++ if (!h_path.dentry) ++ goto out_unlock; ++ h_path.mnt = au_br_mnt(br); ++ au_dtime_store(&dt, a->dentry, &h_path); ++ ++ br = au_sbr(sb, btop); ++ if (!au_br_writable(br->br_perm)) ++ goto out_unlock; ++ h_path.dentry = au_h_dptr(a->dentry, btop); ++ h_path.mnt = au_br_mnt(br); ++ err = vfsub_mnt_want_write(h_path.mnt); ++ if (err) ++ goto out_unlock; ++ hdir = au_hi(dir, btop); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ h_dir = au_h_iptr(dir, btop); ++ if (h_dir->i_nlink ++ && timespec_compare(&h_dir->i_mtime, &dt.dt_mtime) < 0) { ++ dt.dt_h_path = h_path; ++ au_dtime_revert(&dt); ++ } ++ au_hn_inode_unlock(hdir); ++ vfsub_mnt_drop_write(h_path.mnt); ++ au_cpup_attr_timesizes(dir); ++ ++out_unlock: ++ aufs_read_unlock(a->dentry, AuLock_DW); ++out: ++ dput(a->dentry); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ kfree(arg); ++} ++ ++void au_dir_ts(struct inode *dir, aufs_bindex_t bindex) ++{ ++ int perm, wkq_err; ++ aufs_bindex_t btop; ++ struct au_dir_ts_arg *arg; ++ struct dentry *dentry; ++ struct super_block *sb; ++ ++ IMustLock(dir); ++ ++ dentry = d_find_any_alias(dir); ++ AuDebugOn(!dentry); ++ sb = dentry->d_sb; ++ btop = au_ibtop(dir); ++ if (btop == bindex) { ++ au_cpup_attr_timesizes(dir); ++ goto out; ++ } ++ ++ perm = au_sbr_perm(sb, btop); ++ if (!au_br_writable(perm)) ++ goto out; ++ ++ arg = kmalloc(sizeof(*arg), GFP_NOFS); ++ if (!arg) ++ goto out; ++ ++ arg->dentry = dget(dentry); /* will be dput-ted by au_do_dir_ts() */ ++ arg->brid = au_sbr_id(sb, bindex); ++ wkq_err = au_wkq_nowait(au_do_dir_ts, arg, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ pr_err("wkq %d\n", wkq_err); ++ dput(dentry); ++ kfree(arg); ++ } ++ ++out: ++ dput(dentry); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int reopen_dir(struct file *file) ++{ ++ int err; ++ unsigned int flags; ++ aufs_bindex_t bindex, btail, btop; ++ struct dentry *dentry, *h_dentry; ++ struct file *h_file; ++ ++ /* open all lower dirs */ ++ dentry = file->f_path.dentry; ++ btop = au_dbtop(dentry); ++ for (bindex = au_fbtop(file); bindex < btop; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbtop(file, btop); ++ ++ btail = au_dbtaildir(dentry); ++ for (bindex = au_fbbot_dir(file); btail < bindex; bindex--) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbbot_dir(file, btail); ++ ++ flags = vfsub_file_flags(file); ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ h_file = au_hf_dir(file, bindex); ++ if (h_file) ++ continue; ++ ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; /* close all? */ ++ au_set_h_fptr(file, bindex, h_file); ++ } ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static int do_open_dir(struct file *file, int flags, struct file *h_file) ++{ ++ int err; ++ aufs_bindex_t bindex, btail; ++ struct dentry *dentry, *h_dentry; ++ struct vfsmount *mnt; ++ ++ FiMustWriteLock(file); ++ AuDebugOn(h_file); ++ ++ err = 0; ++ mnt = file->f_path.mnt; ++ dentry = file->f_path.dentry; ++ file->f_version = d_inode(dentry)->i_version; ++ bindex = au_dbtop(dentry); ++ au_set_fbtop(file, bindex); ++ btail = au_dbtaildir(dentry); ++ au_set_fbbot_dir(file, btail); ++ for (; !err && bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!h_dentry) ++ continue; ++ ++ err = vfsub_test_mntns(mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ break; ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ if (IS_ERR(h_file)) { ++ err = PTR_ERR(h_file); ++ break; ++ } ++ au_set_h_fptr(file, bindex, h_file); ++ } ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ if (!err) ++ return 0; /* success */ ++ ++ /* close all */ ++ for (bindex = au_fbtop(file); bindex <= btail; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ au_set_fbtop(file, -1); ++ au_set_fbbot_dir(file, -1); ++ ++ return err; ++} ++ ++static int aufs_open_dir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_fidir *fidir; ++ ++ err = -ENOMEM; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ fidir = au_fidir_alloc(sb); ++ if (fidir) { ++ struct au_do_open_args args = { ++ .open = do_open_dir, ++ .fidir = fidir ++ }; ++ err = au_do_open(file, &args); ++ if (unlikely(err)) ++ kfree(fidir); ++ } ++ si_read_unlock(sb); ++ return err; ++} ++ ++static int aufs_release_dir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ struct au_vdir *vdir_cache; ++ struct au_finfo *finfo; ++ struct au_fidir *fidir; ++ struct au_hfile *hf; ++ aufs_bindex_t bindex, bbot; ++ ++ finfo = au_fi(file); ++ fidir = finfo->fi_hdir; ++ if (fidir) { ++ au_hbl_del(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ vdir_cache = fidir->fd_vdir_cache; /* lock-free */ ++ if (vdir_cache) ++ au_vdir_free(vdir_cache); ++ ++ bindex = finfo->fi_btop; ++ if (bindex >= 0) { ++ hf = fidir->fd_hfile + bindex; ++ /* ++ * calls fput() instead of filp_close(), ++ * since no dnotify or lock for the lower file. ++ */ ++ bbot = fidir->fd_bbot; ++ for (; bindex <= bbot; bindex++, hf++) ++ if (hf->hf_file) ++ au_hfput(hf, /*execed*/0); ++ } ++ kfree(fidir); ++ finfo->fi_hdir = NULL; ++ } ++ au_finfo_fin(file); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_flush_dir(struct file *file, fl_owner_t id) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct file *h_file; ++ ++ err = 0; ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (h_file) ++ err = vfsub_flush(h_file, id); ++ } ++ return err; ++} ++ ++static int aufs_flush_dir(struct file *file, fl_owner_t id) ++{ ++ return au_do_flush(file, id, au_do_flush_dir); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_fsync_dir_no_file(struct dentry *dentry, int datasync) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); !err && bindex <= bbot; bindex++) { ++ struct path h_path; ++ ++ if (au_test_ro(sb, bindex, inode)) ++ continue; ++ h_path.dentry = au_h_dptr(dentry, bindex); ++ if (!h_path.dentry) ++ continue; ++ ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_fsync(NULL, &h_path, datasync); ++ } ++ ++ return err; ++} ++ ++static int au_do_fsync_dir(struct file *file, int datasync) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct file *h_file; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); !err && bindex <= bbot; bindex++) { ++ h_file = au_hf_dir(file, bindex); ++ if (!h_file || au_test_ro(sb, bindex, inode)) ++ continue; ++ ++ err = vfsub_fsync(h_file, &h_file->f_path, datasync); ++ } ++ ++out: ++ return err; ++} ++ ++/* ++ * @file may be NULL ++ */ ++static int aufs_fsync_dir(struct file *file, loff_t start, loff_t end, ++ int datasync) ++{ ++ int err; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ inode_lock(inode); ++ sb = dentry->d_sb; ++ si_noflush_read_lock(sb); ++ if (file) ++ err = au_do_fsync_dir(file, datasync); ++ else { ++ di_write_lock_child(dentry); ++ err = au_do_fsync_dir_no_file(dentry, datasync); ++ } ++ au_cpup_attr_timesizes(inode); ++ di_write_unlock(dentry); ++ if (file) ++ fi_write_unlock(file); ++ ++ si_read_unlock(sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_iterate_shared(struct file *file, struct dir_context *ctx) ++{ ++ int err; ++ struct dentry *dentry; ++ struct inode *inode, *h_inode; ++ struct super_block *sb; ++ ++ AuDbg("%pD, ctx{%pf, %llu}\n", file, ctx->actor, ctx->pos); ++ ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ ++ sb = dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ err = au_reval_and_lock_fdi(file, reopen_dir, /*wlock*/1, /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out; ++ err = au_alive_dir(dentry); ++ if (!err) ++ err = au_vdir_init(file); ++ di_downgrade_lock(dentry, AuLock_IR); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ if (!au_test_nfsd()) { ++ err = au_vdir_fill_de(file, ctx); ++ fsstack_copy_attr_atime(inode, h_inode); ++ } else { ++ /* ++ * nfsd filldir may call lookup_one_len(), vfs_getattr(), ++ * encode_fh() and others. ++ */ ++ atomic_inc(&h_inode->i_count); ++ di_read_unlock(dentry, AuLock_IR); ++ si_read_unlock(sb); ++ err = au_vdir_fill_de(file, ctx); ++ fsstack_copy_attr_atime(inode, h_inode); ++ fi_write_unlock(file); ++ iput(h_inode); ++ ++ AuTraceErr(err); ++ return err; ++ } ++ ++out_unlock: ++ di_read_unlock(dentry, AuLock_IR); ++ fi_write_unlock(file); ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuTestEmpty_WHONLY 1 ++#define AuTestEmpty_CALLED (1 << 1) ++#define AuTestEmpty_SHWH (1 << 2) ++#define au_ftest_testempty(flags, name) ((flags) & AuTestEmpty_##name) ++#define au_fset_testempty(flags, name) \ ++ do { (flags) |= AuTestEmpty_##name; } while (0) ++#define au_fclr_testempty(flags, name) \ ++ do { (flags) &= ~AuTestEmpty_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_SHWH ++#undef AuTestEmpty_SHWH ++#define AuTestEmpty_SHWH 0 ++#endif ++ ++struct test_empty_arg { ++ struct dir_context ctx; ++ struct au_nhash *whlist; ++ unsigned int flags; ++ int err; ++ aufs_bindex_t bindex; ++}; ++ ++static int test_empty_cb(struct dir_context *ctx, const char *__name, ++ int namelen, loff_t offset __maybe_unused, u64 ino, ++ unsigned int d_type) ++{ ++ struct test_empty_arg *arg = container_of(ctx, struct test_empty_arg, ++ ctx); ++ char *name = (void *)__name; ++ ++ arg->err = 0; ++ au_fset_testempty(arg->flags, CALLED); ++ /* smp_mb(); */ ++ if (name[0] == '.' ++ && (namelen == 1 || (name[1] == '.' && namelen == 2))) ++ goto out; /* success */ ++ ++ if (namelen <= AUFS_WH_PFX_LEN ++ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ if (au_ftest_testempty(arg->flags, WHONLY) ++ && !au_nhash_test_known_wh(arg->whlist, name, namelen)) ++ arg->err = -ENOTEMPTY; ++ goto out; ++ } ++ ++ name += AUFS_WH_PFX_LEN; ++ namelen -= AUFS_WH_PFX_LEN; ++ if (!au_nhash_test_known_wh(arg->whlist, name, namelen)) ++ arg->err = au_nhash_append_wh ++ (arg->whlist, name, namelen, ino, d_type, arg->bindex, ++ au_ftest_testempty(arg->flags, SHWH)); ++ ++out: ++ /* smp_mb(); */ ++ AuTraceErr(arg->err); ++ return arg->err; ++} ++ ++static int do_test_empty(struct dentry *dentry, struct test_empty_arg *arg) ++{ ++ int err; ++ struct file *h_file; ++ ++ h_file = au_h_open(dentry, arg->bindex, ++ O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_LARGEFILE, ++ /*file*/NULL, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = 0; ++ if (!au_opt_test(au_mntflags(dentry->d_sb), UDBA_NONE) ++ && !file_inode(h_file)->i_nlink) ++ goto out_put; ++ ++ do { ++ arg->err = 0; ++ au_fclr_testempty(arg->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(h_file, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err && au_ftest_testempty(arg->flags, CALLED)); ++ ++out_put: ++ fput(h_file); ++ au_sbr_put(dentry->d_sb, arg->bindex); ++out: ++ return err; ++} ++ ++struct do_test_empty_args { ++ int *errp; ++ struct dentry *dentry; ++ struct test_empty_arg *arg; ++}; ++ ++static void call_do_test_empty(void *args) ++{ ++ struct do_test_empty_args *a = args; ++ *a->errp = do_test_empty(a->dentry, a->arg); ++} ++ ++static int sio_test_empty(struct dentry *dentry, struct test_empty_arg *arg) ++{ ++ int err, wkq_err; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_dentry = au_h_dptr(dentry, arg->bindex); ++ h_inode = d_inode(h_dentry); ++ /* todo: i_mode changes anytime? */ ++ vfsub_inode_lock_shared_nested(h_inode, AuLsc_I_CHILD); ++ err = au_test_h_perm_sio(h_inode, MAY_EXEC | MAY_READ); ++ inode_unlock_shared(h_inode); ++ if (!err) ++ err = do_test_empty(dentry, arg); ++ else { ++ struct do_test_empty_args args = { ++ .errp = &err, ++ .dentry = dentry, ++ .arg = arg ++ }; ++ unsigned int flags = arg->flags; ++ ++ wkq_err = au_wkq_wait(call_do_test_empty, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ arg->flags = flags; ++ } ++ ++ return err; ++} ++ ++int au_test_empty_lower(struct dentry *dentry) ++{ ++ int err; ++ unsigned int rdhash; ++ aufs_bindex_t bindex, btop, btail; ++ struct au_nhash whlist; ++ struct test_empty_arg arg = { ++ .ctx = { ++ .actor = test_empty_cb ++ } ++ }; ++ int (*test_empty)(struct dentry *dentry, struct test_empty_arg *arg); ++ ++ SiMustAnyLock(dentry->d_sb); ++ ++ rdhash = au_sbi(dentry->d_sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, dentry)); ++ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ ++ arg.flags = 0; ++ arg.whlist = &whlist; ++ btop = au_dbtop(dentry); ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) ++ au_fset_testempty(arg.flags, SHWH); ++ test_empty = do_test_empty; ++ if (au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1)) ++ test_empty = sio_test_empty; ++ arg.bindex = btop; ++ err = test_empty(dentry, &arg); ++ if (unlikely(err)) ++ goto out_whlist; ++ ++ au_fset_testempty(arg.flags, WHONLY); ++ btail = au_dbtaildir(dentry); ++ for (bindex = btop + 1; !err && bindex <= btail; bindex++) { ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) { ++ arg.bindex = bindex; ++ err = test_empty(dentry, &arg); ++ } ++ } ++ ++out_whlist: ++ au_nhash_wh_free(&whlist); ++out: ++ return err; ++} ++ ++int au_test_empty(struct dentry *dentry, struct au_nhash *whlist) ++{ ++ int err; ++ struct test_empty_arg arg = { ++ .ctx = { ++ .actor = test_empty_cb ++ } ++ }; ++ aufs_bindex_t bindex, btail; ++ ++ err = 0; ++ arg.whlist = whlist; ++ arg.flags = AuTestEmpty_WHONLY; ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH)) ++ au_fset_testempty(arg.flags, SHWH); ++ btail = au_dbtaildir(dentry); ++ for (bindex = au_dbtop(dentry); !err && bindex <= btail; bindex++) { ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry && d_is_positive(h_dentry)) { ++ arg.bindex = bindex; ++ err = sio_test_empty(dentry, &arg); ++ } ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++const struct file_operations aufs_dir_fop = { ++ .owner = THIS_MODULE, ++ .llseek = default_llseek, ++ .read = generic_read_dir, ++ .iterate_shared = aufs_iterate_shared, ++ .unlocked_ioctl = aufs_ioctl_dir, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = aufs_compat_ioctl_dir, ++#endif ++ .open = aufs_open_dir, ++ .release = aufs_release_dir, ++ .flush = aufs_flush_dir, ++ .fsync = aufs_fsync_dir ++}; +diff -Naur null/fs/aufs/dir.h linux-4.15/fs/aufs/dir.h +--- /dev/null ++++ linux-4.15/fs/aufs/dir.h 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,131 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * directory operations ++ */ ++ ++#ifndef __AUFS_DIR_H__ ++#define __AUFS_DIR_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* need to be faster and smaller */ ++ ++struct au_nhash { ++ unsigned int nh_num; ++ struct hlist_head *nh_head; ++}; ++ ++struct au_vdir_destr { ++ unsigned char len; ++ unsigned char name[0]; ++} __packed; ++ ++struct au_vdir_dehstr { ++ struct hlist_node hash; ++ struct au_vdir_destr *str; ++} ____cacheline_aligned_in_smp; ++ ++struct au_vdir_de { ++ ino_t de_ino; ++ unsigned char de_type; ++ /* caution: packed */ ++ struct au_vdir_destr de_str; ++} __packed; ++ ++struct au_vdir_wh { ++ struct hlist_node wh_hash; ++#ifdef CONFIG_AUFS_SHWH ++ ino_t wh_ino; ++ aufs_bindex_t wh_bindex; ++ unsigned char wh_type; ++#else ++ aufs_bindex_t wh_bindex; ++#endif ++ /* caution: packed */ ++ struct au_vdir_destr wh_str; ++} __packed; ++ ++union au_vdir_deblk_p { ++ unsigned char *deblk; ++ struct au_vdir_de *de; ++}; ++ ++struct au_vdir { ++ unsigned char **vd_deblk; ++ unsigned long vd_nblk; ++ struct { ++ unsigned long ul; ++ union au_vdir_deblk_p p; ++ } vd_last; ++ ++ unsigned long vd_version; ++ unsigned int vd_deblk_sz; ++ unsigned long vd_jiffy; ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dir.c */ ++extern const struct file_operations aufs_dir_fop; ++void au_add_nlink(struct inode *dir, struct inode *h_dir); ++void au_sub_nlink(struct inode *dir, struct inode *h_dir); ++loff_t au_dir_size(struct file *file, struct dentry *dentry); ++void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); ++int au_test_empty_lower(struct dentry *dentry); ++int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); ++ ++/* vdir.c */ ++unsigned int au_rdhash_est(loff_t sz); ++int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); ++void au_nhash_wh_free(struct au_nhash *whlist); ++int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, ++ int limit); ++int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); ++int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, ++ unsigned int d_type, aufs_bindex_t bindex, ++ unsigned char shwh); ++void au_vdir_free(struct au_vdir *vdir); ++int au_vdir_init(struct file *file); ++int au_vdir_fill_de(struct file *file, struct dir_context *ctx); ++ ++/* ioctl.c */ ++long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); ++ ++#ifdef CONFIG_AUFS_RDU ++/* rdu.c */ ++long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, ++ unsigned long arg); ++#endif ++#else ++AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, ++ unsigned int cmd, unsigned long arg) ++#ifdef CONFIG_COMPAT ++AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, ++ unsigned int cmd, unsigned long arg) ++#endif ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DIR_H__ */ +diff -Naur null/fs/aufs/dirren.c linux-4.15/fs/aufs/dirren.c +--- /dev/null ++++ linux-4.15/fs/aufs/dirren.c 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,1315 @@ ++/* ++ * Copyright (C) 2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * special handling in renaming a directoy ++ * in order to support looking-up the before-renamed name on the lower readonly ++ * branches ++ */ ++ ++#include ++#include "aufs.h" ++ ++static void au_dr_hino_del(struct au_dr_br *dr, struct au_dr_hino *ent) ++{ ++ int idx; ++ ++ idx = au_dr_ihash(ent->dr_h_ino); ++ au_hbl_del(&ent->dr_hnode, dr->dr_h_ino + idx); ++} ++ ++static int au_dr_hino_test_empty(struct au_dr_br *dr) ++{ ++ int ret, i; ++ struct hlist_bl_head *hbl; ++ ++ ret = 1; ++ for (i = 0; ret && i < AuDirren_NHASH; i++) { ++ hbl = dr->dr_h_ino + i; ++ hlist_bl_lock(hbl); ++ ret &= hlist_bl_empty(hbl); ++ hlist_bl_unlock(hbl); ++ } ++ ++ return ret; ++} ++ ++static struct au_dr_hino *au_dr_hino_find(struct au_dr_br *dr, ino_t ino) ++{ ++ struct au_dr_hino *found, *ent; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ int idx; ++ ++ found = NULL; ++ idx = au_dr_ihash(ino); ++ hbl = dr->dr_h_ino + idx; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) ++ if (ent->dr_h_ino == ino) { ++ found = ent; ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ ++ return found; ++} ++ ++int au_dr_hino_test_add(struct au_dr_br *dr, ino_t ino, ++ struct au_dr_hino *add_ent) ++{ ++ int found, idx; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_dr_hino *ent; ++ ++ found = 0; ++ idx = au_dr_ihash(ino); ++ hbl = dr->dr_h_ino + idx; ++#if 0 ++ { ++ struct hlist_bl_node *tmp; ++ ++ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) ++ AuDbg("hi%llu\n", (unsigned long long)ent->dr_h_ino); ++ } ++#endif ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(ent, pos, hbl, dr_hnode) ++ if (ent->dr_h_ino == ino) { ++ found = 1; ++ break; ++ } ++ if (!found && add_ent) ++ hlist_bl_add_head(&add_ent->dr_hnode, hbl); ++ hlist_bl_unlock(hbl); ++ ++ if (!found && add_ent) ++ AuDbg("i%llu added\n", (unsigned long long)add_ent->dr_h_ino); ++ ++ return found; ++} ++ ++void au_dr_hino_free(struct au_dr_br *dr) ++{ ++ int i; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_dr_hino *ent; ++ ++ /* SiMustWriteLock(sb); */ ++ ++ for (i = 0; i < AuDirren_NHASH; i++) { ++ hbl = dr->dr_h_ino + i; ++ /* no spinlock since sbinfo must be write-locked */ ++ hlist_bl_for_each_entry_safe(ent, pos, tmp, hbl, dr_hnode) ++ kfree(ent); ++ INIT_HLIST_BL_HEAD(hbl); ++ } ++} ++ ++/* returns the number of inodes or an error */ ++static int au_dr_hino_store(struct super_block *sb, struct au_branch *br, ++ struct file *hinofile) ++{ ++ int err, i; ++ ssize_t ssz; ++ loff_t pos, oldsize; ++ __be64 u64; ++ struct inode *hinoinode; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *n1, *n2; ++ struct au_dr_hino *ent; ++ ++ SiMustWriteLock(sb); ++ AuDebugOn(!au_br_writable(br->br_perm)); ++ ++ hinoinode = file_inode(hinofile); ++ oldsize = i_size_read(hinoinode); ++ ++ err = 0; ++ pos = 0; ++ hbl = br->br_dirren.dr_h_ino; ++ for (i = 0; !err && i < AuDirren_NHASH; i++, hbl++) { ++ /* no bit-lock since sbinfo must be write-locked */ ++ hlist_bl_for_each_entry_safe(ent, n1, n2, hbl, dr_hnode) { ++ AuDbg("hi%llu, %pD2\n", ++ (unsigned long long)ent->dr_h_ino, hinofile); ++ u64 = cpu_to_be64(ent->dr_h_ino); ++ ssz = vfsub_write_k(hinofile, &u64, sizeof(u64), &pos); ++ if (ssz == sizeof(u64)) ++ continue; ++ ++ /* write error */ ++ pr_err("ssz %zd, %pD2\n", ssz, hinofile); ++ err = -ENOSPC; ++ if (ssz < 0) ++ err = ssz; ++ break; ++ } ++ } ++ /* regardless the error */ ++ if (pos < oldsize) { ++ err = vfsub_trunc(&hinofile->f_path, pos, /*attr*/0, hinofile); ++ AuTraceErr(err); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_dr_hino_load(struct au_dr_br *dr, struct file *hinofile) ++{ ++ int err, hidx; ++ ssize_t ssz; ++ size_t sz, n; ++ loff_t pos; ++ uint64_t u64; ++ struct au_dr_hino *ent; ++ struct inode *hinoinode; ++ struct hlist_bl_head *hbl; ++ ++ err = 0; ++ pos = 0; ++ hbl = dr->dr_h_ino; ++ hinoinode = file_inode(hinofile); ++ sz = i_size_read(hinoinode); ++ AuDebugOn(sz % sizeof(u64)); ++ n = sz / sizeof(u64); ++ while (n--) { ++ ssz = vfsub_read_k(hinofile, &u64, sizeof(u64), &pos); ++ if (unlikely(ssz != sizeof(u64))) { ++ pr_err("ssz %zd, %pD2\n", ssz, hinofile); ++ err = -EINVAL; ++ if (ssz < 0) ++ err = ssz; ++ goto out_free; ++ } ++ ++ ent = kmalloc(sizeof(*ent), GFP_NOFS); ++ if (!ent) { ++ err = -ENOMEM; ++ AuTraceErr(err); ++ goto out_free; ++ } ++ ent->dr_h_ino = be64_to_cpu((__force __be64)u64); ++ AuDbg("hi%llu, %pD2\n", ++ (unsigned long long)ent->dr_h_ino, hinofile); ++ hidx = au_dr_ihash(ent->dr_h_ino); ++ au_hbl_add(&ent->dr_hnode, hbl + hidx); ++ } ++ goto out; /* success */ ++ ++out_free: ++ au_dr_hino_free(dr); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * @bindex/@br is a switch to distinguish whether suspending hnotify or not. ++ * @path is a switch to distinguish load and store. ++ */ ++static int au_dr_hino(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_branch *br, const struct path *path) ++{ ++ int err, flags; ++ unsigned char load, suspend; ++ struct file *hinofile; ++ struct au_hinode *hdir; ++ struct inode *dir, *delegated; ++ struct path hinopath; ++ struct qstr hinoname = QSTR_INIT(AUFS_WH_DR_BRHINO, ++ sizeof(AUFS_WH_DR_BRHINO) - 1); ++ ++ AuDebugOn(bindex < 0 && !br); ++ AuDebugOn(bindex >= 0 && br); ++ ++ err = -EINVAL; ++ suspend = !br; ++ if (suspend) ++ br = au_sbr(sb, bindex); ++ load = !!path; ++ if (!load) { ++ path = &br->br_path; ++ AuDebugOn(!au_br_writable(br->br_perm)); ++ if (unlikely(!au_br_writable(br->br_perm))) ++ goto out; ++ } ++ ++ hdir = NULL; ++ if (suspend) { ++ dir = d_inode(sb->s_root); ++ hdir = au_hinode(au_ii(dir), bindex); ++ dir = hdir->hi_inode; ++ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); ++ } else { ++ dir = d_inode(path->dentry); ++ inode_lock_nested(dir, AuLsc_I_CHILD); ++ } ++ hinopath.dentry = vfsub_lkup_one(&hinoname, path->dentry); ++ err = PTR_ERR(hinopath.dentry); ++ if (IS_ERR(hinopath.dentry)) ++ goto out_unlock; ++ ++ err = 0; ++ flags = O_RDONLY; ++ if (load) { ++ if (d_is_negative(hinopath.dentry)) ++ goto out_dput; /* success */ ++ } else { ++ if (au_dr_hino_test_empty(&br->br_dirren)) { ++ if (d_is_positive(hinopath.dentry)) { ++ delegated = NULL; ++ err = vfsub_unlink(dir, &hinopath, &delegated, ++ /*force*/0); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ pr_err("ignored err %d, %pd2\n", ++ err, hinopath.dentry); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ err = 0; ++ } ++ goto out_dput; ++ } else if (!d_is_positive(hinopath.dentry)) { ++ err = vfsub_create(dir, &hinopath, 0600, ++ /*want_excl*/false); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dput; ++ } ++ flags = O_WRONLY; ++ } ++ hinopath.mnt = path->mnt; ++ hinofile = vfsub_dentry_open(&hinopath, flags); ++ if (suspend) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(dir); ++ dput(hinopath.dentry); ++ AuTraceErrPtr(hinofile); ++ if (IS_ERR(hinofile)) { ++ err = PTR_ERR(hinofile); ++ goto out; ++ } ++ ++ if (load) ++ err = au_dr_hino_load(&br->br_dirren, hinofile); ++ else ++ err = au_dr_hino_store(sb, br, hinofile); ++ fput(hinofile); ++ goto out; ++ ++out_dput: ++ dput(hinopath.dentry); ++out_unlock: ++ if (suspend) ++ au_hn_inode_unlock(hdir); ++ else ++ inode_unlock(dir); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_dr_brid_init(struct au_dr_brid *brid, const struct path *path) ++{ ++ int err; ++ struct kstatfs kstfs; ++ dev_t dev; ++ struct dentry *dentry; ++ struct super_block *sb; ++ ++ err = vfs_statfs((void *)path, &kstfs); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ /* todo: support for UUID */ ++ ++ if (kstfs.f_fsid.val[0] || kstfs.f_fsid.val[1]) { ++ brid->type = AuBrid_FSID; ++ brid->fsid = kstfs.f_fsid; ++ } else { ++ dentry = path->dentry; ++ sb = dentry->d_sb; ++ dev = sb->s_dev; ++ if (dev) { ++ brid->type = AuBrid_DEV; ++ brid->dev = dev; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++int au_dr_br_init(struct super_block *sb, struct au_branch *br, ++ const struct path *path) ++{ ++ int err, i; ++ struct au_dr_br *dr; ++ struct hlist_bl_head *hbl; ++ ++ dr = &br->br_dirren; ++ hbl = dr->dr_h_ino; ++ for (i = 0; i < AuDirren_NHASH; i++, hbl++) ++ INIT_HLIST_BL_HEAD(hbl); ++ ++ err = au_dr_brid_init(&dr->dr_brid, path); ++ if (unlikely(err)) ++ goto out; ++ ++ if (au_opt_test(au_mntflags(sb), DIRREN)) ++ err = au_dr_hino(sb, /*bindex*/-1, br, path); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_dr_br_fin(struct super_block *sb, struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ if (au_br_writable(br->br_perm)) ++ err = au_dr_hino(sb, /*bindex*/-1, br, /*path*/NULL); ++ if (!err) ++ au_dr_hino_free(&br->br_dirren); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_brid_str(struct au_dr_brid *brid, struct inode *h_inode, ++ char *buf, size_t sz) ++{ ++ int err; ++ unsigned int major, minor; ++ char *p; ++ ++ p = buf; ++ err = snprintf(p, sz, "%d_", brid->type); ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ switch (brid->type) { ++ case AuBrid_Unset: ++ return -EINVAL; ++ case AuBrid_UUID: ++ err = snprintf(p, sz, "%pU", brid->uuid.b); ++ break; ++ case AuBrid_FSID: ++ err = snprintf(p, sz, "%08x-%08x", ++ brid->fsid.val[0], brid->fsid.val[1]); ++ break; ++ case AuBrid_DEV: ++ major = MAJOR(brid->dev); ++ minor = MINOR(brid->dev); ++ if (major <= 0xff && minor <= 0xff) ++ err = snprintf(p, sz, "%02x%02x", major, minor); ++ else ++ err = snprintf(p, sz, "%03x:%05x", major, minor); ++ break; ++ } ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ err = snprintf(p, sz, "_%llu", (unsigned long long)h_inode->i_ino); ++ AuDebugOn(err > sz); ++ p += err; ++ sz -= err; ++ ++ return p - buf; ++} ++ ++static int au_drinfo_name(struct au_branch *br, char *name, int len) ++{ ++ int rlen; ++ struct dentry *br_dentry; ++ struct inode *br_inode; ++ ++ br_dentry = au_br_dentry(br); ++ br_inode = d_inode(br_dentry); ++ rlen = au_brid_str(&br->br_dirren.dr_brid, br_inode, name, len); ++ AuDebugOn(rlen >= AUFS_DIRREN_ENV_VAL_SZ); ++ AuDebugOn(rlen > len); ++ ++ return rlen; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * from the given @h_dentry, construct drinfo at @*fdata. ++ * when the size of @*fdata is not enough, reallocate and return new @fdata and ++ * @allocated. ++ */ ++static int au_drinfo_construct(struct au_drinfo_fdata **fdata, ++ struct dentry *h_dentry, ++ unsigned char *allocated) ++{ ++ int err, v; ++ struct au_drinfo_fdata *f, *p; ++ struct au_drinfo *drinfo; ++ struct inode *h_inode; ++ struct qstr *qname; ++ ++ err = 0; ++ f = *fdata; ++ h_inode = d_inode(h_dentry); ++ qname = &h_dentry->d_name; ++ drinfo = &f->drinfo; ++ drinfo->ino = (__force uint64_t)cpu_to_be64(h_inode->i_ino); ++ drinfo->oldnamelen = qname->len; ++ if (*allocated < sizeof(*f) + qname->len) { ++ v = roundup_pow_of_two(*allocated + qname->len); ++ p = au_krealloc(f, v, GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!p)) { ++ err = -ENOMEM; ++ AuTraceErr(err); ++ goto out; ++ } ++ f = p; ++ *fdata = f; ++ *allocated = v; ++ drinfo = &f->drinfo; ++ } ++ memcpy(drinfo->oldname, qname->name, qname->len); ++ AuDbg("i%llu, %.*s\n", ++ be64_to_cpu((__force __be64)drinfo->ino), drinfo->oldnamelen, ++ drinfo->oldname); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* callers have to free the return value */ ++static struct au_drinfo *au_drinfo_read_k(struct file *file, ino_t h_ino) ++{ ++ struct au_drinfo *ret, *drinfo; ++ struct au_drinfo_fdata fdata; ++ int len; ++ loff_t pos; ++ ssize_t ssz; ++ ++ ret = ERR_PTR(-EIO); ++ pos = 0; ++ ssz = vfsub_read_k(file, &fdata, sizeof(fdata), &pos); ++ if (unlikely(ssz != sizeof(fdata))) { ++ AuIOErr("ssz %zd, %u, %pD2\n", ++ ssz, (unsigned int)sizeof(fdata), file); ++ goto out; ++ } ++ ++ fdata.magic = ntohl((__force __be32)fdata.magic); ++ switch (fdata.magic) { ++ case AUFS_DRINFO_MAGIC_V1: ++ break; ++ default: ++ AuIOErr("magic-num 0x%x, 0x%x, %pD2\n", ++ fdata.magic, AUFS_DRINFO_MAGIC_V1, file); ++ goto out; ++ } ++ ++ drinfo = &fdata.drinfo; ++ len = drinfo->oldnamelen; ++ if (!len) { ++ AuIOErr("broken drinfo %pD2\n", file); ++ goto out; ++ } ++ ++ ret = NULL; ++ drinfo->ino = be64_to_cpu((__force __be64)drinfo->ino); ++ if (unlikely(h_ino && drinfo->ino != h_ino)) { ++ AuDbg("ignored i%llu, i%llu, %pD2\n", ++ (unsigned long long)drinfo->ino, ++ (unsigned long long)h_ino, file); ++ goto out; /* success */ ++ } ++ ++ ret = kmalloc(sizeof(*ret) + len, GFP_NOFS); ++ if (unlikely(!ret)) { ++ ret = ERR_PTR(-ENOMEM); ++ AuTraceErrPtr(ret); ++ goto out; ++ } ++ ++ *ret = *drinfo; ++ ssz = vfsub_read_k(file, (void *)ret->oldname, len, &pos); ++ if (unlikely(ssz != len)) { ++ kfree(ret); ++ ret = ERR_PTR(-EIO); ++ AuIOErr("ssz %zd, %u, %pD2\n", ssz, len, file); ++ goto out; ++ } ++ ++ AuDbg("oldname %.*s\n", ret->oldnamelen, ret->oldname); ++ ++out: ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* in order to be revertible */ ++struct au_drinfo_rev_elm { ++ int created; ++ struct dentry *info_dentry; ++ struct au_drinfo *info_last; ++}; ++ ++struct au_drinfo_rev { ++ unsigned char already; ++ aufs_bindex_t nelm; ++ struct au_drinfo_rev_elm elm[0]; ++}; ++ ++/* todo: isn't it too large? */ ++struct au_drinfo_store { ++ struct path h_ppath; ++ struct dentry *h_dentry; ++ struct au_drinfo_fdata *fdata; ++ char *infoname; /* inside of whname, just after PFX */ ++ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ]; ++ aufs_bindex_t btgt, btail; ++ unsigned char no_sio, ++ allocated, /* current size of *fdata */ ++ infonamelen, /* room size for p */ ++ whnamelen, /* length of the genarated name */ ++ renameback; /* renamed back */ ++}; ++ ++/* on rename(2) error, the caller should revert it using @elm */ ++static int au_drinfo_do_store(struct au_drinfo_store *w, ++ struct au_drinfo_rev_elm *elm) ++{ ++ int err, len; ++ ssize_t ssz; ++ loff_t pos; ++ struct path infopath = { ++ .mnt = w->h_ppath.mnt ++ }; ++ struct inode *h_dir, *h_inode, *delegated; ++ struct file *infofile; ++ struct qstr *qname; ++ ++ AuDebugOn(elm ++ && memcmp(elm, page_address(ZERO_PAGE(0)), sizeof(*elm))); ++ ++ infopath.dentry = vfsub_lookup_one_len(w->whname, w->h_ppath.dentry, ++ w->whnamelen); ++ AuTraceErrPtr(infopath.dentry); ++ if (IS_ERR(infopath.dentry)) { ++ err = PTR_ERR(infopath.dentry); ++ goto out; ++ } ++ ++ err = 0; ++ h_dir = d_inode(w->h_ppath.dentry); ++ if (elm && d_is_negative(infopath.dentry)) { ++ err = vfsub_create(h_dir, &infopath, 0600, /*want_excl*/true); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dput; ++ elm->created = 1; ++ elm->info_dentry = dget(infopath.dentry); ++ } ++ ++ infofile = vfsub_dentry_open(&infopath, O_RDWR); ++ AuTraceErrPtr(infofile); ++ if (IS_ERR(infofile)) { ++ err = PTR_ERR(infofile); ++ goto out_dput; ++ } ++ ++ h_inode = d_inode(infopath.dentry); ++ if (elm && i_size_read(h_inode)) { ++ h_inode = d_inode(w->h_dentry); ++ elm->info_last = au_drinfo_read_k(infofile, h_inode->i_ino); ++ AuTraceErrPtr(elm->info_last); ++ if (IS_ERR(elm->info_last)) { ++ err = PTR_ERR(elm->info_last); ++ elm->info_last = NULL; ++ AuDebugOn(elm->info_dentry); ++ goto out_fput; ++ } ++ } ++ ++ if (elm && w->renameback) { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &infopath, &delegated, /*force*/0); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ goto out_fput; ++ } ++ ++ pos = 0; ++ qname = &w->h_dentry->d_name; ++ len = sizeof(*w->fdata) + qname->len; ++ if (!elm) ++ len = sizeof(*w->fdata) + w->fdata->drinfo.oldnamelen; ++ ssz = vfsub_write_k(infofile, w->fdata, len, &pos); ++ if (ssz == len) { ++ AuDbg("hi%llu, %.*s\n", w->fdata->drinfo.ino, ++ w->fdata->drinfo.oldnamelen, w->fdata->drinfo.oldname); ++ goto out_fput; /* success */ ++ } else { ++ err = -EIO; ++ if (ssz < 0) ++ err = ssz; ++ /* the caller should revert it using @elm */ ++ } ++ ++out_fput: ++ fput(infofile); ++out_dput: ++ dput(infopath.dentry); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++struct au_call_drinfo_do_store_args { ++ int *errp; ++ struct au_drinfo_store *w; ++ struct au_drinfo_rev_elm *elm; ++}; ++ ++static void au_call_drinfo_do_store(void *args) ++{ ++ struct au_call_drinfo_do_store_args *a = args; ++ ++ *a->errp = au_drinfo_do_store(a->w, a->elm); ++} ++ ++static int au_drinfo_store_sio(struct au_drinfo_store *w, ++ struct au_drinfo_rev_elm *elm) ++{ ++ int err, wkq_err; ++ ++ if (w->no_sio) ++ err = au_drinfo_do_store(w, elm); ++ else { ++ struct au_call_drinfo_do_store_args a = { ++ .errp = &err, ++ .w = w, ++ .elm = elm ++ }; ++ wkq_err = au_wkq_wait(au_call_drinfo_do_store, &a); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ AuTraceErr(err); ++ ++ return err; ++} ++ ++static int au_drinfo_store_work_init(struct au_drinfo_store *w, ++ aufs_bindex_t btgt) ++{ ++ int err; ++ ++ memset(w, 0, sizeof(*w)); ++ w->allocated = roundup_pow_of_two(sizeof(*w->fdata) + 40); ++ strcpy(w->whname, AUFS_WH_DR_INFO_PFX); ++ w->infoname = w->whname + sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ w->infonamelen = sizeof(w->whname) - sizeof(AUFS_WH_DR_INFO_PFX); ++ w->btgt = btgt; ++ w->no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); ++ ++ err = -ENOMEM; ++ w->fdata = kcalloc(1, w->allocated, GFP_NOFS); ++ if (unlikely(!w->fdata)) { ++ AuTraceErr(err); ++ goto out; ++ } ++ w->fdata->magic = (__force uint32_t)htonl(AUFS_DRINFO_MAGIC_V1); ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static void au_drinfo_store_work_fin(struct au_drinfo_store *w) ++{ ++ kfree(w->fdata); ++} ++ ++static void au_drinfo_store_rev(struct au_drinfo_rev *rev, ++ struct au_drinfo_store *w) ++{ ++ struct au_drinfo_rev_elm *elm; ++ struct inode *h_dir, *delegated; ++ int err, nelm; ++ struct path infopath = { ++ .mnt = w->h_ppath.mnt ++ }; ++ ++ h_dir = d_inode(w->h_ppath.dentry); ++ IMustLock(h_dir); ++ ++ err = 0; ++ elm = rev->elm; ++ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { ++ AuDebugOn(elm->created && elm->info_last); ++ if (elm->created) { ++ AuDbg("here\n"); ++ delegated = NULL; ++ infopath.dentry = elm->info_dentry; ++ err = vfsub_unlink(h_dir, &infopath, &delegated, ++ !w->no_sio); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) ++ iput(delegated); ++ dput(elm->info_dentry); ++ } else if (elm->info_last) { ++ AuDbg("here\n"); ++ w->fdata->drinfo = *elm->info_last; ++ memcpy(w->fdata->drinfo.oldname, ++ elm->info_last->oldname, ++ elm->info_last->oldnamelen); ++ err = au_drinfo_store_sio(w, /*elm*/NULL); ++ kfree(elm->info_last); ++ } ++ if (unlikely(err)) ++ AuIOErr("%d, %s\n", err, w->whname); ++ /* go on even if err */ ++ } ++} ++ ++/* caller has to call au_dr_rename_fin() later */ ++static int au_drinfo_store(struct dentry *dentry, aufs_bindex_t btgt, ++ struct qstr *dst_name, void *_rev) ++{ ++ int err, sz, nelm; ++ aufs_bindex_t bindex, btail; ++ struct au_drinfo_store work; ++ struct au_drinfo_rev *rev, **p; ++ struct au_drinfo_rev_elm *elm; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_hinode *hdir; ++ ++ err = au_drinfo_store_work_init(&work, btgt); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOMEM; ++ btail = au_dbtaildir(dentry); ++ nelm = btail - btgt; ++ sz = sizeof(*rev) + sizeof(*elm) * nelm; ++ rev = kcalloc(1, sz, GFP_NOFS); ++ if (unlikely(!rev)) { ++ AuTraceErr(err); ++ goto out_args; ++ } ++ rev->nelm = nelm; ++ elm = rev->elm; ++ p = _rev; ++ *p = rev; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ work.h_ppath.dentry = au_h_dptr(dentry, btgt); ++ work.h_ppath.mnt = au_sbr_mnt(sb, btgt); ++ hdir = au_hi(d_inode(dentry), btgt); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_CHILD); ++ for (bindex = btgt + 1; bindex <= btail; bindex++, elm++) { ++ work.h_dentry = au_h_dptr(dentry, bindex); ++ if (!work.h_dentry) ++ continue; ++ ++ err = au_drinfo_construct(&work.fdata, work.h_dentry, ++ &work.allocated); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ break; ++ ++ work.renameback = au_qstreq(&work.h_dentry->d_name, dst_name); ++ br = au_sbr(sb, bindex); ++ work.whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ work.whnamelen += au_drinfo_name(br, work.infoname, ++ work.infonamelen); ++ AuDbg("whname %.*s, i%llu, %.*s\n", ++ work.whnamelen, work.whname, ++ be64_to_cpu((__force __be64)work.fdata->drinfo.ino), ++ work.fdata->drinfo.oldnamelen, ++ work.fdata->drinfo.oldname); ++ ++ err = au_drinfo_store_sio(&work, elm); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ break; ++ } ++ if (unlikely(err)) { ++ /* revert all drinfo */ ++ au_drinfo_store_rev(rev, &work); ++ kfree(rev); ++ *p = NULL; ++ } ++ au_hn_inode_unlock(hdir); ++ ++out_args: ++ au_drinfo_store_work_fin(&work); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev) ++{ ++ int err, already; ++ ino_t ino; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_dr_br *dr; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_dr_hino *ent; ++ struct au_drinfo_rev *rev, **p; ++ ++ AuDbg("bindex %d\n", bindex); ++ ++ err = -ENOMEM; ++ ent = kmalloc(sizeof(*ent), GFP_NOFS); ++ if (unlikely(!ent)) ++ goto out; ++ ++ sb = src->d_sb; ++ br = au_sbr(sb, bindex); ++ dr = &br->br_dirren; ++ h_dentry = au_h_dptr(src, bindex); ++ h_inode = d_inode(h_dentry); ++ ino = h_inode->i_ino; ++ ent->dr_h_ino = ino; ++ already = au_dr_hino_test_add(dr, ino, ent); ++ AuDbg("b%d, hi%llu, already %d\n", ++ bindex, (unsigned long long)ino, already); ++ ++ err = au_drinfo_store(src, bindex, dst_name, _rev); ++ AuTraceErr(err); ++ if (!err) { ++ p = _rev; ++ rev = *p; ++ rev->already = already; ++ goto out; /* success */ ++ } ++ ++ /* revert */ ++ if (!already) ++ au_dr_hino_del(dr, ent); ++ kfree(ent); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *_rev) ++{ ++ struct au_drinfo_rev *rev; ++ struct au_drinfo_rev_elm *elm; ++ int nelm; ++ ++ rev = _rev; ++ elm = rev->elm; ++ for (nelm = rev->nelm; nelm > 0; nelm--, elm++) { ++ dput(elm->info_dentry); ++ kfree(elm->info_last); ++ } ++ kfree(rev); ++} ++ ++void au_dr_rename_rev(struct dentry *src, aufs_bindex_t btgt, void *_rev) ++{ ++ int err; ++ struct au_drinfo_store work; ++ struct au_drinfo_rev *rev = _rev; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct inode *h_inode; ++ struct au_dr_br *dr; ++ struct au_dr_hino *ent; ++ ++ err = au_drinfo_store_work_init(&work, btgt); ++ if (unlikely(err)) ++ goto out; ++ ++ sb = src->d_sb; ++ br = au_sbr(sb, btgt); ++ work.h_ppath.dentry = au_h_dptr(src, btgt); ++ work.h_ppath.mnt = au_br_mnt(br); ++ au_drinfo_store_rev(rev, &work); ++ au_drinfo_store_work_fin(&work); ++ if (rev->already) ++ goto out; ++ ++ dr = &br->br_dirren; ++ h_inode = d_inode(work.h_ppath.dentry); ++ ent = au_dr_hino_find(dr, h_inode->i_ino); ++ BUG_ON(!ent); ++ au_dr_hino_del(dr, ent); ++ kfree(ent); ++ ++out: ++ kfree(rev); ++ if (unlikely(err)) ++ pr_err("failed to remove dirren info\n"); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct au_drinfo *au_drinfo_do_load(struct path *h_ppath, ++ char *whname, int whnamelen, ++ struct dentry **info_dentry) ++{ ++ struct au_drinfo *drinfo; ++ struct file *f; ++ struct inode *h_dir; ++ struct path infopath; ++ int unlocked; ++ ++ AuDbg("%pd/%.*s\n", h_ppath->dentry, whnamelen, whname); ++ ++ *info_dentry = NULL; ++ drinfo = NULL; ++ unlocked = 0; ++ h_dir = d_inode(h_ppath->dentry); ++ vfsub_inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ infopath.dentry = vfsub_lookup_one_len(whname, h_ppath->dentry, ++ whnamelen); ++ if (IS_ERR(infopath.dentry)) { ++ drinfo = (void *)infopath.dentry; ++ goto out; ++ } ++ ++ if (d_is_negative(infopath.dentry)) ++ goto out_dput; /* success */ ++ ++ infopath.mnt = h_ppath->mnt; ++ f = vfsub_dentry_open(&infopath, O_RDONLY); ++ inode_unlock_shared(h_dir); ++ unlocked = 1; ++ if (IS_ERR(f)) { ++ drinfo = (void *)f; ++ goto out_dput; ++ } ++ ++ drinfo = au_drinfo_read_k(f, /*h_ino*/0); ++ if (IS_ERR_OR_NULL(drinfo)) ++ goto out_fput; ++ ++ AuDbg("oldname %.*s\n", drinfo->oldnamelen, drinfo->oldname); ++ *info_dentry = dget(infopath.dentry); /* keep it alive */ ++ ++out_fput: ++ fput(f); ++out_dput: ++ dput(infopath.dentry); ++out: ++ if (!unlocked) ++ inode_unlock_shared(h_dir); ++ AuTraceErrPtr(drinfo); ++ return drinfo; ++} ++ ++struct au_drinfo_do_load_args { ++ struct au_drinfo **drinfop; ++ struct path *h_ppath; ++ char *whname; ++ int whnamelen; ++ struct dentry **info_dentry; ++}; ++ ++static void au_call_drinfo_do_load(void *args) ++{ ++ struct au_drinfo_do_load_args *a = args; ++ ++ *a->drinfop = au_drinfo_do_load(a->h_ppath, a->whname, a->whnamelen, ++ a->info_dentry); ++} ++ ++struct au_drinfo_load { ++ struct path h_ppath; ++ struct qstr *qname; ++ unsigned char no_sio; ++ ++ aufs_bindex_t ninfo; ++ struct au_drinfo **drinfo; ++}; ++ ++static int au_drinfo_load(struct au_drinfo_load *w, aufs_bindex_t bindex, ++ struct au_branch *br) ++{ ++ int err, wkq_err, whnamelen, e; ++ char whname[sizeof(AUFS_WH_DR_INFO_PFX) + AUFS_DIRREN_ENV_VAL_SZ] ++ = AUFS_WH_DR_INFO_PFX; ++ struct au_drinfo *drinfo; ++ struct qstr oldname; ++ struct inode *h_dir, *delegated; ++ struct dentry *info_dentry; ++ struct path infopath; ++ ++ whnamelen = sizeof(AUFS_WH_DR_INFO_PFX) - 1; ++ whnamelen += au_drinfo_name(br, whname + whnamelen, ++ sizeof(whname) - whnamelen); ++ if (w->no_sio) ++ drinfo = au_drinfo_do_load(&w->h_ppath, whname, whnamelen, ++ &info_dentry); ++ else { ++ struct au_drinfo_do_load_args args = { ++ .drinfop = &drinfo, ++ .h_ppath = &w->h_ppath, ++ .whname = whname, ++ .whnamelen = whnamelen, ++ .info_dentry = &info_dentry ++ }; ++ wkq_err = au_wkq_wait(au_call_drinfo_do_load, &args); ++ if (unlikely(wkq_err)) ++ drinfo = ERR_PTR(wkq_err); ++ } ++ err = PTR_ERR(drinfo); ++ if (IS_ERR_OR_NULL(drinfo)) ++ goto out; ++ ++ err = 0; ++ oldname.len = drinfo->oldnamelen; ++ oldname.name = drinfo->oldname; ++ if (au_qstreq(w->qname, &oldname)) { ++ /* the name is renamed back */ ++ kfree(drinfo); ++ drinfo = NULL; ++ ++ infopath.dentry = info_dentry; ++ infopath.mnt = w->h_ppath.mnt; ++ h_dir = d_inode(w->h_ppath.dentry); ++ delegated = NULL; ++ inode_lock_nested(h_dir, AuLsc_I_PARENT); ++ e = vfsub_unlink(h_dir, &infopath, &delegated, !w->no_sio); ++ inode_unlock(h_dir); ++ if (unlikely(e)) ++ AuIOErr("ignored %d, %pd2\n", e, &infopath.dentry); ++ if (unlikely(e == -EWOULDBLOCK)) ++ iput(delegated); ++ } ++ kfree(w->drinfo[bindex]); ++ w->drinfo[bindex] = drinfo; ++ dput(info_dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_dr_lkup_free(struct au_drinfo **drinfo, int n) ++{ ++ struct au_drinfo **p = drinfo; ++ ++ while (n-- > 0) ++ kfree(*drinfo++); ++ kfree(p); ++} ++ ++int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t btgt) ++{ ++ int err, ninfo; ++ struct au_drinfo_load w; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ struct inode *h_dir; ++ struct au_dr_hino *ent; ++ struct super_block *sb; ++ ++ AuDbg("%.*s, name %.*s, whname %.*s, b%d\n", ++ AuLNPair(&dentry->d_name), AuLNPair(&lkup->dirren.dr_name), ++ AuLNPair(&lkup->whname), btgt); ++ ++ sb = dentry->d_sb; ++ bbot = au_sbbot(sb); ++ w.ninfo = bbot + 1; ++ if (!lkup->dirren.drinfo) { ++ lkup->dirren.drinfo = kcalloc(w.ninfo, ++ sizeof(*lkup->dirren.drinfo), ++ GFP_NOFS); ++ if (unlikely(!lkup->dirren.drinfo)) { ++ err = -ENOMEM; ++ goto out; ++ } ++ lkup->dirren.ninfo = w.ninfo; ++ } ++ w.drinfo = lkup->dirren.drinfo; ++ w.no_sio = !!uid_eq(current_fsuid(), GLOBAL_ROOT_UID); ++ w.h_ppath.dentry = au_h_dptr(dentry, btgt); ++ AuDebugOn(!w.h_ppath.dentry); ++ w.h_ppath.mnt = au_sbr_mnt(sb, btgt); ++ w.qname = &dentry->d_name; ++ ++ ninfo = 0; ++ for (bindex = btgt + 1; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_drinfo_load(&w, bindex, br); ++ if (unlikely(err)) ++ goto out_free; ++ if (w.drinfo[bindex]) ++ ninfo++; ++ } ++ if (!ninfo) { ++ br = au_sbr(sb, btgt); ++ h_dir = d_inode(w.h_ppath.dentry); ++ ent = au_dr_hino_find(&br->br_dirren, h_dir->i_ino); ++ AuDebugOn(!ent); ++ au_dr_hino_del(&br->br_dirren, ent); ++ kfree(ent); ++ } ++ goto out; /* success */ ++ ++out_free: ++ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); ++ lkup->dirren.ninfo = 0; ++ lkup->dirren.drinfo = NULL; ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_dr_lkup_fin(struct au_do_lookup_args *lkup) ++{ ++ au_dr_lkup_free(lkup->dirren.drinfo, lkup->dirren.ninfo); ++} ++ ++int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt) ++{ ++ int err; ++ struct au_drinfo *drinfo; ++ ++ err = 0; ++ if (!lkup->dirren.drinfo) ++ goto out; ++ AuDebugOn(lkup->dirren.ninfo < btgt + 1); ++ drinfo = lkup->dirren.drinfo[btgt + 1]; ++ if (!drinfo) ++ goto out; ++ ++ kfree(lkup->whname.name); ++ lkup->whname.name = NULL; ++ lkup->dirren.dr_name.len = drinfo->oldnamelen; ++ lkup->dirren.dr_name.name = drinfo->oldname; ++ lkup->name = &lkup->dirren.dr_name; ++ err = au_wh_name_alloc(&lkup->whname, lkup->name); ++ if (!err) ++ AuDbg("name %.*s, whname %.*s, b%d\n", ++ AuLNPair(lkup->name), AuLNPair(&lkup->whname), ++ btgt); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, ++ ino_t h_ino) ++{ ++ int match; ++ struct au_drinfo *drinfo; ++ ++ match = 1; ++ if (!lkup->dirren.drinfo) ++ goto out; ++ AuDebugOn(lkup->dirren.ninfo < bindex + 1); ++ drinfo = lkup->dirren.drinfo[bindex + 1]; ++ if (!drinfo) ++ goto out; ++ ++ match = (drinfo->ino == h_ino); ++ AuDbg("match %d\n", match); ++ ++out: ++ return match; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dr_opt_set(struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_dr_hino(sb, bindex, /*br*/NULL, &br->br_path); ++ } ++ ++ return err; ++} ++ ++int au_dr_opt_flush(struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm)) ++ err = au_dr_hino(sb, bindex, /*br*/NULL, /*path*/NULL); ++ } ++ ++ return err; ++} ++ ++int au_dr_opt_clr(struct super_block *sb, int no_flush) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ err = 0; ++ if (!no_flush) { ++ err = au_dr_opt_flush(sb); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ au_dr_hino_free(&br->br_dirren); ++ } ++ ++out: ++ return err; ++} +diff -Naur null/fs/aufs/dirren.h linux-4.15/fs/aufs/dirren.h +--- /dev/null ++++ linux-4.15/fs/aufs/dirren.h 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,139 @@ ++/* ++ * Copyright (C) 2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * renamed dir info ++ */ ++ ++#ifndef __AUFS_DIRREN_H__ ++#define __AUFS_DIRREN_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include "hbl.h" ++ ++#define AuDirren_NHASH 100 ++ ++#ifdef CONFIG_AUFS_DIRREN ++enum au_brid_type { ++ AuBrid_Unset, ++ AuBrid_UUID, ++ AuBrid_FSID, ++ AuBrid_DEV ++}; ++ ++struct au_dr_brid { ++ enum au_brid_type type; ++ union { ++ uuid_t uuid; /* unimplemented yet */ ++ fsid_t fsid; ++ dev_t dev; ++ }; ++}; ++ ++/* 20 is the max digits length of ulong 64 */ ++/* brid-type "_" uuid "_" inum */ ++#define AUFS_DIRREN_FNAME_SZ (1 + 1 + UUID_STRING_LEN + 20) ++#define AUFS_DIRREN_ENV_VAL_SZ (AUFS_DIRREN_FNAME_SZ + 1 + 20) ++ ++struct au_dr_hino { ++ struct hlist_bl_node dr_hnode; ++ ino_t dr_h_ino; ++}; ++ ++struct au_dr_br { ++ struct hlist_bl_head dr_h_ino[AuDirren_NHASH]; ++ struct au_dr_brid dr_brid; ++}; ++ ++struct au_dr_lookup { ++ /* dr_name is pointed by struct au_do_lookup_args.name */ ++ struct qstr dr_name; /* subset of dr_info */ ++ aufs_bindex_t ninfo; ++ struct au_drinfo **drinfo; ++}; ++#else ++struct au_dr_hino; ++/* empty */ ++struct au_dr_br { }; ++struct au_dr_lookup { }; ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_branch; ++struct au_do_lookup_args; ++struct au_hinode; ++#ifdef CONFIG_AUFS_DIRREN ++int au_dr_hino_test_add(struct au_dr_br *dr, ino_t h_ino, ++ struct au_dr_hino *add_ent); ++void au_dr_hino_free(struct au_dr_br *dr); ++int au_dr_br_init(struct super_block *sb, struct au_branch *br, ++ const struct path *path); ++int au_dr_br_fin(struct super_block *sb, struct au_branch *br); ++int au_dr_rename(struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev); ++void au_dr_rename_fin(struct dentry *src, aufs_bindex_t btgt, void *rev); ++void au_dr_rename_rev(struct dentry *src, aufs_bindex_t bindex, void *rev); ++int au_dr_lkup(struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t bindex); ++int au_dr_lkup_name(struct au_do_lookup_args *lkup, aufs_bindex_t btgt); ++int au_dr_lkup_h_ino(struct au_do_lookup_args *lkup, aufs_bindex_t bindex, ++ ino_t h_ino); ++void au_dr_lkup_fin(struct au_do_lookup_args *lkup); ++int au_dr_opt_set(struct super_block *sb); ++int au_dr_opt_flush(struct super_block *sb); ++int au_dr_opt_clr(struct super_block *sb, int no_flush); ++#else ++AuStubInt0(au_dr_hino_test_add, struct au_dr_br *dr, ino_t h_ino, ++ struct au_dr_hino *add_ent); ++AuStubVoid(au_dr_hino_free, struct au_dr_br *dr); ++AuStubInt0(au_dr_br_init, struct super_block *sb, struct au_branch *br, ++ const struct path *path); ++AuStubInt0(au_dr_br_fin, struct super_block *sb, struct au_branch *br); ++AuStubInt0(au_dr_rename, struct dentry *src, aufs_bindex_t bindex, ++ struct qstr *dst_name, void *_rev); ++AuStubVoid(au_dr_rename_fin, struct dentry *src, aufs_bindex_t btgt, void *rev); ++AuStubVoid(au_dr_rename_rev, struct dentry *src, aufs_bindex_t bindex, ++ void *rev); ++AuStubInt0(au_dr_lkup, struct au_do_lookup_args *lkup, struct dentry *dentry, ++ aufs_bindex_t bindex); ++AuStubInt0(au_dr_lkup_name, struct au_do_lookup_args *lkup, aufs_bindex_t btgt); ++AuStubInt0(au_dr_lkup_h_ino, struct au_do_lookup_args *lkup, ++ aufs_bindex_t bindex, ino_t h_ino); ++AuStubVoid(au_dr_lkup_fin, struct au_do_lookup_args *lkup); ++AuStubInt0(au_dr_opt_set, struct super_block *sb); ++AuStubInt0(au_dr_opt_flush, struct super_block *sb); ++AuStubInt0(au_dr_opt_clr, struct super_block *sb, int no_flush); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_DIRREN ++static inline int au_dr_ihash(ino_t h_ino) ++{ ++ return h_ino % AuDirren_NHASH; ++} ++#else ++AuStubInt0(au_dr_ihash, ino_t h_ino); ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DIRREN_H__ */ +diff -Naur null/fs/aufs/dynop.c linux-4.15/fs/aufs/dynop.c +--- /dev/null ++++ linux-4.15/fs/aufs/dynop.c 2018-02-25 02:38:09.199737576 +0100 +@@ -0,0 +1,369 @@ ++/* ++ * Copyright (C) 2010-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * dynamically customizable operations for regular files ++ */ ++ ++#include "aufs.h" ++ ++#define DyPrSym(key) AuDbgSym(key->dk_op.dy_hop) ++ ++/* ++ * How large will these lists be? ++ * Usually just a few elements, 20-30 at most for each, I guess. ++ */ ++static struct hlist_bl_head dynop[AuDyLast]; ++ ++static struct au_dykey *dy_gfind_get(struct hlist_bl_head *hbl, ++ const void *h_op) ++{ ++ struct au_dykey *key, *tmp; ++ struct hlist_bl_node *pos; ++ ++ key = NULL; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) ++ if (tmp->dk_op.dy_hop == h_op) { ++ key = tmp; ++ kref_get(&key->dk_kref); ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ ++ return key; ++} ++ ++static struct au_dykey *dy_bradd(struct au_branch *br, struct au_dykey *key) ++{ ++ struct au_dykey **k, *found; ++ const void *h_op = key->dk_op.dy_hop; ++ int i; ++ ++ found = NULL; ++ k = br->br_dykey; ++ for (i = 0; i < AuBrDynOp; i++) ++ if (k[i]) { ++ if (k[i]->dk_op.dy_hop == h_op) { ++ found = k[i]; ++ break; ++ } ++ } else ++ break; ++ if (!found) { ++ spin_lock(&br->br_dykey_lock); ++ for (; i < AuBrDynOp; i++) ++ if (k[i]) { ++ if (k[i]->dk_op.dy_hop == h_op) { ++ found = k[i]; ++ break; ++ } ++ } else { ++ k[i] = key; ++ break; ++ } ++ spin_unlock(&br->br_dykey_lock); ++ BUG_ON(i == AuBrDynOp); /* expand the array */ ++ } ++ ++ return found; ++} ++ ++/* kref_get() if @key is already added */ ++static struct au_dykey *dy_gadd(struct hlist_bl_head *hbl, struct au_dykey *key) ++{ ++ struct au_dykey *tmp, *found; ++ struct hlist_bl_node *pos; ++ const void *h_op = key->dk_op.dy_hop; ++ ++ found = NULL; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(tmp, pos, hbl, dk_hnode) ++ if (tmp->dk_op.dy_hop == h_op) { ++ kref_get(&tmp->dk_kref); ++ found = tmp; ++ break; ++ } ++ if (!found) ++ hlist_bl_add_head(&key->dk_hnode, hbl); ++ hlist_bl_unlock(hbl); ++ ++ if (!found) ++ DyPrSym(key); ++ return found; ++} ++ ++static void dy_free_rcu(struct rcu_head *rcu) ++{ ++ struct au_dykey *key; ++ ++ key = container_of(rcu, struct au_dykey, dk_rcu); ++ DyPrSym(key); ++ kfree(key); ++} ++ ++static void dy_free(struct kref *kref) ++{ ++ struct au_dykey *key; ++ struct hlist_bl_head *hbl; ++ ++ key = container_of(kref, struct au_dykey, dk_kref); ++ hbl = dynop + key->dk_op.dy_type; ++ au_hbl_del(&key->dk_hnode, hbl); ++ call_rcu(&key->dk_rcu, dy_free_rcu); ++} ++ ++void au_dy_put(struct au_dykey *key) ++{ ++ kref_put(&key->dk_kref, dy_free); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define DyDbgSize(cnt, op) AuDebugOn(cnt != sizeof(op)/sizeof(void *)) ++ ++#ifdef CONFIG_AUFS_DEBUG ++#define DyDbgDeclare(cnt) unsigned int cnt = 0 ++#define DyDbgInc(cnt) do { cnt++; } while (0) ++#else ++#define DyDbgDeclare(cnt) do {} while (0) ++#define DyDbgInc(cnt) do {} while (0) ++#endif ++ ++#define DySet(func, dst, src, h_op, h_sb) do { \ ++ DyDbgInc(cnt); \ ++ if (h_op->func) { \ ++ if (src.func) \ ++ dst.func = src.func; \ ++ else \ ++ AuDbg("%s %s\n", au_sbtype(h_sb), #func); \ ++ } \ ++} while (0) ++ ++#define DySetForce(func, dst, src) do { \ ++ AuDebugOn(!src.func); \ ++ DyDbgInc(cnt); \ ++ dst.func = src.func; \ ++} while (0) ++ ++#define DySetAop(func) \ ++ DySet(func, dyaop->da_op, aufs_aop, h_aop, h_sb) ++#define DySetAopForce(func) \ ++ DySetForce(func, dyaop->da_op, aufs_aop) ++ ++static void dy_aop(struct au_dykey *key, const void *h_op, ++ struct super_block *h_sb __maybe_unused) ++{ ++ struct au_dyaop *dyaop = (void *)key; ++ const struct address_space_operations *h_aop = h_op; ++ DyDbgDeclare(cnt); ++ ++ AuDbg("%s\n", au_sbtype(h_sb)); ++ ++ DySetAop(writepage); ++ DySetAopForce(readpage); /* force */ ++ DySetAop(writepages); ++ DySetAop(set_page_dirty); ++ DySetAop(readpages); ++ DySetAop(write_begin); ++ DySetAop(write_end); ++ DySetAop(bmap); ++ DySetAop(invalidatepage); ++ DySetAop(releasepage); ++ DySetAop(freepage); ++ /* this one will be changed according to an aufs mount option */ ++ DySetAop(direct_IO); ++ DySetAop(migratepage); ++ DySetAop(isolate_page); ++ DySetAop(putback_page); ++ DySetAop(launder_page); ++ DySetAop(is_partially_uptodate); ++ DySetAop(is_dirty_writeback); ++ DySetAop(error_remove_page); ++ DySetAop(swap_activate); ++ DySetAop(swap_deactivate); ++ ++ DyDbgSize(cnt, *h_aop); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void dy_bug(struct kref *kref) ++{ ++ BUG(); ++} ++ ++static struct au_dykey *dy_get(struct au_dynop *op, struct au_branch *br) ++{ ++ struct au_dykey *key, *old; ++ struct hlist_bl_head *hbl; ++ struct op { ++ unsigned int sz; ++ void (*set)(struct au_dykey *key, const void *h_op, ++ struct super_block *h_sb __maybe_unused); ++ }; ++ static const struct op a[] = { ++ [AuDy_AOP] = { ++ .sz = sizeof(struct au_dyaop), ++ .set = dy_aop ++ } ++ }; ++ const struct op *p; ++ ++ hbl = dynop + op->dy_type; ++ key = dy_gfind_get(hbl, op->dy_hop); ++ if (key) ++ goto out_add; /* success */ ++ ++ p = a + op->dy_type; ++ key = kzalloc(p->sz, GFP_NOFS); ++ if (unlikely(!key)) { ++ key = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ key->dk_op.dy_hop = op->dy_hop; ++ kref_init(&key->dk_kref); ++ p->set(key, op->dy_hop, au_br_sb(br)); ++ old = dy_gadd(hbl, key); ++ if (old) { ++ kfree(key); ++ key = old; ++ } ++ ++out_add: ++ old = dy_bradd(br, key); ++ if (old) ++ /* its ref-count should never be zero here */ ++ kref_put(&key->dk_kref, dy_bug); ++out: ++ return key; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * Aufs prohibits O_DIRECT by defaut even if the branch supports it. ++ * This behaviour is necessary to return an error from open(O_DIRECT) instead ++ * of the succeeding I/O. The dio mount option enables O_DIRECT and makes ++ * open(O_DIRECT) always succeed, but the succeeding I/O may return an error. ++ * See the aufs manual in detail. ++ */ ++static void dy_adx(struct au_dyaop *dyaop, int do_dx) ++{ ++ if (!do_dx) ++ dyaop->da_op.direct_IO = NULL; ++ else ++ dyaop->da_op.direct_IO = aufs_aop.direct_IO; ++} ++ ++static struct au_dyaop *dy_aget(struct au_branch *br, ++ const struct address_space_operations *h_aop, ++ int do_dx) ++{ ++ struct au_dyaop *dyaop; ++ struct au_dynop op; ++ ++ op.dy_type = AuDy_AOP; ++ op.dy_haop = h_aop; ++ dyaop = (void *)dy_get(&op, br); ++ if (IS_ERR(dyaop)) ++ goto out; ++ dy_adx(dyaop, do_dx); ++ ++out: ++ return dyaop; ++} ++ ++int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode) ++{ ++ int err, do_dx; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_dyaop *dyaop; ++ ++ AuDebugOn(!S_ISREG(h_inode->i_mode)); ++ IiMustWriteLock(inode); ++ ++ sb = inode->i_sb; ++ br = au_sbr(sb, bindex); ++ do_dx = !!au_opt_test(au_mntflags(sb), DIO); ++ dyaop = dy_aget(br, h_inode->i_mapping->a_ops, do_dx); ++ err = PTR_ERR(dyaop); ++ if (IS_ERR(dyaop)) ++ /* unnecessary to call dy_fput() */ ++ goto out; ++ ++ err = 0; ++ inode->i_mapping->a_ops = &dyaop->da_op; ++ ++out: ++ return err; ++} ++ ++/* ++ * Is it safe to replace a_ops during the inode/file is in operation? ++ * Yes, I hope so. ++ */ ++int au_dy_irefresh(struct inode *inode) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct inode *h_inode; ++ ++ err = 0; ++ if (S_ISREG(inode->i_mode)) { ++ btop = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, btop); ++ err = au_dy_iaop(inode, btop, h_inode); ++ } ++ return err; ++} ++ ++void au_dy_arefresh(int do_dx) ++{ ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_dykey *key; ++ ++ hbl = dynop + AuDy_AOP; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(key, pos, hbl, dk_hnode) ++ dy_adx((void *)key, do_dx); ++ hlist_bl_unlock(hbl); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void __init au_dy_init(void) ++{ ++ int i; ++ ++ /* make sure that 'struct au_dykey *' can be any type */ ++ BUILD_BUG_ON(offsetof(struct au_dyaop, da_key)); ++ ++ for (i = 0; i < AuDyLast; i++) ++ INIT_HLIST_BL_HEAD(dynop + i); ++} ++ ++void au_dy_fin(void) ++{ ++ int i; ++ ++ for (i = 0; i < AuDyLast; i++) ++ WARN_ON(!hlist_bl_empty(dynop + i)); ++} +diff -Naur null/fs/aufs/dynop.h linux-4.15/fs/aufs/dynop.h +--- /dev/null ++++ linux-4.15/fs/aufs/dynop.h 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (C) 2010-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * dynamically customizable operations (for regular files only) ++ */ ++ ++#ifndef __AUFS_DYNOP_H__ ++#define __AUFS_DYNOP_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++ ++enum {AuDy_AOP, AuDyLast}; ++ ++struct au_dynop { ++ int dy_type; ++ union { ++ const void *dy_hop; ++ const struct address_space_operations *dy_haop; ++ }; ++}; ++ ++struct au_dykey { ++ union { ++ struct hlist_bl_node dk_hnode; ++ struct rcu_head dk_rcu; ++ }; ++ struct au_dynop dk_op; ++ ++ /* ++ * during I am in the branch local array, kref is gotten. when the ++ * branch is removed, kref is put. ++ */ ++ struct kref dk_kref; ++}; ++ ++/* stop unioning since their sizes are very different from each other */ ++struct au_dyaop { ++ struct au_dykey da_key; ++ struct address_space_operations da_op; /* not const */ ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dynop.c */ ++struct au_branch; ++void au_dy_put(struct au_dykey *key); ++int au_dy_iaop(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode); ++int au_dy_irefresh(struct inode *inode); ++void au_dy_arefresh(int do_dio); ++ ++void __init au_dy_init(void); ++void au_dy_fin(void); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_DYNOP_H__ */ +diff -Naur null/fs/aufs/export.c linux-4.15/fs/aufs/export.c +--- /dev/null ++++ linux-4.15/fs/aufs/export.c 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,836 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * export via nfs ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++union conv { ++#ifdef CONFIG_AUFS_INO_T_64 ++ __u32 a[2]; ++#else ++ __u32 a[1]; ++#endif ++ ino_t ino; ++}; ++ ++static ino_t decode_ino(__u32 *a) ++{ ++ union conv u; ++ ++ BUILD_BUG_ON(sizeof(u.ino) != sizeof(u.a)); ++ u.a[0] = a[0]; ++#ifdef CONFIG_AUFS_INO_T_64 ++ u.a[1] = a[1]; ++#endif ++ return u.ino; ++} ++ ++static void encode_ino(__u32 *a, ino_t ino) ++{ ++ union conv u; ++ ++ u.ino = ino; ++ a[0] = u.a[0]; ++#ifdef CONFIG_AUFS_INO_T_64 ++ a[1] = u.a[1]; ++#endif ++} ++ ++/* NFS file handle */ ++enum { ++ Fh_br_id, ++ Fh_sigen, ++#ifdef CONFIG_AUFS_INO_T_64 ++ /* support 64bit inode number */ ++ Fh_ino1, ++ Fh_ino2, ++ Fh_dir_ino1, ++ Fh_dir_ino2, ++#else ++ Fh_ino1, ++ Fh_dir_ino1, ++#endif ++ Fh_igen, ++ Fh_h_type, ++ Fh_tail, ++ ++ Fh_ino = Fh_ino1, ++ Fh_dir_ino = Fh_dir_ino1 ++}; ++ ++static int au_test_anon(struct dentry *dentry) ++{ ++ /* note: read d_flags without d_lock */ ++ return !!(dentry->d_flags & DCACHE_DISCONNECTED); ++} ++ ++int au_test_nfsd(void) ++{ ++ int ret; ++ struct task_struct *tsk = current; ++ char comm[sizeof(tsk->comm)]; ++ ++ ret = 0; ++ if (tsk->flags & PF_KTHREAD) { ++ get_task_comm(comm, tsk); ++ ret = !strcmp(comm, "nfsd"); ++ } ++ ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* inode generation external table */ ++ ++void au_xigen_inc(struct inode *inode) ++{ ++ loff_t pos; ++ ssize_t sz; ++ __u32 igen; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ sb = inode->i_sb; ++ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); ++ ++ sbinfo = au_sbi(sb); ++ pos = inode->i_ino; ++ pos *= sizeof(igen); ++ igen = inode->i_generation + 1; ++ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xigen, &igen, ++ sizeof(igen), &pos); ++ if (sz == sizeof(igen)) ++ return; /* success */ ++ ++ if (unlikely(sz >= 0)) ++ AuIOErr("xigen error (%zd)\n", sz); ++} ++ ++int au_xigen_new(struct inode *inode) ++{ ++ int err; ++ loff_t pos; ++ ssize_t sz; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ err = 0; ++ /* todo: dirty, at mount time */ ++ if (inode->i_ino == AUFS_ROOT_INO) ++ goto out; ++ sb = inode->i_sb; ++ SiMustAnyLock(sb); ++ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) ++ goto out; ++ ++ err = -EFBIG; ++ pos = inode->i_ino; ++ if (unlikely(au_loff_max / sizeof(inode->i_generation) - 1 < pos)) { ++ AuIOErr1("too large i%lld\n", pos); ++ goto out; ++ } ++ pos *= sizeof(inode->i_generation); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ file = sbinfo->si_xigen; ++ BUG_ON(!file); ++ ++ if (vfsub_f_size_read(file) ++ < pos + sizeof(inode->i_generation)) { ++ inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next); ++ sz = xino_fwrite(sbinfo->si_xwrite, file, &inode->i_generation, ++ sizeof(inode->i_generation), &pos); ++ } else ++ sz = xino_fread(sbinfo->si_xread, file, &inode->i_generation, ++ sizeof(inode->i_generation), &pos); ++ if (sz == sizeof(inode->i_generation)) ++ goto out; /* success */ ++ ++ err = sz; ++ if (unlikely(sz >= 0)) { ++ err = -EIO; ++ AuIOErr("xigen error (%zd)\n", sz); ++ } ++ ++out: ++ return err; ++} ++ ++int au_xigen_set(struct super_block *sb, struct file *base) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ file = au_xino_create2(base, sbinfo->si_xigen); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ err = 0; ++ if (sbinfo->si_xigen) ++ fput(sbinfo->si_xigen); ++ sbinfo->si_xigen = file; ++ ++out: ++ return err; ++} ++ ++void au_xigen_clr(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ if (sbinfo->si_xigen) { ++ fput(sbinfo->si_xigen); ++ sbinfo->si_xigen = NULL; ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *decode_by_ino(struct super_block *sb, ino_t ino, ++ ino_t dir_ino) ++{ ++ struct dentry *dentry, *d; ++ struct inode *inode; ++ unsigned int sigen; ++ ++ dentry = NULL; ++ inode = ilookup(sb, ino); ++ if (!inode) ++ goto out; ++ ++ dentry = ERR_PTR(-ESTALE); ++ sigen = au_sigen(sb); ++ if (unlikely(au_is_bad_inode(inode) ++ || IS_DEADDIR(inode) ++ || sigen != au_iigen(inode, NULL))) ++ goto out_iput; ++ ++ dentry = NULL; ++ if (!dir_ino || S_ISDIR(inode->i_mode)) ++ dentry = d_find_alias(inode); ++ else { ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { ++ spin_lock(&d->d_lock); ++ if (!au_test_anon(d) ++ && d_inode(d->d_parent)->i_ino == dir_ino) { ++ dentry = dget_dlock(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ spin_unlock(&d->d_lock); ++ } ++ spin_unlock(&inode->i_lock); ++ } ++ if (unlikely(dentry && au_digen_test(dentry, sigen))) { ++ /* need to refresh */ ++ dput(dentry); ++ dentry = NULL; ++ } ++ ++out_iput: ++ iput(inode); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: dirty? */ ++/* if exportfs_decode_fh() passed vfsmount*, we could be happy */ ++ ++struct au_compare_mnt_args { ++ /* input */ ++ struct super_block *sb; ++ ++ /* output */ ++ struct vfsmount *mnt; ++}; ++ ++static int au_compare_mnt(struct vfsmount *mnt, void *arg) ++{ ++ struct au_compare_mnt_args *a = arg; ++ ++ if (mnt->mnt_sb != a->sb) ++ return 0; ++ a->mnt = mntget(mnt); ++ return 1; ++} ++ ++static struct vfsmount *au_mnt_get(struct super_block *sb) ++{ ++ int err; ++ struct path root; ++ struct au_compare_mnt_args args = { ++ .sb = sb ++ }; ++ ++ get_fs_root(current->fs, &root); ++ rcu_read_lock(); ++ err = iterate_mounts(au_compare_mnt, &args, root.mnt); ++ rcu_read_unlock(); ++ path_put(&root); ++ AuDebugOn(!err); ++ AuDebugOn(!args.mnt); ++ return args.mnt; ++} ++ ++struct au_nfsd_si_lock { ++ unsigned int sigen; ++ aufs_bindex_t bindex, br_id; ++ unsigned char force_lock; ++}; ++ ++static int si_nfsd_read_lock(struct super_block *sb, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ ++ si_read_lock(sb, AuLock_FLUSH); ++ ++ /* branch id may be wrapped around */ ++ err = 0; ++ bindex = au_br_index(sb, nsi_lock->br_id); ++ if (bindex >= 0 && nsi_lock->sigen + AUFS_BRANCH_MAX > au_sigen(sb)) ++ goto out; /* success */ ++ ++ err = -ESTALE; ++ bindex = -1; ++ if (!nsi_lock->force_lock) ++ si_read_unlock(sb); ++ ++out: ++ nsi_lock->bindex = bindex; ++ return err; ++} ++ ++struct find_name_by_ino { ++ struct dir_context ctx; ++ int called, found; ++ ino_t ino; ++ char *name; ++ int namelen; ++}; ++ ++static int ++find_name_by_ino(struct dir_context *ctx, const char *name, int namelen, ++ loff_t offset, u64 ino, unsigned int d_type) ++{ ++ struct find_name_by_ino *a = container_of(ctx, struct find_name_by_ino, ++ ctx); ++ ++ a->called++; ++ if (a->ino != ino) ++ return 0; ++ ++ memcpy(a->name, name, namelen); ++ a->namelen = namelen; ++ a->found = 1; ++ return 1; ++} ++ ++static struct dentry *au_lkup_by_ino(struct path *path, ino_t ino, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry, *parent; ++ struct file *file; ++ struct inode *dir; ++ struct find_name_by_ino arg = { ++ .ctx = { ++ .actor = find_name_by_ino ++ } ++ }; ++ int err; ++ ++ parent = path->dentry; ++ if (nsi_lock) ++ si_read_unlock(parent->d_sb); ++ file = vfsub_dentry_open(path, au_dir_roflags); ++ dentry = (void *)file; ++ if (IS_ERR(file)) ++ goto out; ++ ++ dentry = ERR_PTR(-ENOMEM); ++ arg.name = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!arg.name)) ++ goto out_file; ++ arg.ino = ino; ++ arg.found = 0; ++ do { ++ arg.called = 0; ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(file, &arg.ctx); ++ } while (!err && !arg.found && arg.called); ++ dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_name; ++ /* instead of ENOENT */ ++ dentry = ERR_PTR(-ESTALE); ++ if (!arg.found) ++ goto out_name; ++ ++ /* do not call vfsub_lkup_one() */ ++ dir = d_inode(parent); ++ dentry = vfsub_lookup_one_len_unlocked(arg.name, parent, arg.namelen); ++ AuTraceErrPtr(dentry); ++ if (IS_ERR(dentry)) ++ goto out_name; ++ AuDebugOn(au_test_anon(dentry)); ++ if (unlikely(d_really_is_negative(dentry))) { ++ dput(dentry); ++ dentry = ERR_PTR(-ENOENT); ++ } ++ ++out_name: ++ free_page((unsigned long)arg.name); ++out_file: ++ fput(file); ++out: ++ if (unlikely(nsi_lock ++ && si_nfsd_read_lock(parent->d_sb, nsi_lock) < 0)) ++ if (!IS_ERR(dentry)) { ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++ } ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++static struct dentry *decode_by_dir_ino(struct super_block *sb, ino_t ino, ++ ino_t dir_ino, ++ struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry; ++ struct path path; ++ ++ if (dir_ino != AUFS_ROOT_INO) { ++ path.dentry = decode_by_ino(sb, dir_ino, 0); ++ dentry = path.dentry; ++ if (!path.dentry || IS_ERR(path.dentry)) ++ goto out; ++ AuDebugOn(au_test_anon(path.dentry)); ++ } else ++ path.dentry = dget(sb->s_root); ++ ++ path.mnt = au_mnt_get(sb); ++ dentry = au_lkup_by_ino(&path, ino, nsi_lock); ++ path_put(&path); ++ ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int h_acceptable(void *expv, struct dentry *dentry) ++{ ++ return 1; ++} ++ ++static char *au_build_path(struct dentry *h_parent, struct path *h_rootpath, ++ char *buf, int len, struct super_block *sb) ++{ ++ char *p; ++ int n; ++ struct path path; ++ ++ p = d_path(h_rootpath, buf, len); ++ if (IS_ERR(p)) ++ goto out; ++ n = strlen(p); ++ ++ path.mnt = h_rootpath->mnt; ++ path.dentry = h_parent; ++ p = d_path(&path, buf, len); ++ if (IS_ERR(p)) ++ goto out; ++ if (n != 1) ++ p += n; ++ ++ path.mnt = au_mnt_get(sb); ++ path.dentry = sb->s_root; ++ p = d_path(&path, buf, len - strlen(p)); ++ mntput(path.mnt); ++ if (IS_ERR(p)) ++ goto out; ++ if (n != 1) ++ p[strlen(p)] = '/'; ++ ++out: ++ AuTraceErrPtr(p); ++ return p; ++} ++ ++static ++struct dentry *decode_by_path(struct super_block *sb, ino_t ino, __u32 *fh, ++ int fh_len, struct au_nfsd_si_lock *nsi_lock) ++{ ++ struct dentry *dentry, *h_parent, *root; ++ struct super_block *h_sb; ++ char *pathname, *p; ++ struct vfsmount *h_mnt; ++ struct au_branch *br; ++ int err; ++ struct path path; ++ ++ br = au_sbr(sb, nsi_lock->bindex); ++ h_mnt = au_br_mnt(br); ++ h_sb = h_mnt->mnt_sb; ++ /* todo: call lower fh_to_dentry()? fh_to_parent()? */ ++ lockdep_off(); ++ h_parent = exportfs_decode_fh(h_mnt, (void *)(fh + Fh_tail), ++ fh_len - Fh_tail, fh[Fh_h_type], ++ h_acceptable, /*context*/NULL); ++ lockdep_on(); ++ dentry = h_parent; ++ if (unlikely(!h_parent || IS_ERR(h_parent))) { ++ AuWarn1("%s decode_fh failed, %ld\n", ++ au_sbtype(h_sb), PTR_ERR(h_parent)); ++ goto out; ++ } ++ dentry = NULL; ++ if (unlikely(au_test_anon(h_parent))) { ++ AuWarn1("%s decode_fh returned a disconnected dentry\n", ++ au_sbtype(h_sb)); ++ goto out_h_parent; ++ } ++ ++ dentry = ERR_PTR(-ENOMEM); ++ pathname = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!pathname)) ++ goto out_h_parent; ++ ++ root = sb->s_root; ++ path.mnt = h_mnt; ++ di_read_lock_parent(root, !AuLock_IR); ++ path.dentry = au_h_dptr(root, nsi_lock->bindex); ++ di_read_unlock(root, !AuLock_IR); ++ p = au_build_path(h_parent, &path, pathname, PAGE_SIZE, sb); ++ dentry = (void *)p; ++ if (IS_ERR(p)) ++ goto out_pathname; ++ ++ si_read_unlock(sb); ++ err = vfsub_kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path); ++ dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_relock; ++ ++ dentry = ERR_PTR(-ENOENT); ++ AuDebugOn(au_test_anon(path.dentry)); ++ if (unlikely(d_really_is_negative(path.dentry))) ++ goto out_path; ++ ++ if (ino != d_inode(path.dentry)->i_ino) ++ dentry = au_lkup_by_ino(&path, ino, /*nsi_lock*/NULL); ++ else ++ dentry = dget(path.dentry); ++ ++out_path: ++ path_put(&path); ++out_relock: ++ if (unlikely(si_nfsd_read_lock(sb, nsi_lock) < 0)) ++ if (!IS_ERR(dentry)) { ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++ } ++out_pathname: ++ free_page((unsigned long)pathname); ++out_h_parent: ++ dput(h_parent); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry * ++aufs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, ++ int fh_type) ++{ ++ struct dentry *dentry; ++ __u32 *fh = fid->raw; ++ struct au_branch *br; ++ ino_t ino, dir_ino; ++ struct au_nfsd_si_lock nsi_lock = { ++ .force_lock = 0 ++ }; ++ ++ dentry = ERR_PTR(-ESTALE); ++ /* it should never happen, but the file handle is unreliable */ ++ if (unlikely(fh_len < Fh_tail)) ++ goto out; ++ nsi_lock.sigen = fh[Fh_sigen]; ++ nsi_lock.br_id = fh[Fh_br_id]; ++ ++ /* branch id may be wrapped around */ ++ br = NULL; ++ if (unlikely(si_nfsd_read_lock(sb, &nsi_lock))) ++ goto out; ++ nsi_lock.force_lock = 1; ++ ++ /* is this inode still cached? */ ++ ino = decode_ino(fh + Fh_ino); ++ /* it should never happen */ ++ if (unlikely(ino == AUFS_ROOT_INO)) ++ goto out_unlock; ++ ++ dir_ino = decode_ino(fh + Fh_dir_ino); ++ dentry = decode_by_ino(sb, ino, dir_ino); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (dentry) ++ goto accept; ++ ++ /* is the parent dir cached? */ ++ br = au_sbr(sb, nsi_lock.bindex); ++ au_br_get(br); ++ dentry = decode_by_dir_ino(sb, ino, dir_ino, &nsi_lock); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (dentry) ++ goto accept; ++ ++ /* lookup path */ ++ dentry = decode_by_path(sb, ino, fh, fh_len, &nsi_lock); ++ if (IS_ERR(dentry)) ++ goto out_unlock; ++ if (unlikely(!dentry)) ++ /* todo?: make it ESTALE */ ++ goto out_unlock; ++ ++accept: ++ if (!au_digen_test(dentry, au_sigen(sb)) ++ && d_inode(dentry)->i_generation == fh[Fh_igen]) ++ goto out_unlock; /* success */ ++ ++ dput(dentry); ++ dentry = ERR_PTR(-ESTALE); ++out_unlock: ++ if (br) ++ au_br_put(br); ++ si_read_unlock(sb); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++#if 0 /* reserved for future use */ ++/* support subtreecheck option */ ++static struct dentry *aufs_fh_to_parent(struct super_block *sb, struct fid *fid, ++ int fh_len, int fh_type) ++{ ++ struct dentry *parent; ++ __u32 *fh = fid->raw; ++ ino_t dir_ino; ++ ++ dir_ino = decode_ino(fh + Fh_dir_ino); ++ parent = decode_by_ino(sb, dir_ino, 0); ++ if (IS_ERR(parent)) ++ goto out; ++ if (!parent) ++ parent = decode_by_path(sb, au_br_index(sb, fh[Fh_br_id]), ++ dir_ino, fh, fh_len); ++ ++out: ++ AuTraceErrPtr(parent); ++ return parent; ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_encode_fh(struct inode *inode, __u32 *fh, int *max_len, ++ struct inode *dir) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb, *h_sb; ++ struct dentry *dentry, *parent, *h_parent; ++ struct inode *h_dir; ++ struct au_branch *br; ++ ++ err = -ENOSPC; ++ if (unlikely(*max_len <= Fh_tail)) { ++ AuWarn1("NFSv2 client (max_len %d)?\n", *max_len); ++ goto out; ++ } ++ ++ err = FILEID_ROOT; ++ if (inode->i_ino == AUFS_ROOT_INO) { ++ AuDebugOn(inode->i_ino != AUFS_ROOT_INO); ++ goto out; ++ } ++ ++ h_parent = NULL; ++ sb = inode->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH); ++ if (unlikely(err)) ++ goto out; ++ ++#ifdef CONFIG_AUFS_DEBUG ++ if (unlikely(!au_opt_test(au_mntflags(sb), XINO))) ++ AuWarn1("NFS-exporting requires xino\n"); ++#endif ++ err = -EIO; ++ parent = NULL; ++ ii_read_lock_child(inode); ++ bindex = au_ibtop(inode); ++ if (!dir) { ++ dentry = d_find_any_alias(inode); ++ if (unlikely(!dentry)) ++ goto out_unlock; ++ AuDebugOn(au_test_anon(dentry)); ++ parent = dget_parent(dentry); ++ dput(dentry); ++ if (unlikely(!parent)) ++ goto out_unlock; ++ if (d_really_is_positive(parent)) ++ dir = d_inode(parent); ++ } ++ ++ ii_read_lock_parent(dir); ++ h_dir = au_h_iptr(dir, bindex); ++ ii_read_unlock(dir); ++ if (unlikely(!h_dir)) ++ goto out_parent; ++ h_parent = d_find_any_alias(h_dir); ++ if (unlikely(!h_parent)) ++ goto out_hparent; ++ ++ err = -EPERM; ++ br = au_sbr(sb, bindex); ++ h_sb = au_br_sb(br); ++ if (unlikely(!h_sb->s_export_op)) { ++ AuErr1("%s branch is not exportable\n", au_sbtype(h_sb)); ++ goto out_hparent; ++ } ++ ++ fh[Fh_br_id] = br->br_id; ++ fh[Fh_sigen] = au_sigen(sb); ++ encode_ino(fh + Fh_ino, inode->i_ino); ++ encode_ino(fh + Fh_dir_ino, dir->i_ino); ++ fh[Fh_igen] = inode->i_generation; ++ ++ *max_len -= Fh_tail; ++ fh[Fh_h_type] = exportfs_encode_fh(h_parent, (void *)(fh + Fh_tail), ++ max_len, ++ /*connectable or subtreecheck*/0); ++ err = fh[Fh_h_type]; ++ *max_len += Fh_tail; ++ /* todo: macros? */ ++ if (err != FILEID_INVALID) ++ err = 99; ++ else ++ AuWarn1("%s encode_fh failed\n", au_sbtype(h_sb)); ++ ++out_hparent: ++ dput(h_parent); ++out_parent: ++ dput(parent); ++out_unlock: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++out: ++ if (unlikely(err < 0)) ++ err = FILEID_INVALID; ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_commit_metadata(struct inode *inode) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct inode *h_inode; ++ int (*f)(struct inode *inode); ++ ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ii_write_lock_child(inode); ++ bindex = au_ibtop(inode); ++ AuDebugOn(bindex < 0); ++ h_inode = au_h_iptr(inode, bindex); ++ ++ f = h_inode->i_sb->s_export_op->commit_metadata; ++ if (f) ++ err = f(h_inode); ++ else { ++ struct writeback_control wbc = { ++ .sync_mode = WB_SYNC_ALL, ++ .nr_to_write = 0 /* metadata only */ ++ }; ++ ++ err = sync_inode(h_inode, &wbc); ++ } ++ ++ au_cpup_attr_timesizes(inode); ++ ii_write_unlock(inode); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct export_operations aufs_export_op = { ++ .fh_to_dentry = aufs_fh_to_dentry, ++ /* .fh_to_parent = aufs_fh_to_parent, */ ++ .encode_fh = aufs_encode_fh, ++ .commit_metadata = aufs_commit_metadata ++}; ++ ++void au_export_init(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ __u32 u; ++ ++ BUILD_BUG_ON_MSG(IS_BUILTIN(CONFIG_AUFS_FS) ++ && IS_MODULE(CONFIG_EXPORTFS), ++ AUFS_NAME ": unsupported configuration " ++ "CONFIG_EXPORTFS=m and CONFIG_AUFS_FS=y"); ++ ++ sb->s_export_op = &aufs_export_op; ++ sbinfo = au_sbi(sb); ++ sbinfo->si_xigen = NULL; ++ get_random_bytes(&u, sizeof(u)); ++ BUILD_BUG_ON(sizeof(u) != sizeof(int)); ++ atomic_set(&sbinfo->si_xigen_next, u); ++} +diff -Naur null/fs/aufs/fhsm.c linux-4.15/fs/aufs/fhsm.c +--- /dev/null ++++ linux-4.15/fs/aufs/fhsm.c 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,426 @@ ++/* ++ * Copyright (C) 2011-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++/* ++ * File-based Hierarchy Storage Management ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++static aufs_bindex_t au_fhsm_bottom(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ AuDebugOn(!fhsm); ++ return fhsm->fhsm_bottom; ++} ++ ++void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ AuDebugOn(!fhsm); ++ fhsm->fhsm_bottom = bindex; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_fhsm_test_jiffy(struct au_sbinfo *sbinfo, struct au_branch *br) ++{ ++ struct au_br_fhsm *bf; ++ ++ bf = br->br_fhsm; ++ MtxMustLock(&bf->bf_lock); ++ ++ return !bf->bf_readable ++ || time_after(jiffies, ++ bf->bf_jiffy + sbinfo->si_fhsm.fhsm_expire); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_fhsm_notify(struct super_block *sb, int val) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ if (au_fhsm_pid(fhsm) ++ && atomic_read(&fhsm->fhsm_readable) != -1) { ++ atomic_set(&fhsm->fhsm_readable, val); ++ if (val) ++ wake_up(&fhsm->fhsm_wqh); ++ } ++} ++ ++static int au_fhsm_stfs(struct super_block *sb, aufs_bindex_t bindex, ++ struct aufs_stfs *rstfs, int do_lock, int do_notify) ++{ ++ int err; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ br = au_sbr(sb, bindex); ++ AuDebugOn(au_br_rdonly(br)); ++ bf = br->br_fhsm; ++ AuDebugOn(!bf); ++ ++ if (do_lock) ++ mutex_lock(&bf->bf_lock); ++ else ++ MtxMustLock(&bf->bf_lock); ++ ++ /* sb->s_root for NFS is unreliable */ ++ err = au_br_stfs(br, &bf->bf_stfs); ++ if (unlikely(err)) { ++ AuErr1("FHSM failed (%d), b%d, ignored.\n", bindex, err); ++ goto out; ++ } ++ ++ bf->bf_jiffy = jiffies; ++ bf->bf_readable = 1; ++ if (do_notify) ++ au_fhsm_notify(sb, /*val*/1); ++ if (rstfs) ++ *rstfs = bf->bf_stfs; ++ ++out: ++ if (do_lock) ++ mutex_unlock(&bf->bf_lock); ++ au_fhsm_notify(sb, /*val*/1); ++ ++ return err; ++} ++ ++void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ AuDbg("b%d, force %d\n", bindex, force); ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ if (!au_ftest_si(sbinfo, FHSM) ++ || fhsm->fhsm_bottom == bindex) ++ return; ++ ++ br = au_sbr(sb, bindex); ++ bf = br->br_fhsm; ++ AuDebugOn(!bf); ++ mutex_lock(&bf->bf_lock); ++ if (force ++ || au_fhsm_pid(fhsm) ++ || au_fhsm_test_jiffy(sbinfo, br)) ++ err = au_fhsm_stfs(sb, bindex, /*rstfs*/NULL, /*do_lock*/0, ++ /*do_notify*/1); ++ mutex_unlock(&bf->bf_lock); ++} ++ ++void au_fhsm_wrote_all(struct super_block *sb, int force) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ /* exclude the bottom */ ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) ++ au_fhsm_wrote(sb, bindex, force); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static unsigned int au_fhsm_poll(struct file *file, ++ struct poll_table_struct *wait) ++{ ++ unsigned int mask; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ mask = 0; ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++ poll_wait(file, &fhsm->fhsm_wqh, wait); ++ if (atomic_read(&fhsm->fhsm_readable)) ++ mask = POLLIN /* | POLLRDNORM */; ++ ++ AuTraceErr((int)mask); ++ return mask; ++} ++ ++static int au_fhsm_do_read_one(struct aufs_stbr __user *stbr, ++ struct aufs_stfs *stfs, __s16 brid) ++{ ++ int err; ++ ++ err = copy_to_user(&stbr->stfs, stfs, sizeof(*stfs)); ++ if (!err) ++ err = __put_user(brid, &stbr->brid); ++ if (unlikely(err)) ++ err = -EFAULT; ++ ++ return err; ++} ++ ++static ssize_t au_fhsm_do_read(struct super_block *sb, ++ struct aufs_stbr __user *stbr, size_t count) ++{ ++ ssize_t err; ++ int nstbr; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ struct au_br_fhsm *bf; ++ ++ /* except the bottom branch */ ++ err = 0; ++ nstbr = 0; ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; !err && bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_fhsm(br->br_perm)) ++ continue; ++ ++ bf = br->br_fhsm; ++ mutex_lock(&bf->bf_lock); ++ if (bf->bf_readable) { ++ err = -EFAULT; ++ if (count >= sizeof(*stbr)) ++ err = au_fhsm_do_read_one(stbr++, &bf->bf_stfs, ++ br->br_id); ++ if (!err) { ++ bf->bf_readable = 0; ++ count -= sizeof(*stbr); ++ nstbr++; ++ } ++ } ++ mutex_unlock(&bf->bf_lock); ++ } ++ if (!err) ++ err = sizeof(*stbr) * nstbr; ++ ++ return err; ++} ++ ++static ssize_t au_fhsm_read(struct file *file, char __user *buf, size_t count, ++ loff_t *pos) ++{ ++ ssize_t err; ++ int readable; ++ aufs_bindex_t nfhsm, bindex, bbot; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ struct au_branch *br; ++ struct super_block *sb; ++ ++ err = 0; ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++need_data: ++ spin_lock_irq(&fhsm->fhsm_wqh.lock); ++ if (!atomic_read(&fhsm->fhsm_readable)) { ++ if (vfsub_file_flags(file) & O_NONBLOCK) ++ err = -EAGAIN; ++ else ++ err = wait_event_interruptible_locked_irq ++ (fhsm->fhsm_wqh, ++ atomic_read(&fhsm->fhsm_readable)); ++ } ++ spin_unlock_irq(&fhsm->fhsm_wqh.lock); ++ if (unlikely(err)) ++ goto out; ++ ++ /* sb may already be dead */ ++ au_rw_read_lock(&sbinfo->si_rwsem); ++ readable = atomic_read(&fhsm->fhsm_readable); ++ if (readable > 0) { ++ sb = sbinfo->si_sb; ++ AuDebugOn(!sb); ++ /* exclude the bottom branch */ ++ nfhsm = 0; ++ bbot = au_fhsm_bottom(sb); ++ for (bindex = 0; bindex < bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) ++ nfhsm++; ++ } ++ err = -EMSGSIZE; ++ if (nfhsm * sizeof(struct aufs_stbr) <= count) { ++ atomic_set(&fhsm->fhsm_readable, 0); ++ err = au_fhsm_do_read(sbinfo->si_sb, (void __user *)buf, ++ count); ++ } ++ } ++ au_rw_read_unlock(&sbinfo->si_rwsem); ++ if (!readable) ++ goto need_data; ++ ++out: ++ return err; ++} ++ ++static int au_fhsm_release(struct inode *inode, struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ /* sb may already be dead */ ++ sbinfo = file->private_data; ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock(&fhsm->fhsm_spin); ++ fhsm->fhsm_pid = 0; ++ spin_unlock(&fhsm->fhsm_spin); ++ kobject_put(&sbinfo->si_kobj); ++ ++ return 0; ++} ++ ++static const struct file_operations au_fhsm_fops = { ++ .owner = THIS_MODULE, ++ .llseek = noop_llseek, ++ .read = au_fhsm_read, ++ .poll = au_fhsm_poll, ++ .release = au_fhsm_release ++}; ++ ++int au_fhsm_fd(struct super_block *sb, int oflags) ++{ ++ int err, fd; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(oflags & ~(O_CLOEXEC | O_NONBLOCK))) ++ goto out; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock(&fhsm->fhsm_spin); ++ if (!fhsm->fhsm_pid) ++ fhsm->fhsm_pid = current->pid; ++ else ++ err = -EBUSY; ++ spin_unlock(&fhsm->fhsm_spin); ++ if (unlikely(err)) ++ goto out; ++ ++ oflags |= O_RDONLY; ++ /* oflags |= FMODE_NONOTIFY; */ ++ fd = anon_inode_getfd("[aufs_fhsm]", &au_fhsm_fops, sbinfo, oflags); ++ err = fd; ++ if (unlikely(fd < 0)) ++ goto out_pid; ++ ++ /* succeed reglardless 'fhsm' status */ ++ kobject_get(&sbinfo->si_kobj); ++ si_noflush_read_lock(sb); ++ if (au_ftest_si(sbinfo, FHSM)) ++ au_fhsm_wrote_all(sb, /*force*/0); ++ si_read_unlock(sb); ++ goto out; /* success */ ++ ++out_pid: ++ spin_lock(&fhsm->fhsm_spin); ++ fhsm->fhsm_pid = 0; ++ spin_unlock(&fhsm->fhsm_spin); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_fhsm_br_alloc(struct au_branch *br) ++{ ++ int err; ++ ++ err = 0; ++ br->br_fhsm = kmalloc(sizeof(*br->br_fhsm), GFP_NOFS); ++ if (br->br_fhsm) ++ au_br_fhsm_init(br->br_fhsm); ++ else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_fhsm_fin(struct super_block *sb) ++{ ++ au_fhsm_notify(sb, /*val*/-1); ++} ++ ++void au_fhsm_init(struct au_sbinfo *sbinfo) ++{ ++ struct au_fhsm *fhsm; ++ ++ fhsm = &sbinfo->si_fhsm; ++ spin_lock_init(&fhsm->fhsm_spin); ++ init_waitqueue_head(&fhsm->fhsm_wqh); ++ atomic_set(&fhsm->fhsm_readable, 0); ++ fhsm->fhsm_expire ++ = msecs_to_jiffies(AUFS_FHSM_CACHE_DEF_SEC * MSEC_PER_SEC); ++ fhsm->fhsm_bottom = -1; ++} ++ ++void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec) ++{ ++ sbinfo->si_fhsm.fhsm_expire ++ = msecs_to_jiffies(sec * MSEC_PER_SEC); ++} ++ ++void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo) ++{ ++ unsigned int u; ++ ++ if (!au_ftest_si(sbinfo, FHSM)) ++ return; ++ ++ u = jiffies_to_msecs(sbinfo->si_fhsm.fhsm_expire) / MSEC_PER_SEC; ++ if (u != AUFS_FHSM_CACHE_DEF_SEC) ++ seq_printf(seq, ",fhsm_sec=%u", u); ++} +diff -Naur null/fs/aufs/file.c linux-4.15/fs/aufs/file.c +--- /dev/null ++++ linux-4.15/fs/aufs/file.c 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,856 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * handling file/dir, and address_space operation ++ */ ++ ++#ifdef CONFIG_AUFS_DEBUG ++#include ++#endif ++#include ++#include "aufs.h" ++ ++/* drop flags for writing */ ++unsigned int au_file_roflags(unsigned int flags) ++{ ++ flags &= ~(O_WRONLY | O_RDWR | O_APPEND | O_CREAT | O_TRUNC); ++ flags |= O_RDONLY | O_NOATIME; ++ return flags; ++} ++ ++/* common functions to regular file and dir */ ++struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, ++ struct file *file, int force_wr) ++{ ++ struct file *h_file; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct path h_path; ++ int err; ++ ++ /* a race condition can happen between open and unlink/rmdir */ ++ h_file = ERR_PTR(-ENOENT); ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (au_test_nfsd() && (!h_dentry || d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ spin_lock(&h_dentry->d_lock); ++ err = (!d_unhashed(dentry) && d_unlinked(h_dentry)) ++ /* || !d_inode(dentry)->i_nlink */ ++ ; ++ spin_unlock(&h_dentry->d_lock); ++ if (unlikely(err)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, bindex); ++ err = au_br_test_oflag(flags, br); ++ h_file = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ /* drop flags for writing */ ++ if (au_test_ro(sb, bindex, d_inode(dentry))) { ++ if (force_wr && !(flags & O_WRONLY)) ++ force_wr = 0; ++ flags = au_file_roflags(flags); ++ if (force_wr) { ++ h_file = ERR_PTR(-EROFS); ++ flags = au_file_roflags(flags); ++ if (unlikely(vfsub_native_ro(h_inode) ++ || IS_APPEND(h_inode))) ++ goto out; ++ flags &= ~O_ACCMODE; ++ flags |= O_WRONLY; ++ } ++ } ++ flags &= ~O_CREAT; ++ au_br_get(br); ++ h_path.dentry = h_dentry; ++ h_path.mnt = au_br_mnt(br); ++ h_file = vfsub_dentry_open(&h_path, flags); ++ if (IS_ERR(h_file)) ++ goto out_br; ++ ++ if (flags & __FMODE_EXEC) { ++ err = deny_write_access(h_file); ++ if (unlikely(err)) { ++ fput(h_file); ++ h_file = ERR_PTR(err); ++ goto out_br; ++ } ++ } ++ fsnotify_open(h_file); ++ goto out; /* success */ ++ ++out_br: ++ au_br_put(br); ++out: ++ return h_file; ++} ++ ++static int au_cmoo(struct dentry *dentry) ++{ ++ int err, cmoo, matched; ++ unsigned int udba; ++ struct path h_path; ++ struct au_pin pin; ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ struct inode *delegated; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct au_fhsm *fhsm; ++ pid_t pid; ++ struct au_branch *br; ++ struct dentry *parent; ++ struct au_hinode *hdir; ++ ++ DiMustWriteLock(dentry); ++ IiMustWriteLock(d_inode(dentry)); ++ ++ err = 0; ++ if (IS_ROOT(dentry)) ++ goto out; ++ cpg.bsrc = au_dbtop(dentry); ++ if (!cpg.bsrc) ++ goto out; ++ ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ fhsm = &sbinfo->si_fhsm; ++ pid = au_fhsm_pid(fhsm); ++ rcu_read_lock(); ++ matched = (pid ++ && (current->pid == pid ++ || rcu_dereference(current->real_parent)->pid == pid)); ++ rcu_read_unlock(); ++ if (matched) ++ goto out; ++ ++ br = au_sbr(sb, cpg.bsrc); ++ cmoo = au_br_cmoo(br->br_perm); ++ if (!cmoo) ++ goto out; ++ if (!d_is_reg(dentry)) ++ cmoo &= AuBrAttr_COO_ALL; ++ if (!cmoo) ++ goto out; ++ ++ parent = dget_parent(dentry); ++ di_write_lock_parent(parent); ++ err = au_wbr_do_copyup_bu(dentry, cpg.bsrc - 1); ++ cpg.bdst = err; ++ if (unlikely(err < 0)) { ++ err = 0; /* there is no upper writable branch */ ++ goto out_dgrade; ++ } ++ AuDbg("bsrc %d, bdst %d\n", cpg.bsrc, cpg.bdst); ++ ++ /* do not respect the coo attrib for the target branch */ ++ err = au_cpup_dirs(dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_dgrade; ++ ++ di_downgrade_lock(parent, AuLock_IR); ++ udba = au_opt_udba(sb); ++ err = au_pin(&pin, dentry, cpg.bdst, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ if (unlikely(err)) ++ goto out_parent; ++ if (!(cmoo & AuBrWAttr_MOO)) ++ goto out_parent; /* success */ ++ ++ err = au_pin(&pin, dentry, cpg.bsrc, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ h_path.mnt = au_br_mnt(br); ++ h_path.dentry = au_h_dptr(dentry, cpg.bsrc); ++ hdir = au_hi(d_inode(parent), cpg.bsrc); ++ delegated = NULL; ++ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, /*force*/1); ++ au_unpin(&pin); ++ /* todo: keep h_dentry or not? */ ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) { ++ pr_err("unlink %pd after coo failed (%d), ignored\n", ++ dentry, err); ++ err = 0; ++ } ++ goto out_parent; /* success */ ++ ++out_dgrade: ++ di_downgrade_lock(parent, AuLock_IR); ++out_parent: ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_do_open(struct file *file, struct au_do_open_args *args) ++{ ++ int err, aopen = args->aopen; ++ struct dentry *dentry; ++ struct au_finfo *finfo; ++ ++ if (!aopen) ++ err = au_finfo_init(file, args->fidir); ++ else { ++ lockdep_off(); ++ err = au_finfo_init(file, args->fidir); ++ lockdep_on(); ++ } ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ AuDebugOn(IS_ERR_OR_NULL(dentry)); ++ di_write_lock_child(dentry); ++ err = au_cmoo(dentry); ++ di_downgrade_lock(dentry, AuLock_IR); ++ if (!err) { ++ if (!aopen) ++ err = args->open(file, vfsub_file_flags(file), NULL); ++ else { ++ lockdep_off(); ++ err = args->open(file, vfsub_file_flags(file), NULL); ++ lockdep_on(); ++ } ++ } ++ di_read_unlock(dentry, AuLock_IR); ++ ++ finfo = au_fi(file); ++ if (!err) { ++ finfo->fi_file = file; ++ au_hbl_add(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ } ++ if (!aopen) ++ fi_write_unlock(file); ++ else { ++ lockdep_off(); ++ fi_write_unlock(file); ++ lockdep_on(); ++ } ++ if (unlikely(err)) { ++ finfo->fi_hdir = NULL; ++ au_finfo_fin(file); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_reopen_nondir(struct file *file) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct dentry *dentry; ++ struct file *h_file, *h_file_tmp; ++ ++ dentry = file->f_path.dentry; ++ btop = au_dbtop(dentry); ++ h_file_tmp = NULL; ++ if (au_fbtop(file) == btop) { ++ h_file = au_hf_top(file); ++ if (file->f_mode == h_file->f_mode) ++ return 0; /* success */ ++ h_file_tmp = h_file; ++ get_file(h_file_tmp); ++ au_set_h_fptr(file, btop, NULL); ++ } ++ AuDebugOn(au_fi(file)->fi_hdir); ++ /* ++ * it can happen ++ * file exists on both of rw and ro ++ * open --> dbtop and fbtop are both 0 ++ * prepend a branch as rw, "rw" become ro ++ * remove rw/file ++ * delete the top branch, "rw" becomes rw again ++ * --> dbtop is 1, fbtop is still 0 ++ * write --> fbtop is 0 but dbtop is 1 ++ */ ++ /* AuDebugOn(au_fbtop(file) < btop); */ ++ ++ h_file = au_h_open(dentry, btop, vfsub_file_flags(file) & ~O_TRUNC, ++ file, /*force_wr*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) { ++ if (h_file_tmp) { ++ au_sbr_get(dentry->d_sb, btop); ++ au_set_h_fptr(file, btop, h_file_tmp); ++ h_file_tmp = NULL; ++ } ++ goto out; /* todo: close all? */ ++ } ++ ++ err = 0; ++ au_set_fbtop(file, btop); ++ au_set_h_fptr(file, btop, h_file); ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ ++out: ++ if (h_file_tmp) ++ fput(h_file_tmp); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_reopen_wh(struct file *file, aufs_bindex_t btgt, ++ struct dentry *hi_wh) ++{ ++ int err; ++ aufs_bindex_t btop; ++ struct au_dinfo *dinfo; ++ struct dentry *h_dentry; ++ struct au_hdentry *hdp; ++ ++ dinfo = au_di(file->f_path.dentry); ++ AuRwMustWriteLock(&dinfo->di_rwsem); ++ ++ btop = dinfo->di_btop; ++ dinfo->di_btop = btgt; ++ hdp = au_hdentry(dinfo, btgt); ++ h_dentry = hdp->hd_dentry; ++ hdp->hd_dentry = hi_wh; ++ err = au_reopen_nondir(file); ++ hdp->hd_dentry = h_dentry; ++ dinfo->di_btop = btop; ++ ++ return err; ++} ++ ++static int au_ready_to_write_wh(struct file *file, loff_t len, ++ aufs_bindex_t bcpup, struct au_pin *pin) ++{ ++ int err; ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry, *hi_wh; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = bcpup, ++ .bsrc = -1, ++ .len = len, ++ .pin = pin ++ }; ++ ++ au_update_dbtop(cpg.dentry); ++ inode = d_inode(cpg.dentry); ++ h_inode = NULL; ++ if (au_dbtop(cpg.dentry) <= bcpup ++ && au_dbbot(cpg.dentry) >= bcpup) { ++ h_dentry = au_h_dptr(cpg.dentry, bcpup); ++ if (h_dentry && d_is_positive(h_dentry)) ++ h_inode = d_inode(h_dentry); ++ } ++ hi_wh = au_hi_wh(inode, bcpup); ++ if (!hi_wh && !h_inode) ++ err = au_sio_cpup_wh(&cpg, file); ++ else ++ /* already copied-up after unlink */ ++ err = au_reopen_wh(file, bcpup, hi_wh); ++ ++ if (!err ++ && (inode->i_nlink > 1 ++ || (inode->i_state & I_LINKABLE)) ++ && au_opt_test(au_mntflags(cpg.dentry->d_sb), PLINK)) ++ au_plink_append(inode, bcpup, au_h_dptr(cpg.dentry, bcpup)); ++ ++ return err; ++} ++ ++/* ++ * prepare the @file for writing. ++ */ ++int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin) ++{ ++ int err; ++ aufs_bindex_t dbtop; ++ struct dentry *parent; ++ struct inode *inode; ++ struct super_block *sb; ++ struct file *h_file; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = len, ++ .pin = pin, ++ .flags = AuCpup_DTIME ++ }; ++ ++ sb = cpg.dentry->d_sb; ++ inode = d_inode(cpg.dentry); ++ cpg.bsrc = au_fbtop(file); ++ err = au_test_ro(sb, cpg.bsrc, inode); ++ if (!err && (au_hf_top(file)->f_mode & FMODE_WRITE)) { ++ err = au_pin(pin, cpg.dentry, cpg.bsrc, AuOpt_UDBA_NONE, ++ /*flags*/0); ++ goto out; ++ } ++ ++ /* need to cpup or reopen */ ++ parent = dget_parent(cpg.dentry); ++ di_write_lock_parent(parent); ++ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); ++ cpg.bdst = err; ++ if (unlikely(err < 0)) ++ goto out_dgrade; ++ err = 0; ++ ++ if (!d_unhashed(cpg.dentry) && !au_h_dptr(parent, cpg.bdst)) { ++ err = au_cpup_dirs(cpg.dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_dgrade; ++ } ++ ++ err = au_pin(pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_dgrade; ++ ++ dbtop = au_dbtop(cpg.dentry); ++ if (dbtop <= cpg.bdst) ++ cpg.bsrc = cpg.bdst; ++ ++ if (dbtop <= cpg.bdst /* just reopen */ ++ || !d_unhashed(cpg.dentry) /* copyup and reopen */ ++ ) { ++ h_file = au_h_open_pre(cpg.dentry, cpg.bsrc, /*force_wr*/0); ++ if (IS_ERR(h_file)) ++ err = PTR_ERR(h_file); ++ else { ++ di_downgrade_lock(parent, AuLock_IR); ++ if (dbtop > cpg.bdst) ++ err = au_sio_cpup_simple(&cpg); ++ if (!err) ++ err = au_reopen_nondir(file); ++ au_h_open_post(cpg.dentry, cpg.bsrc, h_file); ++ } ++ } else { /* copyup as wh and reopen */ ++ /* ++ * since writable hfsplus branch is not supported, ++ * h_open_pre/post() are unnecessary. ++ */ ++ err = au_ready_to_write_wh(file, len, cpg.bdst, pin); ++ di_downgrade_lock(parent, AuLock_IR); ++ } ++ ++ if (!err) { ++ au_pin_set_parent_lflag(pin, /*lflag*/0); ++ goto out_dput; /* success */ ++ } ++ au_unpin(pin); ++ goto out_unlock; ++ ++out_dgrade: ++ di_downgrade_lock(parent, AuLock_IR); ++out_unlock: ++ di_read_unlock(parent, AuLock_IR); ++out_dput: ++ dput(parent); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_do_flush(struct file *file, fl_owner_t id, ++ int (*flush)(struct file *file, fl_owner_t id)) ++{ ++ int err; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_noflush_read_lock(sb); ++ fi_read_lock(file); ++ ii_read_lock_child(inode); ++ ++ err = flush(file, id); ++ au_cpup_attr_timesizes(inode); ++ ++ ii_read_unlock(inode); ++ fi_read_unlock(file); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_file_refresh_by_inode(struct file *file, int *need_reopen) ++{ ++ int err; ++ struct au_pin pin; ++ struct au_finfo *finfo; ++ struct dentry *parent, *hi_wh; ++ struct inode *inode; ++ struct super_block *sb; ++ struct au_cp_generic cpg = { ++ .dentry = file->f_path.dentry, ++ .bdst = -1, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME ++ }; ++ ++ FiMustWriteLock(file); ++ ++ err = 0; ++ finfo = au_fi(file); ++ sb = cpg.dentry->d_sb; ++ inode = d_inode(cpg.dentry); ++ cpg.bdst = au_ibtop(inode); ++ if (cpg.bdst == finfo->fi_btop || IS_ROOT(cpg.dentry)) ++ goto out; ++ ++ parent = dget_parent(cpg.dentry); ++ if (au_test_ro(sb, cpg.bdst, inode)) { ++ di_read_lock_parent(parent, !AuLock_IR); ++ err = AuWbrCopyup(au_sbi(sb), cpg.dentry); ++ cpg.bdst = err; ++ di_read_unlock(parent, !AuLock_IR); ++ if (unlikely(err < 0)) ++ goto out_parent; ++ err = 0; ++ } ++ ++ di_read_lock_parent(parent, AuLock_IR); ++ hi_wh = au_hi_wh(inode, cpg.bdst); ++ if (!S_ISDIR(inode->i_mode) ++ && au_opt_test(au_mntflags(sb), PLINK) ++ && au_plink_test(inode) ++ && !d_unhashed(cpg.dentry) ++ && cpg.bdst < au_dbtop(cpg.dentry)) { ++ err = au_test_and_cpup_dirs(cpg.dentry, cpg.bdst); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ /* always superio. */ ++ err = au_pin(&pin, cpg.dentry, cpg.bdst, AuOpt_UDBA_NONE, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ } else if (hi_wh) { ++ /* already copied-up after unlink */ ++ err = au_reopen_wh(file, cpg.bdst, hi_wh); ++ *need_reopen = 0; ++ } ++ ++out_unlock: ++ di_read_unlock(parent, AuLock_IR); ++out_parent: ++ dput(parent); ++out: ++ return err; ++} ++ ++static void au_do_refresh_dir(struct file *file) ++{ ++ aufs_bindex_t bindex, bbot, new_bindex, brid; ++ struct au_hfile *p, tmp, *q; ++ struct au_finfo *finfo; ++ struct super_block *sb; ++ struct au_fidir *fidir; ++ ++ FiMustWriteLock(file); ++ ++ sb = file->f_path.dentry->d_sb; ++ finfo = au_fi(file); ++ fidir = finfo->fi_hdir; ++ AuDebugOn(!fidir); ++ p = fidir->fd_hfile + finfo->fi_btop; ++ brid = p->hf_br->br_id; ++ bbot = fidir->fd_bbot; ++ for (bindex = finfo->fi_btop; bindex <= bbot; bindex++, p++) { ++ if (!p->hf_file) ++ continue; ++ ++ new_bindex = au_br_index(sb, p->hf_br->br_id); ++ if (new_bindex == bindex) ++ continue; ++ if (new_bindex < 0) { ++ au_set_h_fptr(file, bindex, NULL); ++ continue; ++ } ++ ++ /* swap two lower inode, and loop again */ ++ q = fidir->fd_hfile + new_bindex; ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hf_file) { ++ bindex--; ++ p--; ++ } ++ } ++ ++ p = fidir->fd_hfile; ++ if (!au_test_mmapped(file) && !d_unlinked(file->f_path.dentry)) { ++ bbot = au_sbbot(sb); ++ for (finfo->fi_btop = 0; finfo->fi_btop <= bbot; ++ finfo->fi_btop++, p++) ++ if (p->hf_file) { ++ if (file_inode(p->hf_file)) ++ break; ++ au_hfput(p, /*execed*/0); ++ } ++ } else { ++ bbot = au_br_index(sb, brid); ++ for (finfo->fi_btop = 0; finfo->fi_btop < bbot; ++ finfo->fi_btop++, p++) ++ if (p->hf_file) ++ au_hfput(p, /*execed*/0); ++ bbot = au_sbbot(sb); ++ } ++ ++ p = fidir->fd_hfile + bbot; ++ for (fidir->fd_bbot = bbot; fidir->fd_bbot >= finfo->fi_btop; ++ fidir->fd_bbot--, p--) ++ if (p->hf_file) { ++ if (file_inode(p->hf_file)) ++ break; ++ au_hfput(p, /*execed*/0); ++ } ++ AuDebugOn(fidir->fd_bbot < finfo->fi_btop); ++} ++ ++/* ++ * after branch manipulating, refresh the file. ++ */ ++static int refresh_file(struct file *file, int (*reopen)(struct file *file)) ++{ ++ int err, need_reopen, nbr; ++ aufs_bindex_t bbot, bindex; ++ struct dentry *dentry; ++ struct super_block *sb; ++ struct au_finfo *finfo; ++ struct au_hfile *hfile; ++ ++ dentry = file->f_path.dentry; ++ sb = dentry->d_sb; ++ nbr = au_sbbot(sb) + 1; ++ finfo = au_fi(file); ++ if (!finfo->fi_hdir) { ++ hfile = &finfo->fi_htop; ++ AuDebugOn(!hfile->hf_file); ++ bindex = au_br_index(sb, hfile->hf_br->br_id); ++ AuDebugOn(bindex < 0); ++ if (bindex != finfo->fi_btop) ++ au_set_fbtop(file, bindex); ++ } else { ++ err = au_fidir_realloc(finfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ au_do_refresh_dir(file); ++ } ++ ++ err = 0; ++ need_reopen = 1; ++ if (!au_test_mmapped(file)) ++ err = au_file_refresh_by_inode(file, &need_reopen); ++ if (finfo->fi_hdir) ++ /* harmless if err */ ++ au_fidir_realloc(finfo, nbr, /*may_shrink*/1); ++ if (!err && need_reopen && !d_unlinked(dentry)) ++ err = reopen(file); ++ if (!err) { ++ au_update_figen(file); ++ goto out; /* success */ ++ } ++ ++ /* error, close all lower files */ ++ if (finfo->fi_hdir) { ++ bbot = au_fbbot_dir(file); ++ for (bindex = au_fbtop(file); bindex <= bbot; bindex++) ++ au_set_h_fptr(file, bindex, NULL); ++ } ++ ++out: ++ return err; ++} ++ ++/* common function to regular file and dir */ ++int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), ++ int wlock, unsigned int fi_lsc) ++{ ++ int err; ++ unsigned int sigen, figen; ++ aufs_bindex_t btop; ++ unsigned char pseudo_link; ++ struct dentry *dentry; ++ struct inode *inode; ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ sigen = au_sigen(dentry->d_sb); ++ fi_write_lock_nested(file, fi_lsc); ++ figen = au_figen(file); ++ if (!fi_lsc) ++ di_write_lock_child(dentry); ++ else ++ di_write_lock_child2(dentry); ++ btop = au_dbtop(dentry); ++ pseudo_link = (btop != au_ibtop(inode)); ++ if (sigen == figen && !pseudo_link && au_fbtop(file) == btop) { ++ if (!wlock) { ++ di_downgrade_lock(dentry, AuLock_IR); ++ fi_downgrade_lock(file); ++ } ++ goto out; /* success */ ++ } ++ ++ AuDbg("sigen %d, figen %d\n", sigen, figen); ++ if (au_digen_test(dentry, sigen)) { ++ err = au_reval_dpath(dentry, sigen); ++ AuDebugOn(!err && au_digen_test(dentry, sigen)); ++ } ++ ++ if (!err) ++ err = refresh_file(file, reopen); ++ if (!err) { ++ if (!wlock) { ++ di_downgrade_lock(dentry, AuLock_IR); ++ fi_downgrade_lock(file); ++ } ++ } else { ++ di_write_unlock(dentry); ++ fi_write_unlock(file); ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* cf. aufs_nopage() */ ++/* for madvise(2) */ ++static int aufs_readpage(struct file *file __maybe_unused, struct page *page) ++{ ++ unlock_page(page); ++ return 0; ++} ++ ++/* it will never be called, but necessary to support O_DIRECT */ ++static ssize_t aufs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) ++{ BUG(); return 0; } ++ ++/* they will never be called. */ ++#ifdef CONFIG_AUFS_DEBUG ++static int aufs_write_begin(struct file *file, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned flags, ++ struct page **pagep, void **fsdata) ++{ AuUnsupport(); return 0; } ++static int aufs_write_end(struct file *file, struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned copied, ++ struct page *page, void *fsdata) ++{ AuUnsupport(); return 0; } ++static int aufs_writepage(struct page *page, struct writeback_control *wbc) ++{ AuUnsupport(); return 0; } ++ ++static int aufs_set_page_dirty(struct page *page) ++{ AuUnsupport(); return 0; } ++static void aufs_invalidatepage(struct page *page, unsigned int offset, ++ unsigned int length) ++{ AuUnsupport(); } ++static int aufs_releasepage(struct page *page, gfp_t gfp) ++{ AuUnsupport(); return 0; } ++#if 0 /* called by memory compaction regardless file */ ++static int aufs_migratepage(struct address_space *mapping, struct page *newpage, ++ struct page *page, enum migrate_mode mode) ++{ AuUnsupport(); return 0; } ++#endif ++static bool aufs_isolate_page(struct page *page, isolate_mode_t mode) ++{ AuUnsupport(); return true; } ++static void aufs_putback_page(struct page *page) ++{ AuUnsupport(); } ++static int aufs_launder_page(struct page *page) ++{ AuUnsupport(); return 0; } ++static int aufs_is_partially_uptodate(struct page *page, ++ unsigned long from, ++ unsigned long count) ++{ AuUnsupport(); return 0; } ++static void aufs_is_dirty_writeback(struct page *page, bool *dirty, ++ bool *writeback) ++{ AuUnsupport(); } ++static int aufs_error_remove_page(struct address_space *mapping, ++ struct page *page) ++{ AuUnsupport(); return 0; } ++static int aufs_swap_activate(struct swap_info_struct *sis, struct file *file, ++ sector_t *span) ++{ AuUnsupport(); return 0; } ++static void aufs_swap_deactivate(struct file *file) ++{ AuUnsupport(); } ++#endif /* CONFIG_AUFS_DEBUG */ ++ ++const struct address_space_operations aufs_aop = { ++ .readpage = aufs_readpage, ++ .direct_IO = aufs_direct_IO, ++#ifdef CONFIG_AUFS_DEBUG ++ .writepage = aufs_writepage, ++ /* no writepages, because of writepage */ ++ .set_page_dirty = aufs_set_page_dirty, ++ /* no readpages, because of readpage */ ++ .write_begin = aufs_write_begin, ++ .write_end = aufs_write_end, ++ /* no bmap, no block device */ ++ .invalidatepage = aufs_invalidatepage, ++ .releasepage = aufs_releasepage, ++ /* is fallback_migrate_page ok? */ ++ /* .migratepage = aufs_migratepage, */ ++ .isolate_page = aufs_isolate_page, ++ .putback_page = aufs_putback_page, ++ .launder_page = aufs_launder_page, ++ .is_partially_uptodate = aufs_is_partially_uptodate, ++ .is_dirty_writeback = aufs_is_dirty_writeback, ++ .error_remove_page = aufs_error_remove_page, ++ .swap_activate = aufs_swap_activate, ++ .swap_deactivate = aufs_swap_deactivate ++#endif /* CONFIG_AUFS_DEBUG */ ++}; +diff -Naur null/fs/aufs/file.h linux-4.15/fs/aufs/file.h +--- /dev/null ++++ linux-4.15/fs/aufs/file.h 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,340 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * file operations ++ */ ++ ++#ifndef __AUFS_FILE_H__ ++#define __AUFS_FILE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++#include "rwsem.h" ++ ++struct au_branch; ++struct au_hfile { ++ struct file *hf_file; ++ struct au_branch *hf_br; ++}; ++ ++struct au_vdir; ++struct au_fidir { ++ aufs_bindex_t fd_bbot; ++ aufs_bindex_t fd_nent; ++ struct au_vdir *fd_vdir_cache; ++ struct au_hfile fd_hfile[]; ++}; ++ ++static inline int au_fidir_sz(int nent) ++{ ++ AuDebugOn(nent < 0); ++ return sizeof(struct au_fidir) + sizeof(struct au_hfile) * nent; ++} ++ ++struct au_finfo { ++ atomic_t fi_generation; ++ ++ struct au_rwsem fi_rwsem; ++ aufs_bindex_t fi_btop; ++ ++ /* do not union them */ ++ struct { /* for non-dir */ ++ struct au_hfile fi_htop; ++ atomic_t fi_mmapped; ++ }; ++ struct au_fidir *fi_hdir; /* for dir only */ ++ ++ struct hlist_bl_node fi_hlist; ++ struct file *fi_file; /* very ugly */ ++} ____cacheline_aligned_in_smp; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* file.c */ ++extern const struct address_space_operations aufs_aop; ++unsigned int au_file_roflags(unsigned int flags); ++struct file *au_h_open(struct dentry *dentry, aufs_bindex_t bindex, int flags, ++ struct file *file, int force_wr); ++struct au_do_open_args { ++ int aopen; ++ int (*open)(struct file *file, int flags, ++ struct file *h_file); ++ struct au_fidir *fidir; ++ struct file *h_file; ++}; ++int au_do_open(struct file *file, struct au_do_open_args *args); ++int au_reopen_nondir(struct file *file); ++struct au_pin; ++int au_ready_to_write(struct file *file, loff_t len, struct au_pin *pin); ++int au_reval_and_lock_fdi(struct file *file, int (*reopen)(struct file *file), ++ int wlock, unsigned int fi_lsc); ++int au_do_flush(struct file *file, fl_owner_t id, ++ int (*flush)(struct file *file, fl_owner_t id)); ++ ++/* poll.c */ ++#ifdef CONFIG_AUFS_POLL ++unsigned int aufs_poll(struct file *file, poll_table *wait); ++#endif ++ ++#ifdef CONFIG_AUFS_BR_HFSPLUS ++/* hfsplus.c */ ++struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, ++ int force_wr); ++void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file); ++#else ++AuStub(struct file *, au_h_open_pre, return NULL, struct dentry *dentry, ++ aufs_bindex_t bindex, int force_wr) ++AuStubVoid(au_h_open_post, struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file); ++#endif ++ ++/* f_op.c */ ++extern const struct file_operations aufs_file_fop; ++int au_do_open_nondir(struct file *file, int flags, struct file *h_file); ++int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file); ++struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc); ++ ++/* finfo.c */ ++void au_hfput(struct au_hfile *hf, int execed); ++void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, ++ struct file *h_file); ++ ++void au_update_figen(struct file *file); ++struct au_fidir *au_fidir_alloc(struct super_block *sb); ++int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink); ++ ++void au_fi_init_once(void *_fi); ++void au_finfo_fin(struct file *file); ++int au_finfo_init(struct file *file, struct au_fidir *fidir); ++ ++/* ioctl.c */ ++long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, ++ unsigned long arg); ++long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, ++ unsigned long arg); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_finfo *au_fi(struct file *file) ++{ ++ return file->private_data; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define fi_read_lock(f) au_rw_read_lock(&au_fi(f)->fi_rwsem) ++#define fi_write_lock(f) au_rw_write_lock(&au_fi(f)->fi_rwsem) ++#define fi_read_trylock(f) au_rw_read_trylock(&au_fi(f)->fi_rwsem) ++#define fi_write_trylock(f) au_rw_write_trylock(&au_fi(f)->fi_rwsem) ++/* ++#define fi_read_trylock_nested(f) \ ++ au_rw_read_trylock_nested(&au_fi(f)->fi_rwsem) ++#define fi_write_trylock_nested(f) \ ++ au_rw_write_trylock_nested(&au_fi(f)->fi_rwsem) ++*/ ++ ++#define fi_read_unlock(f) au_rw_read_unlock(&au_fi(f)->fi_rwsem) ++#define fi_write_unlock(f) au_rw_write_unlock(&au_fi(f)->fi_rwsem) ++#define fi_downgrade_lock(f) au_rw_dgrade_lock(&au_fi(f)->fi_rwsem) ++ ++/* lock subclass for finfo */ ++enum { ++ AuLsc_FI_1, ++ AuLsc_FI_2 ++}; ++ ++static inline void fi_read_lock_nested(struct file *f, unsigned int lsc) ++{ ++ au_rw_read_lock_nested(&au_fi(f)->fi_rwsem, lsc); ++} ++ ++static inline void fi_write_lock_nested(struct file *f, unsigned int lsc) ++{ ++ au_rw_write_lock_nested(&au_fi(f)->fi_rwsem, lsc); ++} ++ ++/* ++ * fi_read_lock_1, fi_write_lock_1, ++ * fi_read_lock_2, fi_write_lock_2 ++ */ ++#define AuReadLockFunc(name) \ ++static inline void fi_read_lock_##name(struct file *f) \ ++{ fi_read_lock_nested(f, AuLsc_FI_##name); } ++ ++#define AuWriteLockFunc(name) \ ++static inline void fi_write_lock_##name(struct file *f) \ ++{ fi_write_lock_nested(f, AuLsc_FI_##name); } ++ ++#define AuRWLockFuncs(name) \ ++ AuReadLockFunc(name) \ ++ AuWriteLockFunc(name) ++ ++AuRWLockFuncs(1); ++AuRWLockFuncs(2); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define FiMustNoWaiters(f) AuRwMustNoWaiters(&au_fi(f)->fi_rwsem) ++#define FiMustAnyLock(f) AuRwMustAnyLock(&au_fi(f)->fi_rwsem) ++#define FiMustWriteLock(f) AuRwMustWriteLock(&au_fi(f)->fi_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: hard/soft set? */ ++static inline aufs_bindex_t au_fbtop(struct file *file) ++{ ++ FiMustAnyLock(file); ++ return au_fi(file)->fi_btop; ++} ++ ++static inline aufs_bindex_t au_fbbot_dir(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_bbot; ++} ++ ++static inline struct au_vdir *au_fvdir_cache(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_vdir_cache; ++} ++ ++static inline void au_set_fbtop(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustWriteLock(file); ++ au_fi(file)->fi_btop = bindex; ++} ++ ++static inline void au_set_fbbot_dir(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustWriteLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ au_fi(file)->fi_hdir->fd_bbot = bindex; ++} ++ ++static inline void au_set_fvdir_cache(struct file *file, ++ struct au_vdir *vdir_cache) ++{ ++ FiMustWriteLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ au_fi(file)->fi_hdir->fd_vdir_cache = vdir_cache; ++} ++ ++static inline struct file *au_hf_top(struct file *file) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_htop.hf_file; ++} ++ ++static inline struct file *au_hf_dir(struct file *file, aufs_bindex_t bindex) ++{ ++ FiMustAnyLock(file); ++ AuDebugOn(!au_fi(file)->fi_hdir); ++ return au_fi(file)->fi_hdir->fd_hfile[0 + bindex].hf_file; ++} ++ ++/* todo: memory barrier? */ ++static inline unsigned int au_figen(struct file *f) ++{ ++ return atomic_read(&au_fi(f)->fi_generation); ++} ++ ++static inline void au_set_mmapped(struct file *f) ++{ ++ if (atomic_inc_return(&au_fi(f)->fi_mmapped)) ++ return; ++ pr_warn("fi_mmapped wrapped around\n"); ++ while (!atomic_inc_return(&au_fi(f)->fi_mmapped)) ++ ; ++} ++ ++static inline void au_unset_mmapped(struct file *f) ++{ ++ atomic_dec(&au_fi(f)->fi_mmapped); ++} ++ ++static inline int au_test_mmapped(struct file *f) ++{ ++ return atomic_read(&au_fi(f)->fi_mmapped); ++} ++ ++/* customize vma->vm_file */ ++ ++static inline void au_do_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ struct file *f; ++ ++ f = vma->vm_file; ++ get_file(file); ++ vma->vm_file = file; ++ fput(f); ++} ++ ++#ifdef CONFIG_MMU ++#define AuDbgVmRegion(file, vma) do {} while (0) ++ ++static inline void au_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ au_do_vm_file_reset(vma, file); ++} ++#else ++#define AuDbgVmRegion(file, vma) \ ++ AuDebugOn((vma)->vm_region && (vma)->vm_region->vm_file != (file)) ++ ++static inline void au_vm_file_reset(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ struct file *f; ++ ++ au_do_vm_file_reset(vma, file); ++ f = vma->vm_region->vm_file; ++ get_file(file); ++ vma->vm_region->vm_file = file; ++ fput(f); ++} ++#endif /* CONFIG_MMU */ ++ ++/* handle vma->vm_prfile */ ++static inline void au_vm_prfile_set(struct vm_area_struct *vma, ++ struct file *file) ++{ ++ get_file(file); ++ vma->vm_prfile = file; ++#ifndef CONFIG_MMU ++ get_file(file); ++ vma->vm_region->vm_prfile = file; ++#endif ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_FILE_H__ */ +diff -Naur null/fs/aufs/finfo.c linux-4.15/fs/aufs/finfo.c +--- /dev/null ++++ linux-4.15/fs/aufs/finfo.c 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,148 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * file private data ++ */ ++ ++#include "aufs.h" ++ ++void au_hfput(struct au_hfile *hf, int execed) ++{ ++ if (execed) ++ allow_write_access(hf->hf_file); ++ fput(hf->hf_file); ++ hf->hf_file = NULL; ++ au_br_put(hf->hf_br); ++ hf->hf_br = NULL; ++} ++ ++void au_set_h_fptr(struct file *file, aufs_bindex_t bindex, struct file *val) ++{ ++ struct au_finfo *finfo = au_fi(file); ++ struct au_hfile *hf; ++ struct au_fidir *fidir; ++ ++ fidir = finfo->fi_hdir; ++ if (!fidir) { ++ AuDebugOn(finfo->fi_btop != bindex); ++ hf = &finfo->fi_htop; ++ } else ++ hf = fidir->fd_hfile + bindex; ++ ++ if (hf && hf->hf_file) ++ au_hfput(hf, vfsub_file_execed(file)); ++ if (val) { ++ FiMustWriteLock(file); ++ AuDebugOn(IS_ERR_OR_NULL(file->f_path.dentry)); ++ hf->hf_file = val; ++ hf->hf_br = au_sbr(file->f_path.dentry->d_sb, bindex); ++ } ++} ++ ++void au_update_figen(struct file *file) ++{ ++ atomic_set(&au_fi(file)->fi_generation, au_digen(file->f_path.dentry)); ++ /* smp_mb(); */ /* atomic_set */ ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_fidir *au_fidir_alloc(struct super_block *sb) ++{ ++ struct au_fidir *fidir; ++ int nbr; ++ ++ nbr = au_sbbot(sb) + 1; ++ if (nbr < 2) ++ nbr = 2; /* initial allocate for 2 branches */ ++ fidir = kzalloc(au_fidir_sz(nbr), GFP_NOFS); ++ if (fidir) { ++ fidir->fd_bbot = -1; ++ fidir->fd_nent = nbr; ++ } ++ ++ return fidir; ++} ++ ++int au_fidir_realloc(struct au_finfo *finfo, int nbr, int may_shrink) ++{ ++ int err; ++ struct au_fidir *fidir, *p; ++ ++ AuRwMustWriteLock(&finfo->fi_rwsem); ++ fidir = finfo->fi_hdir; ++ AuDebugOn(!fidir); ++ ++ err = -ENOMEM; ++ p = au_kzrealloc(fidir, au_fidir_sz(fidir->fd_nent), au_fidir_sz(nbr), ++ GFP_NOFS, may_shrink); ++ if (p) { ++ p->fd_nent = nbr; ++ finfo->fi_hdir = p; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_finfo_fin(struct file *file) ++{ ++ struct au_finfo *finfo; ++ ++ au_nfiles_dec(file->f_path.dentry->d_sb); ++ ++ finfo = au_fi(file); ++ AuDebugOn(finfo->fi_hdir); ++ AuRwDestroy(&finfo->fi_rwsem); ++ au_cache_free_finfo(finfo); ++} ++ ++void au_fi_init_once(void *_finfo) ++{ ++ struct au_finfo *finfo = _finfo; ++ ++ au_rw_init(&finfo->fi_rwsem); ++} ++ ++int au_finfo_init(struct file *file, struct au_fidir *fidir) ++{ ++ int err; ++ struct au_finfo *finfo; ++ struct dentry *dentry; ++ ++ err = -ENOMEM; ++ dentry = file->f_path.dentry; ++ finfo = au_cache_alloc_finfo(); ++ if (unlikely(!finfo)) ++ goto out; ++ ++ err = 0; ++ au_nfiles_inc(dentry->d_sb); ++ au_rw_write_lock(&finfo->fi_rwsem); ++ finfo->fi_btop = -1; ++ finfo->fi_hdir = fidir; ++ atomic_set(&finfo->fi_generation, au_digen(dentry)); ++ /* smp_mb(); */ /* atomic_set */ ++ ++ file->private_data = finfo; ++ ++out: ++ return err; ++} +diff -Naur null/fs/aufs/f_op.c linux-4.15/fs/aufs/f_op.c +--- /dev/null ++++ linux-4.15/fs/aufs/f_op.c 2018-02-25 02:38:09.200737684 +0100 +@@ -0,0 +1,817 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * file and vm operations ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++int au_do_open_nondir(struct file *file, int flags, struct file *h_file) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct dentry *dentry, *h_dentry; ++ struct au_finfo *finfo; ++ struct inode *h_inode; ++ ++ FiMustWriteLock(file); ++ ++ err = 0; ++ dentry = file->f_path.dentry; ++ AuDebugOn(IS_ERR_OR_NULL(dentry)); ++ finfo = au_fi(file); ++ memset(&finfo->fi_htop, 0, sizeof(finfo->fi_htop)); ++ atomic_set(&finfo->fi_mmapped, 0); ++ bindex = au_dbtop(dentry); ++ if (!h_file) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ goto out; ++ h_file = au_h_open(dentry, bindex, flags, file, /*force_wr*/0); ++ } else { ++ h_dentry = h_file->f_path.dentry; ++ err = vfsub_test_mntns(file->f_path.mnt, h_dentry->d_sb); ++ if (unlikely(err)) ++ goto out; ++ get_file(h_file); ++ } ++ if (IS_ERR(h_file)) ++ err = PTR_ERR(h_file); ++ else { ++ if ((flags & __O_TMPFILE) ++ && !(flags & O_EXCL)) { ++ h_inode = file_inode(h_file); ++ spin_lock(&h_inode->i_lock); ++ h_inode->i_state |= I_LINKABLE; ++ spin_unlock(&h_inode->i_lock); ++ } ++ au_set_fbtop(file, bindex); ++ au_set_h_fptr(file, bindex, h_file); ++ au_update_figen(file); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ } ++ ++out: ++ return err; ++} ++ ++static int aufs_open_nondir(struct inode *inode __maybe_unused, ++ struct file *file) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_do_open_args args = { ++ .open = au_do_open_nondir ++ }; ++ ++ AuDbg("%pD, f_flags 0x%x, f_mode 0x%x\n", ++ file, vfsub_file_flags(file), file->f_mode); ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ err = au_do_open(file, &args); ++ si_read_unlock(sb); ++ return err; ++} ++ ++int aufs_release_nondir(struct inode *inode __maybe_unused, struct file *file) ++{ ++ struct au_finfo *finfo; ++ aufs_bindex_t bindex; ++ ++ finfo = au_fi(file); ++ au_hbl_del(&finfo->fi_hlist, ++ &au_sbi(file->f_path.dentry->d_sb)->si_files); ++ bindex = finfo->fi_btop; ++ if (bindex >= 0) ++ au_set_h_fptr(file, bindex, NULL); ++ ++ au_finfo_fin(file); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_do_flush_nondir(struct file *file, fl_owner_t id) ++{ ++ int err; ++ struct file *h_file; ++ ++ err = 0; ++ h_file = au_hf_top(file); ++ if (h_file) ++ err = vfsub_flush(h_file, id); ++ return err; ++} ++ ++static int aufs_flush_nondir(struct file *file, fl_owner_t id) ++{ ++ return au_do_flush(file, id, au_do_flush_nondir); ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * read and write functions acquire [fdi]_rwsem once, but release before ++ * mmap_sem. This is because to stop a race condition between mmap(2). ++ * Releasing these aufs-rwsem should be safe, no branch-mamagement (by keeping ++ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in ++ * read functions after [fdi]_rwsem are released, but it should be harmless. ++ */ ++ ++/* Callers should call au_read_post() or fput() in the end */ ++struct file *au_read_pre(struct file *file, int keep_fi, unsigned int lsc) ++{ ++ struct file *h_file; ++ int err; ++ ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/0, lsc); ++ if (!err) { ++ di_read_unlock(file->f_path.dentry, AuLock_IR); ++ h_file = au_hf_top(file); ++ get_file(h_file); ++ if (!keep_fi) ++ fi_read_unlock(file); ++ } else ++ h_file = ERR_PTR(err); ++ ++ return h_file; ++} ++ ++static void au_read_post(struct inode *inode, struct file *h_file) ++{ ++ /* update without lock, I don't think it a problem */ ++ fsstack_copy_attr_atime(inode, file_inode(h_file)); ++ fput(h_file); ++} ++ ++struct au_write_pre { ++ /* input */ ++ unsigned int lsc; ++ ++ /* output */ ++ blkcnt_t blks; ++ aufs_bindex_t btop; ++}; ++ ++/* ++ * return with iinfo is write-locked ++ * callers should call au_write_post() or iinfo_write_unlock() + fput() in the ++ * end ++ */ ++static struct file *au_write_pre(struct file *file, int do_ready, ++ struct au_write_pre *wpre) ++{ ++ struct file *h_file; ++ struct dentry *dentry; ++ int err; ++ unsigned int lsc; ++ struct au_pin pin; ++ ++ lsc = 0; ++ if (wpre) ++ lsc = wpre->lsc; ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, lsc); ++ h_file = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ if (do_ready) { ++ err = au_ready_to_write(file, -1, &pin); ++ if (unlikely(err)) { ++ h_file = ERR_PTR(err); ++ di_write_unlock(dentry); ++ goto out_fi; ++ } ++ } ++ ++ di_downgrade_lock(dentry, /*flags*/0); ++ if (wpre) ++ wpre->btop = au_fbtop(file); ++ h_file = au_hf_top(file); ++ get_file(h_file); ++ if (wpre) ++ wpre->blks = file_inode(h_file)->i_blocks; ++ if (do_ready) ++ au_unpin(&pin); ++ di_read_unlock(dentry, /*flags*/0); ++ ++out_fi: ++ fi_write_unlock(file); ++out: ++ return h_file; ++} ++ ++static void au_write_post(struct inode *inode, struct file *h_file, ++ struct au_write_pre *wpre, ssize_t written) ++{ ++ struct inode *h_inode; ++ ++ au_cpup_attr_timesizes(inode); ++ AuDebugOn(au_ibtop(inode) != wpre->btop); ++ h_inode = file_inode(h_file); ++ inode->i_mode = h_inode->i_mode; ++ ii_write_unlock(inode); ++ /* AuDbg("blks %llu, %llu\n", (u64)blks, (u64)h_inode->i_blocks); */ ++ if (written > 0) ++ au_fhsm_wrote(inode->i_sb, wpre->btop, ++ /*force*/h_inode->i_blocks > wpre->blks); ++ fput(h_file); ++} ++ ++static ssize_t aufs_read(struct file *file, char __user *buf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ struct inode *inode; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ /* filedata may be obsoleted by concurrent copyup, but no problem */ ++ err = vfsub_read_u(h_file, buf, count, ppos); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ++ * todo: very ugly ++ * it locks both of i_mutex and si_rwsem for read in safe. ++ * if the plink maintenance mode continues forever (that is the problem), ++ * may loop forever. ++ */ ++static void au_mtx_and_read_lock(struct inode *inode) ++{ ++ int err; ++ struct super_block *sb = inode->i_sb; ++ ++ while (1) { ++ inode_lock(inode); ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (!err) ++ break; ++ inode_unlock(inode); ++ si_read_lock(sb, AuLock_NOPLMW); ++ si_read_unlock(sb); ++ } ++} ++ ++static ssize_t aufs_write(struct file *file, const char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ char __user *buf = (char __user *)ubuf; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_write_u(h_file, buf, count, ppos); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio, ++ struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct file *file; ++ ssize_t (*iter)(struct kiocb *, struct iov_iter *); ++ ++ err = security_file_permission(h_file, rw); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOSYS; ++ iter = NULL; ++ if (rw == MAY_READ) ++ iter = h_file->f_op->read_iter; ++ else if (rw == MAY_WRITE) ++ iter = h_file->f_op->write_iter; ++ ++ file = kio->ki_filp; ++ kio->ki_filp = h_file; ++ if (iter) { ++ lockdep_off(); ++ err = iter(kio, iov_iter); ++ lockdep_on(); ++ } else ++ /* currently there is no such fs */ ++ WARN_ON_ONCE(1); ++ kio->ki_filp = file; ++ ++out: ++ return err; ++} ++ ++static ssize_t aufs_read_iter(struct kiocb *kio, struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct file *file, *h_file; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ file = kio->ki_filp; ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/1, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ if (au_test_loopback_kthread()) { ++ au_warn_loopback(h_file->f_path.dentry->d_sb); ++ if (file->f_mapping != h_file->f_mapping) { ++ file->f_mapping = h_file->f_mapping; ++ smp_mb(); /* unnecessary? */ ++ } ++ } ++ fi_read_unlock(file); ++ ++ err = au_do_iter(h_file, MAY_READ, kio, iov_iter); ++ /* todo: necessary? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static ssize_t aufs_write_iter(struct kiocb *kio, struct iov_iter *iov_iter) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *file, *h_file; ++ ++ file = kio->ki_filp; ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = au_do_iter(h_file, MAY_WRITE, kio, iov_iter); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t aufs_splice_read(struct file *file, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) ++{ ++ ssize_t err; ++ struct file *h_file; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_splice_to(h_file, ppos, pipe, len, flags); ++ /* todo: necessasry? */ ++ /* file->f_ra = h_file->f_ra; */ ++ au_read_post(inode, h_file); ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static ssize_t ++aufs_splice_write(struct pipe_inode_info *pipe, struct file *file, loff_t *ppos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); ++ au_write_post(inode, h_file, &wpre, err); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static long aufs_fallocate(struct file *file, int mode, loff_t offset, ++ loff_t len) ++{ ++ long err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_fallocate(h_file, mode, offset, len); ++ lockdep_on(); ++ au_write_post(inode, h_file, &wpre, /*written*/1); ++ ++out: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++ return err; ++} ++ ++static ssize_t aufs_copy_file_range(struct file *src, loff_t src_pos, ++ struct file *dst, loff_t dst_pos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t err; ++ struct au_write_pre wpre; ++ enum { SRC, DST }; ++ struct { ++ struct inode *inode; ++ struct file *h_file; ++ struct super_block *h_sb; ++ } a[2]; ++#define a_src a[SRC] ++#define a_dst a[DST] ++ ++ err = -EINVAL; ++ a_src.inode = file_inode(src); ++ if (unlikely(!S_ISREG(a_src.inode->i_mode))) ++ goto out; ++ a_dst.inode = file_inode(dst); ++ if (unlikely(!S_ISREG(a_dst.inode->i_mode))) ++ goto out; ++ ++ au_mtx_and_read_lock(a_dst.inode); ++ /* ++ * in order to match the order in di_write_lock2_{child,parent}(), ++ * use f_path.dentry for this comparision. ++ */ ++ if (src->f_path.dentry < dst->f_path.dentry) { ++ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_1); ++ err = PTR_ERR(a_src.h_file); ++ if (IS_ERR(a_src.h_file)) ++ goto out_si; ++ ++ wpre.lsc = AuLsc_FI_2; ++ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); ++ err = PTR_ERR(a_dst.h_file); ++ if (IS_ERR(a_dst.h_file)) { ++ au_read_post(a_src.inode, a_src.h_file); ++ goto out_si; ++ } ++ } else { ++ wpre.lsc = AuLsc_FI_1; ++ a_dst.h_file = au_write_pre(dst, /*do_ready*/1, &wpre); ++ err = PTR_ERR(a_dst.h_file); ++ if (IS_ERR(a_dst.h_file)) ++ goto out_si; ++ ++ a_src.h_file = au_read_pre(src, /*keep_fi*/1, AuLsc_FI_2); ++ err = PTR_ERR(a_src.h_file); ++ if (IS_ERR(a_src.h_file)) { ++ au_write_post(a_dst.inode, a_dst.h_file, &wpre, ++ /*written*/0); ++ goto out_si; ++ } ++ } ++ ++ err = -EXDEV; ++ a_src.h_sb = file_inode(a_src.h_file)->i_sb; ++ a_dst.h_sb = file_inode(a_dst.h_file)->i_sb; ++ if (unlikely(a_src.h_sb != a_dst.h_sb)) { ++ AuDbgFile(src); ++ AuDbgFile(dst); ++ goto out_file; ++ } ++ ++ err = vfsub_copy_file_range(a_src.h_file, src_pos, a_dst.h_file, ++ dst_pos, len, flags); ++ ++out_file: ++ au_write_post(a_dst.inode, a_dst.h_file, &wpre, err); ++ fi_read_unlock(src); ++ au_read_post(a_src.inode, a_src.h_file); ++out_si: ++ si_read_unlock(a_dst.inode->i_sb); ++ inode_unlock(a_dst.inode); ++out: ++ return err; ++#undef a_src ++#undef a_dst ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * The locking order around current->mmap_sem. ++ * - in most and regular cases ++ * file I/O syscall -- aufs_read() or something ++ * -- si_rwsem for read -- mmap_sem ++ * (Note that [fdi]i_rwsem are released before mmap_sem). ++ * - in mmap case ++ * mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem ++ * This AB-BA order is definitly bad, but is not a problem since "si_rwsem for ++ * read" allows muliple processes to acquire it and [fdi]i_rwsem are not held in ++ * file I/O. Aufs needs to stop lockdep in aufs_mmap() though. ++ * It means that when aufs acquires si_rwsem for write, the process should never ++ * acquire mmap_sem. ++ * ++ * Actually aufs_iterate() holds [fdi]i_rwsem before mmap_sem, but this is not a ++ * problem either since any directory is not able to be mmap-ed. ++ * The similar scenario is applied to aufs_readlink() too. ++ */ ++ ++#if 0 /* stop calling security_file_mmap() */ ++/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */ ++#define AuConv_VM_PROT(f, b) _calc_vm_trans(f, VM_##b, PROT_##b) ++ ++static unsigned long au_arch_prot_conv(unsigned long flags) ++{ ++ /* currently ppc64 only */ ++#ifdef CONFIG_PPC64 ++ /* cf. linux/arch/powerpc/include/asm/mman.h */ ++ AuDebugOn(arch_calc_vm_prot_bits(-1) != VM_SAO); ++ return AuConv_VM_PROT(flags, SAO); ++#else ++ AuDebugOn(arch_calc_vm_prot_bits(-1)); ++ return 0; ++#endif ++} ++ ++static unsigned long au_prot_conv(unsigned long flags) ++{ ++ return AuConv_VM_PROT(flags, READ) ++ | AuConv_VM_PROT(flags, WRITE) ++ | AuConv_VM_PROT(flags, EXEC) ++ | au_arch_prot_conv(flags); ++} ++ ++/* cf. linux/include/linux/mman.h: calc_vm_flag_bits() */ ++#define AuConv_VM_MAP(f, b) _calc_vm_trans(f, VM_##b, MAP_##b) ++ ++static unsigned long au_flag_conv(unsigned long flags) ++{ ++ return AuConv_VM_MAP(flags, GROWSDOWN) ++ | AuConv_VM_MAP(flags, DENYWRITE) ++ | AuConv_VM_MAP(flags, LOCKED); ++} ++#endif ++ ++static int aufs_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ int err; ++ const unsigned char wlock ++ = (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED); ++ struct super_block *sb; ++ struct file *h_file; ++ struct inode *inode; ++ ++ AuDbgVmRegion(file, vma); ++ ++ inode = file_inode(file); ++ sb = inode->i_sb; ++ lockdep_off(); ++ si_read_lock(sb, AuLock_NOPLMW); ++ ++ h_file = au_write_pre(file, wlock, /*wpre*/NULL); ++ lockdep_on(); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ err = 0; ++ au_set_mmapped(file); ++ au_vm_file_reset(vma, h_file); ++ /* ++ * we cannot call security_mmap_file() here since it may acquire ++ * mmap_sem or i_mutex. ++ * ++ * err = security_mmap_file(h_file, au_prot_conv(vma->vm_flags), ++ * au_flag_conv(vma->vm_flags)); ++ */ ++ if (!err) ++ err = call_mmap(h_file, vma); ++ if (!err) { ++ au_vm_prfile_set(vma, file); ++ fsstack_copy_attr_atime(inode, file_inode(h_file)); ++ goto out_fput; /* success */ ++ } ++ au_unset_mmapped(file); ++ au_vm_file_reset(vma, file); ++ ++out_fput: ++ lockdep_off(); ++ ii_write_unlock(inode); ++ lockdep_on(); ++ fput(h_file); ++out: ++ lockdep_off(); ++ si_read_unlock(sb); ++ lockdep_on(); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_fsync_nondir(struct file *file, loff_t start, loff_t end, ++ int datasync) ++{ ++ int err; ++ struct au_write_pre wpre; ++ struct inode *inode; ++ struct file *h_file; ++ ++ err = 0; /* -EBADF; */ /* posix? */ ++ if (unlikely(!(file->f_mode & FMODE_WRITE))) ++ goto out; ++ ++ inode = file_inode(file); ++ au_mtx_and_read_lock(inode); ++ ++ wpre.lsc = 0; ++ h_file = au_write_pre(file, /*do_ready*/1, &wpre); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out_unlock; ++ ++ err = vfsub_fsync(h_file, &h_file->f_path, datasync); ++ au_write_post(inode, h_file, &wpre, /*written*/0); ++ ++out_unlock: ++ si_read_unlock(inode->i_sb); ++ inode_unlock(inode); ++out: ++ return err; ++} ++ ++static int aufs_fasync(int fd, struct file *file, int flag) ++{ ++ int err; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ if (h_file->f_op->fasync) ++ err = h_file->f_op->fasync(fd, h_file, flag); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++static int aufs_setfl(struct file *file, unsigned long arg) ++{ ++ int err; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ /* stop calling h_file->fasync */ ++ arg |= vfsub_file_flags(file) & FASYNC; ++ err = setfl(/*unused fd*/-1, h_file, arg); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* no one supports this operation, currently */ ++#if 0 ++static ssize_t aufs_sendpage(struct file *file, struct page *page, int offset, ++ size_t len, loff_t *pos, int more) ++{ ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++const struct file_operations aufs_file_fop = { ++ .owner = THIS_MODULE, ++ ++ .llseek = default_llseek, ++ ++ .read = aufs_read, ++ .write = aufs_write, ++ .read_iter = aufs_read_iter, ++ .write_iter = aufs_write_iter, ++ ++#ifdef CONFIG_AUFS_POLL ++ .poll = aufs_poll, ++#endif ++ .unlocked_ioctl = aufs_ioctl_nondir, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = aufs_compat_ioctl_nondir, ++#endif ++ .mmap = aufs_mmap, ++ .open = aufs_open_nondir, ++ .flush = aufs_flush_nondir, ++ .release = aufs_release_nondir, ++ .fsync = aufs_fsync_nondir, ++ .fasync = aufs_fasync, ++ /* .sendpage = aufs_sendpage, */ ++ .setfl = aufs_setfl, ++ .splice_write = aufs_splice_write, ++ .splice_read = aufs_splice_read, ++#if 0 ++ .aio_splice_write = aufs_aio_splice_write, ++ .aio_splice_read = aufs_aio_splice_read, ++#endif ++ .fallocate = aufs_fallocate, ++ .copy_file_range = aufs_copy_file_range ++}; +diff -Naur null/fs/aufs/fstype.h linux-4.15/fs/aufs/fstype.h +--- /dev/null ++++ linux-4.15/fs/aufs/fstype.h 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,400 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * judging filesystem type ++ */ ++ ++#ifndef __AUFS_FSTYPE_H__ ++#define __AUFS_FSTYPE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++ ++static inline int au_test_aufs(struct super_block *sb) ++{ ++ return sb->s_magic == AUFS_SUPER_MAGIC; ++} ++ ++static inline const char *au_sbtype(struct super_block *sb) ++{ ++ return sb->s_type->name; ++} ++ ++static inline int au_test_iso9660(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ISO9660_FS) ++ return sb->s_magic == ISOFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_romfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ROMFS_FS) ++ return sb->s_magic == ROMFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_cramfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_CRAMFS) ++ return sb->s_magic == CRAMFS_MAGIC; ++#endif ++ return 0; ++} ++ ++static inline int au_test_nfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_NFS_FS) ++ return sb->s_magic == NFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_fuse(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_FUSE_FS) ++ return sb->s_magic == FUSE_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_xfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_XFS_FS) ++ return sb->s_magic == XFS_SB_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_tmpfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_TMPFS ++ return sb->s_magic == TMPFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_ecryptfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_ECRYPT_FS) ++ return !strcmp(au_sbtype(sb), "ecryptfs"); ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_ramfs(struct super_block *sb) ++{ ++ return sb->s_magic == RAMFS_MAGIC; ++} ++ ++static inline int au_test_ubifs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_UBIFS_FS) ++ return sb->s_magic == UBIFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_procfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_PROC_FS ++ return sb->s_magic == PROC_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_sysfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_SYSFS ++ return sb->s_magic == SYSFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_configfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_CONFIGFS_FS) ++ return sb->s_magic == CONFIGFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_minix(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_MINIX_FS) ++ return sb->s_magic == MINIX3_SUPER_MAGIC ++ || sb->s_magic == MINIX2_SUPER_MAGIC ++ || sb->s_magic == MINIX2_SUPER_MAGIC2 ++ || sb->s_magic == MINIX_SUPER_MAGIC ++ || sb->s_magic == MINIX_SUPER_MAGIC2; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_fat(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_FAT_FS) ++ return sb->s_magic == MSDOS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_msdos(struct super_block *sb) ++{ ++ return au_test_fat(sb); ++} ++ ++static inline int au_test_vfat(struct super_block *sb) ++{ ++ return au_test_fat(sb); ++} ++ ++static inline int au_test_securityfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_SECURITYFS ++ return sb->s_magic == SECURITYFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_squashfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_SQUASHFS) ++ return sb->s_magic == SQUASHFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_btrfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_BTRFS_FS) ++ return sb->s_magic == BTRFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_xenfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_XENFS) ++ return sb->s_magic == XENFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_debugfs(struct super_block *sb __maybe_unused) ++{ ++#ifdef CONFIG_DEBUG_FS ++ return sb->s_magic == DEBUGFS_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_nilfs(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_NILFS) ++ return sb->s_magic == NILFS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++static inline int au_test_hfsplus(struct super_block *sb __maybe_unused) ++{ ++#if IS_ENABLED(CONFIG_HFSPLUS_FS) ++ return sb->s_magic == HFSPLUS_SUPER_MAGIC; ++#else ++ return 0; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * they can't be an aufs branch. ++ */ ++static inline int au_test_fs_unsuppoted(struct super_block *sb) ++{ ++ return ++#ifndef CONFIG_AUFS_BR_RAMFS ++ au_test_ramfs(sb) || ++#endif ++ au_test_procfs(sb) ++ || au_test_sysfs(sb) ++ || au_test_configfs(sb) ++ || au_test_debugfs(sb) ++ || au_test_securityfs(sb) ++ || au_test_xenfs(sb) ++ || au_test_ecryptfs(sb) ++ /* || !strcmp(au_sbtype(sb), "unionfs") */ ++ || au_test_aufs(sb); /* will be supported in next version */ ++} ++ ++static inline int au_test_fs_remote(struct super_block *sb) ++{ ++ return !au_test_tmpfs(sb) ++#ifdef CONFIG_AUFS_BR_RAMFS ++ && !au_test_ramfs(sb) ++#endif ++ && !(sb->s_type->fs_flags & FS_REQUIRES_DEV); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * Note: these functions (below) are created after reading ->getattr() in all ++ * filesystems under linux/fs. it means we have to do so in every update... ++ */ ++ ++/* ++ * some filesystems require getattr to refresh the inode attributes before ++ * referencing. ++ * in most cases, we can rely on the inode attribute in NFS (or every remote fs) ++ * and leave the work for d_revalidate() ++ */ ++static inline int au_test_fs_refresh_iattr(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_fuse(sb) ++ /* || au_test_btrfs(sb) */ /* untested */ ++ ; ++} ++ ++/* ++ * filesystems which don't maintain i_size or i_blocks. ++ */ ++static inline int au_test_fs_bad_iattr_size(struct super_block *sb) ++{ ++ return au_test_xfs(sb) ++ || au_test_btrfs(sb) ++ || au_test_ubifs(sb) ++ || au_test_hfsplus(sb) /* maintained, but incorrect */ ++ /* || au_test_minix(sb) */ /* untested */ ++ ; ++} ++ ++/* ++ * filesystems which don't store the correct value in some of their inode ++ * attributes. ++ */ ++static inline int au_test_fs_bad_iattr(struct super_block *sb) ++{ ++ return au_test_fs_bad_iattr_size(sb) ++ || au_test_fat(sb) ++ || au_test_msdos(sb) ++ || au_test_vfat(sb); ++} ++ ++/* they don't check i_nlink in link(2) */ ++static inline int au_test_fs_no_limit_nlink(struct super_block *sb) ++{ ++ return au_test_tmpfs(sb) ++#ifdef CONFIG_AUFS_BR_RAMFS ++ || au_test_ramfs(sb) ++#endif ++ || au_test_ubifs(sb) ++ || au_test_hfsplus(sb); ++} ++ ++/* ++ * filesystems which sets S_NOATIME and S_NOCMTIME. ++ */ ++static inline int au_test_fs_notime(struct super_block *sb) ++{ ++ return au_test_nfs(sb) ++ || au_test_fuse(sb) ++ || au_test_ubifs(sb) ++ ; ++} ++ ++/* temporary support for i#1 in cramfs */ ++static inline int au_test_fs_unique_ino(struct inode *inode) ++{ ++ if (au_test_cramfs(inode->i_sb)) ++ return inode->i_ino != 1; ++ return 1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * the filesystem where the xino files placed must support i/o after unlink and ++ * maintain i_size and i_blocks. ++ */ ++static inline int au_test_fs_bad_xino(struct super_block *sb) ++{ ++ return au_test_fs_remote(sb) ++ || au_test_fs_bad_iattr_size(sb) ++ /* don't want unnecessary work for xino */ ++ || au_test_aufs(sb) ++ || au_test_ecryptfs(sb) ++ || au_test_nilfs(sb); ++} ++ ++static inline int au_test_fs_trunc_xino(struct super_block *sb) ++{ ++ return au_test_tmpfs(sb) ++ || au_test_ramfs(sb); ++} ++ ++/* ++ * test if the @sb is real-readonly. ++ */ ++static inline int au_test_fs_rr(struct super_block *sb) ++{ ++ return au_test_squashfs(sb) ++ || au_test_iso9660(sb) ++ || au_test_cramfs(sb) ++ || au_test_romfs(sb); ++} ++ ++/* ++ * test if the @inode is nfs with 'noacl' option ++ * NFS always sets SB_POSIXACL regardless its mount option 'noacl.' ++ */ ++static inline int au_test_nfs_noacl(struct inode *inode) ++{ ++ return au_test_nfs(inode->i_sb) ++ /* && IS_POSIXACL(inode) */ ++ && !nfs_server_capable(inode, NFS_CAP_ACLS); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_FSTYPE_H__ */ +diff -Naur null/fs/aufs/hbl.h linux-4.15/fs/aufs/hbl.h +--- /dev/null ++++ linux-4.15/fs/aufs/hbl.h 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,64 @@ ++/* ++ * Copyright (C) 2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * helpers for hlist_bl.h ++ */ ++ ++#ifndef __AUFS_HBL_H__ ++#define __AUFS_HBL_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++static inline void au_hbl_add(struct hlist_bl_node *node, ++ struct hlist_bl_head *hbl) ++{ ++ hlist_bl_lock(hbl); ++ hlist_bl_add_head(node, hbl); ++ hlist_bl_unlock(hbl); ++} ++ ++static inline void au_hbl_del(struct hlist_bl_node *node, ++ struct hlist_bl_head *hbl) ++{ ++ hlist_bl_lock(hbl); ++ hlist_bl_del(node); ++ hlist_bl_unlock(hbl); ++} ++ ++#define au_hbl_for_each(pos, head) \ ++ for (pos = hlist_bl_first(head); \ ++ pos; \ ++ pos = pos->next) ++ ++static inline unsigned long au_hbl_count(struct hlist_bl_head *hbl) ++{ ++ unsigned long cnt; ++ struct hlist_bl_node *pos; ++ ++ cnt = 0; ++ hlist_bl_lock(hbl); ++ au_hbl_for_each(pos, hbl) ++ cnt++; ++ hlist_bl_unlock(hbl); ++ return cnt; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_HBL_H__ */ +diff -Naur null/fs/aufs/hfsnotify.c linux-4.15/fs/aufs/hfsnotify.c +--- /dev/null ++++ linux-4.15/fs/aufs/hfsnotify.c 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,289 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * fsnotify for the lower directories ++ */ ++ ++#include "aufs.h" ++ ++/* FS_IN_IGNORED is unnecessary */ ++static const __u32 AuHfsnMask = (FS_MOVED_TO | FS_MOVED_FROM | FS_DELETE ++ | FS_CREATE | FS_EVENT_ON_CHILD); ++static DECLARE_WAIT_QUEUE_HEAD(au_hfsn_wq); ++static __cacheline_aligned_in_smp atomic64_t au_hfsn_ifree = ATOMIC64_INIT(0); ++ ++static void au_hfsn_free_mark(struct fsnotify_mark *mark) ++{ ++ struct au_hnotify *hn = container_of(mark, struct au_hnotify, ++ hn_mark); ++ /* AuDbg("here\n"); */ ++ au_cache_free_hnotify(hn); ++ smp_mb__before_atomic(); /* for atomic64_dec */ ++ if (atomic64_dec_and_test(&au_hfsn_ifree)) ++ wake_up(&au_hfsn_wq); ++} ++ ++static int au_hfsn_alloc(struct au_hinode *hinode) ++{ ++ int err; ++ struct au_hnotify *hn; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct fsnotify_mark *mark; ++ aufs_bindex_t bindex; ++ ++ hn = hinode->hi_notify; ++ sb = hn->hn_aufs_inode->i_sb; ++ bindex = au_br_index(sb, hinode->hi_id); ++ br = au_sbr(sb, bindex); ++ AuDebugOn(!br->br_hfsn); ++ ++ mark = &hn->hn_mark; ++ fsnotify_init_mark(mark, br->br_hfsn->hfsn_group); ++ mark->mask = AuHfsnMask; ++ /* ++ * by udba rename or rmdir, aufs assign a new inode to the known ++ * h_inode, so specify 1 to allow dups. ++ */ ++ lockdep_off(); ++ err = fsnotify_add_mark(mark, hinode->hi_inode, /*mnt*/NULL, ++ /*allow_dups*/1); ++ lockdep_on(); ++ ++ return err; ++} ++ ++static int au_hfsn_free(struct au_hinode *hinode, struct au_hnotify *hn) ++{ ++ struct fsnotify_mark *mark; ++ unsigned long long ull; ++ struct fsnotify_group *group; ++ ++ ull = atomic64_inc_return(&au_hfsn_ifree); ++ BUG_ON(!ull); ++ ++ mark = &hn->hn_mark; ++ spin_lock(&mark->lock); ++ group = mark->group; ++ fsnotify_get_group(group); ++ spin_unlock(&mark->lock); ++ lockdep_off(); ++ fsnotify_destroy_mark(mark, group); ++ fsnotify_put_mark(mark); ++ fsnotify_put_group(group); ++ lockdep_on(); ++ ++ /* free hn by myself */ ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_ctl(struct au_hinode *hinode, int do_set) ++{ ++ struct fsnotify_mark *mark; ++ ++ mark = &hinode->hi_notify->hn_mark; ++ spin_lock(&mark->lock); ++ if (do_set) { ++ AuDebugOn(mark->mask & AuHfsnMask); ++ mark->mask |= AuHfsnMask; ++ } else { ++ AuDebugOn(!(mark->mask & AuHfsnMask)); ++ mark->mask &= ~AuHfsnMask; ++ } ++ spin_unlock(&mark->lock); ++ /* fsnotify_recalc_inode_mask(hinode->hi_inode); */ ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* #define AuDbgHnotify */ ++#ifdef AuDbgHnotify ++static char *au_hfsn_name(u32 mask) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++#define test_ret(flag) \ ++ do { \ ++ if (mask & flag) \ ++ return #flag; \ ++ } while (0) ++ test_ret(FS_ACCESS); ++ test_ret(FS_MODIFY); ++ test_ret(FS_ATTRIB); ++ test_ret(FS_CLOSE_WRITE); ++ test_ret(FS_CLOSE_NOWRITE); ++ test_ret(FS_OPEN); ++ test_ret(FS_MOVED_FROM); ++ test_ret(FS_MOVED_TO); ++ test_ret(FS_CREATE); ++ test_ret(FS_DELETE); ++ test_ret(FS_DELETE_SELF); ++ test_ret(FS_MOVE_SELF); ++ test_ret(FS_UNMOUNT); ++ test_ret(FS_Q_OVERFLOW); ++ test_ret(FS_IN_IGNORED); ++ test_ret(FS_ISDIR); ++ test_ret(FS_IN_ONESHOT); ++ test_ret(FS_EVENT_ON_CHILD); ++ return ""; ++#undef test_ret ++#else ++ return "??"; ++#endif ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_free_group(struct fsnotify_group *group) ++{ ++ struct au_br_hfsnotify *hfsn = group->private; ++ ++ /* AuDbg("here\n"); */ ++ kfree(hfsn); ++} ++ ++static int au_hfsn_handle_event(struct fsnotify_group *group, ++ struct inode *inode, ++ struct fsnotify_mark *inode_mark, ++ struct fsnotify_mark *vfsmount_mark, ++ u32 mask, const void *data, int data_type, ++ const unsigned char *file_name, u32 cookie, ++ struct fsnotify_iter_info *iter_info) ++{ ++ int err; ++ struct au_hnotify *hnotify; ++ struct inode *h_dir, *h_inode; ++ struct qstr h_child_qstr = QSTR_INIT(file_name, strlen(file_name)); ++ ++ AuDebugOn(data_type != FSNOTIFY_EVENT_INODE); ++ ++ err = 0; ++ /* if FS_UNMOUNT happens, there must be another bug */ ++ AuDebugOn(mask & FS_UNMOUNT); ++ if (mask & (FS_IN_IGNORED | FS_UNMOUNT)) ++ goto out; ++ ++ h_dir = inode; ++ h_inode = NULL; ++#ifdef AuDbgHnotify ++ au_debug_on(); ++ if (1 || h_child_qstr.len != sizeof(AUFS_XINO_FNAME) - 1 ++ || strncmp(h_child_qstr.name, AUFS_XINO_FNAME, h_child_qstr.len)) { ++ AuDbg("i%lu, mask 0x%x %s, hcname %.*s, hi%lu\n", ++ h_dir->i_ino, mask, au_hfsn_name(mask), ++ AuLNPair(&h_child_qstr), h_inode ? h_inode->i_ino : 0); ++ /* WARN_ON(1); */ ++ } ++ au_debug_off(); ++#endif ++ ++ AuDebugOn(!inode_mark); ++ hnotify = container_of(inode_mark, struct au_hnotify, hn_mark); ++ err = au_hnotify(h_dir, hnotify, mask, &h_child_qstr, h_inode); ++ ++out: ++ return err; ++} ++ ++static struct fsnotify_ops au_hfsn_ops = { ++ .handle_event = au_hfsn_handle_event, ++ .free_group_priv = au_hfsn_free_group, ++ .free_mark = au_hfsn_free_mark ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_fin_br(struct au_branch *br) ++{ ++ struct au_br_hfsnotify *hfsn; ++ ++ hfsn = br->br_hfsn; ++ if (hfsn) { ++ lockdep_off(); ++ fsnotify_put_group(hfsn->hfsn_group); ++ lockdep_on(); ++ } ++} ++ ++static int au_hfsn_init_br(struct au_branch *br, int perm) ++{ ++ int err; ++ struct fsnotify_group *group; ++ struct au_br_hfsnotify *hfsn; ++ ++ err = 0; ++ br->br_hfsn = NULL; ++ if (!au_br_hnotifyable(perm)) ++ goto out; ++ ++ err = -ENOMEM; ++ hfsn = kmalloc(sizeof(*hfsn), GFP_NOFS); ++ if (unlikely(!hfsn)) ++ goto out; ++ ++ err = 0; ++ group = fsnotify_alloc_group(&au_hfsn_ops); ++ if (IS_ERR(group)) { ++ err = PTR_ERR(group); ++ pr_err("fsnotify_alloc_group() failed, %d\n", err); ++ goto out_hfsn; ++ } ++ ++ group->private = hfsn; ++ hfsn->hfsn_group = group; ++ br->br_hfsn = hfsn; ++ goto out; /* success */ ++ ++out_hfsn: ++ kfree(hfsn); ++out: ++ return err; ++} ++ ++static int au_hfsn_reset_br(unsigned int udba, struct au_branch *br, int perm) ++{ ++ int err; ++ ++ err = 0; ++ if (!br->br_hfsn) ++ err = au_hfsn_init_br(br, perm); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_hfsn_fin(void) ++{ ++ AuDbg("au_hfsn_ifree %lld\n", (long long)atomic64_read(&au_hfsn_ifree)); ++ wait_event(au_hfsn_wq, !atomic64_read(&au_hfsn_ifree)); ++} ++ ++const struct au_hnotify_op au_hnotify_op = { ++ .ctl = au_hfsn_ctl, ++ .alloc = au_hfsn_alloc, ++ .free = au_hfsn_free, ++ ++ .fin = au_hfsn_fin, ++ ++ .reset_br = au_hfsn_reset_br, ++ .fin_br = au_hfsn_fin_br, ++ .init_br = au_hfsn_init_br ++}; +diff -Naur null/fs/aufs/hfsplus.c linux-4.15/fs/aufs/hfsplus.c +--- /dev/null ++++ linux-4.15/fs/aufs/hfsplus.c 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,56 @@ ++/* ++ * Copyright (C) 2010-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * special support for filesystems which aqucires an inode mutex ++ * at final closing a file, eg, hfsplus. ++ * ++ * This trick is very simple and stupid, just to open the file before really ++ * neceeary open to tell hfsplus that this is not the final closing. ++ * The caller should call au_h_open_pre() after acquiring the inode mutex, ++ * and au_h_open_post() after releasing it. ++ */ ++ ++#include "aufs.h" ++ ++struct file *au_h_open_pre(struct dentry *dentry, aufs_bindex_t bindex, ++ int force_wr) ++{ ++ struct file *h_file; ++ struct dentry *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ AuDebugOn(!h_dentry); ++ AuDebugOn(d_is_negative(h_dentry)); ++ ++ h_file = NULL; ++ if (au_test_hfsplus(h_dentry->d_sb) ++ && d_is_reg(h_dentry)) ++ h_file = au_h_open(dentry, bindex, ++ O_RDONLY | O_NOATIME | O_LARGEFILE, ++ /*file*/NULL, force_wr); ++ return h_file; ++} ++ ++void au_h_open_post(struct dentry *dentry, aufs_bindex_t bindex, ++ struct file *h_file) ++{ ++ if (h_file) { ++ fput(h_file); ++ au_sbr_put(dentry->d_sb, bindex); ++ } ++} +diff -Naur null/fs/aufs/hnotify.c linux-4.15/fs/aufs/hnotify.c +--- /dev/null ++++ linux-4.15/fs/aufs/hnotify.c 2018-02-25 02:38:09.201737791 +0100 +@@ -0,0 +1,719 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * abstraction to notify the direct changes on lower directories ++ */ ++ ++#include "aufs.h" ++ ++int au_hn_alloc(struct au_hinode *hinode, struct inode *inode) ++{ ++ int err; ++ struct au_hnotify *hn; ++ ++ err = -ENOMEM; ++ hn = au_cache_alloc_hnotify(); ++ if (hn) { ++ hn->hn_aufs_inode = inode; ++ hinode->hi_notify = hn; ++ err = au_hnotify_op.alloc(hinode); ++ AuTraceErr(err); ++ if (unlikely(err)) { ++ hinode->hi_notify = NULL; ++ au_cache_free_hnotify(hn); ++ /* ++ * The upper dir was removed by udba, but the same named ++ * dir left. In this case, aufs assignes a new inode ++ * number and set the monitor again. ++ * For the lower dir, the old monitnor is still left. ++ */ ++ if (err == -EEXIST) ++ err = 0; ++ } ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_hn_free(struct au_hinode *hinode) ++{ ++ struct au_hnotify *hn; ++ ++ hn = hinode->hi_notify; ++ if (hn) { ++ hinode->hi_notify = NULL; ++ if (au_hnotify_op.free(hinode, hn)) ++ au_cache_free_hnotify(hn); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_hn_ctl(struct au_hinode *hinode, int do_set) ++{ ++ if (hinode->hi_notify) ++ au_hnotify_op.ctl(hinode, do_set); ++} ++ ++void au_hn_reset(struct inode *inode, unsigned int flags) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct inode *hi; ++ struct dentry *iwhdentry; ++ ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { ++ hi = au_h_iptr(inode, bindex); ++ if (!hi) ++ continue; ++ ++ /* inode_lock_nested(hi, AuLsc_I_CHILD); */ ++ iwhdentry = au_hi_wh(inode, bindex); ++ if (iwhdentry) ++ dget(iwhdentry); ++ au_igrab(hi); ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ au_set_h_iptr(inode, bindex, au_igrab(hi), ++ flags & ~AuHi_XINO); ++ iput(hi); ++ dput(iwhdentry); ++ /* inode_unlock(hi); */ ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int hn_xino(struct inode *inode, struct inode *h_inode) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot, bfound, btop; ++ struct inode *h_i; ++ ++ err = 0; ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("branch root dir was changed\n"); ++ goto out; ++ } ++ ++ bfound = -1; ++ bbot = au_ibbot(inode); ++ btop = au_ibtop(inode); ++#if 0 /* reserved for future use */ ++ if (bindex == bbot) { ++ /* keep this ino in rename case */ ++ goto out; ++ } ++#endif ++ for (bindex = btop; bindex <= bbot; bindex++) ++ if (au_h_iptr(inode, bindex) == h_inode) { ++ bfound = bindex; ++ break; ++ } ++ if (bfound < 0) ++ goto out; ++ ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ h_i = au_h_iptr(inode, bindex); ++ if (!h_i) ++ continue; ++ ++ err = au_xino_write(inode->i_sb, bindex, h_i->i_ino, /*ino*/0); ++ /* ignore this error */ ++ /* bad action? */ ++ } ++ ++ /* children inode number will be broken */ ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int hn_gen_tree(struct dentry *dentry) ++{ ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, dentry, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ struct dentry *d; ++ ++ d = dentries[j]; ++ if (IS_ROOT(d)) ++ continue; ++ ++ au_digen_dec(d); ++ if (d_really_is_positive(d)) ++ /* todo: reset children xino? ++ cached children only? */ ++ au_iigen_dec(d_inode(d)); ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++ ++#if 0 ++ /* discard children */ ++ dentry_unhash(dentry); ++ dput(dentry); ++#endif ++out: ++ return err; ++} ++ ++/* ++ * return 0 if processed. ++ */ ++static int hn_gen_by_inode(char *name, unsigned int nlen, struct inode *inode, ++ const unsigned int isdir) ++{ ++ int err; ++ struct dentry *d; ++ struct qstr *dname; ++ ++ err = 1; ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("branch root dir was changed\n"); ++ err = 0; ++ goto out; ++ } ++ ++ if (!isdir) { ++ AuDebugOn(!name); ++ au_iigen_dec(inode); ++ spin_lock(&inode->i_lock); ++ hlist_for_each_entry(d, &inode->i_dentry, d_u.d_alias) { ++ spin_lock(&d->d_lock); ++ dname = &d->d_name; ++ if (dname->len != nlen ++ && memcmp(dname->name, name, nlen)) { ++ spin_unlock(&d->d_lock); ++ continue; ++ } ++ err = 0; ++ au_digen_dec(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ spin_unlock(&inode->i_lock); ++ } else { ++ au_fset_si(au_sbi(inode->i_sb), FAILED_REFRESH_DIR); ++ d = d_find_any_alias(inode); ++ if (!d) { ++ au_iigen_dec(inode); ++ goto out; ++ } ++ ++ spin_lock(&d->d_lock); ++ dname = &d->d_name; ++ if (dname->len == nlen && !memcmp(dname->name, name, nlen)) { ++ spin_unlock(&d->d_lock); ++ err = hn_gen_tree(d); ++ spin_lock(&d->d_lock); ++ } ++ spin_unlock(&d->d_lock); ++ dput(d); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int hn_gen_by_name(struct dentry *dentry, const unsigned int isdir) ++{ ++ int err; ++ ++ if (IS_ROOT(dentry)) { ++ pr_warn("branch root dir was changed\n"); ++ return 0; ++ } ++ ++ err = 0; ++ if (!isdir) { ++ au_digen_dec(dentry); ++ if (d_really_is_positive(dentry)) ++ au_iigen_dec(d_inode(dentry)); ++ } else { ++ au_fset_si(au_sbi(dentry->d_sb), FAILED_REFRESH_DIR); ++ if (d_really_is_positive(dentry)) ++ err = hn_gen_tree(dentry); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* hnotify job flags */ ++#define AuHnJob_XINO0 1 ++#define AuHnJob_GEN (1 << 1) ++#define AuHnJob_DIRENT (1 << 2) ++#define AuHnJob_ISDIR (1 << 3) ++#define AuHnJob_TRYXINO0 (1 << 4) ++#define AuHnJob_MNTPNT (1 << 5) ++#define au_ftest_hnjob(flags, name) ((flags) & AuHnJob_##name) ++#define au_fset_hnjob(flags, name) \ ++ do { (flags) |= AuHnJob_##name; } while (0) ++#define au_fclr_hnjob(flags, name) \ ++ do { (flags) &= ~AuHnJob_##name; } while (0) ++ ++enum { ++ AuHn_CHILD, ++ AuHn_PARENT, ++ AuHnLast ++}; ++ ++struct au_hnotify_args { ++ struct inode *h_dir, *dir, *h_child_inode; ++ u32 mask; ++ unsigned int flags[AuHnLast]; ++ unsigned int h_child_nlen; ++ char h_child_name[]; ++}; ++ ++struct hn_job_args { ++ unsigned int flags; ++ struct inode *inode, *h_inode, *dir, *h_dir; ++ struct dentry *dentry; ++ char *h_name; ++ int h_nlen; ++}; ++ ++static int hn_job(struct hn_job_args *a) ++{ ++ const unsigned int isdir = au_ftest_hnjob(a->flags, ISDIR); ++ int e; ++ ++ /* reset xino */ ++ if (au_ftest_hnjob(a->flags, XINO0) && a->inode) ++ hn_xino(a->inode, a->h_inode); /* ignore this error */ ++ ++ if (au_ftest_hnjob(a->flags, TRYXINO0) ++ && a->inode ++ && a->h_inode) { ++ vfsub_inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); ++ if (!a->h_inode->i_nlink ++ && !(a->h_inode->i_state & I_LINKABLE)) ++ hn_xino(a->inode, a->h_inode); /* ignore this error */ ++ inode_unlock_shared(a->h_inode); ++ } ++ ++ /* make the generation obsolete */ ++ if (au_ftest_hnjob(a->flags, GEN)) { ++ e = -1; ++ if (a->inode) ++ e = hn_gen_by_inode(a->h_name, a->h_nlen, a->inode, ++ isdir); ++ if (e && a->dentry) ++ hn_gen_by_name(a->dentry, isdir); ++ /* ignore this error */ ++ } ++ ++ /* make dir entries obsolete */ ++ if (au_ftest_hnjob(a->flags, DIRENT) && a->inode) { ++ struct au_vdir *vdir; ++ ++ vdir = au_ivdir(a->inode); ++ if (vdir) ++ vdir->vd_jiffy = 0; ++ /* IMustLock(a->inode); */ ++ /* a->inode->i_version++; */ ++ } ++ ++ /* can do nothing but warn */ ++ if (au_ftest_hnjob(a->flags, MNTPNT) ++ && a->dentry ++ && d_mountpoint(a->dentry)) ++ pr_warn("mount-point %pd is removed or renamed\n", a->dentry); ++ ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen, ++ struct inode *dir) ++{ ++ struct dentry *dentry, *d, *parent; ++ struct qstr *dname; ++ ++ parent = d_find_any_alias(dir); ++ if (!parent) ++ return NULL; ++ ++ dentry = NULL; ++ spin_lock(&parent->d_lock); ++ list_for_each_entry(d, &parent->d_subdirs, d_child) { ++ /* AuDbg("%pd\n", d); */ ++ spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED); ++ dname = &d->d_name; ++ if (dname->len != nlen || memcmp(dname->name, name, nlen)) ++ goto cont_unlock; ++ if (au_di(d)) ++ au_digen_dec(d); ++ else ++ goto cont_unlock; ++ if (au_dcount(d) > 0) { ++ dentry = dget_dlock(d); ++ spin_unlock(&d->d_lock); ++ break; ++ } ++ ++cont_unlock: ++ spin_unlock(&d->d_lock); ++ } ++ spin_unlock(&parent->d_lock); ++ dput(parent); ++ ++ if (dentry) ++ di_write_lock_child(dentry); ++ ++ return dentry; ++} ++ ++static struct inode *lookup_wlock_by_ino(struct super_block *sb, ++ aufs_bindex_t bindex, ino_t h_ino) ++{ ++ struct inode *inode; ++ ino_t ino; ++ int err; ++ ++ inode = NULL; ++ err = au_xino_read(sb, bindex, h_ino, &ino); ++ if (!err && ino) ++ inode = ilookup(sb, ino); ++ if (!inode) ++ goto out; ++ ++ if (unlikely(inode->i_ino == AUFS_ROOT_INO)) { ++ pr_warn("wrong root branch\n"); ++ iput(inode); ++ inode = NULL; ++ goto out; ++ } ++ ++ ii_write_lock_child(inode); ++ ++out: ++ return inode; ++} ++ ++static void au_hn_bh(void *_args) ++{ ++ struct au_hnotify_args *a = _args; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot, bfound; ++ unsigned char xino, try_iput; ++ int err; ++ struct inode *inode; ++ ino_t h_ino; ++ struct hn_job_args args; ++ struct dentry *dentry; ++ struct au_sbinfo *sbinfo; ++ ++ AuDebugOn(!_args); ++ AuDebugOn(!a->h_dir); ++ AuDebugOn(!a->dir); ++ AuDebugOn(!a->mask); ++ AuDbg("mask 0x%x, i%lu, hi%lu, hci%lu\n", ++ a->mask, a->dir->i_ino, a->h_dir->i_ino, ++ a->h_child_inode ? a->h_child_inode->i_ino : 0); ++ ++ inode = NULL; ++ dentry = NULL; ++ /* ++ * do not lock a->dir->i_mutex here ++ * because of d_revalidate() may cause a deadlock. ++ */ ++ sb = a->dir->i_sb; ++ AuDebugOn(!sb); ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!sbinfo); ++ si_write_lock(sb, AuLock_NOPLMW); ++ ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) ++ switch (a->mask & FS_EVENTS_POSS_ON_CHILD) { ++ case FS_MOVED_FROM: ++ case FS_MOVED_TO: ++ AuWarn1("DIRREN with UDBA may not work correctly " ++ "for the direct rename(2)\n"); ++ } ++ ++ ii_read_lock_parent(a->dir); ++ bfound = -1; ++ bbot = au_ibbot(a->dir); ++ for (bindex = au_ibtop(a->dir); bindex <= bbot; bindex++) ++ if (au_h_iptr(a->dir, bindex) == a->h_dir) { ++ bfound = bindex; ++ break; ++ } ++ ii_read_unlock(a->dir); ++ if (unlikely(bfound < 0)) ++ goto out; ++ ++ xino = !!au_opt_test(au_mntflags(sb), XINO); ++ h_ino = 0; ++ if (a->h_child_inode) ++ h_ino = a->h_child_inode->i_ino; ++ ++ if (a->h_child_nlen ++ && (au_ftest_hnjob(a->flags[AuHn_CHILD], GEN) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], MNTPNT))) ++ dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen, ++ a->dir); ++ try_iput = 0; ++ if (dentry && d_really_is_positive(dentry)) ++ inode = d_inode(dentry); ++ if (xino && !inode && h_ino ++ && (au_ftest_hnjob(a->flags[AuHn_CHILD], XINO0) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], TRYXINO0) ++ || au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) { ++ inode = lookup_wlock_by_ino(sb, bfound, h_ino); ++ try_iput = 1; ++ } ++ ++ args.flags = a->flags[AuHn_CHILD]; ++ args.dentry = dentry; ++ args.inode = inode; ++ args.h_inode = a->h_child_inode; ++ args.dir = a->dir; ++ args.h_dir = a->h_dir; ++ args.h_name = a->h_child_name; ++ args.h_nlen = a->h_child_nlen; ++ err = hn_job(&args); ++ if (dentry) { ++ if (au_di(dentry)) ++ di_write_unlock(dentry); ++ dput(dentry); ++ } ++ if (inode && try_iput) { ++ ii_write_unlock(inode); ++ iput(inode); ++ } ++ ++ ii_write_lock_parent(a->dir); ++ args.flags = a->flags[AuHn_PARENT]; ++ args.dentry = NULL; ++ args.inode = a->dir; ++ args.h_inode = a->h_dir; ++ args.dir = NULL; ++ args.h_dir = NULL; ++ args.h_name = NULL; ++ args.h_nlen = 0; ++ err = hn_job(&args); ++ ii_write_unlock(a->dir); ++ ++out: ++ iput(a->h_child_inode); ++ iput(a->h_dir); ++ iput(a->dir); ++ si_write_unlock(sb); ++ au_nwt_done(&sbinfo->si_nowait); ++ kfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, ++ struct qstr *h_child_qstr, struct inode *h_child_inode) ++{ ++ int err, len; ++ unsigned int flags[AuHnLast], f; ++ unsigned char isdir, isroot, wh; ++ struct inode *dir; ++ struct au_hnotify_args *args; ++ char *p, *h_child_name; ++ ++ err = 0; ++ AuDebugOn(!hnotify || !hnotify->hn_aufs_inode); ++ dir = igrab(hnotify->hn_aufs_inode); ++ if (!dir) ++ goto out; ++ ++ isroot = (dir->i_ino == AUFS_ROOT_INO); ++ wh = 0; ++ h_child_name = (void *)h_child_qstr->name; ++ len = h_child_qstr->len; ++ if (h_child_name) { ++ if (len > AUFS_WH_PFX_LEN ++ && !memcmp(h_child_name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ h_child_name += AUFS_WH_PFX_LEN; ++ len -= AUFS_WH_PFX_LEN; ++ wh = 1; ++ } ++ } ++ ++ isdir = 0; ++ if (h_child_inode) ++ isdir = !!S_ISDIR(h_child_inode->i_mode); ++ flags[AuHn_PARENT] = AuHnJob_ISDIR; ++ flags[AuHn_CHILD] = 0; ++ if (isdir) ++ flags[AuHn_CHILD] = AuHnJob_ISDIR; ++ au_fset_hnjob(flags[AuHn_PARENT], DIRENT); ++ au_fset_hnjob(flags[AuHn_CHILD], GEN); ++ switch (mask & FS_EVENTS_POSS_ON_CHILD) { ++ case FS_MOVED_FROM: ++ case FS_MOVED_TO: ++ au_fset_hnjob(flags[AuHn_CHILD], XINO0); ++ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); ++ /*FALLTHROUGH*/ ++ case FS_CREATE: ++ AuDebugOn(!h_child_name); ++ break; ++ ++ case FS_DELETE: ++ /* ++ * aufs never be able to get this child inode. ++ * revalidation should be in d_revalidate() ++ * by checking i_nlink, i_generation or d_unhashed(). ++ */ ++ AuDebugOn(!h_child_name); ++ au_fset_hnjob(flags[AuHn_CHILD], TRYXINO0); ++ au_fset_hnjob(flags[AuHn_CHILD], MNTPNT); ++ break; ++ ++ default: ++ AuDebugOn(1); ++ } ++ ++ if (wh) ++ h_child_inode = NULL; ++ ++ err = -ENOMEM; ++ /* iput() and kfree() will be called in au_hnotify() */ ++ args = kmalloc(sizeof(*args) + len + 1, GFP_NOFS); ++ if (unlikely(!args)) { ++ AuErr1("no memory\n"); ++ iput(dir); ++ goto out; ++ } ++ args->flags[AuHn_PARENT] = flags[AuHn_PARENT]; ++ args->flags[AuHn_CHILD] = flags[AuHn_CHILD]; ++ args->mask = mask; ++ args->dir = dir; ++ args->h_dir = igrab(h_dir); ++ if (h_child_inode) ++ h_child_inode = igrab(h_child_inode); /* can be NULL */ ++ args->h_child_inode = h_child_inode; ++ args->h_child_nlen = len; ++ if (len) { ++ p = (void *)args; ++ p += sizeof(*args); ++ memcpy(p, h_child_name, len); ++ p[len] = 0; ++ } ++ ++ /* NFS fires the event for silly-renamed one from kworker */ ++ f = 0; ++ if (!dir->i_nlink ++ || (au_test_nfs(h_dir->i_sb) && (mask & FS_DELETE))) ++ f = AuWkq_NEST; ++ err = au_wkq_nowait(au_hn_bh, args, dir->i_sb, f); ++ if (unlikely(err)) { ++ pr_err("wkq %d\n", err); ++ iput(args->h_child_inode); ++ iput(args->h_dir); ++ iput(args->dir); ++ kfree(args); ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm) ++{ ++ int err; ++ ++ AuDebugOn(!(udba & AuOptMask_UDBA)); ++ ++ err = 0; ++ if (au_hnotify_op.reset_br) ++ err = au_hnotify_op.reset_br(udba, br, perm); ++ ++ return err; ++} ++ ++int au_hnotify_init_br(struct au_branch *br, int perm) ++{ ++ int err; ++ ++ err = 0; ++ if (au_hnotify_op.init_br) ++ err = au_hnotify_op.init_br(br, perm); ++ ++ return err; ++} ++ ++void au_hnotify_fin_br(struct au_branch *br) ++{ ++ if (au_hnotify_op.fin_br) ++ au_hnotify_op.fin_br(br); ++} ++ ++static void au_hn_destroy_cache(void) ++{ ++ kmem_cache_destroy(au_cache[AuCache_HNOTIFY]); ++ au_cache[AuCache_HNOTIFY] = NULL; ++} ++ ++int __init au_hnotify_init(void) ++{ ++ int err; ++ ++ err = -ENOMEM; ++ au_cache[AuCache_HNOTIFY] = AuCache(au_hnotify); ++ if (au_cache[AuCache_HNOTIFY]) { ++ err = 0; ++ if (au_hnotify_op.init) ++ err = au_hnotify_op.init(); ++ if (unlikely(err)) ++ au_hn_destroy_cache(); ++ } ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_hnotify_fin(void) ++{ ++ if (au_hnotify_op.fin) ++ au_hnotify_op.fin(); ++ ++ /* cf. au_cache_fin() */ ++ if (au_cache[AuCache_HNOTIFY]) ++ au_hn_destroy_cache(); ++} +diff -Naur null/fs/aufs/iinfo.c linux-4.15/fs/aufs/iinfo.c +--- /dev/null ++++ linux-4.15/fs/aufs/iinfo.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,285 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode private data ++ */ ++ ++#include "aufs.h" ++ ++struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex) ++{ ++ struct inode *h_inode; ++ struct au_hinode *hinode; ++ ++ IiMustAnyLock(inode); ++ ++ hinode = au_hinode(au_ii(inode), bindex); ++ h_inode = hinode->hi_inode; ++ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); ++ return h_inode; ++} ++ ++/* todo: hard/soft set? */ ++void au_hiput(struct au_hinode *hinode) ++{ ++ au_hn_free(hinode); ++ dput(hinode->hi_whdentry); ++ iput(hinode->hi_inode); ++} ++ ++unsigned int au_hi_flags(struct inode *inode, int isdir) ++{ ++ unsigned int flags; ++ const unsigned int mnt_flags = au_mntflags(inode->i_sb); ++ ++ flags = 0; ++ if (au_opt_test(mnt_flags, XINO)) ++ au_fset_hi(flags, XINO); ++ if (isdir && au_opt_test(mnt_flags, UDBA_HNOTIFY)) ++ au_fset_hi(flags, HNOTIFY); ++ return flags; ++} ++ ++void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode, unsigned int flags) ++{ ++ struct au_hinode *hinode; ++ struct inode *hi; ++ struct au_iinfo *iinfo = au_ii(inode); ++ ++ IiMustWriteLock(inode); ++ ++ hinode = au_hinode(iinfo, bindex); ++ hi = hinode->hi_inode; ++ AuDebugOn(h_inode && atomic_read(&h_inode->i_count) <= 0); ++ ++ if (hi) ++ au_hiput(hinode); ++ hinode->hi_inode = h_inode; ++ if (h_inode) { ++ int err; ++ struct super_block *sb = inode->i_sb; ++ struct au_branch *br; ++ ++ AuDebugOn(inode->i_mode ++ && (h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT)); ++ if (bindex == iinfo->ii_btop) ++ au_cpup_igen(inode, h_inode); ++ br = au_sbr(sb, bindex); ++ hinode->hi_id = br->br_id; ++ if (au_ftest_hi(flags, XINO)) { ++ err = au_xino_write(sb, bindex, h_inode->i_ino, ++ inode->i_ino); ++ if (unlikely(err)) ++ AuIOErr1("failed au_xino_write() %d\n", err); ++ } ++ ++ if (au_ftest_hi(flags, HNOTIFY) ++ && au_br_hnotifyable(br->br_perm)) { ++ err = au_hn_alloc(hinode, inode); ++ if (unlikely(err)) ++ AuIOErr1("au_hn_alloc() %d\n", err); ++ } ++ } ++} ++ ++void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_wh) ++{ ++ struct au_hinode *hinode; ++ ++ IiMustWriteLock(inode); ++ ++ hinode = au_hinode(au_ii(inode), bindex); ++ AuDebugOn(hinode->hi_whdentry); ++ hinode->hi_whdentry = h_wh; ++} ++ ++void au_update_iigen(struct inode *inode, int half) ++{ ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ unsigned int sigen; ++ ++ sigen = au_sigen(inode->i_sb); ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ iigen->ig_generation = sigen; ++ if (half) ++ au_ig_fset(iigen->ig_flags, HALF_REFRESHED); ++ else ++ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED); ++ spin_unlock(&iigen->ig_spin); ++} ++ ++/* it may be called at remount time, too */ ++void au_update_ibrange(struct inode *inode, int do_put_zero) ++{ ++ struct au_iinfo *iinfo; ++ aufs_bindex_t bindex, bbot; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ IiMustWriteLock(inode); ++ ++ iinfo = au_ii(inode); ++ if (do_put_zero && iinfo->ii_btop >= 0) { ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; ++ bindex++) { ++ struct inode *h_i; ++ ++ h_i = au_hinode(iinfo, bindex)->hi_inode; ++ if (h_i ++ && !h_i->i_nlink ++ && !(h_i->i_state & I_LINKABLE)) ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ } ++ } ++ ++ iinfo->ii_btop = -1; ++ iinfo->ii_bbot = -1; ++ bbot = au_sbbot(inode->i_sb); ++ for (bindex = 0; bindex <= bbot; bindex++) ++ if (au_hinode(iinfo, bindex)->hi_inode) { ++ iinfo->ii_btop = bindex; ++ break; ++ } ++ if (iinfo->ii_btop >= 0) ++ for (bindex = bbot; bindex >= iinfo->ii_btop; bindex--) ++ if (au_hinode(iinfo, bindex)->hi_inode) { ++ iinfo->ii_bbot = bindex; ++ break; ++ } ++ AuDebugOn(iinfo->ii_btop > iinfo->ii_bbot); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_icntnr_init_once(void *_c) ++{ ++ struct au_icntnr *c = _c; ++ struct au_iinfo *iinfo = &c->iinfo; ++ ++ spin_lock_init(&iinfo->ii_generation.ig_spin); ++ au_rw_init(&iinfo->ii_rwsem); ++ inode_init_once(&c->vfs_inode); ++} ++ ++void au_hinode_init(struct au_hinode *hinode) ++{ ++ hinode->hi_inode = NULL; ++ hinode->hi_id = -1; ++ au_hn_init(hinode); ++ hinode->hi_whdentry = NULL; ++} ++ ++int au_iinfo_init(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct super_block *sb; ++ struct au_hinode *hi; ++ int nbr, i; ++ ++ sb = inode->i_sb; ++ iinfo = &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); ++ nbr = au_sbbot(sb) + 1; ++ if (unlikely(nbr <= 0)) ++ nbr = 1; ++ hi = kmalloc_array(nbr, sizeof(*iinfo->ii_hinode), GFP_NOFS); ++ if (hi) { ++ au_ninodes_inc(sb); ++ ++ iinfo->ii_hinode = hi; ++ for (i = 0; i < nbr; i++, hi++) ++ au_hinode_init(hi); ++ ++ iinfo->ii_generation.ig_generation = au_sigen(sb); ++ iinfo->ii_btop = -1; ++ iinfo->ii_bbot = -1; ++ iinfo->ii_vdir = NULL; ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink) ++{ ++ int err, i; ++ struct au_hinode *hip; ++ ++ AuRwMustWriteLock(&iinfo->ii_rwsem); ++ ++ err = -ENOMEM; ++ hip = au_krealloc(iinfo->ii_hinode, sizeof(*hip) * nbr, GFP_NOFS, ++ may_shrink); ++ if (hip) { ++ iinfo->ii_hinode = hip; ++ i = iinfo->ii_bbot + 1; ++ hip += i; ++ for (; i < nbr; i++, hip++) ++ au_hinode_init(hip); ++ err = 0; ++ } ++ ++ return err; ++} ++ ++void au_iinfo_fin(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_hinode *hi; ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ const unsigned char unlinked = !inode->i_nlink; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ ++ sb = inode->i_sb; ++ au_ninodes_dec(sb); ++ if (si_pid_test(sb)) ++ au_xino_delete_inode(inode, unlinked); ++ else { ++ /* ++ * it is safe to hide the dependency between sbinfo and ++ * sb->s_umount. ++ */ ++ lockdep_off(); ++ si_noflush_read_lock(sb); ++ au_xino_delete_inode(inode, unlinked); ++ si_read_unlock(sb); ++ lockdep_on(); ++ } ++ ++ iinfo = au_ii(inode); ++ if (iinfo->ii_vdir) ++ au_vdir_free(iinfo->ii_vdir); ++ ++ bindex = iinfo->ii_btop; ++ if (bindex >= 0) { ++ hi = au_hinode(iinfo, bindex); ++ bbot = iinfo->ii_bbot; ++ while (bindex++ <= bbot) { ++ if (hi->hi_inode) ++ au_hiput(hi); ++ hi++; ++ } ++ } ++ kfree(iinfo->ii_hinode); ++ AuRwDestroy(&iinfo->ii_rwsem); ++} +diff -Naur null/fs/aufs/inode.c linux-4.15/fs/aufs/inode.c +--- /dev/null ++++ linux-4.15/fs/aufs/inode.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,527 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode functions ++ */ ++ ++#include "aufs.h" ++ ++struct inode *au_igrab(struct inode *inode) ++{ ++ if (inode) { ++ AuDebugOn(!atomic_read(&inode->i_count)); ++ ihold(inode); ++ } ++ return inode; ++} ++ ++static void au_refresh_hinode_attr(struct inode *inode, int do_version) ++{ ++ au_cpup_attr_all(inode, /*force*/0); ++ au_update_iigen(inode, /*half*/1); ++ if (do_version) ++ inode->i_version++; ++} ++ ++static int au_ii_refresh(struct inode *inode, int *update) ++{ ++ int err, e, nbr; ++ umode_t type; ++ aufs_bindex_t bindex, new_bindex; ++ struct super_block *sb; ++ struct au_iinfo *iinfo; ++ struct au_hinode *p, *q, tmp; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ IiMustWriteLock(inode); ++ ++ *update = 0; ++ sb = inode->i_sb; ++ nbr = au_sbbot(sb) + 1; ++ type = inode->i_mode & S_IFMT; ++ iinfo = au_ii(inode); ++ err = au_hinode_realloc(iinfo, nbr, /*may_shrink*/0); ++ if (unlikely(err)) ++ goto out; ++ ++ AuDebugOn(iinfo->ii_btop < 0); ++ p = au_hinode(iinfo, iinfo->ii_btop); ++ for (bindex = iinfo->ii_btop; bindex <= iinfo->ii_bbot; ++ bindex++, p++) { ++ if (!p->hi_inode) ++ continue; ++ ++ AuDebugOn(type != (p->hi_inode->i_mode & S_IFMT)); ++ new_bindex = au_br_index(sb, p->hi_id); ++ if (new_bindex == bindex) ++ continue; ++ ++ if (new_bindex < 0) { ++ *update = 1; ++ au_hiput(p); ++ p->hi_inode = NULL; ++ continue; ++ } ++ ++ if (new_bindex < iinfo->ii_btop) ++ iinfo->ii_btop = new_bindex; ++ if (iinfo->ii_bbot < new_bindex) ++ iinfo->ii_bbot = new_bindex; ++ /* swap two lower inode, and loop again */ ++ q = au_hinode(iinfo, new_bindex); ++ tmp = *q; ++ *q = *p; ++ *p = tmp; ++ if (tmp.hi_inode) { ++ bindex--; ++ p--; ++ } ++ } ++ au_update_ibrange(inode, /*do_put_zero*/0); ++ au_hinode_realloc(iinfo, nbr, /*may_shrink*/1); /* harmless if err */ ++ e = au_dy_irefresh(inode); ++ if (unlikely(e && !err)) ++ err = e; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++void au_refresh_iop(struct inode *inode, int force_getattr) ++{ ++ int type; ++ struct au_sbinfo *sbi = au_sbi(inode->i_sb); ++ const struct inode_operations *iop ++ = force_getattr ? aufs_iop : sbi->si_iop_array; ++ ++ if (inode->i_op == iop) ++ return; ++ ++ switch (inode->i_mode & S_IFMT) { ++ case S_IFDIR: ++ type = AuIop_DIR; ++ break; ++ case S_IFLNK: ++ type = AuIop_SYMLINK; ++ break; ++ default: ++ type = AuIop_OTHER; ++ break; ++ } ++ ++ inode->i_op = iop + type; ++ /* unnecessary smp_wmb() */ ++} ++ ++int au_refresh_hinode_self(struct inode *inode) ++{ ++ int err, update; ++ ++ err = au_ii_refresh(inode, &update); ++ if (!err) ++ au_refresh_hinode_attr(inode, update && S_ISDIR(inode->i_mode)); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_refresh_hinode(struct inode *inode, struct dentry *dentry) ++{ ++ int err, e, update; ++ unsigned int flags; ++ umode_t mode; ++ aufs_bindex_t bindex, bbot; ++ unsigned char isdir; ++ struct au_hinode *p; ++ struct au_iinfo *iinfo; ++ ++ err = au_ii_refresh(inode, &update); ++ if (unlikely(err)) ++ goto out; ++ ++ update = 0; ++ iinfo = au_ii(inode); ++ p = au_hinode(iinfo, iinfo->ii_btop); ++ mode = (inode->i_mode & S_IFMT); ++ isdir = S_ISDIR(mode); ++ flags = au_hi_flags(inode, isdir); ++ bbot = au_dbbot(dentry); ++ for (bindex = au_dbtop(dentry); bindex <= bbot; bindex++) { ++ struct inode *h_i, *h_inode; ++ struct dentry *h_d; ++ ++ h_d = au_h_dptr(dentry, bindex); ++ if (!h_d || d_is_negative(h_d)) ++ continue; ++ ++ h_inode = d_inode(h_d); ++ AuDebugOn(mode != (h_inode->i_mode & S_IFMT)); ++ if (iinfo->ii_btop <= bindex && bindex <= iinfo->ii_bbot) { ++ h_i = au_h_iptr(inode, bindex); ++ if (h_i) { ++ if (h_i == h_inode) ++ continue; ++ err = -EIO; ++ break; ++ } ++ } ++ if (bindex < iinfo->ii_btop) ++ iinfo->ii_btop = bindex; ++ if (iinfo->ii_bbot < bindex) ++ iinfo->ii_bbot = bindex; ++ au_set_h_iptr(inode, bindex, au_igrab(h_inode), flags); ++ update = 1; ++ } ++ au_update_ibrange(inode, /*do_put_zero*/0); ++ e = au_dy_irefresh(inode); ++ if (unlikely(e && !err)) ++ err = e; ++ if (!err) ++ au_refresh_hinode_attr(inode, update && isdir); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int set_inode(struct inode *inode, struct dentry *dentry) ++{ ++ int err; ++ unsigned int flags; ++ umode_t mode; ++ aufs_bindex_t bindex, btop, btail; ++ unsigned char isdir; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ struct au_iinfo *iinfo; ++ struct inode_operations *iop; ++ ++ IiMustWriteLock(inode); ++ ++ err = 0; ++ isdir = 0; ++ iop = au_sbi(inode->i_sb)->si_iop_array; ++ btop = au_dbtop(dentry); ++ h_dentry = au_h_dptr(dentry, btop); ++ h_inode = d_inode(h_dentry); ++ mode = h_inode->i_mode; ++ switch (mode & S_IFMT) { ++ case S_IFREG: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_OTHER; ++ inode->i_fop = &aufs_file_fop; ++ err = au_dy_iaop(inode, btop, h_inode); ++ if (unlikely(err)) ++ goto out; ++ break; ++ case S_IFDIR: ++ isdir = 1; ++ btail = au_dbtaildir(dentry); ++ inode->i_op = iop + AuIop_DIR; ++ inode->i_fop = &aufs_dir_fop; ++ break; ++ case S_IFLNK: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_SYMLINK; ++ break; ++ case S_IFBLK: ++ case S_IFCHR: ++ case S_IFIFO: ++ case S_IFSOCK: ++ btail = au_dbtail(dentry); ++ inode->i_op = iop + AuIop_OTHER; ++ init_special_inode(inode, mode, h_inode->i_rdev); ++ break; ++ default: ++ AuIOErr("Unknown file type 0%o\n", mode); ++ err = -EIO; ++ goto out; ++ } ++ ++ /* do not set hnotify for whiteouted dirs (SHWH mode) */ ++ flags = au_hi_flags(inode, isdir); ++ if (au_opt_test(au_mntflags(dentry->d_sb), SHWH) ++ && au_ftest_hi(flags, HNOTIFY) ++ && dentry->d_name.len > AUFS_WH_PFX_LEN ++ && !memcmp(dentry->d_name.name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) ++ au_fclr_hi(flags, HNOTIFY); ++ iinfo = au_ii(inode); ++ iinfo->ii_btop = btop; ++ iinfo->ii_bbot = btail; ++ for (bindex = btop; bindex <= btail; bindex++) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) ++ au_set_h_iptr(inode, bindex, ++ au_igrab(d_inode(h_dentry)), flags); ++ } ++ au_cpup_attr_all(inode, /*force*/1); ++ /* ++ * to force calling aufs_get_acl() every time, ++ * do not call cache_no_acl() for aufs inode. ++ */ ++ ++out: ++ return err; ++} ++ ++/* ++ * successful returns with iinfo write_locked ++ * minus: errno ++ * zero: success, matched ++ * plus: no error, but unmatched ++ */ ++static int reval_inode(struct inode *inode, struct dentry *dentry) ++{ ++ int err; ++ unsigned int gen, igflags; ++ aufs_bindex_t bindex, bbot; ++ struct inode *h_inode, *h_dinode; ++ struct dentry *h_dentry; ++ ++ /* ++ * before this function, if aufs got any iinfo lock, it must be only ++ * one, the parent dir. ++ * it can happen by UDBA and the obsoleted inode number. ++ */ ++ err = -EIO; ++ if (unlikely(inode->i_ino == parent_ino(dentry))) ++ goto out; ++ ++ err = 1; ++ ii_write_lock_new_child(inode); ++ h_dentry = au_h_dptr(dentry, au_dbtop(dentry)); ++ h_dinode = d_inode(h_dentry); ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (!h_inode || h_inode != h_dinode) ++ continue; ++ ++ err = 0; ++ gen = au_iigen(inode, &igflags); ++ if (gen == au_digen(dentry) ++ && !au_ig_ftest(igflags, HALF_REFRESHED)) ++ break; ++ ++ /* fully refresh inode using dentry */ ++ err = au_refresh_hinode(inode, dentry); ++ if (!err) ++ au_update_iigen(inode, /*half*/0); ++ break; ++ } ++ ++ if (unlikely(err)) ++ ii_write_unlock(inode); ++out: ++ return err; ++} ++ ++int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ unsigned int d_type, ino_t *ino) ++{ ++ int err, idx; ++ const int isnondir = d_type != DT_DIR; ++ ++ /* prevent hardlinked inode number from race condition */ ++ if (isnondir) { ++ err = au_xinondir_enter(sb, bindex, h_ino, &idx); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ err = au_xino_read(sb, bindex, h_ino, ino); ++ if (unlikely(err)) ++ goto out_xinondir; ++ ++ if (!*ino) { ++ err = -EIO; ++ *ino = au_xino_new_ino(sb); ++ if (unlikely(!*ino)) ++ goto out_xinondir; ++ err = au_xino_write(sb, bindex, h_ino, *ino); ++ if (unlikely(err)) ++ goto out_xinondir; ++ } ++ ++out_xinondir: ++ if (isnondir && idx >= 0) ++ au_xinondir_leave(sb, bindex, h_ino, idx); ++out: ++ return err; ++} ++ ++/* successful returns with iinfo write_locked */ ++/* todo: return with unlocked? */ ++struct inode *au_new_inode(struct dentry *dentry, int must_new) ++{ ++ struct inode *inode, *h_inode; ++ struct dentry *h_dentry; ++ struct super_block *sb; ++ ino_t h_ino, ino; ++ int err, idx, hlinked; ++ aufs_bindex_t btop; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ h_dentry = au_h_dptr(dentry, btop); ++ h_inode = d_inode(h_dentry); ++ h_ino = h_inode->i_ino; ++ hlinked = !d_is_dir(h_dentry) && h_inode->i_nlink > 1; ++ ++new_ino: ++ /* ++ * stop 'race'-ing between hardlinks under different ++ * parents. ++ */ ++ if (hlinked) { ++ err = au_xinondir_enter(sb, btop, h_ino, &idx); ++ inode = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ err = au_xino_read(sb, btop, h_ino, &ino); ++ inode = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_xinondir; ++ ++ if (!ino) { ++ ino = au_xino_new_ino(sb); ++ if (unlikely(!ino)) { ++ inode = ERR_PTR(-EIO); ++ goto out_xinondir; ++ } ++ } ++ ++ AuDbg("i%lu\n", (unsigned long)ino); ++ inode = au_iget_locked(sb, ino); ++ err = PTR_ERR(inode); ++ if (IS_ERR(inode)) ++ goto out_xinondir; ++ ++ AuDbg("%lx, new %d\n", inode->i_state, !!(inode->i_state & I_NEW)); ++ if (inode->i_state & I_NEW) { ++ ii_write_lock_new_child(inode); ++ err = set_inode(inode, dentry); ++ if (!err) { ++ unlock_new_inode(inode); ++ goto out_xinondir; /* success */ ++ } ++ ++ /* ++ * iget_failed() calls iput(), but we need to call ++ * ii_write_unlock() after iget_failed(). so dirty hack for ++ * i_count. ++ */ ++ atomic_inc(&inode->i_count); ++ iget_failed(inode); ++ ii_write_unlock(inode); ++ au_xino_write(sb, btop, h_ino, /*ino*/0); ++ /* ignore this error */ ++ goto out_iput; ++ } else if (!must_new && !IS_DEADDIR(inode) && inode->i_nlink) { ++ /* ++ * horrible race condition between lookup, readdir and copyup ++ * (or something). ++ */ ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++ err = reval_inode(inode, dentry); ++ if (unlikely(err < 0)) { ++ hlinked = 0; ++ goto out_iput; ++ } ++ if (!err) ++ goto out; /* success */ ++ else if (hlinked && idx >= 0) { ++ err = au_xinondir_enter(sb, btop, h_ino, &idx); ++ if (unlikely(err)) { ++ iput(inode); ++ inode = ERR_PTR(err); ++ goto out; ++ } ++ } ++ } ++ ++ if (unlikely(au_test_fs_unique_ino(h_inode))) ++ AuWarn1("Warning: Un-notified UDBA or repeatedly renamed dir," ++ " b%d, %s, %pd, hi%lu, i%lu.\n", ++ btop, au_sbtype(h_dentry->d_sb), dentry, ++ (unsigned long)h_ino, (unsigned long)ino); ++ ino = 0; ++ err = au_xino_write(sb, btop, h_ino, /*ino*/0); ++ if (!err) { ++ iput(inode); ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++ goto new_ino; ++ } ++ ++out_iput: ++ iput(inode); ++ inode = ERR_PTR(err); ++out_xinondir: ++ if (hlinked && idx >= 0) ++ au_xinondir_leave(sb, btop, h_ino, idx); ++out: ++ return inode; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, ++ struct inode *inode) ++{ ++ int err; ++ struct inode *hi; ++ ++ err = au_br_rdonly(au_sbr(sb, bindex)); ++ ++ /* pseudo-link after flushed may happen out of bounds */ ++ if (!err ++ && inode ++ && au_ibtop(inode) <= bindex ++ && bindex <= au_ibbot(inode)) { ++ /* ++ * permission check is unnecessary since vfsub routine ++ * will be called later ++ */ ++ hi = au_h_iptr(inode, bindex); ++ if (hi) ++ err = IS_IMMUTABLE(hi) ? -EROFS : 0; ++ } ++ ++ return err; ++} ++ ++int au_test_h_perm(struct inode *h_inode, int mask) ++{ ++ if (uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) ++ return 0; ++ return inode_permission(h_inode, mask); ++} ++ ++int au_test_h_perm_sio(struct inode *h_inode, int mask) ++{ ++ if (au_test_nfs(h_inode->i_sb) ++ && (mask & MAY_WRITE) ++ && S_ISDIR(h_inode->i_mode)) ++ mask |= MAY_READ; /* force permission check */ ++ return au_test_h_perm(h_inode, mask); ++} +diff -Naur null/fs/aufs/inode.h linux-4.15/fs/aufs/inode.h +--- /dev/null ++++ linux-4.15/fs/aufs/inode.h 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,695 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode operations ++ */ ++ ++#ifndef __AUFS_INODE_H__ ++#define __AUFS_INODE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "rwsem.h" ++ ++struct vfsmount; ++ ++struct au_hnotify { ++#ifdef CONFIG_AUFS_HNOTIFY ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ /* never use fsnotify_add_vfsmount_mark() */ ++ struct fsnotify_mark hn_mark; ++#endif ++ struct inode *hn_aufs_inode; /* no get/put */ ++#endif ++} ____cacheline_aligned_in_smp; ++ ++struct au_hinode { ++ struct inode *hi_inode; ++ aufs_bindex_t hi_id; ++#ifdef CONFIG_AUFS_HNOTIFY ++ struct au_hnotify *hi_notify; ++#endif ++ ++ /* reference to the copied-up whiteout with get/put */ ++ struct dentry *hi_whdentry; ++}; ++ ++/* ig_flags */ ++#define AuIG_HALF_REFRESHED 1 ++#define au_ig_ftest(flags, name) ((flags) & AuIG_##name) ++#define au_ig_fset(flags, name) \ ++ do { (flags) |= AuIG_##name; } while (0) ++#define au_ig_fclr(flags, name) \ ++ do { (flags) &= ~AuIG_##name; } while (0) ++ ++struct au_iigen { ++ spinlock_t ig_spin; ++ __u32 ig_generation, ig_flags; ++}; ++ ++struct au_vdir; ++struct au_iinfo { ++ struct au_iigen ii_generation; ++ struct super_block *ii_hsb1; /* no get/put */ ++ ++ struct au_rwsem ii_rwsem; ++ aufs_bindex_t ii_btop, ii_bbot; ++ __u32 ii_higen; ++ struct au_hinode *ii_hinode; ++ struct au_vdir *ii_vdir; ++}; ++ ++struct au_icntnr { ++ struct au_iinfo iinfo; ++ struct inode vfs_inode; ++ struct hlist_bl_node plink; ++} ____cacheline_aligned_in_smp; ++ ++/* au_pin flags */ ++#define AuPin_DI_LOCKED 1 ++#define AuPin_MNT_WRITE (1 << 1) ++#define au_ftest_pin(flags, name) ((flags) & AuPin_##name) ++#define au_fset_pin(flags, name) \ ++ do { (flags) |= AuPin_##name; } while (0) ++#define au_fclr_pin(flags, name) \ ++ do { (flags) &= ~AuPin_##name; } while (0) ++ ++struct au_pin { ++ /* input */ ++ struct dentry *dentry; ++ unsigned int udba; ++ unsigned char lsc_di, lsc_hi, flags; ++ aufs_bindex_t bindex; ++ ++ /* output */ ++ struct dentry *parent; ++ struct au_hinode *hdir; ++ struct vfsmount *h_mnt; ++ ++ /* temporary unlock/relock for copyup */ ++ struct dentry *h_dentry, *h_parent; ++ struct au_branch *br; ++ struct task_struct *task; ++}; ++ ++void au_pin_hdir_unlock(struct au_pin *p); ++int au_pin_hdir_lock(struct au_pin *p); ++int au_pin_hdir_relock(struct au_pin *p); ++void au_pin_hdir_acquire_nest(struct au_pin *p); ++void au_pin_hdir_release(struct au_pin *p); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_iinfo *au_ii(struct inode *inode) ++{ ++ BUG_ON(is_bad_inode(inode)); ++ return &(container_of(inode, struct au_icntnr, vfs_inode)->iinfo); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* inode.c */ ++struct inode *au_igrab(struct inode *inode); ++void au_refresh_iop(struct inode *inode, int force_getattr); ++int au_refresh_hinode_self(struct inode *inode); ++int au_refresh_hinode(struct inode *inode, struct dentry *dentry); ++int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ unsigned int d_type, ino_t *ino); ++struct inode *au_new_inode(struct dentry *dentry, int must_new); ++int au_test_ro(struct super_block *sb, aufs_bindex_t bindex, ++ struct inode *inode); ++int au_test_h_perm(struct inode *h_inode, int mask); ++int au_test_h_perm_sio(struct inode *h_inode, int mask); ++ ++static inline int au_wh_ino(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, unsigned int d_type, ino_t *ino) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ return au_ino(sb, bindex, h_ino, d_type, ino); ++#else ++ return 0; ++#endif ++} ++ ++/* i_op.c */ ++enum { ++ AuIop_SYMLINK, ++ AuIop_DIR, ++ AuIop_OTHER, ++ AuIop_Last ++}; ++extern struct inode_operations aufs_iop[AuIop_Last], ++ aufs_iop_nogetattr[AuIop_Last]; ++ ++/* au_wr_dir flags */ ++#define AuWrDir_ADD_ENTRY 1 ++#define AuWrDir_ISDIR (1 << 1) ++#define AuWrDir_TMPFILE (1 << 2) ++#define au_ftest_wrdir(flags, name) ((flags) & AuWrDir_##name) ++#define au_fset_wrdir(flags, name) \ ++ do { (flags) |= AuWrDir_##name; } while (0) ++#define au_fclr_wrdir(flags, name) \ ++ do { (flags) &= ~AuWrDir_##name; } while (0) ++ ++struct au_wr_dir_args { ++ aufs_bindex_t force_btgt; ++ unsigned char flags; ++}; ++int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, ++ struct au_wr_dir_args *args); ++ ++struct dentry *au_pinned_h_parent(struct au_pin *pin); ++void au_pin_init(struct au_pin *pin, struct dentry *dentry, ++ aufs_bindex_t bindex, int lsc_di, int lsc_hi, ++ unsigned int udba, unsigned char flags); ++int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int udba, unsigned char flags) __must_check; ++int au_do_pin(struct au_pin *pin) __must_check; ++void au_unpin(struct au_pin *pin); ++int au_reval_for_attr(struct dentry *dentry, unsigned int sigen); ++ ++#define AuIcpup_DID_CPUP 1 ++#define au_ftest_icpup(flags, name) ((flags) & AuIcpup_##name) ++#define au_fset_icpup(flags, name) \ ++ do { (flags) |= AuIcpup_##name; } while (0) ++#define au_fclr_icpup(flags, name) \ ++ do { (flags) &= ~AuIcpup_##name; } while (0) ++ ++struct au_icpup_args { ++ unsigned char flags; ++ unsigned char pin_flags; ++ aufs_bindex_t btgt; ++ unsigned int udba; ++ struct au_pin pin; ++ struct path h_path; ++ struct inode *h_inode; ++}; ++ ++int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, ++ struct au_icpup_args *a); ++ ++int au_h_path_getattr(struct dentry *dentry, int force, struct path *h_path, ++ int locked); ++ ++/* i_op_add.c */ ++int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir); ++int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, ++ dev_t dev); ++int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname); ++int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, ++ bool want_excl); ++struct vfsub_aopen_args; ++int au_aopen_or_create(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args); ++int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode); ++int aufs_link(struct dentry *src_dentry, struct inode *dir, ++ struct dentry *dentry); ++int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); ++ ++/* i_op_del.c */ ++int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup); ++int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir); ++int aufs_unlink(struct inode *dir, struct dentry *dentry); ++int aufs_rmdir(struct inode *dir, struct dentry *dentry); ++ ++/* i_op_ren.c */ ++int au_wbr(struct dentry *dentry, aufs_bindex_t btgt); ++int aufs_rename(struct inode *src_dir, struct dentry *src_dentry, ++ struct inode *dir, struct dentry *dentry, ++ unsigned int flags); ++ ++/* iinfo.c */ ++struct inode *au_h_iptr(struct inode *inode, aufs_bindex_t bindex); ++void au_hiput(struct au_hinode *hinode); ++void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_wh); ++unsigned int au_hi_flags(struct inode *inode, int isdir); ++ ++/* hinode flags */ ++#define AuHi_XINO 1 ++#define AuHi_HNOTIFY (1 << 1) ++#define au_ftest_hi(flags, name) ((flags) & AuHi_##name) ++#define au_fset_hi(flags, name) \ ++ do { (flags) |= AuHi_##name; } while (0) ++#define au_fclr_hi(flags, name) \ ++ do { (flags) &= ~AuHi_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_HNOTIFY ++#undef AuHi_HNOTIFY ++#define AuHi_HNOTIFY 0 ++#endif ++ ++void au_set_h_iptr(struct inode *inode, aufs_bindex_t bindex, ++ struct inode *h_inode, unsigned int flags); ++ ++void au_update_iigen(struct inode *inode, int half); ++void au_update_ibrange(struct inode *inode, int do_put_zero); ++ ++void au_icntnr_init_once(void *_c); ++void au_hinode_init(struct au_hinode *hinode); ++int au_iinfo_init(struct inode *inode); ++void au_iinfo_fin(struct inode *inode); ++int au_hinode_realloc(struct au_iinfo *iinfo, int nbr, int may_shrink); ++ ++#ifdef CONFIG_PROC_FS ++/* plink.c */ ++int au_plink_maint(struct super_block *sb, int flags); ++struct au_sbinfo; ++void au_plink_maint_leave(struct au_sbinfo *sbinfo); ++int au_plink_maint_enter(struct super_block *sb); ++#ifdef CONFIG_AUFS_DEBUG ++void au_plink_list(struct super_block *sb); ++#else ++AuStubVoid(au_plink_list, struct super_block *sb) ++#endif ++int au_plink_test(struct inode *inode); ++struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex); ++void au_plink_append(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++void au_plink_put(struct super_block *sb, int verbose); ++void au_plink_clean(struct super_block *sb, int verbose); ++void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id); ++#else ++AuStubInt0(au_plink_maint, struct super_block *sb, int flags); ++AuStubVoid(au_plink_maint_leave, struct au_sbinfo *sbinfo); ++AuStubInt0(au_plink_maint_enter, struct super_block *sb); ++AuStubVoid(au_plink_list, struct super_block *sb); ++AuStubInt0(au_plink_test, struct inode *inode); ++AuStub(struct dentry *, au_plink_lkup, return NULL, ++ struct inode *inode, aufs_bindex_t bindex); ++AuStubVoid(au_plink_append, struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry); ++AuStubVoid(au_plink_put, struct super_block *sb, int verbose); ++AuStubVoid(au_plink_clean, struct super_block *sb, int verbose); ++AuStubVoid(au_plink_half_refresh, struct super_block *sb, aufs_bindex_t br_id); ++#endif /* CONFIG_PROC_FS */ ++ ++#ifdef CONFIG_AUFS_XATTR ++/* xattr.c */ ++int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, ++ unsigned int verbose); ++ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size); ++void au_xattr_init(struct super_block *sb); ++#else ++AuStubInt0(au_cpup_xattr, struct dentry *h_dst, struct dentry *h_src, ++ int ignore_flags, unsigned int verbose); ++AuStubVoid(au_xattr_init, struct super_block *sb); ++#endif ++ ++#ifdef CONFIG_FS_POSIX_ACL ++struct posix_acl *aufs_get_acl(struct inode *inode, int type); ++int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type); ++#endif ++ ++#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) ++enum { ++ AU_XATTR_SET, ++ AU_ACL_SET ++}; ++ ++struct au_sxattr { ++ int type; ++ union { ++ struct { ++ const char *name; ++ const void *value; ++ size_t size; ++ int flags; ++ } set; ++ struct { ++ struct posix_acl *acl; ++ int type; ++ } acl_set; ++ } u; ++}; ++ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, ++ struct au_sxattr *arg); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for iinfo */ ++enum { ++ AuLsc_II_CHILD, /* child first */ ++ AuLsc_II_CHILD2, /* rename(2), link(2), and cpup at hnotify */ ++ AuLsc_II_CHILD3, /* copyup dirs */ ++ AuLsc_II_PARENT, /* see AuLsc_I_PARENT in vfsub.h */ ++ AuLsc_II_PARENT2, ++ AuLsc_II_PARENT3, /* copyup dirs */ ++ AuLsc_II_NEW_CHILD ++}; ++ ++/* ++ * ii_read_lock_child, ii_write_lock_child, ++ * ii_read_lock_child2, ii_write_lock_child2, ++ * ii_read_lock_child3, ii_write_lock_child3, ++ * ii_read_lock_parent, ii_write_lock_parent, ++ * ii_read_lock_parent2, ii_write_lock_parent2, ++ * ii_read_lock_parent3, ii_write_lock_parent3, ++ * ii_read_lock_new_child, ii_write_lock_new_child, ++ */ ++#define AuReadLockFunc(name, lsc) \ ++static inline void ii_read_lock_##name(struct inode *i) \ ++{ \ ++ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ ++} ++ ++#define AuWriteLockFunc(name, lsc) \ ++static inline void ii_write_lock_##name(struct inode *i) \ ++{ \ ++ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); \ ++} ++ ++#define AuRWLockFuncs(name, lsc) \ ++ AuReadLockFunc(name, lsc) \ ++ AuWriteLockFunc(name, lsc) ++ ++AuRWLockFuncs(child, CHILD); ++AuRWLockFuncs(child2, CHILD2); ++AuRWLockFuncs(child3, CHILD3); ++AuRWLockFuncs(parent, PARENT); ++AuRWLockFuncs(parent2, PARENT2); ++AuRWLockFuncs(parent3, PARENT3); ++AuRWLockFuncs(new_child, NEW_CHILD); ++ ++#undef AuReadLockFunc ++#undef AuWriteLockFunc ++#undef AuRWLockFuncs ++ ++#define ii_read_unlock(i) au_rw_read_unlock(&au_ii(i)->ii_rwsem) ++#define ii_write_unlock(i) au_rw_write_unlock(&au_ii(i)->ii_rwsem) ++#define ii_downgrade_lock(i) au_rw_dgrade_lock(&au_ii(i)->ii_rwsem) ++ ++#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem) ++#define IiMustAnyLock(i) AuRwMustAnyLock(&au_ii(i)->ii_rwsem) ++#define IiMustWriteLock(i) AuRwMustWriteLock(&au_ii(i)->ii_rwsem) ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void au_icntnr_init(struct au_icntnr *c) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++ c->vfs_inode.i_mode = 0; ++#endif ++} ++ ++static inline unsigned int au_iigen(struct inode *inode, unsigned int *igflags) ++{ ++ unsigned int gen; ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ if (igflags) ++ *igflags = iigen->ig_flags; ++ gen = iigen->ig_generation; ++ spin_unlock(&iigen->ig_spin); ++ ++ return gen; ++} ++ ++/* tiny test for inode number */ ++/* tmpfs generation is too rough */ ++static inline int au_test_higen(struct inode *inode, struct inode *h_inode) ++{ ++ struct au_iinfo *iinfo; ++ ++ iinfo = au_ii(inode); ++ AuRwMustAnyLock(&iinfo->ii_rwsem); ++ return !(iinfo->ii_hsb1 == h_inode->i_sb ++ && iinfo->ii_higen == h_inode->i_generation); ++} ++ ++static inline void au_iigen_dec(struct inode *inode) ++{ ++ struct au_iinfo *iinfo; ++ struct au_iigen *iigen; ++ ++ iinfo = au_ii(inode); ++ iigen = &iinfo->ii_generation; ++ spin_lock(&iigen->ig_spin); ++ iigen->ig_generation--; ++ spin_unlock(&iigen->ig_spin); ++} ++ ++static inline int au_iigen_test(struct inode *inode, unsigned int sigen) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(inode && au_iigen(inode, NULL) != sigen)) ++ err = -EIO; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_hinode *au_hinode(struct au_iinfo *iinfo, ++ aufs_bindex_t bindex) ++{ ++ return iinfo->ii_hinode + bindex; ++} ++ ++static inline int au_is_bad_inode(struct inode *inode) ++{ ++ return !!(is_bad_inode(inode) || !au_hinode(au_ii(inode), 0)); ++} ++ ++static inline aufs_bindex_t au_ii_br_id(struct inode *inode, ++ aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex)->hi_id; ++} ++ ++static inline aufs_bindex_t au_ibtop(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_btop; ++} ++ ++static inline aufs_bindex_t au_ibbot(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_bbot; ++} ++ ++static inline struct au_vdir *au_ivdir(struct inode *inode) ++{ ++ IiMustAnyLock(inode); ++ return au_ii(inode)->ii_vdir; ++} ++ ++static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex)->hi_whdentry; ++} ++ ++static inline void au_set_ibtop(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_btop = bindex; ++} ++ ++static inline void au_set_ibbot(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_bbot = bindex; ++} ++ ++static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir) ++{ ++ IiMustWriteLock(inode); ++ au_ii(inode)->ii_vdir = vdir; ++} ++ ++static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex) ++{ ++ IiMustAnyLock(inode); ++ return au_hinode(au_ii(inode), bindex); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct dentry *au_pinned_parent(struct au_pin *pin) ++{ ++ if (pin) ++ return pin->parent; ++ return NULL; ++} ++ ++static inline struct inode *au_pinned_h_dir(struct au_pin *pin) ++{ ++ if (pin && pin->hdir) ++ return pin->hdir->hi_inode; ++ return NULL; ++} ++ ++static inline struct au_hinode *au_pinned_hdir(struct au_pin *pin) ++{ ++ if (pin) ++ return pin->hdir; ++ return NULL; ++} ++ ++static inline void au_pin_set_dentry(struct au_pin *pin, struct dentry *dentry) ++{ ++ if (pin) ++ pin->dentry = dentry; ++} ++ ++static inline void au_pin_set_parent_lflag(struct au_pin *pin, ++ unsigned char lflag) ++{ ++ if (pin) { ++ if (lflag) ++ au_fset_pin(pin->flags, DI_LOCKED); ++ else ++ au_fclr_pin(pin->flags, DI_LOCKED); ++ } ++} ++ ++#if 0 /* reserved */ ++static inline void au_pin_set_parent(struct au_pin *pin, struct dentry *parent) ++{ ++ if (pin) { ++ dput(pin->parent); ++ pin->parent = dget(parent); ++ } ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_branch; ++#ifdef CONFIG_AUFS_HNOTIFY ++struct au_hnotify_op { ++ void (*ctl)(struct au_hinode *hinode, int do_set); ++ int (*alloc)(struct au_hinode *hinode); ++ ++ /* ++ * if it returns true, the the caller should free hinode->hi_notify, ++ * otherwise ->free() frees it. ++ */ ++ int (*free)(struct au_hinode *hinode, ++ struct au_hnotify *hn) __must_check; ++ ++ void (*fin)(void); ++ int (*init)(void); ++ ++ int (*reset_br)(unsigned int udba, struct au_branch *br, int perm); ++ void (*fin_br)(struct au_branch *br); ++ int (*init_br)(struct au_branch *br, int perm); ++}; ++ ++/* hnotify.c */ ++int au_hn_alloc(struct au_hinode *hinode, struct inode *inode); ++void au_hn_free(struct au_hinode *hinode); ++void au_hn_ctl(struct au_hinode *hinode, int do_set); ++void au_hn_reset(struct inode *inode, unsigned int flags); ++int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask, ++ struct qstr *h_child_qstr, struct inode *h_child_inode); ++int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm); ++int au_hnotify_init_br(struct au_branch *br, int perm); ++void au_hnotify_fin_br(struct au_branch *br); ++int __init au_hnotify_init(void); ++void au_hnotify_fin(void); ++ ++/* hfsnotify.c */ ++extern const struct au_hnotify_op au_hnotify_op; ++ ++static inline ++void au_hn_init(struct au_hinode *hinode) ++{ ++ hinode->hi_notify = NULL; ++} ++ ++static inline struct au_hnotify *au_hn(struct au_hinode *hinode) ++{ ++ return hinode->hi_notify; ++} ++ ++#else ++AuStub(int, au_hn_alloc, return -EOPNOTSUPP, ++ struct au_hinode *hinode __maybe_unused, ++ struct inode *inode __maybe_unused) ++AuStub(struct au_hnotify *, au_hn, return NULL, struct au_hinode *hinode) ++AuStubVoid(au_hn_free, struct au_hinode *hinode __maybe_unused) ++AuStubVoid(au_hn_ctl, struct au_hinode *hinode __maybe_unused, ++ int do_set __maybe_unused) ++AuStubVoid(au_hn_reset, struct inode *inode __maybe_unused, ++ unsigned int flags __maybe_unused) ++AuStubInt0(au_hnotify_reset_br, unsigned int udba __maybe_unused, ++ struct au_branch *br __maybe_unused, ++ int perm __maybe_unused) ++AuStubInt0(au_hnotify_init_br, struct au_branch *br __maybe_unused, ++ int perm __maybe_unused) ++AuStubVoid(au_hnotify_fin_br, struct au_branch *br __maybe_unused) ++AuStubInt0(__init au_hnotify_init, void) ++AuStubVoid(au_hnotify_fin, void) ++AuStubVoid(au_hn_init, struct au_hinode *hinode __maybe_unused) ++#endif /* CONFIG_AUFS_HNOTIFY */ ++ ++static inline void au_hn_suspend(struct au_hinode *hdir) ++{ ++ au_hn_ctl(hdir, /*do_set*/0); ++} ++ ++static inline void au_hn_resume(struct au_hinode *hdir) ++{ ++ au_hn_ctl(hdir, /*do_set*/1); ++} ++ ++static inline void au_hn_inode_lock(struct au_hinode *hdir) ++{ ++ inode_lock(hdir->hi_inode); ++ au_hn_suspend(hdir); ++} ++ ++static inline void au_hn_inode_lock_nested(struct au_hinode *hdir, ++ unsigned int sc __maybe_unused) ++{ ++ inode_lock_nested(hdir->hi_inode, sc); ++ au_hn_suspend(hdir); ++} ++ ++#if 0 /* unused */ ++#include "vfsub.h" ++static inline void au_hn_inode_lock_shared_nested(struct au_hinode *hdir, ++ unsigned int sc) ++{ ++ vfsub_inode_lock_shared_nested(hdir->hi_inode, sc); ++ au_hn_suspend(hdir); ++} ++#endif ++ ++static inline void au_hn_inode_unlock(struct au_hinode *hdir) ++{ ++ au_hn_resume(hdir); ++ inode_unlock(hdir->hi_inode); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_INODE_H__ */ +diff -Naur null/fs/aufs/ioctl.c linux-4.15/fs/aufs/ioctl.c +--- /dev/null ++++ linux-4.15/fs/aufs/ioctl.c 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,219 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * ioctl ++ * plink-management and readdir in userspace. ++ * assist the pathconf(3) wrapper library. ++ * move-down ++ * File-based Hierarchical Storage Management. ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++static int au_wbr_fd(struct path *path, struct aufs_wbr_fd __user *arg) ++{ ++ int err, fd; ++ aufs_bindex_t wbi, bindex, bbot; ++ struct file *h_file; ++ struct super_block *sb; ++ struct dentry *root; ++ struct au_branch *br; ++ struct aufs_wbr_fd wbrfd = { ++ .oflags = au_dir_roflags, ++ .brid = -1 ++ }; ++ const int valid = O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY ++ | O_NOATIME | O_CLOEXEC; ++ ++ AuDebugOn(wbrfd.oflags & ~valid); ++ ++ if (arg) { ++ err = copy_from_user(&wbrfd, arg, sizeof(wbrfd)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ goto out; ++ } ++ ++ err = -EINVAL; ++ AuDbg("wbrfd{0%o, %d}\n", wbrfd.oflags, wbrfd.brid); ++ wbrfd.oflags |= au_dir_roflags; ++ AuDbg("0%o\n", wbrfd.oflags); ++ if (unlikely(wbrfd.oflags & ~valid)) ++ goto out; ++ } ++ ++ fd = get_unused_fd_flags(0); ++ err = fd; ++ if (unlikely(fd < 0)) ++ goto out; ++ ++ h_file = ERR_PTR(-EINVAL); ++ wbi = 0; ++ br = NULL; ++ sb = path->dentry->d_sb; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_IR); ++ bbot = au_sbbot(sb); ++ if (wbrfd.brid >= 0) { ++ wbi = au_br_index(sb, wbrfd.brid); ++ if (unlikely(wbi < 0 || wbi > bbot)) ++ goto out_unlock; ++ } ++ ++ h_file = ERR_PTR(-ENOENT); ++ br = au_sbr(sb, wbi); ++ if (!au_br_writable(br->br_perm)) { ++ if (arg) ++ goto out_unlock; ++ ++ bindex = wbi + 1; ++ wbi = -1; ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm)) { ++ wbi = bindex; ++ br = au_sbr(sb, wbi); ++ break; ++ } ++ } ++ } ++ AuDbg("wbi %d\n", wbi); ++ if (wbi >= 0) ++ h_file = au_h_open(root, wbi, wbrfd.oflags, NULL, ++ /*force_wr*/0); ++ ++out_unlock: ++ aufs_read_unlock(root, AuLock_IR); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out_fd; ++ ++ au_br_put(br); /* cf. au_h_open() */ ++ fd_install(fd, h_file); ++ err = fd; ++ goto out; /* success */ ++ ++out_fd: ++ put_unused_fd(fd); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err; ++ struct dentry *dentry; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ioctl(file, cmd, arg); ++ break; ++ ++ case AUFS_CTL_WBR_FD: ++ err = au_wbr_fd(&file->f_path, (void __user *)arg); ++ break; ++ ++ case AUFS_CTL_IBUSY: ++ err = au_ibusy_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_BRINFO: ++ err = au_brinfo_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_FHSM_FD: ++ dentry = file->f_path.dentry; ++ if (IS_ROOT(dentry)) ++ err = au_fhsm_fd(dentry->d_sb, arg); ++ else ++ err = -ENOTTY; ++ break; ++ ++ default: ++ /* do not call the lower */ ++ AuDbg("0x%x\n", cmd); ++ err = -ENOTTY; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++long aufs_ioctl_nondir(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err; ++ ++ switch (cmd) { ++ case AUFS_CTL_MVDOWN: ++ err = au_mvdown(file->f_path.dentry, (void __user *)arg); ++ break; ++ ++ case AUFS_CTL_WBR_FD: ++ err = au_wbr_fd(&file->f_path, (void __user *)arg); ++ break; ++ ++ default: ++ /* do not call the lower */ ++ AuDbg("0x%x\n", cmd); ++ err = -ENOTTY; ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++#ifdef CONFIG_COMPAT ++long aufs_compat_ioctl_dir(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ long err; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_compat_ioctl(file, cmd, arg); ++ break; ++ ++ case AUFS_CTL_IBUSY: ++ err = au_ibusy_compat_ioctl(file, arg); ++ break; ++ ++ case AUFS_CTL_BRINFO: ++ err = au_brinfo_compat_ioctl(file, arg); ++ break; ++ ++ default: ++ err = aufs_ioctl_dir(file, cmd, arg); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++long aufs_compat_ioctl_nondir(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ return aufs_ioctl_nondir(file, cmd, (unsigned long)compat_ptr(arg)); ++} ++#endif +diff -Naur null/fs/aufs/i_op_add.c linux-4.15/fs/aufs/i_op_add.c +--- /dev/null ++++ linux-4.15/fs/aufs/i_op_add.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,920 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode operations (add entry) ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * final procedure of adding a new entry, except link(2). ++ * remove whiteout, instantiate, copyup the parent dir's times and size ++ * and update version. ++ * if it failed, re-create the removed whiteout. ++ */ ++static int epilog(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct dentry *dentry) ++{ ++ int err, rerr; ++ aufs_bindex_t bwh; ++ struct path h_path; ++ struct super_block *sb; ++ struct inode *inode, *h_dir; ++ struct dentry *wh; ++ ++ bwh = -1; ++ sb = dir->i_sb; ++ if (wh_dentry) { ++ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ ++ IMustLock(h_dir); ++ AuDebugOn(au_h_iptr(dir, bindex) != h_dir); ++ bwh = au_dbwh(dentry); ++ h_path.dentry = wh_dentry; ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, ++ dentry); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ inode = au_new_inode(dentry, /*must_new*/1); ++ if (!IS_ERR(inode)) { ++ d_instantiate(dentry, inode); ++ dir = d_inode(dentry->d_parent); /* dir inode is locked */ ++ IMustLock(dir); ++ au_dir_ts(dir, bindex); ++ dir->i_version++; ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ return 0; /* success */ ++ } ++ ++ err = PTR_ERR(inode); ++ if (!wh_dentry) ++ goto out; ++ ++ /* revert */ ++ /* dir inode is locked */ ++ wh = au_wh_create(dentry, bwh, wh_dentry->d_parent); ++ rerr = PTR_ERR(wh); ++ if (IS_ERR(wh)) { ++ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } else ++ dput(wh); ++ ++out: ++ return err; ++} ++ ++static int au_d_may_add(struct dentry *dentry) ++{ ++ int err; ++ ++ err = 0; ++ if (unlikely(d_unhashed(dentry))) ++ err = -ENOENT; ++ if (unlikely(d_really_is_positive(dentry))) ++ err = -EEXIST; ++ return err; ++} ++ ++/* ++ * simple tests for the adding inode operations. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++int au_may_add(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir) ++{ ++ int err; ++ umode_t h_mode; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ err = -ENAMETOOLONG; ++ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ goto out; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (d_really_is_negative(dentry)) { ++ err = -EEXIST; ++ if (unlikely(d_is_positive(h_dentry))) ++ goto out; ++ } else { ++ /* rename(2) case */ ++ err = -EIO; ++ if (unlikely(d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ if (unlikely(!h_inode->i_nlink)) ++ goto out; ++ ++ h_mode = h_inode->i_mode; ++ if (!isdir) { ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(h_mode))) ++ goto out; ++ } else if (unlikely(!S_ISDIR(h_mode))) { ++ err = -ENOTDIR; ++ goto out; ++ } ++ } ++ ++ err = 0; ++ /* expected parent dir is locked */ ++ if (unlikely(h_parent != h_dentry->d_parent)) ++ err = -EIO; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * initial procedure of adding a new entry. ++ * prepare writable branch and the parent dir, lock it, ++ * and lookup whiteout for the new entry. ++ */ ++static struct dentry* ++lock_hdir_lkup_wh(struct dentry *dentry, struct au_dtime *dt, ++ struct dentry *src_dentry, struct au_pin *pin, ++ struct au_wr_dir_args *wr_dir_args) ++{ ++ struct dentry *wh_dentry, *h_parent; ++ struct super_block *sb; ++ struct au_branch *br; ++ int err; ++ unsigned int udba; ++ aufs_bindex_t bcpup; ++ ++ AuDbg("%pd\n", dentry); ++ ++ err = au_wr_dir(dentry, src_dentry, wr_dir_args); ++ bcpup = err; ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ udba = au_opt_udba(sb); ++ err = au_pin(pin, dentry, bcpup, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ h_parent = au_pinned_h_parent(pin); ++ if (udba != AuOpt_UDBA_NONE ++ && au_dbtop(dentry) == bcpup) ++ err = au_may_add(dentry, bcpup, h_parent, ++ au_ftest_wrdir(wr_dir_args->flags, ISDIR)); ++ else if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ err = -ENAMETOOLONG; ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ br = au_sbr(sb, bcpup); ++ if (dt) { ++ struct path tmp = { ++ .dentry = h_parent, ++ .mnt = au_br_mnt(br) ++ }; ++ au_dtime_store(dt, au_pinned_parent(pin), &tmp); ++ } ++ ++ wh_dentry = NULL; ++ if (bcpup != au_dbwh(dentry)) ++ goto out; /* success */ ++ ++ /* ++ * ENAMETOOLONG here means that if we allowed create such name, then it ++ * would not be able to removed in the future. So we don't allow such ++ * name here and we don't handle ENAMETOOLONG differently here. ++ */ ++ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, br); ++ ++out_unpin: ++ if (IS_ERR(wh_dentry)) ++ au_unpin(pin); ++out: ++ return wh_dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++enum { Mknod, Symlink, Creat }; ++struct simple_arg { ++ int type; ++ union { ++ struct { ++ umode_t mode; ++ bool want_excl; ++ bool try_aopen; ++ struct vfsub_aopen_args *aopen; ++ } c; ++ struct { ++ const char *symname; ++ } s; ++ struct { ++ umode_t mode; ++ dev_t dev; ++ } m; ++ } u; ++}; ++ ++static int add_simple(struct inode *dir, struct dentry *dentry, ++ struct simple_arg *arg) ++{ ++ int err, rerr; ++ aufs_bindex_t btop; ++ unsigned char created; ++ const unsigned char try_aopen ++ = (arg->type == Creat && arg->u.c.try_aopen); ++ struct dentry *wh_dentry, *parent; ++ struct inode *h_dir; ++ struct super_block *sb; ++ struct au_branch *br; ++ /* to reuduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ struct path h_path; ++ struct au_wr_dir_args wr_dir_args; ++ } *a; ++ ++ AuDbg("%pd\n", dentry); ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ a->wr_dir_args.force_btgt = -1; ++ a->wr_dir_args.flags = AuWrDir_ADD_ENTRY; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ if (!try_aopen) { ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ } ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ if (!try_aopen) ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, ++ &a->pin, &a->wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ btop = au_dbtop(dentry); ++ sb = dentry->d_sb; ++ br = au_sbr(sb, btop); ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ a->h_path.mnt = au_br_mnt(br); ++ h_dir = au_pinned_h_dir(&a->pin); ++ switch (arg->type) { ++ case Creat: ++ err = 0; ++ if (!try_aopen || !h_dir->i_op->atomic_open) ++ err = vfsub_create(h_dir, &a->h_path, arg->u.c.mode, ++ arg->u.c.want_excl); ++ else ++ err = vfsub_atomic_open(h_dir, a->h_path.dentry, ++ arg->u.c.aopen, br); ++ break; ++ case Symlink: ++ err = vfsub_symlink(h_dir, &a->h_path, arg->u.s.symname); ++ break; ++ case Mknod: ++ err = vfsub_mknod(h_dir, &a->h_path, arg->u.m.mode, ++ arg->u.m.dev); ++ break; ++ default: ++ BUG(); ++ } ++ created = !err; ++ if (!err) ++ err = epilog(dir, btop, wh_dentry, dentry); ++ ++ /* revert */ ++ if (unlikely(created && err && d_is_positive(a->h_path.dentry))) { ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(h_dir, &a->h_path, /*delegated*/NULL, ++ /*force*/0); ++ if (rerr) { ++ AuIOErr("%pd revert failure(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&a->dt); ++ } ++ ++ if (!err && try_aopen && !h_dir->i_op->atomic_open) ++ *arg->u.c.aopen->opened |= FILE_CREATED; ++ ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++ ++out_parent: ++ if (!try_aopen) ++ di_write_unlock(parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ if (!try_aopen) ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} ++ ++int aufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, ++ dev_t dev) ++{ ++ struct simple_arg arg = { ++ .type = Mknod, ++ .u.m = { ++ .mode = mode, ++ .dev = dev ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) ++{ ++ struct simple_arg arg = { ++ .type = Symlink, ++ .u.s.symname = symname ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_create(struct inode *dir, struct dentry *dentry, umode_t mode, ++ bool want_excl) ++{ ++ struct simple_arg arg = { ++ .type = Creat, ++ .u.c = { ++ .mode = mode, ++ .want_excl = want_excl ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int au_aopen_or_create(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *aopen_args) ++{ ++ struct simple_arg arg = { ++ .type = Creat, ++ .u.c = { ++ .mode = aopen_args->create_mode, ++ .want_excl = aopen_args->open_flag & O_EXCL, ++ .try_aopen = true, ++ .aopen = aopen_args ++ } ++ }; ++ return add_simple(dir, dentry, &arg); ++} ++ ++int aufs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent, *h_dentry; ++ struct inode *h_dir, *inode; ++ struct vfsmount *h_mnt; ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = AuWrDir_TMPFILE ++ }; ++ ++ /* copy-up may happen */ ++ inode_lock(dir); ++ ++ sb = dir->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_di_init(dentry); ++ if (unlikely(err)) ++ goto out_si; ++ ++ err = -EBUSY; ++ parent = d_find_any_alias(dir); ++ AuDebugOn(!parent); ++ di_write_lock_parent(parent); ++ if (unlikely(d_inode(parent) != dir)) ++ goto out_parent; ++ ++ err = au_digen_test(parent, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ bindex = au_dbtop(parent); ++ au_set_dbtop(dentry, bindex); ++ au_set_dbbot(dentry, bindex); ++ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); ++ bindex = err; ++ if (unlikely(err < 0)) ++ goto out_parent; ++ ++ err = -EOPNOTSUPP; ++ h_dir = au_h_iptr(dir, bindex); ++ if (unlikely(!h_dir->i_op->tmpfile)) ++ goto out_parent; ++ ++ h_mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mnt_want_write(h_mnt); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ h_parent = au_h_dptr(parent, bindex); ++ h_dentry = vfs_tmpfile(h_parent, mode, /*open_flag*/0); ++ if (IS_ERR(h_dentry)) { ++ err = PTR_ERR(h_dentry); ++ goto out_mnt; ++ } ++ ++ au_set_dbtop(dentry, bindex); ++ au_set_dbbot(dentry, bindex); ++ au_set_h_dptr(dentry, bindex, dget(h_dentry)); ++ inode = au_new_inode(dentry, /*must_new*/1); ++ if (IS_ERR(inode)) { ++ err = PTR_ERR(inode); ++ au_set_h_dptr(dentry, bindex, NULL); ++ au_set_dbtop(dentry, -1); ++ au_set_dbbot(dentry, -1); ++ } else { ++ if (!inode->i_nlink) ++ set_nlink(inode, 1); ++ d_tmpfile(dentry, inode); ++ au_di(dentry)->di_tmpfile = 1; ++ ++ /* update without i_mutex */ ++ if (au_ibtop(dir) == au_dbtop(dentry)) ++ au_cpup_attr_timesizes(dir); ++ } ++ dput(h_dentry); ++ ++out_mnt: ++ vfsub_mnt_drop_write(h_mnt); ++out_parent: ++ di_write_unlock(parent); ++ dput(parent); ++ di_write_unlock(dentry); ++ if (unlikely(err)) { ++ au_di_fin(dentry); ++ dentry->d_fsdata = NULL; ++ } ++out_si: ++ si_read_unlock(sb); ++out: ++ inode_unlock(dir); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_link_args { ++ aufs_bindex_t bdst, bsrc; ++ struct au_pin pin; ++ struct path h_path; ++ struct dentry *src_parent, *parent; ++}; ++ ++static int au_cpup_before_link(struct dentry *src_dentry, ++ struct au_link_args *a) ++{ ++ int err; ++ struct dentry *h_src_dentry; ++ struct au_cp_generic cpg = { ++ .dentry = src_dentry, ++ .bdst = a->bdst, ++ .bsrc = a->bsrc, ++ .len = -1, ++ .pin = &a->pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN /* | AuCpup_KEEPLINO */ ++ }; ++ ++ di_read_lock_parent(a->src_parent, AuLock_IR); ++ err = au_test_and_cpup_dirs(src_dentry, a->bdst); ++ if (unlikely(err)) ++ goto out; ++ ++ h_src_dentry = au_h_dptr(src_dentry, a->bsrc); ++ err = au_pin(&a->pin, src_dentry, a->bdst, ++ au_opt_udba(src_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&a->pin); ++ ++out: ++ di_read_unlock(a->src_parent, AuLock_IR); ++ return err; ++} ++ ++static int au_cpup_or_link(struct dentry *src_dentry, struct dentry *dentry, ++ struct au_link_args *a) ++{ ++ int err; ++ unsigned char plink; ++ aufs_bindex_t bbot; ++ struct dentry *h_src_dentry; ++ struct inode *h_inode, *inode, *delegated; ++ struct super_block *sb; ++ struct file *h_file; ++ ++ plink = 0; ++ h_inode = NULL; ++ sb = src_dentry->d_sb; ++ inode = d_inode(src_dentry); ++ if (au_ibtop(inode) <= a->bdst) ++ h_inode = au_h_iptr(inode, a->bdst); ++ if (!h_inode || !h_inode->i_nlink) { ++ /* copyup src_dentry as the name of dentry. */ ++ bbot = au_dbbot(dentry); ++ if (bbot < a->bsrc) ++ au_set_dbbot(dentry, a->bsrc); ++ au_set_h_dptr(dentry, a->bsrc, ++ dget(au_h_dptr(src_dentry, a->bsrc))); ++ dget(a->h_path.dentry); ++ au_set_h_dptr(dentry, a->bdst, NULL); ++ AuDbg("temporary d_inode...\n"); ++ spin_lock(&dentry->d_lock); ++ dentry->d_inode = d_inode(src_dentry); /* tmp */ ++ spin_unlock(&dentry->d_lock); ++ h_file = au_h_open_pre(dentry, a->bsrc, /*force_wr*/0); ++ if (IS_ERR(h_file)) ++ err = PTR_ERR(h_file); ++ else { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->bdst, ++ .bsrc = -1, ++ .len = -1, ++ .pin = &a->pin, ++ .flags = AuCpup_KEEPLINO ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ au_h_open_post(dentry, a->bsrc, h_file); ++ if (!err) { ++ dput(a->h_path.dentry); ++ a->h_path.dentry = au_h_dptr(dentry, a->bdst); ++ } else ++ au_set_h_dptr(dentry, a->bdst, ++ a->h_path.dentry); ++ } ++ spin_lock(&dentry->d_lock); ++ dentry->d_inode = NULL; /* restore */ ++ spin_unlock(&dentry->d_lock); ++ AuDbg("temporary d_inode...done\n"); ++ au_set_h_dptr(dentry, a->bsrc, NULL); ++ au_set_dbbot(dentry, bbot); ++ } else { ++ /* the inode of src_dentry already exists on a.bdst branch */ ++ h_src_dentry = d_find_alias(h_inode); ++ if (!h_src_dentry && au_plink_test(inode)) { ++ plink = 1; ++ h_src_dentry = au_plink_lkup(inode, a->bdst); ++ err = PTR_ERR(h_src_dentry); ++ if (IS_ERR(h_src_dentry)) ++ goto out; ++ ++ if (unlikely(d_is_negative(h_src_dentry))) { ++ dput(h_src_dentry); ++ h_src_dentry = NULL; ++ } ++ ++ } ++ if (h_src_dentry) { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ dput(h_src_dentry); ++ } else { ++ AuIOErr("no dentry found for hi%lu on b%d\n", ++ h_inode->i_ino, a->bdst); ++ err = -EIO; ++ } ++ } ++ ++ if (!err && !plink) ++ au_plink_append(inode, a->bdst, a->h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int aufs_link(struct dentry *src_dentry, struct inode *dir, ++ struct dentry *dentry) ++{ ++ int err, rerr; ++ struct au_dtime dt; ++ struct au_link_args *a; ++ struct dentry *wh_dentry, *h_src_dentry; ++ struct inode *inode, *delegated; ++ struct super_block *sb; ++ struct au_wr_dir_args wr_dir_args = { ++ /* .force_btgt = -1, */ ++ .flags = AuWrDir_ADD_ENTRY ++ }; ++ ++ IMustLock(dir); ++ inode = d_inode(src_dentry); ++ IMustLock(inode); ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ a->parent = dentry->d_parent; /* dir inode is locked */ ++ err = aufs_read_and_write_lock2(dentry, src_dentry, ++ AuLock_NOPLM | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_kfree; ++ err = au_d_linkable(src_dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ a->src_parent = dget_parent(src_dentry); ++ wr_dir_args.force_btgt = au_ibtop(inode); ++ ++ di_write_lock_parent(a->parent); ++ wr_dir_args.force_btgt = au_wbr(dentry, wr_dir_args.force_btgt); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &dt, src_dentry, &a->pin, ++ &wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ a->bdst = au_dbtop(dentry); ++ a->h_path.dentry = au_h_dptr(dentry, a->bdst); ++ a->h_path.mnt = au_sbr_mnt(sb, a->bdst); ++ a->bsrc = au_ibtop(inode); ++ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); ++ if (!h_src_dentry && au_di(src_dentry)->di_tmpfile) ++ h_src_dentry = dget(au_hi_wh(inode, a->bsrc)); ++ if (!h_src_dentry) { ++ a->bsrc = au_dbtop(src_dentry); ++ h_src_dentry = au_h_d_alias(src_dentry, a->bsrc); ++ AuDebugOn(!h_src_dentry); ++ } else if (IS_ERR(h_src_dentry)) { ++ err = PTR_ERR(h_src_dentry); ++ goto out_parent; ++ } ++ ++ /* ++ * aufs doesn't touch the credential so ++ * security_dentry_create_files_as() is unnecrssary. ++ */ ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ if (a->bdst < a->bsrc ++ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) ++ err = au_cpup_or_link(src_dentry, dentry, a); ++ else { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ dput(h_src_dentry); ++ } else { ++ /* ++ * copyup src_dentry to the branch we process, ++ * and then link(2) to it. ++ */ ++ dput(h_src_dentry); ++ if (a->bdst < a->bsrc ++ /* && h_src_dentry->d_sb != a->h_path.dentry->d_sb */) { ++ au_unpin(&a->pin); ++ di_write_unlock(a->parent); ++ err = au_cpup_before_link(src_dentry, a); ++ di_write_lock_parent(a->parent); ++ if (!err) ++ err = au_pin(&a->pin, dentry, a->bdst, ++ au_opt_udba(sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (unlikely(err)) ++ goto out_wh; ++ } ++ if (!err) { ++ h_src_dentry = au_h_dptr(src_dentry, a->bdst); ++ err = -ENOENT; ++ if (h_src_dentry && d_is_positive(h_src_dentry)) { ++ delegated = NULL; ++ err = vfsub_link(h_src_dentry, ++ au_pinned_h_dir(&a->pin), ++ &a->h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry" ++ " for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ } ++ } ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ if (wh_dentry) { ++ a->h_path.dentry = wh_dentry; ++ err = au_wh_unlink_dentry(au_pinned_h_dir(&a->pin), &a->h_path, ++ dentry); ++ if (unlikely(err)) ++ goto out_revert; ++ } ++ ++ au_dir_ts(dir, a->bdst); ++ dir->i_version++; ++ inc_nlink(inode); ++ inode->i_ctime = dir->i_ctime; ++ d_instantiate(dentry, au_igrab(inode)); ++ if (d_unhashed(a->h_path.dentry)) ++ /* some filesystem calls d_drop() */ ++ d_drop(dentry); ++ /* some filesystems consume an inode even hardlink */ ++ au_fhsm_wrote(sb, a->bdst, /*force*/0); ++ goto out_unpin; /* success */ ++ ++out_revert: ++ /* no delegation since it is just created */ ++ rerr = vfsub_unlink(au_pinned_h_dir(&a->pin), &a->h_path, ++ /*delegated*/NULL, /*force*/0); ++ if (unlikely(rerr)) { ++ AuIOErr("%pd reverting failed(%d, %d)\n", dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&dt); ++out_unpin: ++ au_unpin(&a->pin); ++out_wh: ++ dput(wh_dentry); ++out_parent: ++ di_write_unlock(a->parent); ++ dput(a->src_parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ aufs_read_and_write_unlock2(dentry, src_dentry); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int aufs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) ++{ ++ int err, rerr; ++ aufs_bindex_t bindex; ++ unsigned char diropq; ++ struct path h_path; ++ struct dentry *wh_dentry, *parent, *opq_dentry; ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct { ++ struct au_pin pin; ++ struct au_dtime dt; ++ } *a; /* reduce the stack usage */ ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = AuWrDir_ADD_ENTRY | AuWrDir_ISDIR ++ }; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_d_may_add(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_lkup_wh(dentry, &a->dt, /*src_dentry*/NULL, ++ &a->pin, &wr_dir_args); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ sb = dentry->d_sb; ++ bindex = au_dbtop(dentry); ++ h_path.dentry = au_h_dptr(dentry, bindex); ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mkdir(au_pinned_h_dir(&a->pin), &h_path, mode); ++ if (unlikely(err)) ++ goto out_unpin; ++ ++ /* make the dir opaque */ ++ diropq = 0; ++ h_inode = d_inode(h_path.dentry); ++ if (wh_dentry ++ || au_opt_test(au_mntflags(sb), ALWAYS_DIROPQ)) { ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ opq_dentry = au_diropq_create(dentry, bindex); ++ inode_unlock(h_inode); ++ err = PTR_ERR(opq_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out_dir; ++ dput(opq_dentry); ++ diropq = 1; ++ } ++ ++ err = epilog(dir, bindex, wh_dentry, dentry); ++ if (!err) { ++ inc_nlink(dir); ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ if (diropq) { ++ AuLabel(revert opq); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ rerr = au_diropq_remove(dentry, bindex); ++ inode_unlock(h_inode); ++ if (rerr) { ++ AuIOErr("%pd reverting diropq failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ } ++ ++out_dir: ++ AuLabel(revert dir); ++ rerr = vfsub_rmdir(au_pinned_h_dir(&a->pin), &h_path); ++ if (rerr) { ++ AuIOErr("%pd reverting dir failed(%d, %d)\n", ++ dentry, err, rerr); ++ err = -EIO; ++ } ++ au_dtime_revert(&a->dt); ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++out_parent: ++ di_write_unlock(parent); ++out_unlock: ++ if (unlikely(err)) { ++ au_update_dbtop(dentry); ++ d_drop(dentry); ++ } ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} +diff -Naur null/fs/aufs/i_op.c linux-4.15/fs/aufs/i_op.c +--- /dev/null ++++ linux-4.15/fs/aufs/i_op.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,1459 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode operations (except add/del/rename) ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++static int h_permission(struct inode *h_inode, int mask, ++ struct path *h_path, int brperm) ++{ ++ int err; ++ const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); ++ ++ err = -EPERM; ++ if (write_mask && IS_IMMUTABLE(h_inode)) ++ goto out; ++ ++ err = -EACCES; ++ if (((mask & MAY_EXEC) ++ && S_ISREG(h_inode->i_mode) ++ && (path_noexec(h_path) ++ || !(h_inode->i_mode & S_IXUGO)))) ++ goto out; ++ ++ /* ++ * - skip the lower fs test in the case of write to ro branch. ++ * - nfs dir permission write check is optimized, but a policy for ++ * link/rename requires a real check. ++ * - nfs always sets SB_POSIXACL regardless its mount option 'noacl.' ++ * in this case, generic_permission() returns -EOPNOTSUPP. ++ */ ++ if ((write_mask && !au_br_writable(brperm)) ++ || (au_test_nfs(h_inode->i_sb) && S_ISDIR(h_inode->i_mode) ++ && write_mask && !(mask & MAY_READ)) ++ || !h_inode->i_op->permission) { ++ /* AuLabel(generic_permission); */ ++ /* AuDbg("get_acl %pf\n", h_inode->i_op->get_acl); */ ++ err = generic_permission(h_inode, mask); ++ if (err == -EOPNOTSUPP && au_test_nfs_noacl(h_inode)) ++ err = h_inode->i_op->permission(h_inode, mask); ++ AuTraceErr(err); ++ } else { ++ /* AuLabel(h_inode->permission); */ ++ err = h_inode->i_op->permission(h_inode, mask); ++ AuTraceErr(err); ++ } ++ ++ if (!err) ++ err = devcgroup_inode_permission(h_inode, mask); ++ if (!err) ++ err = security_inode_permission(h_inode, mask); ++ ++#if 0 ++ if (!err) { ++ /* todo: do we need to call ima_path_check()? */ ++ struct path h_path = { ++ .dentry = ++ .mnt = h_mnt ++ }; ++ err = ima_path_check(&h_path, ++ mask & (MAY_READ | MAY_WRITE | MAY_EXEC), ++ IMA_COUNT_LEAVE); ++ } ++#endif ++ ++out: ++ return err; ++} ++ ++static int aufs_permission(struct inode *inode, int mask) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ const unsigned char isdir = !!S_ISDIR(inode->i_mode), ++ write_mask = !!(mask & (MAY_WRITE | MAY_APPEND)); ++ struct inode *h_inode; ++ struct super_block *sb; ++ struct au_branch *br; ++ ++ /* todo: support rcu-walk? */ ++ if (mask & MAY_NOT_BLOCK) ++ return -ECHILD; ++ ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_read_lock_child(inode); ++#if 0 ++ err = au_iigen_test(inode, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out; ++#endif ++ ++ if (!isdir ++ || write_mask ++ || au_opt_test(au_mntflags(sb), DIRPERM1)) { ++ err = au_busy_or_stale(); ++ h_inode = au_h_iptr(inode, au_ibtop(inode)); ++ if (unlikely(!h_inode ++ || (h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT))) ++ goto out; ++ ++ err = 0; ++ bindex = au_ibtop(inode); ++ br = au_sbr(sb, bindex); ++ err = h_permission(h_inode, mask, &br->br_path, br->br_perm); ++ if (write_mask ++ && !err ++ && !special_file(h_inode->i_mode)) { ++ /* test whether the upper writable branch exists */ ++ err = -EROFS; ++ for (; bindex >= 0; bindex--) ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = 0; ++ break; ++ } ++ } ++ goto out; ++ } ++ ++ /* non-write to dir */ ++ err = 0; ++ bbot = au_ibbot(inode); ++ for (bindex = au_ibtop(inode); !err && bindex <= bbot; bindex++) { ++ h_inode = au_h_iptr(inode, bindex); ++ if (h_inode) { ++ err = au_busy_or_stale(); ++ if (unlikely(!S_ISDIR(h_inode->i_mode))) ++ break; ++ ++ br = au_sbr(sb, bindex); ++ err = h_permission(h_inode, mask, &br->br_path, ++ br->br_perm); ++ } ++ } ++ ++out: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *aufs_lookup(struct inode *dir, struct dentry *dentry, ++ unsigned int flags) ++{ ++ struct dentry *ret, *parent; ++ struct inode *inode; ++ struct super_block *sb; ++ int err, npositive; ++ ++ IMustLock(dir); ++ ++ /* todo: support rcu-walk? */ ++ ret = ERR_PTR(-ECHILD); ++ if (flags & LOOKUP_RCU) ++ goto out; ++ ++ ret = ERR_PTR(-ENAMETOOLONG); ++ if (unlikely(dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ goto out; ++ ++ sb = dir->i_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ ret = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_di_init(dentry); ++ ret = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_si; ++ ++ inode = NULL; ++ npositive = 0; /* suppress a warning */ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_alive_dir(parent); ++ if (!err) ++ err = au_digen_test(parent, au_sigen(sb)); ++ if (!err) { ++ /* regardless LOOKUP_CREATE, always ALLOW_NEG */ ++ npositive = au_lkup_dentry(dentry, au_dbtop(parent), ++ AuLkup_ALLOW_NEG); ++ err = npositive; ++ } ++ di_read_unlock(parent, AuLock_IR); ++ ret = ERR_PTR(err); ++ if (unlikely(err < 0)) ++ goto out_unlock; ++ ++ if (npositive) { ++ inode = au_new_inode(dentry, /*must_new*/0); ++ if (IS_ERR(inode)) { ++ ret = (void *)inode; ++ inode = NULL; ++ goto out_unlock; ++ } ++ } ++ ++ if (inode) ++ atomic_inc(&inode->i_count); ++ ret = d_splice_alias(inode, dentry); ++#if 0 ++ if (unlikely(d_need_lookup(dentry))) { ++ spin_lock(&dentry->d_lock); ++ dentry->d_flags &= ~DCACHE_NEED_LOOKUP; ++ spin_unlock(&dentry->d_lock); ++ } else ++#endif ++ if (inode) { ++ if (!IS_ERR(ret)) { ++ iput(inode); ++ if (ret && ret != dentry) ++ ii_write_unlock(inode); ++ } else { ++ ii_write_unlock(inode); ++ iput(inode); ++ inode = NULL; ++ } ++ } ++ ++out_unlock: ++ di_write_unlock(dentry); ++out_si: ++ si_read_unlock(sb); ++out: ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct aopen_node { ++ struct hlist_bl_node hblist; ++ struct file *file, *h_file; ++}; ++ ++static int au_do_aopen(struct inode *inode, struct file *file) ++{ ++ struct hlist_bl_head *aopen; ++ struct hlist_bl_node *pos; ++ struct aopen_node *node; ++ struct au_do_open_args args = { ++ .aopen = 1, ++ .open = au_do_open_nondir ++ }; ++ ++ aopen = &au_sbi(inode->i_sb)->si_aopen; ++ hlist_bl_lock(aopen); ++ hlist_bl_for_each_entry(node, pos, aopen, hblist) ++ if (node->file == file) { ++ args.h_file = node->h_file; ++ break; ++ } ++ hlist_bl_unlock(aopen); ++ /* AuDebugOn(!args.h_file); */ ++ ++ return au_do_open(file, &args); ++} ++ ++static int aufs_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct file *file, unsigned int open_flag, ++ umode_t create_mode, int *opened) ++{ ++ int err, unlocked, h_opened = *opened; ++ unsigned int lkup_flags; ++ struct dentry *parent, *d; ++ struct hlist_bl_head *aopen; ++ struct vfsub_aopen_args args = { ++ .open_flag = open_flag, ++ .create_mode = create_mode, ++ .opened = &h_opened ++ }; ++ struct aopen_node aopen_node = { ++ .file = file ++ }; ++ ++ IMustLock(dir); ++ AuDbg("open_flag 0%o\n", open_flag); ++ AuDbgDentry(dentry); ++ ++ err = 0; ++ if (!au_di(dentry)) { ++ lkup_flags = LOOKUP_OPEN; ++ if (open_flag & O_CREAT) ++ lkup_flags |= LOOKUP_CREATE; ++ d = aufs_lookup(dir, dentry, lkup_flags); ++ if (IS_ERR(d)) { ++ err = PTR_ERR(d); ++ AuTraceErr(err); ++ goto out; ++ } else if (d) { ++ /* ++ * obsoleted dentry found. ++ * another error will be returned later. ++ */ ++ d_drop(d); ++ AuDbgDentry(d); ++ dput(d); ++ } ++ AuDbgDentry(dentry); ++ } ++ ++ if (d_is_positive(dentry) ++ || d_unhashed(dentry) ++ || d_unlinked(dentry) ++ || !(open_flag & O_CREAT)) ++ goto out_no_open; ++ ++ unlocked = 0; ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); ++ if (unlikely(err)) ++ goto out; ++ ++ parent = dentry->d_parent; /* dir is locked */ ++ di_write_lock_parent(parent); ++ err = au_lkup_dentry(dentry, /*btop*/0, AuLkup_ALLOW_NEG); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ AuDbgDentry(dentry); ++ if (d_is_positive(dentry)) ++ goto out_unlock; ++ ++ args.file = get_empty_filp(); ++ err = PTR_ERR(args.file); ++ if (IS_ERR(args.file)) ++ goto out_unlock; ++ ++ args.file->f_flags = file->f_flags; ++ err = au_aopen_or_create(dir, dentry, &args); ++ AuTraceErr(err); ++ AuDbgFile(args.file); ++ if (unlikely(err < 0)) { ++ if (h_opened & FILE_OPENED) ++ fput(args.file); ++ else ++ put_filp(args.file); ++ goto out_unlock; ++ } ++ di_write_unlock(parent); ++ di_write_unlock(dentry); ++ unlocked = 1; ++ ++ /* some filesystems don't set FILE_CREATED while succeeded? */ ++ *opened |= FILE_CREATED; ++ if (h_opened & FILE_OPENED) ++ aopen_node.h_file = args.file; ++ else { ++ put_filp(args.file); ++ args.file = NULL; ++ } ++ aopen = &au_sbi(dir->i_sb)->si_aopen; ++ au_hbl_add(&aopen_node.hblist, aopen); ++ err = finish_open(file, dentry, au_do_aopen, opened); ++ au_hbl_del(&aopen_node.hblist, aopen); ++ AuTraceErr(err); ++ AuDbgFile(file); ++ if (aopen_node.h_file) ++ fput(aopen_node.h_file); ++ ++out_unlock: ++ if (unlocked) ++ si_read_unlock(dentry->d_sb); ++ else { ++ di_write_unlock(parent); ++ aufs_read_unlock(dentry, AuLock_DW); ++ } ++ AuDbgDentry(dentry); ++ if (unlikely(err < 0)) ++ goto out; ++out_no_open: ++ if (err >= 0 && !(*opened & FILE_CREATED)) { ++ AuLabel(out_no_open); ++ dget(dentry); ++ err = finish_no_open(file, dentry); ++ } ++out: ++ AuDbg("%pd%s%s\n", dentry, ++ (*opened & FILE_CREATED) ? " created" : "", ++ (*opened & FILE_OPENED) ? " opened" : ""); ++ AuTraceErr(err); ++ return err; ++} ++ ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent, ++ const unsigned char add_entry, aufs_bindex_t bcpup, ++ aufs_bindex_t btop) ++{ ++ int err; ++ struct dentry *h_parent; ++ struct inode *h_dir; ++ ++ if (add_entry) ++ IMustLock(d_inode(parent)); ++ else ++ di_write_lock_parent(parent); ++ ++ err = 0; ++ if (!au_h_dptr(parent, bcpup)) { ++ if (btop > bcpup) ++ err = au_cpup_dirs(dentry, bcpup); ++ else if (btop < bcpup) ++ err = au_cpdown_dirs(dentry, bcpup); ++ else ++ BUG(); ++ } ++ if (!err && add_entry && !au_ftest_wrdir(add_entry, TMPFILE)) { ++ h_parent = au_h_dptr(parent, bcpup); ++ h_dir = d_inode(h_parent); ++ vfsub_inode_lock_shared_nested(h_dir, AuLsc_I_PARENT); ++ err = au_lkup_neg(dentry, bcpup, /*wh*/0); ++ /* todo: no unlock here */ ++ inode_unlock_shared(h_dir); ++ ++ AuDbg("bcpup %d\n", bcpup); ++ if (!err) { ++ if (d_really_is_negative(dentry)) ++ au_set_h_dptr(dentry, btop, NULL); ++ au_update_dbrange(dentry, /*do_put_zero*/0); ++ } ++ } ++ ++ if (!add_entry) ++ di_write_unlock(parent); ++ if (!err) ++ err = bcpup; /* success */ ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * decide the branch and the parent dir where we will create a new entry. ++ * returns new bindex or an error. ++ * copyup the parent dir if needed. ++ */ ++int au_wr_dir(struct dentry *dentry, struct dentry *src_dentry, ++ struct au_wr_dir_args *args) ++{ ++ int err; ++ unsigned int flags; ++ aufs_bindex_t bcpup, btop, src_btop; ++ const unsigned char add_entry ++ = au_ftest_wrdir(args->flags, ADD_ENTRY) ++ | au_ftest_wrdir(args->flags, TMPFILE); ++ struct super_block *sb; ++ struct dentry *parent; ++ struct au_sbinfo *sbinfo; ++ ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ parent = dget_parent(dentry); ++ btop = au_dbtop(dentry); ++ bcpup = btop; ++ if (args->force_btgt < 0) { ++ if (src_dentry) { ++ src_btop = au_dbtop(src_dentry); ++ if (src_btop < btop) ++ bcpup = src_btop; ++ } else if (add_entry) { ++ flags = 0; ++ if (au_ftest_wrdir(args->flags, ISDIR)) ++ au_fset_wbr(flags, DIR); ++ err = AuWbrCreate(sbinfo, dentry, flags); ++ bcpup = err; ++ } ++ ++ if (bcpup < 0 || au_test_ro(sb, bcpup, d_inode(dentry))) { ++ if (add_entry) ++ err = AuWbrCopyup(sbinfo, dentry); ++ else { ++ if (!IS_ROOT(dentry)) { ++ di_read_lock_parent(parent, !AuLock_IR); ++ err = AuWbrCopyup(sbinfo, dentry); ++ di_read_unlock(parent, !AuLock_IR); ++ } else ++ err = AuWbrCopyup(sbinfo, dentry); ++ } ++ bcpup = err; ++ if (unlikely(err < 0)) ++ goto out; ++ } ++ } else { ++ bcpup = args->force_btgt; ++ AuDebugOn(au_test_ro(sb, bcpup, d_inode(dentry))); ++ } ++ ++ AuDbg("btop %d, bcpup %d\n", btop, bcpup); ++ err = bcpup; ++ if (bcpup == btop) ++ goto out; /* success */ ++ ++ /* copyup the new parent into the branch we process */ ++ err = au_wr_dir_cpup(dentry, parent, add_entry, bcpup, btop); ++ if (err >= 0) { ++ if (d_really_is_negative(dentry)) { ++ au_set_h_dptr(dentry, btop, NULL); ++ au_set_dbtop(dentry, bcpup); ++ au_set_dbbot(dentry, bcpup); ++ } ++ AuDebugOn(add_entry ++ && !au_ftest_wrdir(args->flags, TMPFILE) ++ && !au_h_dptr(dentry, bcpup)); ++ } ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_pin_hdir_unlock(struct au_pin *p) ++{ ++ if (p->hdir) ++ au_hn_inode_unlock(p->hdir); ++} ++ ++int au_pin_hdir_lock(struct au_pin *p) ++{ ++ int err; ++ ++ err = 0; ++ if (!p->hdir) ++ goto out; ++ ++ /* even if an error happens later, keep this lock */ ++ au_hn_inode_lock_nested(p->hdir, p->lsc_hi); ++ ++ err = -EBUSY; ++ if (unlikely(p->hdir->hi_inode != d_inode(p->h_parent))) ++ goto out; ++ ++ err = 0; ++ if (p->h_dentry) ++ err = au_h_verify(p->h_dentry, p->udba, p->hdir->hi_inode, ++ p->h_parent, p->br); ++ ++out: ++ return err; ++} ++ ++int au_pin_hdir_relock(struct au_pin *p) ++{ ++ int err, i; ++ struct inode *h_i; ++ struct dentry *h_d[] = { ++ p->h_dentry, ++ p->h_parent ++ }; ++ ++ err = au_pin_hdir_lock(p); ++ if (unlikely(err)) ++ goto out; ++ ++ for (i = 0; !err && i < sizeof(h_d)/sizeof(*h_d); i++) { ++ if (!h_d[i]) ++ continue; ++ if (d_is_positive(h_d[i])) { ++ h_i = d_inode(h_d[i]); ++ err = !h_i->i_nlink; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++static void au_pin_hdir_set_owner(struct au_pin *p, struct task_struct *task) ++{ ++#if !defined(CONFIG_RWSEM_GENERIC_SPINLOCK) && defined(CONFIG_RWSEM_SPIN_ON_OWNER) ++ p->hdir->hi_inode->i_rwsem.owner = task; ++#endif ++} ++ ++void au_pin_hdir_acquire_nest(struct au_pin *p) ++{ ++ if (p->hdir) { ++ rwsem_acquire_nest(&p->hdir->hi_inode->i_rwsem.dep_map, ++ p->lsc_hi, 0, NULL, _RET_IP_); ++ au_pin_hdir_set_owner(p, current); ++ } ++} ++ ++void au_pin_hdir_release(struct au_pin *p) ++{ ++ if (p->hdir) { ++ au_pin_hdir_set_owner(p, p->task); ++ rwsem_release(&p->hdir->hi_inode->i_rwsem.dep_map, 1, _RET_IP_); ++ } ++} ++ ++struct dentry *au_pinned_h_parent(struct au_pin *pin) ++{ ++ if (pin && pin->parent) ++ return au_h_dptr(pin->parent, pin->bindex); ++ return NULL; ++} ++ ++void au_unpin(struct au_pin *p) ++{ ++ if (p->hdir) ++ au_pin_hdir_unlock(p); ++ if (p->h_mnt && au_ftest_pin(p->flags, MNT_WRITE)) ++ vfsub_mnt_drop_write(p->h_mnt); ++ if (!p->hdir) ++ return; ++ ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ iput(p->hdir->hi_inode); ++ dput(p->parent); ++ p->parent = NULL; ++ p->hdir = NULL; ++ p->h_mnt = NULL; ++ /* do not clear p->task */ ++} ++ ++int au_do_pin(struct au_pin *p) ++{ ++ int err; ++ struct super_block *sb; ++ struct inode *h_dir; ++ ++ err = 0; ++ sb = p->dentry->d_sb; ++ p->br = au_sbr(sb, p->bindex); ++ if (IS_ROOT(p->dentry)) { ++ if (au_ftest_pin(p->flags, MNT_WRITE)) { ++ p->h_mnt = au_br_mnt(p->br); ++ err = vfsub_mnt_want_write(p->h_mnt); ++ if (unlikely(err)) { ++ au_fclr_pin(p->flags, MNT_WRITE); ++ goto out_err; ++ } ++ } ++ goto out; ++ } ++ ++ p->h_dentry = NULL; ++ if (p->bindex <= au_dbbot(p->dentry)) ++ p->h_dentry = au_h_dptr(p->dentry, p->bindex); ++ ++ p->parent = dget_parent(p->dentry); ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_lock(p->parent, AuLock_IR, p->lsc_di); ++ ++ h_dir = NULL; ++ p->h_parent = au_h_dptr(p->parent, p->bindex); ++ p->hdir = au_hi(d_inode(p->parent), p->bindex); ++ if (p->hdir) ++ h_dir = p->hdir->hi_inode; ++ ++ /* ++ * udba case, or ++ * if DI_LOCKED is not set, then p->parent may be different ++ * and h_parent can be NULL. ++ */ ++ if (unlikely(!p->hdir || !h_dir || !p->h_parent)) { ++ err = -EBUSY; ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ dput(p->parent); ++ p->parent = NULL; ++ goto out_err; ++ } ++ ++ if (au_ftest_pin(p->flags, MNT_WRITE)) { ++ p->h_mnt = au_br_mnt(p->br); ++ err = vfsub_mnt_want_write(p->h_mnt); ++ if (unlikely(err)) { ++ au_fclr_pin(p->flags, MNT_WRITE); ++ if (!au_ftest_pin(p->flags, DI_LOCKED)) ++ di_read_unlock(p->parent, AuLock_IR); ++ dput(p->parent); ++ p->parent = NULL; ++ goto out_err; ++ } ++ } ++ ++ au_igrab(h_dir); ++ err = au_pin_hdir_lock(p); ++ if (!err) ++ goto out; /* success */ ++ ++ au_unpin(p); ++ ++out_err: ++ pr_err("err %d\n", err); ++ err = au_busy_or_stale(); ++out: ++ return err; ++} ++ ++void au_pin_init(struct au_pin *p, struct dentry *dentry, ++ aufs_bindex_t bindex, int lsc_di, int lsc_hi, ++ unsigned int udba, unsigned char flags) ++{ ++ p->dentry = dentry; ++ p->udba = udba; ++ p->lsc_di = lsc_di; ++ p->lsc_hi = lsc_hi; ++ p->flags = flags; ++ p->bindex = bindex; ++ ++ p->parent = NULL; ++ p->hdir = NULL; ++ p->h_mnt = NULL; ++ ++ p->h_dentry = NULL; ++ p->h_parent = NULL; ++ p->br = NULL; ++ p->task = current; ++} ++ ++int au_pin(struct au_pin *pin, struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int udba, unsigned char flags) ++{ ++ au_pin_init(pin, dentry, bindex, AuLsc_DI_PARENT, AuLsc_I_PARENT2, ++ udba, flags); ++ return au_do_pin(pin); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * ->setattr() and ->getattr() are called in various cases. ++ * chmod, stat: dentry is revalidated. ++ * fchmod, fstat: file and dentry are not revalidated, additionally they may be ++ * unhashed. ++ * for ->setattr(), ia->ia_file is passed from ftruncate only. ++ */ ++/* todo: consolidate with do_refresh() and simple_reval_dpath() */ ++int au_reval_for_attr(struct dentry *dentry, unsigned int sigen) ++{ ++ int err; ++ struct dentry *parent; ++ ++ err = 0; ++ if (au_digen_test(dentry, sigen)) { ++ parent = dget_parent(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(dentry, parent); ++ di_read_unlock(parent, AuLock_IR); ++ dput(parent); ++ } ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_pin_and_icpup(struct dentry *dentry, struct iattr *ia, ++ struct au_icpup_args *a) ++{ ++ int err; ++ loff_t sz; ++ aufs_bindex_t btop, ibtop; ++ struct dentry *hi_wh, *parent; ++ struct inode *inode; ++ struct au_wr_dir_args wr_dir_args = { ++ .force_btgt = -1, ++ .flags = 0 ++ }; ++ ++ if (d_is_dir(dentry)) ++ au_fset_wrdir(wr_dir_args.flags, ISDIR); ++ /* plink or hi_wh() case */ ++ btop = au_dbtop(dentry); ++ inode = d_inode(dentry); ++ ibtop = au_ibtop(inode); ++ if (btop != ibtop && !au_test_ro(inode->i_sb, ibtop, inode)) ++ wr_dir_args.force_btgt = ibtop; ++ err = au_wr_dir(dentry, /*src_dentry*/NULL, &wr_dir_args); ++ if (unlikely(err < 0)) ++ goto out; ++ a->btgt = err; ++ if (err != btop) ++ au_fset_icpup(a->flags, DID_CPUP); ++ ++ err = 0; ++ a->pin_flags = AuPin_MNT_WRITE; ++ parent = NULL; ++ if (!IS_ROOT(dentry)) { ++ au_fset_pin(a->pin_flags, DI_LOCKED); ++ parent = dget_parent(dentry); ++ di_write_lock_parent(parent); ++ } ++ ++ err = au_pin(&a->pin, dentry, a->btgt, a->udba, a->pin_flags); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ sz = -1; ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ a->h_inode = d_inode(a->h_path.dentry); ++ if (ia && (ia->ia_valid & ATTR_SIZE)) { ++ vfsub_inode_lock_shared_nested(a->h_inode, AuLsc_I_CHILD); ++ if (ia->ia_size < i_size_read(a->h_inode)) ++ sz = ia->ia_size; ++ inode_unlock_shared(a->h_inode); ++ } ++ ++ hi_wh = NULL; ++ if (au_ftest_icpup(a->flags, DID_CPUP) && d_unlinked(dentry)) { ++ hi_wh = au_hi_wh(inode, a->btgt); ++ if (!hi_wh) { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->btgt, ++ .bsrc = -1, ++ .len = sz, ++ .pin = &a->pin ++ }; ++ err = au_sio_cpup_wh(&cpg, /*file*/NULL); ++ if (unlikely(err)) ++ goto out_unlock; ++ hi_wh = au_hi_wh(inode, a->btgt); ++ /* todo: revalidate hi_wh? */ ++ } ++ } ++ ++ if (parent) { ++ au_pin_set_parent_lflag(&a->pin, /*lflag*/0); ++ di_downgrade_lock(parent, AuLock_IR); ++ dput(parent); ++ parent = NULL; ++ } ++ if (!au_ftest_icpup(a->flags, DID_CPUP)) ++ goto out; /* success */ ++ ++ if (!d_unhashed(dentry)) { ++ struct au_cp_generic cpg = { ++ .dentry = dentry, ++ .bdst = a->btgt, ++ .bsrc = btop, ++ .len = sz, ++ .pin = &a->pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ if (!err) ++ a->h_path.dentry = au_h_dptr(dentry, a->btgt); ++ } else if (!hi_wh) ++ a->h_path.dentry = au_h_dptr(dentry, a->btgt); ++ else ++ a->h_path.dentry = hi_wh; /* do not dget here */ ++ ++out_unlock: ++ a->h_inode = d_inode(a->h_path.dentry); ++ if (!err) ++ goto out; /* success */ ++ au_unpin(&a->pin); ++out_parent: ++ if (parent) { ++ di_write_unlock(parent); ++ dput(parent); ++ } ++out: ++ if (!err) ++ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); ++ return err; ++} ++ ++static int aufs_setattr(struct dentry *dentry, struct iattr *ia) ++{ ++ int err; ++ struct inode *inode, *delegated; ++ struct super_block *sb; ++ struct file *file; ++ struct au_icpup_args *a; ++ ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ ++ err = setattr_prepare(dentry, ia); ++ if (unlikely(err)) ++ goto out; ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) ++ ia->ia_valid &= ~ATTR_MODE; ++ ++ file = NULL; ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_kfree; ++ ++ if (ia->ia_valid & ATTR_FILE) { ++ /* currently ftruncate(2) only */ ++ AuDebugOn(!d_is_reg(dentry)); ++ file = ia->ia_file; ++ err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1, ++ /*fi_lsc*/0); ++ if (unlikely(err)) ++ goto out_si; ++ ia->ia_file = au_hf_top(file); ++ a->udba = AuOpt_UDBA_NONE; ++ } else { ++ /* fchmod() doesn't pass ia_file */ ++ a->udba = au_opt_udba(sb); ++ di_write_lock_child(dentry); ++ /* no d_unlinked(), to set UDBA_NONE for root */ ++ if (d_unhashed(dentry)) ++ a->udba = AuOpt_UDBA_NONE; ++ if (a->udba != AuOpt_UDBA_NONE) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_for_attr(dentry, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out_dentry; ++ } ++ } ++ ++ err = au_pin_and_icpup(dentry, ia, a); ++ if (unlikely(err < 0)) ++ goto out_dentry; ++ if (au_ftest_icpup(a->flags, DID_CPUP)) { ++ ia->ia_file = NULL; ++ ia->ia_valid &= ~ATTR_FILE; ++ } ++ ++ a->h_path.mnt = au_sbr_mnt(sb, a->btgt); ++ if ((ia->ia_valid & (ATTR_MODE | ATTR_CTIME)) ++ == (ATTR_MODE | ATTR_CTIME)) { ++ err = security_path_chmod(&a->h_path, ia->ia_mode); ++ if (unlikely(err)) ++ goto out_unlock; ++ } else if ((ia->ia_valid & (ATTR_UID | ATTR_GID)) ++ && (ia->ia_valid & ATTR_CTIME)) { ++ err = security_path_chown(&a->h_path, ia->ia_uid, ia->ia_gid); ++ if (unlikely(err)) ++ goto out_unlock; ++ } ++ ++ if (ia->ia_valid & ATTR_SIZE) { ++ struct file *f; ++ ++ if (ia->ia_size < i_size_read(inode)) ++ /* unmap only */ ++ truncate_setsize(inode, ia->ia_size); ++ ++ f = NULL; ++ if (ia->ia_valid & ATTR_FILE) ++ f = ia->ia_file; ++ inode_unlock(a->h_inode); ++ err = vfsub_trunc(&a->h_path, ia->ia_size, ia->ia_valid, f); ++ inode_lock_nested(a->h_inode, AuLsc_I_CHILD); ++ } else { ++ delegated = NULL; ++ while (1) { ++ err = vfsub_notify_change(&a->h_path, ia, &delegated); ++ if (delegated) { ++ err = break_deleg_wait(&delegated); ++ if (!err) ++ continue; ++ } ++ break; ++ } ++ } ++ /* ++ * regardless aufs 'acl' option setting. ++ * why don't all acl-aware fs call this func from their ->setattr()? ++ */ ++ if (!err && (ia->ia_valid & ATTR_MODE)) ++ err = vfsub_acl_chmod(a->h_inode, ia->ia_mode); ++ if (!err) ++ au_cpup_attr_changeable(inode); ++ ++out_unlock: ++ inode_unlock(a->h_inode); ++ au_unpin(&a->pin); ++ if (unlikely(err)) ++ au_update_dbtop(dentry); ++out_dentry: ++ di_write_unlock(dentry); ++ if (file) { ++ fi_write_unlock(file); ++ ia->ia_file = file; ++ ia->ia_valid |= ATTR_FILE; ++ } ++out_si: ++ si_read_unlock(sb); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++#if IS_ENABLED(CONFIG_AUFS_XATTR) || IS_ENABLED(CONFIG_FS_POSIX_ACL) ++static int au_h_path_to_set_attr(struct dentry *dentry, ++ struct au_icpup_args *a, struct path *h_path) ++{ ++ int err; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ a->udba = au_opt_udba(sb); ++ /* no d_unlinked(), to set UDBA_NONE for root */ ++ if (d_unhashed(dentry)) ++ a->udba = AuOpt_UDBA_NONE; ++ if (a->udba != AuOpt_UDBA_NONE) { ++ AuDebugOn(IS_ROOT(dentry)); ++ err = au_reval_for_attr(dentry, au_sigen(sb)); ++ if (unlikely(err)) ++ goto out; ++ } ++ err = au_pin_and_icpup(dentry, /*ia*/NULL, a); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ h_path->dentry = a->h_path.dentry; ++ h_path->mnt = au_sbr_mnt(sb, a->btgt); ++ ++out: ++ return err; ++} ++ ++ssize_t au_sxattr(struct dentry *dentry, struct inode *inode, ++ struct au_sxattr *arg) ++{ ++ int err; ++ struct path h_path; ++ struct super_block *sb; ++ struct au_icpup_args *a; ++ struct inode *h_inode; ++ ++ IMustLock(inode); ++ ++ err = -ENOMEM; ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_kfree; ++ ++ h_path.dentry = NULL; /* silence gcc */ ++ di_write_lock_child(dentry); ++ err = au_h_path_to_set_attr(dentry, a, &h_path); ++ if (unlikely(err)) ++ goto out_di; ++ ++ inode_unlock(a->h_inode); ++ switch (arg->type) { ++ case AU_XATTR_SET: ++ AuDebugOn(d_is_negative(h_path.dentry)); ++ err = vfsub_setxattr(h_path.dentry, ++ arg->u.set.name, arg->u.set.value, ++ arg->u.set.size, arg->u.set.flags); ++ break; ++ case AU_ACL_SET: ++ err = -EOPNOTSUPP; ++ h_inode = d_inode(h_path.dentry); ++ if (h_inode->i_op->set_acl) ++ /* this will call posix_acl_update_mode */ ++ err = h_inode->i_op->set_acl(h_inode, ++ arg->u.acl_set.acl, ++ arg->u.acl_set.type); ++ break; ++ } ++ if (!err) ++ au_cpup_attr_timesizes(inode); ++ ++ au_unpin(&a->pin); ++ if (unlikely(err)) ++ au_update_dbtop(dentry); ++ ++out_di: ++ di_write_unlock(dentry); ++ si_read_unlock(sb); ++out_kfree: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++#endif ++ ++static void au_refresh_iattr(struct inode *inode, struct kstat *st, ++ unsigned int nlink) ++{ ++ unsigned int n; ++ ++ inode->i_mode = st->mode; ++ /* don't i_[ug]id_write() here */ ++ inode->i_uid = st->uid; ++ inode->i_gid = st->gid; ++ inode->i_atime = st->atime; ++ inode->i_mtime = st->mtime; ++ inode->i_ctime = st->ctime; ++ ++ au_cpup_attr_nlink(inode, /*force*/0); ++ if (S_ISDIR(inode->i_mode)) { ++ n = inode->i_nlink; ++ n -= nlink; ++ n += st->nlink; ++ smp_mb(); /* for i_nlink */ ++ /* 0 can happen */ ++ set_nlink(inode, n); ++ } ++ ++ spin_lock(&inode->i_lock); ++ inode->i_blocks = st->blocks; ++ i_size_write(inode, st->size); ++ spin_unlock(&inode->i_lock); ++} ++ ++/* ++ * common routine for aufs_getattr() and au_getxattr(). ++ * returns zero or negative (an error). ++ * @dentry will be read-locked in success. ++ */ ++int au_h_path_getattr(struct dentry *dentry, int force, struct path *h_path, ++ int locked) ++{ ++ int err; ++ unsigned int mnt_flags, sigen; ++ unsigned char udba_none; ++ aufs_bindex_t bindex; ++ struct super_block *sb, *h_sb; ++ struct inode *inode; ++ ++ h_path->mnt = NULL; ++ h_path->dentry = NULL; ++ ++ err = 0; ++ sb = dentry->d_sb; ++ mnt_flags = au_mntflags(sb); ++ udba_none = !!au_opt_test(mnt_flags, UDBA_NONE); ++ ++ if (unlikely(locked)) ++ goto body; /* skip locking dinfo */ ++ ++ /* support fstat(2) */ ++ if (!d_unlinked(dentry) && !udba_none) { ++ sigen = au_sigen(sb); ++ err = au_digen_test(dentry, sigen); ++ if (!err) { ++ di_read_lock_child(dentry, AuLock_IR); ++ err = au_dbrange_test(dentry); ++ if (unlikely(err)) { ++ di_read_unlock(dentry, AuLock_IR); ++ goto out; ++ } ++ } else { ++ AuDebugOn(IS_ROOT(dentry)); ++ di_write_lock_child(dentry); ++ err = au_dbrange_test(dentry); ++ if (!err) ++ err = au_reval_for_attr(dentry, sigen); ++ if (!err) ++ di_downgrade_lock(dentry, AuLock_IR); ++ else { ++ di_write_unlock(dentry); ++ goto out; ++ } ++ } ++ } else ++ di_read_lock_child(dentry, AuLock_IR); ++ ++body: ++ inode = d_inode(dentry); ++ bindex = au_ibtop(inode); ++ h_path->mnt = au_sbr_mnt(sb, bindex); ++ h_sb = h_path->mnt->mnt_sb; ++ if (!force ++ && !au_test_fs_bad_iattr(h_sb) ++ && udba_none) ++ goto out; /* success */ ++ ++ if (au_dbtop(dentry) == bindex) ++ h_path->dentry = au_h_dptr(dentry, bindex); ++ else if (au_opt_test(mnt_flags, PLINK) && au_plink_test(inode)) { ++ h_path->dentry = au_plink_lkup(inode, bindex); ++ if (IS_ERR(h_path->dentry)) ++ /* pretending success */ ++ h_path->dentry = NULL; ++ else ++ dput(h_path->dentry); ++ } ++ ++out: ++ return err; ++} ++ ++static int aufs_getattr(const struct path *path, struct kstat *st, ++ u32 request, unsigned int query) ++{ ++ int err; ++ unsigned char positive; ++ struct path h_path; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct super_block *sb; ++ ++ dentry = path->dentry; ++ inode = d_inode(dentry); ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ err = au_h_path_getattr(dentry, /*force*/0, &h_path, /*locked*/0); ++ if (unlikely(err)) ++ goto out_si; ++ if (unlikely(!h_path.dentry)) ++ /* illegally overlapped or something */ ++ goto out_fill; /* pretending success */ ++ ++ positive = d_is_positive(h_path.dentry); ++ if (positive) ++ /* no vfsub version */ ++ err = vfs_getattr(&h_path, st, request, query); ++ if (!err) { ++ if (positive) ++ au_refresh_iattr(inode, st, ++ d_inode(h_path.dentry)->i_nlink); ++ goto out_fill; /* success */ ++ } ++ AuTraceErr(err); ++ goto out_di; ++ ++out_fill: ++ generic_fillattr(inode, st); ++out_di: ++ di_read_unlock(dentry, AuLock_IR); ++out_si: ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const char *aufs_get_link(struct dentry *dentry, struct inode *inode, ++ struct delayed_call *done) ++{ ++ const char *ret; ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ int err; ++ aufs_bindex_t bindex; ++ ++ ret = NULL; /* suppress a warning */ ++ err = -ECHILD; ++ if (!dentry) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_d_hashed_positive(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ err = -EINVAL; ++ inode = d_inode(dentry); ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(!h_inode->i_op->get_link)) ++ goto out_unlock; ++ ++ err = -EBUSY; ++ h_dentry = NULL; ++ if (au_dbtop(dentry) <= bindex) { ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (h_dentry) ++ dget(h_dentry); ++ } ++ if (!h_dentry) { ++ h_dentry = d_find_any_alias(h_inode); ++ if (IS_ERR(h_dentry)) { ++ err = PTR_ERR(h_dentry); ++ goto out_unlock; ++ } ++ } ++ if (unlikely(!h_dentry)) ++ goto out_unlock; ++ ++ err = 0; ++ AuDbg("%pf\n", h_inode->i_op->get_link); ++ AuDbgDentry(h_dentry); ++ ret = vfs_get_link(h_dentry, done); ++ dput(h_dentry); ++ if (IS_ERR(ret)) ++ err = PTR_ERR(ret); ++ ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_IR); ++out: ++ if (unlikely(err)) ++ ret = ERR_PTR(err); ++ AuTraceErrPtr(ret); ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_is_special(struct inode *inode) ++{ ++ return (inode->i_mode & (S_IFBLK | S_IFCHR | S_IFIFO | S_IFSOCK)); ++} ++ ++static int aufs_update_time(struct inode *inode, struct timespec *ts, int flags) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct super_block *sb; ++ struct inode *h_inode; ++ struct vfsmount *h_mnt; ++ ++ sb = inode->i_sb; ++ WARN_ONCE((flags & S_ATIME) && !IS_NOATIME(inode), ++ "unexpected s_flags 0x%lx", sb->s_flags); ++ ++ /* mmap_sem might be acquired already, cf. aufs_mmap() */ ++ lockdep_off(); ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_write_lock_child(inode); ++ ++ err = 0; ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (!au_test_ro(sb, bindex, inode)) { ++ h_mnt = au_sbr_mnt(sb, bindex); ++ err = vfsub_mnt_want_write(h_mnt); ++ if (!err) { ++ err = vfsub_update_time(h_inode, ts, flags); ++ vfsub_mnt_drop_write(h_mnt); ++ } ++ } else if (au_is_special(h_inode)) { ++ /* ++ * Never copy-up here. ++ * These special files may already be opened and used for ++ * communicating. If we copied it up, then the communication ++ * would be corrupted. ++ */ ++ AuWarn1("timestamps for i%lu are ignored " ++ "since it is on readonly branch (hi%lu).\n", ++ inode->i_ino, h_inode->i_ino); ++ } else if (flags & ~S_ATIME) { ++ err = -EIO; ++ AuIOErr1("unexpected flags 0x%x\n", flags); ++ AuDebugOn(1); ++ } ++ ++ if (!err) ++ au_cpup_attr_timesizes(inode); ++ ii_write_unlock(inode); ++ si_read_unlock(sb); ++ lockdep_on(); ++ ++ if (!err && (flags & S_VERSION)) ++ inode_inc_iversion(inode); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* no getattr version will be set by module.c:aufs_init() */ ++struct inode_operations aufs_iop_nogetattr[AuIop_Last], ++ aufs_iop[] = { ++ [AuIop_SYMLINK] = { ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, /* unsupport for symlink? */ ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .get_link = aufs_get_link, ++ ++ /* .update_time = aufs_update_time */ ++ }, ++ [AuIop_DIR] = { ++ .create = aufs_create, ++ .lookup = aufs_lookup, ++ .link = aufs_link, ++ .unlink = aufs_unlink, ++ .symlink = aufs_symlink, ++ .mkdir = aufs_mkdir, ++ .rmdir = aufs_rmdir, ++ .mknod = aufs_mknod, ++ .rename = aufs_rename, ++ ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .update_time = aufs_update_time, ++ .atomic_open = aufs_atomic_open, ++ .tmpfile = aufs_tmpfile ++ }, ++ [AuIop_OTHER] = { ++ .permission = aufs_permission, ++#ifdef CONFIG_FS_POSIX_ACL ++ .get_acl = aufs_get_acl, ++ .set_acl = aufs_set_acl, ++#endif ++ ++ .setattr = aufs_setattr, ++ .getattr = aufs_getattr, ++ ++#ifdef CONFIG_AUFS_XATTR ++ .listxattr = aufs_listxattr, ++#endif ++ ++ .update_time = aufs_update_time ++ } ++}; +diff -Naur null/fs/aufs/i_op_del.c linux-4.15/fs/aufs/i_op_del.c +--- /dev/null ++++ linux-4.15/fs/aufs/i_op_del.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,511 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode operations (del entry) ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * decide if a new whiteout for @dentry is necessary or not. ++ * when it is necessary, prepare the parent dir for the upper branch whose ++ * branch index is @bcpup for creation. the actual creation of the whiteout will ++ * be done by caller. ++ * return value: ++ * 0: wh is unnecessary ++ * plus: wh is necessary ++ * minus: error ++ */ ++int au_wr_dir_need_wh(struct dentry *dentry, int isdir, aufs_bindex_t *bcpup) ++{ ++ int need_wh, err; ++ aufs_bindex_t btop; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ if (*bcpup < 0) { ++ *bcpup = btop; ++ if (au_test_ro(sb, btop, d_inode(dentry))) { ++ err = AuWbrCopyup(au_sbi(sb), dentry); ++ *bcpup = err; ++ if (unlikely(err < 0)) ++ goto out; ++ } ++ } else ++ AuDebugOn(btop < *bcpup ++ || au_test_ro(sb, *bcpup, d_inode(dentry))); ++ AuDbg("bcpup %d, btop %d\n", *bcpup, btop); ++ ++ if (*bcpup != btop) { ++ err = au_cpup_dirs(dentry, *bcpup); ++ if (unlikely(err)) ++ goto out; ++ need_wh = 1; ++ } else { ++ struct au_dinfo *dinfo, *tmp; ++ ++ need_wh = -ENOMEM; ++ dinfo = au_di(dentry); ++ tmp = au_di_alloc(sb, AuLsc_DI_TMP); ++ if (tmp) { ++ au_di_cp(tmp, dinfo); ++ au_di_swap(tmp, dinfo); ++ /* returns the number of positive dentries */ ++ need_wh = au_lkup_dentry(dentry, btop + 1, ++ /* AuLkup_IGNORE_PERM */ 0); ++ au_di_swap(tmp, dinfo); ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ } ++ } ++ AuDbg("need_wh %d\n", need_wh); ++ err = need_wh; ++ ++out: ++ return err; ++} ++ ++/* ++ * simple tests for the del-entry operations. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++int au_may_del(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent, int isdir) ++{ ++ int err; ++ umode_t h_mode; ++ struct dentry *h_dentry, *h_latest; ++ struct inode *h_inode; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (d_really_is_positive(dentry)) { ++ err = -ENOENT; ++ if (unlikely(d_is_negative(h_dentry))) ++ goto out; ++ h_inode = d_inode(h_dentry); ++ if (unlikely(!h_inode->i_nlink)) ++ goto out; ++ ++ h_mode = h_inode->i_mode; ++ if (!isdir) { ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(h_mode))) ++ goto out; ++ } else if (unlikely(!S_ISDIR(h_mode))) { ++ err = -ENOTDIR; ++ goto out; ++ } ++ } else { ++ /* rename(2) case */ ++ err = -EIO; ++ if (unlikely(d_is_positive(h_dentry))) ++ goto out; ++ } ++ ++ err = -ENOENT; ++ /* expected parent dir is locked */ ++ if (unlikely(h_parent != h_dentry->d_parent)) ++ goto out; ++ err = 0; ++ ++ /* ++ * rmdir a dir may break the consistency on some filesystem. ++ * let's try heavy test. ++ */ ++ err = -EACCES; ++ if (unlikely(!au_opt_test(au_mntflags(dentry->d_sb), DIRPERM1) ++ && au_test_h_perm(d_inode(h_parent), ++ MAY_EXEC | MAY_WRITE))) ++ goto out; ++ ++ h_latest = au_sio_lkup_one(&dentry->d_name, h_parent); ++ err = -EIO; ++ if (IS_ERR(h_latest)) ++ goto out; ++ if (h_latest == h_dentry) ++ err = 0; ++ dput(h_latest); ++ ++out: ++ return err; ++} ++ ++/* ++ * decide the branch where we operate for @dentry. the branch index will be set ++ * @rbcpup. after diciding it, 'pin' it and store the timestamps of the parent ++ * dir for reverting. ++ * when a new whiteout is necessary, create it. ++ */ ++static struct dentry* ++lock_hdir_create_wh(struct dentry *dentry, int isdir, aufs_bindex_t *rbcpup, ++ struct au_dtime *dt, struct au_pin *pin) ++{ ++ struct dentry *wh_dentry; ++ struct super_block *sb; ++ struct path h_path; ++ int err, need_wh; ++ unsigned int udba; ++ aufs_bindex_t bcpup; ++ ++ need_wh = au_wr_dir_need_wh(dentry, isdir, rbcpup); ++ wh_dentry = ERR_PTR(need_wh); ++ if (unlikely(need_wh < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ udba = au_opt_udba(sb); ++ bcpup = *rbcpup; ++ err = au_pin(pin, dentry, bcpup, udba, ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out; ++ ++ h_path.dentry = au_pinned_h_parent(pin); ++ if (udba != AuOpt_UDBA_NONE ++ && au_dbtop(dentry) == bcpup) { ++ err = au_may_del(dentry, bcpup, h_path.dentry, isdir); ++ wh_dentry = ERR_PTR(err); ++ if (unlikely(err)) ++ goto out_unpin; ++ } ++ ++ h_path.mnt = au_sbr_mnt(sb, bcpup); ++ au_dtime_store(dt, au_pinned_parent(pin), &h_path); ++ wh_dentry = NULL; ++ if (!need_wh) ++ goto out; /* success, no need to create whiteout */ ++ ++ wh_dentry = au_wh_create(dentry, bcpup, h_path.dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_unpin; ++ ++ /* returns with the parent is locked and wh_dentry is dget-ed */ ++ goto out; /* success */ ++ ++out_unpin: ++ au_unpin(pin); ++out: ++ return wh_dentry; ++} ++ ++/* ++ * when removing a dir, rename it to a unique temporary whiteout-ed name first ++ * in order to be revertible and save time for removing many child whiteouts ++ * under the dir. ++ * returns 1 when there are too many child whiteout and caller should remove ++ * them asynchronously. returns 0 when the number of children is enough small to ++ * remove now or the branch fs is a remote fs. ++ * otherwise return an error. ++ */ ++static int renwh_and_rmdir(struct dentry *dentry, aufs_bindex_t bindex, ++ struct au_nhash *whlist, struct inode *dir) ++{ ++ int rmdir_later, err, dirwh; ++ struct dentry *h_dentry; ++ struct super_block *sb; ++ struct inode *inode; ++ ++ sb = dentry->d_sb; ++ SiMustAnyLock(sb); ++ h_dentry = au_h_dptr(dentry, bindex); ++ err = au_whtmp_ren(h_dentry, au_sbr(sb, bindex)); ++ if (unlikely(err)) ++ goto out; ++ ++ /* stop monitoring */ ++ inode = d_inode(dentry); ++ au_hn_free(au_hi(inode, bindex)); ++ ++ if (!au_test_fs_remote(h_dentry->d_sb)) { ++ dirwh = au_sbi(sb)->si_dirwh; ++ rmdir_later = (dirwh <= 1); ++ if (!rmdir_later) ++ rmdir_later = au_nhash_test_longer_wh(whlist, bindex, ++ dirwh); ++ if (rmdir_later) ++ return rmdir_later; ++ } ++ ++ err = au_whtmp_rmdir(dir, bindex, h_dentry, whlist); ++ if (unlikely(err)) { ++ AuIOErr("rmdir %pd, b%d failed, %d. ignored\n", ++ h_dentry, bindex, err); ++ err = 0; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * final procedure for deleting a entry. ++ * maintain dentry and iattr. ++ */ ++static void epilog(struct inode *dir, struct dentry *dentry, ++ aufs_bindex_t bindex) ++{ ++ struct inode *inode; ++ ++ inode = d_inode(dentry); ++ d_drop(dentry); ++ inode->i_ctime = dir->i_ctime; ++ ++ au_dir_ts(dir, bindex); ++ dir->i_version++; ++} ++ ++/* ++ * when an error happened, remove the created whiteout and revert everything. ++ */ ++static int do_revert(int err, struct inode *dir, aufs_bindex_t bindex, ++ aufs_bindex_t bwh, struct dentry *wh_dentry, ++ struct dentry *dentry, struct au_dtime *dt) ++{ ++ int rerr; ++ struct path h_path = { ++ .dentry = wh_dentry, ++ .mnt = au_sbr_mnt(dir->i_sb, bindex) ++ }; ++ ++ rerr = au_wh_unlink_dentry(au_h_iptr(dir, bindex), &h_path, dentry); ++ if (!rerr) { ++ au_set_dbwh(dentry, bwh); ++ au_dtime_revert(dt); ++ return 0; ++ } ++ ++ AuIOErr("%pd reverting whiteout failed(%d, %d)\n", dentry, err, rerr); ++ return -EIO; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int aufs_unlink(struct inode *dir, struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bwh, bindex, btop; ++ struct inode *inode, *h_dir, *delegated; ++ struct dentry *parent, *wh_dentry; ++ /* to reuduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ struct path h_path; ++ } *a; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_d_hashed_positive(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ err = -EISDIR; ++ if (unlikely(d_is_dir(dentry))) ++ goto out_unlock; /* possible? */ ++ ++ btop = au_dbtop(dentry); ++ bwh = au_dbwh(dentry); ++ bindex = -1; ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/0, &bindex, &a->dt, ++ &a->pin); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ a->h_path.mnt = au_sbr_mnt(dentry->d_sb, btop); ++ a->h_path.dentry = au_h_dptr(dentry, btop); ++ dget(a->h_path.dentry); ++ if (bindex == btop) { ++ h_dir = au_pinned_h_dir(&a->pin); ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &a->h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } else { ++ /* dir inode is locked */ ++ h_dir = d_inode(wh_dentry->d_parent); ++ IMustLock(h_dir); ++ err = 0; ++ } ++ ++ if (!err) { ++ vfsub_drop_nlink(inode); ++ epilog(dir, dentry, bindex); ++ ++ /* update target timestamps */ ++ if (bindex == btop) { ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); ++ /*ignore*/ ++ inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ } else ++ /* todo: this timestamp may be reverted later */ ++ inode->i_ctime = h_dir->i_ctime; ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ if (wh_dentry) { ++ int rerr; ++ ++ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, ++ &a->dt); ++ if (rerr) ++ err = rerr; ++ } ++ ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++ dput(a->h_path.dentry); ++out_parent: ++ di_write_unlock(parent); ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ return err; ++} ++ ++int aufs_rmdir(struct inode *dir, struct dentry *dentry) ++{ ++ int err, rmdir_later; ++ aufs_bindex_t bwh, bindex, btop; ++ struct inode *inode; ++ struct dentry *parent, *wh_dentry, *h_dentry; ++ struct au_whtmp_rmdir *args; ++ /* to reuduce stack size */ ++ struct { ++ struct au_dtime dt; ++ struct au_pin pin; ++ } *a; ++ ++ IMustLock(dir); ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_GEN); ++ if (unlikely(err)) ++ goto out_free; ++ err = au_alive_dir(dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ inode = d_inode(dentry); ++ IMustLock(inode); ++ err = -ENOTDIR; ++ if (unlikely(!d_is_dir(dentry))) ++ goto out_unlock; /* possible? */ ++ ++ err = -ENOMEM; ++ args = au_whtmp_rmdir_alloc(dir->i_sb, GFP_NOFS); ++ if (unlikely(!args)) ++ goto out_unlock; ++ ++ parent = dentry->d_parent; /* dir inode is locked */ ++ di_write_lock_parent(parent); ++ err = au_test_empty(dentry, &args->whlist); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ btop = au_dbtop(dentry); ++ bwh = au_dbwh(dentry); ++ bindex = -1; ++ wh_dentry = lock_hdir_create_wh(dentry, /*isdir*/1, &bindex, &a->dt, ++ &a->pin); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) ++ goto out_parent; ++ ++ h_dentry = au_h_dptr(dentry, btop); ++ dget(h_dentry); ++ rmdir_later = 0; ++ if (bindex == btop) { ++ err = renwh_and_rmdir(dentry, btop, &args->whlist, dir); ++ if (err > 0) { ++ rmdir_later = err; ++ err = 0; ++ } ++ } else { ++ /* stop monitoring */ ++ au_hn_free(au_hi(inode, btop)); ++ ++ /* dir inode is locked */ ++ IMustLock(d_inode(wh_dentry->d_parent)); ++ err = 0; ++ } ++ ++ if (!err) { ++ vfsub_dead_dir(inode); ++ au_set_dbdiropq(dentry, -1); ++ epilog(dir, dentry, bindex); ++ ++ if (rmdir_later) { ++ au_whtmp_kick_rmdir(dir, btop, h_dentry, args); ++ args = NULL; ++ } ++ ++ goto out_unpin; /* success */ ++ } ++ ++ /* revert */ ++ AuLabel(revert); ++ if (wh_dentry) { ++ int rerr; ++ ++ rerr = do_revert(err, dir, bindex, bwh, wh_dentry, dentry, ++ &a->dt); ++ if (rerr) ++ err = rerr; ++ } ++ ++out_unpin: ++ au_unpin(&a->pin); ++ dput(wh_dentry); ++ dput(h_dentry); ++out_parent: ++ di_write_unlock(parent); ++ if (args) ++ au_whtmp_rmdir_free(args); ++out_unlock: ++ aufs_read_unlock(dentry, AuLock_DW); ++out_free: ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff -Naur null/fs/aufs/i_op_ren.c linux-4.15/fs/aufs/i_op_ren.c +--- /dev/null ++++ linux-4.15/fs/aufs/i_op_ren.c 2018-02-25 02:38:09.202737899 +0100 +@@ -0,0 +1,1246 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * inode operation (rename entry) ++ * todo: this is crazy monster ++ */ ++ ++#include "aufs.h" ++ ++enum { AuSRC, AuDST, AuSrcDst }; ++enum { AuPARENT, AuCHILD, AuParentChild }; ++ ++#define AuRen_ISDIR_SRC 1 ++#define AuRen_ISDIR_DST (1 << 1) ++#define AuRen_ISSAMEDIR (1 << 2) ++#define AuRen_WHSRC (1 << 3) ++#define AuRen_WHDST (1 << 4) ++#define AuRen_MNT_WRITE (1 << 5) ++#define AuRen_DT_DSTDIR (1 << 6) ++#define AuRen_DIROPQ_SRC (1 << 7) ++#define AuRen_DIROPQ_DST (1 << 8) ++#define AuRen_DIRREN (1 << 9) ++#define AuRen_DROPPED_SRC (1 << 10) ++#define AuRen_DROPPED_DST (1 << 11) ++#define au_ftest_ren(flags, name) ((flags) & AuRen_##name) ++#define au_fset_ren(flags, name) \ ++ do { (flags) |= AuRen_##name; } while (0) ++#define au_fclr_ren(flags, name) \ ++ do { (flags) &= ~AuRen_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuRen_DIRREN ++#define AuRen_DIRREN 0 ++#endif ++ ++struct au_ren_args { ++ struct { ++ struct dentry *dentry, *h_dentry, *parent, *h_parent, ++ *wh_dentry; ++ struct inode *dir, *inode; ++ struct au_hinode *hdir, *hinode; ++ struct au_dtime dt[AuParentChild]; ++ aufs_bindex_t btop, bdiropq; ++ } sd[AuSrcDst]; ++ ++#define src_dentry sd[AuSRC].dentry ++#define src_dir sd[AuSRC].dir ++#define src_inode sd[AuSRC].inode ++#define src_h_dentry sd[AuSRC].h_dentry ++#define src_parent sd[AuSRC].parent ++#define src_h_parent sd[AuSRC].h_parent ++#define src_wh_dentry sd[AuSRC].wh_dentry ++#define src_hdir sd[AuSRC].hdir ++#define src_hinode sd[AuSRC].hinode ++#define src_h_dir sd[AuSRC].hdir->hi_inode ++#define src_dt sd[AuSRC].dt ++#define src_btop sd[AuSRC].btop ++#define src_bdiropq sd[AuSRC].bdiropq ++ ++#define dst_dentry sd[AuDST].dentry ++#define dst_dir sd[AuDST].dir ++#define dst_inode sd[AuDST].inode ++#define dst_h_dentry sd[AuDST].h_dentry ++#define dst_parent sd[AuDST].parent ++#define dst_h_parent sd[AuDST].h_parent ++#define dst_wh_dentry sd[AuDST].wh_dentry ++#define dst_hdir sd[AuDST].hdir ++#define dst_hinode sd[AuDST].hinode ++#define dst_h_dir sd[AuDST].hdir->hi_inode ++#define dst_dt sd[AuDST].dt ++#define dst_btop sd[AuDST].btop ++#define dst_bdiropq sd[AuDST].bdiropq ++ ++ struct dentry *h_trap; ++ struct au_branch *br; ++ struct path h_path; ++ struct au_nhash whlist; ++ aufs_bindex_t btgt, src_bwh; ++ ++ struct { ++ unsigned short auren_flags; ++ unsigned char flags; /* syscall parameter */ ++ unsigned char exchange; ++ } __packed; ++ ++ struct au_whtmp_rmdir *thargs; ++ struct dentry *h_dst; ++ struct au_hinode *h_root; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * functions for reverting. ++ * when an error happened in a single rename systemcall, we should revert ++ * everything as if nothing happened. ++ * we don't need to revert the copied-up/down the parent dir since they are ++ * harmless. ++ */ ++ ++#define RevertFailure(fmt, ...) do { \ ++ AuIOErr("revert failure: " fmt " (%d, %d)\n", \ ++ ##__VA_ARGS__, err, rerr); \ ++ err = -EIO; \ ++} while (0) ++ ++static void au_ren_do_rev_diropq(int err, struct au_ren_args *a, int idx) ++{ ++ int rerr; ++ struct dentry *d; ++#define src_or_dst(member) a->sd[idx].member ++ ++ d = src_or_dst(dentry); /* {src,dst}_dentry */ ++ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); ++ rerr = au_diropq_remove(d, a->btgt); ++ au_hn_inode_unlock(src_or_dst(hinode)); ++ au_set_dbdiropq(d, src_or_dst(bdiropq)); ++ if (rerr) ++ RevertFailure("remove diropq %pd", d); ++ ++#undef src_or_dst_ ++} ++ ++static void au_ren_rev_diropq(int err, struct au_ren_args *a) ++{ ++ if (au_ftest_ren(a->auren_flags, DIROPQ_SRC)) ++ au_ren_do_rev_diropq(err, a, AuSRC); ++ if (au_ftest_ren(a->auren_flags, DIROPQ_DST)) ++ au_ren_do_rev_diropq(err, a, AuDST); ++} ++ ++static void au_ren_rev_rename(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ struct inode *delegated; ++ ++ a->h_path.dentry = vfsub_lkup_one(&a->src_dentry->d_name, ++ a->src_h_parent); ++ rerr = PTR_ERR(a->h_path.dentry); ++ if (IS_ERR(a->h_path.dentry)) { ++ RevertFailure("lkup one %pd", a->src_dentry); ++ return; ++ } ++ ++ delegated = NULL; ++ rerr = vfsub_rename(a->dst_h_dir, ++ au_h_dptr(a->src_dentry, a->btgt), ++ a->src_h_dir, &a->h_path, &delegated, a->flags); ++ if (unlikely(rerr == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ /* au_set_h_dptr(a->src_dentry, a->btgt, NULL); */ ++ if (rerr) ++ RevertFailure("rename %pd", a->src_dentry); ++} ++ ++static void au_ren_rev_whtmp(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ struct inode *delegated; ++ ++ a->h_path.dentry = vfsub_lkup_one(&a->dst_dentry->d_name, ++ a->dst_h_parent); ++ rerr = PTR_ERR(a->h_path.dentry); ++ if (IS_ERR(a->h_path.dentry)) { ++ RevertFailure("lkup one %pd", a->dst_dentry); ++ return; ++ } ++ if (d_is_positive(a->h_path.dentry)) { ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ return; ++ } ++ ++ delegated = NULL; ++ rerr = vfsub_rename(a->dst_h_dir, a->h_dst, a->dst_h_dir, &a->h_path, ++ &delegated, a->flags); ++ if (unlikely(rerr == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ d_drop(a->h_path.dentry); ++ dput(a->h_path.dentry); ++ if (!rerr) ++ au_set_h_dptr(a->dst_dentry, a->btgt, dget(a->h_dst)); ++ else ++ RevertFailure("rename %pd", a->h_dst); ++} ++ ++static void au_ren_rev_whsrc(int err, struct au_ren_args *a) ++{ ++ int rerr; ++ ++ a->h_path.dentry = a->src_wh_dentry; ++ rerr = au_wh_unlink_dentry(a->src_h_dir, &a->h_path, a->src_dentry); ++ au_set_dbwh(a->src_dentry, a->src_bwh); ++ if (rerr) ++ RevertFailure("unlink %pd", a->src_wh_dentry); ++} ++#undef RevertFailure ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * when we have to copyup the renaming entry, do it with the rename-target name ++ * in order to minimize the cost (the later actual rename is unnecessary). ++ * otherwise rename it on the target branch. ++ */ ++static int au_ren_or_cpup(struct au_ren_args *a) ++{ ++ int err; ++ struct dentry *d; ++ struct inode *delegated; ++ ++ d = a->src_dentry; ++ if (au_dbtop(d) == a->btgt) { ++ a->h_path.dentry = a->dst_h_dentry; ++ AuDebugOn(au_dbtop(d) != a->btgt); ++ delegated = NULL; ++ err = vfsub_rename(a->src_h_dir, au_h_dptr(d, a->btgt), ++ a->dst_h_dir, &a->h_path, &delegated, ++ a->flags); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ } else ++ BUG(); ++ ++ if (!err && a->h_dst) ++ /* it will be set to dinfo later */ ++ dget(a->h_dst); ++ ++ return err; ++} ++ ++/* cf. aufs_rmdir() */ ++static int au_ren_del_whtmp(struct au_ren_args *a) ++{ ++ int err; ++ struct inode *dir; ++ ++ dir = a->dst_dir; ++ SiMustAnyLock(dir->i_sb); ++ if (!au_nhash_test_longer_wh(&a->whlist, a->btgt, ++ au_sbi(dir->i_sb)->si_dirwh) ++ || au_test_fs_remote(a->h_dst->d_sb)) { ++ err = au_whtmp_rmdir(dir, a->btgt, a->h_dst, &a->whlist); ++ if (unlikely(err)) ++ pr_warn("failed removing whtmp dir %pd (%d), " ++ "ignored.\n", a->h_dst, err); ++ } else { ++ au_nhash_wh_free(&a->thargs->whlist); ++ a->thargs->whlist = a->whlist; ++ a->whlist.nh_num = 0; ++ au_whtmp_kick_rmdir(dir, a->btgt, a->h_dst, a->thargs); ++ dput(a->h_dst); ++ a->thargs = NULL; ++ } ++ ++ return 0; ++} ++ ++/* make it 'opaque' dir. */ ++static int au_ren_do_diropq(struct au_ren_args *a, int idx) ++{ ++ int err; ++ struct dentry *d, *diropq; ++#define src_or_dst(member) a->sd[idx].member ++ ++ err = 0; ++ d = src_or_dst(dentry); /* {src,dst}_dentry */ ++ src_or_dst(bdiropq) = au_dbdiropq(d); ++ src_or_dst(hinode) = au_hi(src_or_dst(inode), a->btgt); ++ au_hn_inode_lock_nested(src_or_dst(hinode), AuLsc_I_CHILD); ++ diropq = au_diropq_create(d, a->btgt); ++ au_hn_inode_unlock(src_or_dst(hinode)); ++ if (IS_ERR(diropq)) ++ err = PTR_ERR(diropq); ++ else ++ dput(diropq); ++ ++#undef src_or_dst_ ++ return err; ++} ++ ++static int au_ren_diropq(struct au_ren_args *a) ++{ ++ int err; ++ unsigned char always; ++ struct dentry *d; ++ ++ err = 0; ++ d = a->dst_dentry; /* already renamed on the branch */ ++ always = !!au_opt_test(au_mntflags(d->d_sb), ALWAYS_DIROPQ); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ && !au_ftest_ren(a->auren_flags, DIRREN) ++ && a->btgt != au_dbdiropq(a->src_dentry) ++ && (a->dst_wh_dentry ++ || a->btgt <= au_dbdiropq(d) ++ /* hide the lower to keep xino */ ++ /* the lowers may not be a dir, but we hide them anyway */ ++ || a->btgt < au_dbbot(d) ++ || always)) { ++ AuDbg("here\n"); ++ err = au_ren_do_diropq(a, AuSRC); ++ if (unlikely(err)) ++ goto out; ++ au_fset_ren(a->auren_flags, DIROPQ_SRC); ++ } ++ if (!a->exchange) ++ goto out; /* success */ ++ ++ d = a->src_dentry; /* already renamed on the branch */ ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) ++ && a->btgt != au_dbdiropq(a->dst_dentry) ++ && (a->btgt < au_dbdiropq(d) ++ || a->btgt < au_dbbot(d) ++ || always)) { ++ AuDbgDentry(a->src_dentry); ++ AuDbgDentry(a->dst_dentry); ++ err = au_ren_do_diropq(a, AuDST); ++ if (unlikely(err)) ++ goto out_rev_src; ++ au_fset_ren(a->auren_flags, DIROPQ_DST); ++ } ++ goto out; /* success */ ++ ++out_rev_src: ++ AuDbg("err %d, reverting src\n", err); ++ au_ren_rev_diropq(err, a); ++out: ++ return err; ++} ++ ++static int do_rename(struct au_ren_args *a) ++{ ++ int err; ++ struct dentry *d, *h_d; ++ ++ if (!a->exchange) { ++ /* prepare workqueue args for asynchronous rmdir */ ++ h_d = a->dst_h_dentry; ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) ++ /* && !au_ftest_ren(a->auren_flags, DIRREN) */ ++ && d_is_positive(h_d)) { ++ err = -ENOMEM; ++ a->thargs = au_whtmp_rmdir_alloc(a->src_dentry->d_sb, ++ GFP_NOFS); ++ if (unlikely(!a->thargs)) ++ goto out; ++ a->h_dst = dget(h_d); ++ } ++ ++ /* create whiteout for src_dentry */ ++ if (au_ftest_ren(a->auren_flags, WHSRC)) { ++ a->src_bwh = au_dbwh(a->src_dentry); ++ AuDebugOn(a->src_bwh >= 0); ++ a->src_wh_dentry = au_wh_create(a->src_dentry, a->btgt, ++ a->src_h_parent); ++ err = PTR_ERR(a->src_wh_dentry); ++ if (IS_ERR(a->src_wh_dentry)) ++ goto out_thargs; ++ } ++ ++ /* lookup whiteout for dentry */ ++ if (au_ftest_ren(a->auren_flags, WHDST)) { ++ h_d = au_wh_lkup(a->dst_h_parent, ++ &a->dst_dentry->d_name, a->br); ++ err = PTR_ERR(h_d); ++ if (IS_ERR(h_d)) ++ goto out_whsrc; ++ if (d_is_negative(h_d)) ++ dput(h_d); ++ else ++ a->dst_wh_dentry = h_d; ++ } ++ ++ /* rename dentry to tmpwh */ ++ if (a->thargs) { ++ err = au_whtmp_ren(a->dst_h_dentry, a->br); ++ if (unlikely(err)) ++ goto out_whdst; ++ ++ d = a->dst_dentry; ++ au_set_h_dptr(d, a->btgt, NULL); ++ err = au_lkup_neg(d, a->btgt, /*wh*/0); ++ if (unlikely(err)) ++ goto out_whtmp; ++ a->dst_h_dentry = au_h_dptr(d, a->btgt); ++ } ++ } ++ ++ BUG_ON(d_is_positive(a->dst_h_dentry) && a->src_btop != a->btgt); ++#if 0 ++ BUG_ON(!au_ftest_ren(a->auren_flags, DIRREN) ++ && d_is_positive(a->dst_h_dentry) ++ && a->src_btop != a->btgt); ++#endif ++ ++ /* rename by vfs_rename or cpup */ ++ err = au_ren_or_cpup(a); ++ if (unlikely(err)) ++ /* leave the copied-up one */ ++ goto out_whtmp; ++ ++ /* make dir opaque */ ++ err = au_ren_diropq(a); ++ if (unlikely(err)) ++ goto out_rename; ++ ++ /* update target timestamps */ ++ if (a->exchange) { ++ AuDebugOn(au_dbtop(a->dst_dentry) != a->btgt); ++ a->h_path.dentry = au_h_dptr(a->dst_dentry, a->btgt); ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ ++ a->dst_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ } ++ AuDebugOn(au_dbtop(a->src_dentry) != a->btgt); ++ a->h_path.dentry = au_h_dptr(a->src_dentry, a->btgt); ++ vfsub_update_h_iattr(&a->h_path, /*did*/NULL); /*ignore*/ ++ a->src_inode->i_ctime = d_inode(a->h_path.dentry)->i_ctime; ++ ++ if (!a->exchange) { ++ /* remove whiteout for dentry */ ++ if (a->dst_wh_dentry) { ++ a->h_path.dentry = a->dst_wh_dentry; ++ err = au_wh_unlink_dentry(a->dst_h_dir, &a->h_path, ++ a->dst_dentry); ++ if (unlikely(err)) ++ goto out_diropq; ++ } ++ ++ /* remove whtmp */ ++ if (a->thargs) ++ au_ren_del_whtmp(a); /* ignore this error */ ++ ++ au_fhsm_wrote(a->src_dentry->d_sb, a->btgt, /*force*/0); ++ } ++ err = 0; ++ goto out_success; ++ ++out_diropq: ++ au_ren_rev_diropq(err, a); ++out_rename: ++ au_ren_rev_rename(err, a); ++ dput(a->h_dst); ++out_whtmp: ++ if (a->thargs) ++ au_ren_rev_whtmp(err, a); ++out_whdst: ++ dput(a->dst_wh_dentry); ++ a->dst_wh_dentry = NULL; ++out_whsrc: ++ if (a->src_wh_dentry) ++ au_ren_rev_whsrc(err, a); ++out_success: ++ dput(a->src_wh_dentry); ++ dput(a->dst_wh_dentry); ++out_thargs: ++ if (a->thargs) { ++ dput(a->h_dst); ++ au_whtmp_rmdir_free(a->thargs); ++ a->thargs = NULL; ++ } ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * test if @dentry dir can be rename destination or not. ++ * success means, it is a logically empty dir. ++ */ ++static int may_rename_dstdir(struct dentry *dentry, struct au_nhash *whlist) ++{ ++ return au_test_empty(dentry, whlist); ++} ++ ++/* ++ * test if @a->src_dentry dir can be rename source or not. ++ * if it can, return 0. ++ * success means, ++ * - it is a logically empty dir. ++ * - or, it exists on writable branch and has no children including whiteouts ++ * on the lower branch unless DIRREN is on. ++ */ ++static int may_rename_srcdir(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int rdhash; ++ aufs_bindex_t btop, btgt; ++ struct dentry *dentry; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ dentry = a->src_dentry; ++ sb = dentry->d_sb; ++ sbinfo = au_sbi(sb); ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) ++ au_fset_ren(a->auren_flags, DIRREN); ++ ++ btgt = a->btgt; ++ btop = au_dbtop(dentry); ++ if (btop != btgt) { ++ struct au_nhash whlist; ++ ++ SiMustAnyLock(sb); ++ rdhash = sbinfo->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, ++ dentry)); ++ err = au_nhash_alloc(&whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_test_empty(dentry, &whlist); ++ au_nhash_wh_free(&whlist); ++ goto out; ++ } ++ ++ if (btop == au_dbtaildir(dentry)) ++ return 0; /* success */ ++ ++ err = au_test_empty_lower(dentry); ++ ++out: ++ if (err == -ENOTEMPTY) { ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ err = 0; ++ } else { ++ AuWarn1("renaming dir who has child(ren) on multiple " ++ "branches, is not supported\n"); ++ err = -EXDEV; ++ } ++ } ++ return err; ++} ++ ++/* side effect: sets whlist and h_dentry */ ++static int au_ren_may_dir(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int rdhash; ++ struct dentry *d; ++ ++ d = a->dst_dentry; ++ SiMustAnyLock(d->d_sb); ++ ++ err = 0; ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST) && a->dst_inode) { ++ rdhash = au_sbi(d->d_sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(/*file*/NULL, d)); ++ err = au_nhash_alloc(&a->whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ ++ if (!a->exchange) { ++ au_set_dbtop(d, a->dst_btop); ++ err = may_rename_dstdir(d, &a->whlist); ++ au_set_dbtop(d, a->btgt); ++ } else ++ err = may_rename_srcdir(a); ++ } ++ a->dst_h_dentry = au_h_dptr(d, au_dbtop(d)); ++ if (unlikely(err)) ++ goto out; ++ ++ d = a->src_dentry; ++ a->src_h_dentry = au_h_dptr(d, au_dbtop(d)); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { ++ err = may_rename_srcdir(a); ++ if (unlikely(err)) { ++ au_nhash_wh_free(&a->whlist); ++ a->whlist.nh_num = 0; ++ } ++ } ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * simple tests for rename. ++ * following the checks in vfs, plus the parent-child relationship. ++ */ ++static int au_may_ren(struct au_ren_args *a) ++{ ++ int err, isdir; ++ struct inode *h_inode; ++ ++ if (a->src_btop == a->btgt) { ++ err = au_may_del(a->src_dentry, a->btgt, a->src_h_parent, ++ au_ftest_ren(a->auren_flags, ISDIR_SRC)); ++ if (unlikely(err)) ++ goto out; ++ err = -EINVAL; ++ if (unlikely(a->src_h_dentry == a->h_trap)) ++ goto out; ++ } ++ ++ err = 0; ++ if (a->dst_btop != a->btgt) ++ goto out; ++ ++ err = -ENOTEMPTY; ++ if (unlikely(a->dst_h_dentry == a->h_trap)) ++ goto out; ++ ++ err = -EIO; ++ isdir = !!au_ftest_ren(a->auren_flags, ISDIR_DST); ++ if (d_really_is_negative(a->dst_dentry)) { ++ if (d_is_negative(a->dst_h_dentry)) ++ err = au_may_add(a->dst_dentry, a->btgt, ++ a->dst_h_parent, isdir); ++ } else { ++ if (unlikely(d_is_negative(a->dst_h_dentry))) ++ goto out; ++ h_inode = d_inode(a->dst_h_dentry); ++ if (h_inode->i_nlink) ++ err = au_may_del(a->dst_dentry, a->btgt, ++ a->dst_h_parent, isdir); ++ } ++ ++out: ++ if (unlikely(err == -ENOENT || err == -EEXIST)) ++ err = -EIO; ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * locking order ++ * (VFS) ++ * - src_dir and dir by lock_rename() ++ * - inode if exitsts ++ * (aufs) ++ * - lock all ++ * + src_dentry and dentry by aufs_read_and_write_lock2() which calls, ++ * + si_read_lock ++ * + di_write_lock2_child() ++ * + di_write_lock_child() ++ * + ii_write_lock_child() ++ * + di_write_lock_child2() ++ * + ii_write_lock_child2() ++ * + src_parent and parent ++ * + di_write_lock_parent() ++ * + ii_write_lock_parent() ++ * + di_write_lock_parent2() ++ * + ii_write_lock_parent2() ++ * + lower src_dir and dir by vfsub_lock_rename() ++ * + verify the every relationships between child and parent. if any ++ * of them failed, unlock all and return -EBUSY. ++ */ ++static void au_ren_unlock(struct au_ren_args *a) ++{ ++ vfsub_unlock_rename(a->src_h_parent, a->src_hdir, ++ a->dst_h_parent, a->dst_hdir); ++ if (au_ftest_ren(a->auren_flags, DIRREN) ++ && a->h_root) ++ au_hn_inode_unlock(a->h_root); ++ if (au_ftest_ren(a->auren_flags, MNT_WRITE)) ++ vfsub_mnt_drop_write(au_br_mnt(a->br)); ++} ++ ++static int au_ren_lock(struct au_ren_args *a) ++{ ++ int err; ++ unsigned int udba; ++ ++ err = 0; ++ a->src_h_parent = au_h_dptr(a->src_parent, a->btgt); ++ a->src_hdir = au_hi(a->src_dir, a->btgt); ++ a->dst_h_parent = au_h_dptr(a->dst_parent, a->btgt); ++ a->dst_hdir = au_hi(a->dst_dir, a->btgt); ++ ++ err = vfsub_mnt_want_write(au_br_mnt(a->br)); ++ if (unlikely(err)) ++ goto out; ++ au_fset_ren(a->auren_flags, MNT_WRITE); ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ struct dentry *root; ++ struct inode *dir; ++ ++ /* ++ * sbinfo is already locked, so this ii_read_lock is ++ * unnecessary. but our debugging feature checks it. ++ */ ++ root = a->src_inode->i_sb->s_root; ++ if (root != a->src_parent && root != a->dst_parent) { ++ dir = d_inode(root); ++ ii_read_lock_parent3(dir); ++ a->h_root = au_hi(dir, a->btgt); ++ ii_read_unlock(dir); ++ au_hn_inode_lock_nested(a->h_root, AuLsc_I_PARENT3); ++ } ++ } ++ a->h_trap = vfsub_lock_rename(a->src_h_parent, a->src_hdir, ++ a->dst_h_parent, a->dst_hdir); ++ udba = au_opt_udba(a->src_dentry->d_sb); ++ if (unlikely(a->src_hdir->hi_inode != d_inode(a->src_h_parent) ++ || a->dst_hdir->hi_inode != d_inode(a->dst_h_parent))) ++ err = au_busy_or_stale(); ++ if (!err && au_dbtop(a->src_dentry) == a->btgt) ++ err = au_h_verify(a->src_h_dentry, udba, ++ d_inode(a->src_h_parent), a->src_h_parent, ++ a->br); ++ if (!err && au_dbtop(a->dst_dentry) == a->btgt) ++ err = au_h_verify(a->dst_h_dentry, udba, ++ d_inode(a->dst_h_parent), a->dst_h_parent, ++ a->br); ++ if (!err) ++ goto out; /* success */ ++ ++ err = au_busy_or_stale(); ++ au_ren_unlock(a); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_ren_refresh_dir(struct au_ren_args *a) ++{ ++ struct inode *dir; ++ ++ dir = a->dst_dir; ++ dir->i_version++; ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) { ++ /* is this updating defined in POSIX? */ ++ au_cpup_attr_timesizes(a->src_inode); ++ au_cpup_attr_nlink(dir, /*force*/1); ++ } ++ au_dir_ts(dir, a->btgt); ++ ++ if (a->exchange) { ++ dir = a->src_dir; ++ dir->i_version++; ++ if (au_ftest_ren(a->auren_flags, ISDIR_DST)) { ++ /* is this updating defined in POSIX? */ ++ au_cpup_attr_timesizes(a->dst_inode); ++ au_cpup_attr_nlink(dir, /*force*/1); ++ } ++ au_dir_ts(dir, a->btgt); ++ } ++ ++ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ return; ++ ++ dir = a->src_dir; ++ dir->i_version++; ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC)) ++ au_cpup_attr_nlink(dir, /*force*/1); ++ au_dir_ts(dir, a->btgt); ++} ++ ++static void au_ren_refresh(struct au_ren_args *a) ++{ ++ aufs_bindex_t bbot, bindex; ++ struct dentry *d, *h_d; ++ struct inode *i, *h_i; ++ struct super_block *sb; ++ ++ d = a->dst_dentry; ++ d_drop(d); ++ if (a->h_dst) ++ /* already dget-ed by au_ren_or_cpup() */ ++ au_set_h_dptr(d, a->btgt, a->h_dst); ++ ++ i = a->dst_inode; ++ if (i) { ++ if (!a->exchange) { ++ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) ++ vfsub_drop_nlink(i); ++ else { ++ vfsub_dead_dir(i); ++ au_cpup_attr_timesizes(i); ++ } ++ au_update_dbrange(d, /*do_put_zero*/1); ++ } else ++ au_cpup_attr_nlink(i, /*force*/1); ++ } else { ++ bbot = a->btgt; ++ for (bindex = au_dbtop(d); bindex < bbot; bindex++) ++ au_set_h_dptr(d, bindex, NULL); ++ bbot = au_dbbot(d); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) ++ au_set_h_dptr(d, bindex, NULL); ++ au_update_dbrange(d, /*do_put_zero*/0); ++ } ++ ++ if (a->exchange ++ || au_ftest_ren(a->auren_flags, DIRREN)) { ++ d_drop(a->src_dentry); ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_set_dbwh(a->src_dentry, -1); ++ return; ++ } ++ ++ d = a->src_dentry; ++ au_set_dbwh(d, -1); ++ bbot = au_dbbot(d); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { ++ h_d = au_h_dptr(d, bindex); ++ if (h_d) ++ au_set_h_dptr(d, bindex, NULL); ++ } ++ au_set_dbbot(d, a->btgt); ++ ++ sb = d->d_sb; ++ i = a->src_inode; ++ if (au_opt_test(au_mntflags(sb), PLINK) && au_plink_test(i)) ++ return; /* success */ ++ ++ bbot = au_ibbot(i); ++ for (bindex = a->btgt + 1; bindex <= bbot; bindex++) { ++ h_i = au_h_iptr(i, bindex); ++ if (h_i) { ++ au_xino_write(sb, bindex, h_i->i_ino, /*ino*/0); ++ /* ignore this error */ ++ au_set_h_iptr(i, bindex, NULL, 0); ++ } ++ } ++ au_set_ibbot(i, a->btgt); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* mainly for link(2) and rename(2) */ ++int au_wbr(struct dentry *dentry, aufs_bindex_t btgt) ++{ ++ aufs_bindex_t bdiropq, bwh; ++ struct dentry *parent; ++ struct au_branch *br; ++ ++ parent = dentry->d_parent; ++ IMustLock(d_inode(parent)); /* dir is locked */ ++ ++ bdiropq = au_dbdiropq(parent); ++ bwh = au_dbwh(dentry); ++ br = au_sbr(dentry->d_sb, btgt); ++ if (au_br_rdonly(br) ++ || (0 <= bdiropq && bdiropq < btgt) ++ || (0 <= bwh && bwh < btgt)) ++ btgt = -1; ++ ++ AuDbg("btgt %d\n", btgt); ++ return btgt; ++} ++ ++/* sets src_btop, dst_btop and btgt */ ++static int au_ren_wbr(struct au_ren_args *a) ++{ ++ int err; ++ struct au_wr_dir_args wr_dir_args = { ++ /* .force_btgt = -1, */ ++ .flags = AuWrDir_ADD_ENTRY ++ }; ++ ++ a->src_btop = au_dbtop(a->src_dentry); ++ a->dst_btop = au_dbtop(a->dst_dentry); ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ || au_ftest_ren(a->auren_flags, ISDIR_DST)) ++ au_fset_wrdir(wr_dir_args.flags, ISDIR); ++ wr_dir_args.force_btgt = a->src_btop; ++ if (a->dst_inode && a->dst_btop < a->src_btop) ++ wr_dir_args.force_btgt = a->dst_btop; ++ wr_dir_args.force_btgt = au_wbr(a->dst_dentry, wr_dir_args.force_btgt); ++ err = au_wr_dir(a->dst_dentry, a->src_dentry, &wr_dir_args); ++ a->btgt = err; ++ if (a->exchange) ++ au_update_dbtop(a->dst_dentry); ++ ++ return err; ++} ++ ++static void au_ren_dt(struct au_ren_args *a) ++{ ++ a->h_path.dentry = a->src_h_parent; ++ au_dtime_store(a->src_dt + AuPARENT, a->src_parent, &a->h_path); ++ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) { ++ a->h_path.dentry = a->dst_h_parent; ++ au_dtime_store(a->dst_dt + AuPARENT, a->dst_parent, &a->h_path); ++ } ++ ++ au_fclr_ren(a->auren_flags, DT_DSTDIR); ++ if (!au_ftest_ren(a->auren_flags, ISDIR_SRC) ++ && !a->exchange) ++ return; ++ ++ a->h_path.dentry = a->src_h_dentry; ++ au_dtime_store(a->src_dt + AuCHILD, a->src_dentry, &a->h_path); ++ if (d_is_positive(a->dst_h_dentry)) { ++ au_fset_ren(a->auren_flags, DT_DSTDIR); ++ a->h_path.dentry = a->dst_h_dentry; ++ au_dtime_store(a->dst_dt + AuCHILD, a->dst_dentry, &a->h_path); ++ } ++} ++ ++static void au_ren_rev_dt(int err, struct au_ren_args *a) ++{ ++ struct dentry *h_d; ++ struct inode *h_inode; ++ ++ au_dtime_revert(a->src_dt + AuPARENT); ++ if (!au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ au_dtime_revert(a->dst_dt + AuPARENT); ++ ++ if (au_ftest_ren(a->auren_flags, ISDIR_SRC) && err != -EIO) { ++ h_d = a->src_dt[AuCHILD].dt_h_path.dentry; ++ h_inode = d_inode(h_d); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ au_dtime_revert(a->src_dt + AuCHILD); ++ inode_unlock(h_inode); ++ ++ if (au_ftest_ren(a->auren_flags, DT_DSTDIR)) { ++ h_d = a->dst_dt[AuCHILD].dt_h_path.dentry; ++ h_inode = d_inode(h_d); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ au_dtime_revert(a->dst_dt + AuCHILD); ++ inode_unlock(h_inode); ++ } ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int aufs_rename(struct inode *_src_dir, struct dentry *_src_dentry, ++ struct inode *_dst_dir, struct dentry *_dst_dentry, ++ unsigned int _flags) ++{ ++ int err, lock_flags; ++ void *rev; ++ /* reduce stack space */ ++ struct au_ren_args *a; ++ struct au_pin pin; ++ ++ AuDbg("%pd, %pd, 0x%x\n", _src_dentry, _dst_dentry, _flags); ++ IMustLock(_src_dir); ++ IMustLock(_dst_dir); ++ ++ err = -EINVAL; ++ if (unlikely(_flags & RENAME_WHITEOUT)) ++ goto out; ++ ++ err = -ENOMEM; ++ BUILD_BUG_ON(sizeof(*a) > PAGE_SIZE); ++ a = kzalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ a->flags = _flags; ++ a->exchange = _flags & RENAME_EXCHANGE; ++ a->src_dir = _src_dir; ++ a->src_dentry = _src_dentry; ++ a->src_inode = NULL; ++ if (d_really_is_positive(a->src_dentry)) ++ a->src_inode = d_inode(a->src_dentry); ++ a->src_parent = a->src_dentry->d_parent; /* dir inode is locked */ ++ a->dst_dir = _dst_dir; ++ a->dst_dentry = _dst_dentry; ++ a->dst_inode = NULL; ++ if (d_really_is_positive(a->dst_dentry)) ++ a->dst_inode = d_inode(a->dst_dentry); ++ a->dst_parent = a->dst_dentry->d_parent; /* dir inode is locked */ ++ if (a->dst_inode) { ++ /* ++ * if EXCHANGE && src is non-dir && dst is dir, ++ * dst is not locked. ++ */ ++ /* IMustLock(a->dst_inode); */ ++ au_igrab(a->dst_inode); ++ } ++ ++ err = -ENOTDIR; ++ lock_flags = AuLock_FLUSH | AuLock_NOPLM | AuLock_GEN; ++ if (d_is_dir(a->src_dentry)) { ++ au_fset_ren(a->auren_flags, ISDIR_SRC); ++ if (unlikely(!a->exchange ++ && d_really_is_positive(a->dst_dentry) ++ && !d_is_dir(a->dst_dentry))) ++ goto out_free; ++ lock_flags |= AuLock_DIRS; ++ } ++ if (a->dst_inode && d_is_dir(a->dst_dentry)) { ++ au_fset_ren(a->auren_flags, ISDIR_DST); ++ if (unlikely(!a->exchange ++ && d_really_is_positive(a->src_dentry) ++ && !d_is_dir(a->src_dentry))) ++ goto out_free; ++ lock_flags |= AuLock_DIRS; ++ } ++ err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, ++ lock_flags); ++ if (unlikely(err)) ++ goto out_free; ++ ++ err = au_d_hashed_positive(a->src_dentry); ++ if (unlikely(err)) ++ goto out_unlock; ++ err = -ENOENT; ++ if (a->dst_inode) { ++ /* ++ * If it is a dir, VFS unhash it before this ++ * function. It means we cannot rely upon d_unhashed(). ++ */ ++ if (unlikely(!a->dst_inode->i_nlink)) ++ goto out_unlock; ++ if (!au_ftest_ren(a->auren_flags, ISDIR_DST)) { ++ err = au_d_hashed_positive(a->dst_dentry); ++ if (unlikely(err && !a->exchange)) ++ goto out_unlock; ++ } else if (unlikely(IS_DEADDIR(a->dst_inode))) ++ goto out_unlock; ++ } else if (unlikely(d_unhashed(a->dst_dentry))) ++ goto out_unlock; ++ ++ /* ++ * is it possible? ++ * yes, it happened (in linux-3.3-rcN) but I don't know why. ++ * there may exist a problem somewhere else. ++ */ ++ err = -EINVAL; ++ if (unlikely(d_inode(a->dst_parent) == d_inode(a->src_dentry))) ++ goto out_unlock; ++ ++ au_fset_ren(a->auren_flags, ISSAMEDIR); /* temporary */ ++ di_write_lock_parent(a->dst_parent); ++ ++ /* which branch we process */ ++ err = au_ren_wbr(a); ++ if (unlikely(err < 0)) ++ goto out_parent; ++ a->br = au_sbr(a->dst_dentry->d_sb, a->btgt); ++ a->h_path.mnt = au_br_mnt(a->br); ++ ++ /* are they available to be renamed */ ++ err = au_ren_may_dir(a); ++ if (unlikely(err)) ++ goto out_children; ++ ++ /* prepare the writable parent dir on the same branch */ ++ if (a->dst_btop == a->btgt) { ++ au_fset_ren(a->auren_flags, WHDST); ++ } else { ++ err = au_cpup_dirs(a->dst_dentry, a->btgt); ++ if (unlikely(err)) ++ goto out_children; ++ } ++ ++ err = 0; ++ if (!a->exchange) { ++ if (a->src_dir != a->dst_dir) { ++ /* ++ * this temporary unlock is safe, ++ * because both dir->i_mutex are locked. ++ */ ++ di_write_unlock(a->dst_parent); ++ di_write_lock_parent(a->src_parent); ++ err = au_wr_dir_need_wh(a->src_dentry, ++ au_ftest_ren(a->auren_flags, ++ ISDIR_SRC), ++ &a->btgt); ++ di_write_unlock(a->src_parent); ++ di_write_lock2_parent(a->src_parent, a->dst_parent, ++ /*isdir*/1); ++ au_fclr_ren(a->auren_flags, ISSAMEDIR); ++ } else ++ err = au_wr_dir_need_wh(a->src_dentry, ++ au_ftest_ren(a->auren_flags, ++ ISDIR_SRC), ++ &a->btgt); ++ } ++ if (unlikely(err < 0)) ++ goto out_children; ++ if (err) ++ au_fset_ren(a->auren_flags, WHSRC); ++ ++ /* cpup src */ ++ if (a->src_btop != a->btgt) { ++ err = au_pin(&pin, a->src_dentry, a->btgt, ++ au_opt_udba(a->src_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ struct au_cp_generic cpg = { ++ .dentry = a->src_dentry, ++ .bdst = a->btgt, ++ .bsrc = a->src_btop, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ AuDebugOn(au_dbtop(a->src_dentry) != a->src_btop); ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ if (unlikely(err)) ++ goto out_children; ++ a->src_btop = a->btgt; ++ a->src_h_dentry = au_h_dptr(a->src_dentry, a->btgt); ++ if (!a->exchange) ++ au_fset_ren(a->auren_flags, WHSRC); ++ } ++ ++ /* cpup dst */ ++ if (a->exchange && a->dst_inode ++ && a->dst_btop != a->btgt) { ++ err = au_pin(&pin, a->dst_dentry, a->btgt, ++ au_opt_udba(a->dst_dentry->d_sb), ++ AuPin_DI_LOCKED | AuPin_MNT_WRITE); ++ if (!err) { ++ struct au_cp_generic cpg = { ++ .dentry = a->dst_dentry, ++ .bdst = a->btgt, ++ .bsrc = a->dst_btop, ++ .len = -1, ++ .pin = &pin, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ err = au_sio_cpup_simple(&cpg); ++ au_unpin(&pin); ++ } ++ if (unlikely(err)) ++ goto out_children; ++ a->dst_btop = a->btgt; ++ a->dst_h_dentry = au_h_dptr(a->dst_dentry, a->btgt); ++ } ++ ++ /* lock them all */ ++ err = au_ren_lock(a); ++ if (unlikely(err)) ++ /* leave the copied-up one */ ++ goto out_children; ++ ++ if (!a->exchange) { ++ if (!au_opt_test(au_mntflags(a->dst_dir->i_sb), UDBA_NONE)) ++ err = au_may_ren(a); ++ else if (unlikely(a->dst_dentry->d_name.len > AUFS_MAX_NAMELEN)) ++ err = -ENAMETOOLONG; ++ if (unlikely(err)) ++ goto out_hdir; ++ } ++ ++ /* store timestamps to be revertible */ ++ au_ren_dt(a); ++ ++ /* store dirren info */ ++ if (au_ftest_ren(a->auren_flags, DIRREN)) { ++ err = au_dr_rename(a->src_dentry, a->btgt, ++ &a->dst_dentry->d_name, &rev); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out_dt; ++ } ++ ++ /* here we go */ ++ err = do_rename(a); ++ if (unlikely(err)) ++ goto out_dirren; ++ ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_dr_rename_fin(a->src_dentry, a->btgt, rev); ++ ++ /* update dir attributes */ ++ au_ren_refresh_dir(a); ++ ++ /* dput/iput all lower dentries */ ++ au_ren_refresh(a); ++ ++ goto out_hdir; /* success */ ++ ++out_dirren: ++ if (au_ftest_ren(a->auren_flags, DIRREN)) ++ au_dr_rename_rev(a->src_dentry, a->btgt, rev); ++out_dt: ++ au_ren_rev_dt(err, a); ++out_hdir: ++ au_ren_unlock(a); ++out_children: ++ au_nhash_wh_free(&a->whlist); ++ if (err && a->dst_inode && a->dst_btop != a->btgt) { ++ AuDbg("btop %d, btgt %d\n", a->dst_btop, a->btgt); ++ au_set_h_dptr(a->dst_dentry, a->btgt, NULL); ++ au_set_dbtop(a->dst_dentry, a->dst_btop); ++ } ++out_parent: ++ if (!err) { ++ if (d_unhashed(a->src_dentry)) ++ au_fset_ren(a->auren_flags, DROPPED_SRC); ++ if (d_unhashed(a->dst_dentry)) ++ au_fset_ren(a->auren_flags, DROPPED_DST); ++ if (!a->exchange) ++ d_move(a->src_dentry, a->dst_dentry); ++ else { ++ d_exchange(a->src_dentry, a->dst_dentry); ++ if (au_ftest_ren(a->auren_flags, DROPPED_DST)) ++ d_drop(a->dst_dentry); ++ } ++ if (au_ftest_ren(a->auren_flags, DROPPED_SRC)) ++ d_drop(a->src_dentry); ++ } else { ++ au_update_dbtop(a->dst_dentry); ++ if (!a->dst_inode) ++ d_drop(a->dst_dentry); ++ } ++ if (au_ftest_ren(a->auren_flags, ISSAMEDIR)) ++ di_write_unlock(a->dst_parent); ++ else ++ di_write_unlock2(a->src_parent, a->dst_parent); ++out_unlock: ++ aufs_read_and_write_unlock2(a->dst_dentry, a->src_dentry); ++out_free: ++ iput(a->dst_inode); ++ if (a->thargs) ++ au_whtmp_rmdir_free(a->thargs); ++ kfree(a); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff -Naur null/fs/aufs/Kconfig linux-4.15/fs/aufs/Kconfig +--- /dev/null ++++ linux-4.15/fs/aufs/Kconfig 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,199 @@ ++# SPDX-License-Identifier: GPL-2.0 ++config AUFS_FS ++ tristate "Aufs (Advanced multi layered unification filesystem) support" ++ help ++ Aufs is a stackable unification filesystem such as Unionfs, ++ which unifies several directories and provides a merged single ++ directory. ++ In the early days, aufs was entirely re-designed and ++ re-implemented Unionfs Version 1.x series. Introducing many ++ original ideas, approaches and improvements, it becomes totally ++ different from Unionfs while keeping the basic features. ++ ++if AUFS_FS ++choice ++ prompt "Maximum number of branches" ++ default AUFS_BRANCH_MAX_127 ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_127 ++ bool "127" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_511 ++ bool "511" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_1023 ++ bool "1023" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++config AUFS_BRANCH_MAX_32767 ++ bool "32767" ++ help ++ Specifies the maximum number of branches (or member directories) ++ in a single aufs. The larger value consumes more system ++ resources and has a minor impact to performance. ++endchoice ++ ++config AUFS_SBILIST ++ bool ++ depends on AUFS_MAGIC_SYSRQ || PROC_FS ++ default y ++ help ++ Automatic configuration for internal use. ++ When aufs supports Magic SysRq or /proc, enabled automatically. ++ ++config AUFS_HNOTIFY ++ bool "Detect direct branch access (bypassing aufs)" ++ help ++ If you want to modify files on branches directly, eg. bypassing aufs, ++ and want aufs to detect the changes of them fully, then enable this ++ option and use 'udba=notify' mount option. ++ Currently there is only one available configuration, "fsnotify". ++ It will have a negative impact to the performance. ++ See detail in aufs.5. ++ ++choice ++ prompt "method" if AUFS_HNOTIFY ++ default AUFS_HFSNOTIFY ++config AUFS_HFSNOTIFY ++ bool "fsnotify" ++ select FSNOTIFY ++endchoice ++ ++config AUFS_EXPORT ++ bool "NFS-exportable aufs" ++ depends on EXPORTFS ++ help ++ If you want to export your mounted aufs via NFS, then enable this ++ option. There are several requirements for this configuration. ++ See detail in aufs.5. ++ ++config AUFS_INO_T_64 ++ bool ++ depends on AUFS_EXPORT ++ depends on 64BIT && !(ALPHA || S390) ++ default y ++ help ++ Automatic configuration for internal use. ++ /* typedef unsigned long/int __kernel_ino_t */ ++ /* alpha and s390x are int */ ++ ++config AUFS_XATTR ++ bool "support for XATTR/EA (including Security Labels)" ++ help ++ If your branch fs supports XATTR/EA and you want to make them ++ available in aufs too, then enable this opsion and specify the ++ branch attributes for EA. ++ See detail in aufs.5. ++ ++config AUFS_FHSM ++ bool "File-based Hierarchical Storage Management" ++ help ++ Hierarchical Storage Management (or HSM) is a well-known feature ++ in the storage world. Aufs provides this feature as file-based. ++ with multiple branches. ++ These multiple branches are prioritized, ie. the topmost one ++ should be the fastest drive and be used heavily. ++ ++config AUFS_RDU ++ bool "Readdir in userspace" ++ help ++ Aufs has two methods to provide a merged view for a directory, ++ by a user-space library and by kernel-space natively. The latter ++ is always enabled but sometimes large and slow. ++ If you enable this option, install the library in aufs2-util ++ package, and set some environment variables for your readdir(3), ++ then the work will be handled in user-space which generally ++ shows better performance in most cases. ++ See detail in aufs.5. ++ ++config AUFS_DIRREN ++ bool "Workaround for rename(2)-ing a directory" ++ help ++ By default, aufs returns EXDEV error in renameing a dir who has ++ his child on the lower branch, since it is a bad idea to issue ++ rename(2) internally for every lower branch. But user may not ++ accept this behaviour. So here is a workaround to allow such ++ rename(2) and store some extra infromation on the writable ++ branch. Obviously this costs high (and I don't like it). ++ To use this feature, you need to enable this configuration AND ++ to specify the mount option `dirren.' ++ See details in aufs.5 and the design documents. ++ ++config AUFS_SHWH ++ bool "Show whiteouts" ++ help ++ If you want to make the whiteouts in aufs visible, then enable ++ this option and specify 'shwh' mount option. Although it may ++ sounds like philosophy or something, but in technically it ++ simply shows the name of whiteout with keeping its behaviour. ++ ++config AUFS_BR_RAMFS ++ bool "Ramfs (initramfs/rootfs) as an aufs branch" ++ help ++ If you want to use ramfs as an aufs branch fs, then enable this ++ option. Generally tmpfs is recommended. ++ Aufs prohibited them to be a branch fs by default, because ++ initramfs becomes unusable after switch_root or something ++ generally. If you sets initramfs as an aufs branch and boot your ++ system by switch_root, you will meet a problem easily since the ++ files in initramfs may be inaccessible. ++ Unless you are going to use ramfs as an aufs branch fs without ++ switch_root or something, leave it N. ++ ++config AUFS_BR_FUSE ++ bool "Fuse fs as an aufs branch" ++ depends on FUSE_FS ++ select AUFS_POLL ++ help ++ If you want to use fuse-based userspace filesystem as an aufs ++ branch fs, then enable this option. ++ It implements the internal poll(2) operation which is ++ implemented by fuse only (curretnly). ++ ++config AUFS_POLL ++ bool ++ help ++ Automatic configuration for internal use. ++ ++config AUFS_BR_HFSPLUS ++ bool "Hfsplus as an aufs branch" ++ depends on HFSPLUS_FS ++ default y ++ help ++ If you want to use hfsplus fs as an aufs branch fs, then enable ++ this option. This option introduces a small overhead at ++ copying-up a file on hfsplus. ++ ++config AUFS_BDEV_LOOP ++ bool ++ depends on BLK_DEV_LOOP ++ default y ++ help ++ Automatic configuration for internal use. ++ Convert =[ym] into =y. ++ ++config AUFS_DEBUG ++ bool "Debug aufs" ++ help ++ Enable this to compile aufs internal debug code. ++ It will have a negative impact to the performance. ++ ++config AUFS_MAGIC_SYSRQ ++ bool ++ depends on AUFS_DEBUG && MAGIC_SYSRQ ++ default y ++ help ++ Automatic configuration for internal use. ++ When aufs supports Magic SysRq, enabled automatically. ++endif +diff -Naur null/fs/aufs/loop.c linux-4.15/fs/aufs/loop.c +--- /dev/null ++++ linux-4.15/fs/aufs/loop.c 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,147 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * support for loopback block device as a branch ++ */ ++ ++#include "aufs.h" ++ ++/* added into drivers/block/loop.c */ ++static struct file *(*backing_file_func)(struct super_block *sb); ++ ++/* ++ * test if two lower dentries have overlapping branches. ++ */ ++int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding) ++{ ++ struct super_block *h_sb; ++ struct file *backing_file; ++ ++ if (unlikely(!backing_file_func)) { ++ /* don't load "loop" module here */ ++ backing_file_func = symbol_get(loop_backing_file); ++ if (unlikely(!backing_file_func)) ++ /* "loop" module is not loaded */ ++ return 0; ++ } ++ ++ h_sb = h_adding->d_sb; ++ backing_file = backing_file_func(h_sb); ++ if (!backing_file) ++ return 0; ++ ++ h_adding = backing_file->f_path.dentry; ++ /* ++ * h_adding can be local NFS. ++ * in this case aufs cannot detect the loop. ++ */ ++ if (unlikely(h_adding->d_sb == sb)) ++ return 1; ++ return !!au_test_subdir(h_adding, sb->s_root); ++} ++ ++/* true if a kernel thread named 'loop[0-9].*' accesses a file */ ++int au_test_loopback_kthread(void) ++{ ++ int ret; ++ struct task_struct *tsk = current; ++ char c, comm[sizeof(tsk->comm)]; ++ ++ ret = 0; ++ if (tsk->flags & PF_KTHREAD) { ++ get_task_comm(comm, tsk); ++ c = comm[4]; ++ ret = ('0' <= c && c <= '9' ++ && !strncmp(comm, "loop", 4)); ++ } ++ ++ return ret; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define au_warn_loopback_step 16 ++static int au_warn_loopback_nelem = au_warn_loopback_step; ++static unsigned long *au_warn_loopback_array; ++ ++void au_warn_loopback(struct super_block *h_sb) ++{ ++ int i, new_nelem; ++ unsigned long *a, magic; ++ static DEFINE_SPINLOCK(spin); ++ ++ magic = h_sb->s_magic; ++ spin_lock(&spin); ++ a = au_warn_loopback_array; ++ for (i = 0; i < au_warn_loopback_nelem && *a; i++) ++ if (a[i] == magic) { ++ spin_unlock(&spin); ++ return; ++ } ++ ++ /* h_sb is new to us, print it */ ++ if (i < au_warn_loopback_nelem) { ++ a[i] = magic; ++ goto pr; ++ } ++ ++ /* expand the array */ ++ new_nelem = au_warn_loopback_nelem + au_warn_loopback_step; ++ a = au_kzrealloc(au_warn_loopback_array, ++ au_warn_loopback_nelem * sizeof(unsigned long), ++ new_nelem * sizeof(unsigned long), GFP_ATOMIC, ++ /*may_shrink*/0); ++ if (a) { ++ au_warn_loopback_nelem = new_nelem; ++ au_warn_loopback_array = a; ++ a[i] = magic; ++ goto pr; ++ } ++ ++ spin_unlock(&spin); ++ AuWarn1("realloc failed, ignored\n"); ++ return; ++ ++pr: ++ spin_unlock(&spin); ++ pr_warn("you may want to try another patch for loopback file " ++ "on %s(0x%lx) branch\n", au_sbtype(h_sb), magic); ++} ++ ++int au_loopback_init(void) ++{ ++ int err; ++ struct super_block *sb __maybe_unused; ++ ++ BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(unsigned long)); ++ ++ err = 0; ++ au_warn_loopback_array = kcalloc(au_warn_loopback_step, ++ sizeof(unsigned long), GFP_NOFS); ++ if (unlikely(!au_warn_loopback_array)) ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++void au_loopback_fin(void) ++{ ++ if (backing_file_func) ++ symbol_put(loop_backing_file); ++ kfree(au_warn_loopback_array); ++} +diff -Naur null/fs/aufs/loop.h linux-4.15/fs/aufs/loop.h +--- /dev/null ++++ linux-4.15/fs/aufs/loop.h 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * support for loopback mount as a branch ++ */ ++ ++#ifndef __AUFS_LOOP_H__ ++#define __AUFS_LOOP_H__ ++ ++#ifdef __KERNEL__ ++ ++struct dentry; ++struct super_block; ++ ++#ifdef CONFIG_AUFS_BDEV_LOOP ++/* drivers/block/loop.c */ ++struct file *loop_backing_file(struct super_block *sb); ++ ++/* loop.c */ ++int au_test_loopback_overlap(struct super_block *sb, struct dentry *h_adding); ++int au_test_loopback_kthread(void); ++void au_warn_loopback(struct super_block *h_sb); ++ ++int au_loopback_init(void); ++void au_loopback_fin(void); ++#else ++AuStubInt0(au_test_loopback_overlap, struct super_block *sb, ++ struct dentry *h_adding) ++AuStubInt0(au_test_loopback_kthread, void) ++AuStubVoid(au_warn_loopback, struct super_block *h_sb) ++ ++AuStubInt0(au_loopback_init, void) ++AuStubVoid(au_loopback_fin, void) ++#endif /* BLK_DEV_LOOP */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_LOOP_H__ */ +diff -Naur null/fs/aufs/magic.mk linux-4.15/fs/aufs/magic.mk +--- /dev/null ++++ linux-4.15/fs/aufs/magic.mk 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,31 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++# defined in ${srctree}/fs/fuse/inode.c ++# tristate ++ifdef CONFIG_FUSE_FS ++ccflags-y += -DFUSE_SUPER_MAGIC=0x65735546 ++endif ++ ++# defined in ${srctree}/fs/xfs/xfs_sb.h ++# tristate ++ifdef CONFIG_XFS_FS ++ccflags-y += -DXFS_SB_MAGIC=0x58465342 ++endif ++ ++# defined in ${srctree}/fs/configfs/mount.c ++# tristate ++ifdef CONFIG_CONFIGFS_FS ++ccflags-y += -DCONFIGFS_MAGIC=0x62656570 ++endif ++ ++# defined in ${srctree}/fs/ubifs/ubifs.h ++# tristate ++ifdef CONFIG_UBIFS_FS ++ccflags-y += -DUBIFS_SUPER_MAGIC=0x24051905 ++endif ++ ++# defined in ${srctree}/fs/hfsplus/hfsplus_raw.h ++# tristate ++ifdef CONFIG_HFSPLUS_FS ++ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b ++endif +diff -Naur null/fs/aufs/Makefile linux-4.15/fs/aufs/Makefile +--- /dev/null ++++ linux-4.15/fs/aufs/Makefile 2018-02-25 02:38:09.197737361 +0100 +@@ -0,0 +1,46 @@ ++# SPDX-License-Identifier: GPL-2.0 ++ ++include ${src}/magic.mk ++ifeq (${CONFIG_AUFS_FS},m) ++include ${src}/conf.mk ++endif ++-include ${src}/priv_def.mk ++ ++# cf. include/linux/kernel.h ++# enable pr_debug ++ccflags-y += -DDEBUG ++# sparse requires the full pathname ++ifdef M ++ccflags-y += -include ${M}/../../include/uapi/linux/aufs_type.h ++else ++ccflags-y += -include ${srctree}/include/uapi/linux/aufs_type.h ++endif ++ ++obj-$(CONFIG_AUFS_FS) += aufs.o ++aufs-y := module.o sbinfo.o super.o branch.o xino.o sysaufs.o opts.o \ ++ wkq.o vfsub.o dcsub.o \ ++ cpup.o whout.o wbr_policy.o \ ++ dinfo.o dentry.o \ ++ dynop.o \ ++ finfo.o file.o f_op.o \ ++ dir.o vdir.o \ ++ iinfo.o inode.o i_op.o i_op_add.o i_op_del.o i_op_ren.o \ ++ mvdown.o ioctl.o ++ ++# all are boolean ++aufs-$(CONFIG_PROC_FS) += procfs.o plink.o ++aufs-$(CONFIG_SYSFS) += sysfs.o ++aufs-$(CONFIG_DEBUG_FS) += dbgaufs.o ++aufs-$(CONFIG_AUFS_BDEV_LOOP) += loop.o ++aufs-$(CONFIG_AUFS_HNOTIFY) += hnotify.o ++aufs-$(CONFIG_AUFS_HFSNOTIFY) += hfsnotify.o ++aufs-$(CONFIG_AUFS_EXPORT) += export.o ++aufs-$(CONFIG_AUFS_XATTR) += xattr.o ++aufs-$(CONFIG_FS_POSIX_ACL) += posix_acl.o ++aufs-$(CONFIG_AUFS_DIRREN) += dirren.o ++aufs-$(CONFIG_AUFS_FHSM) += fhsm.o ++aufs-$(CONFIG_AUFS_POLL) += poll.o ++aufs-$(CONFIG_AUFS_RDU) += rdu.o ++aufs-$(CONFIG_AUFS_BR_HFSPLUS) += hfsplus.o ++aufs-$(CONFIG_AUFS_DEBUG) += debug.o ++aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o +diff -Naur null/fs/aufs/module.c linux-4.15/fs/aufs/module.c +--- /dev/null ++++ linux-4.15/fs/aufs/module.c 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,266 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * module global variables and operations ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++/* shrinkable realloc */ ++void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink) ++{ ++ size_t sz; ++ int diff; ++ ++ sz = 0; ++ diff = -1; ++ if (p) { ++#if 0 /* unused */ ++ if (!new_sz) { ++ kfree(p); ++ p = NULL; ++ goto out; ++ } ++#else ++ AuDebugOn(!new_sz); ++#endif ++ sz = ksize(p); ++ diff = au_kmidx_sub(sz, new_sz); ++ } ++ if (sz && !diff) ++ goto out; ++ ++ if (sz < new_sz) ++ /* expand or SLOB */ ++ p = krealloc(p, new_sz, gfp); ++ else if (new_sz < sz && may_shrink) { ++ /* shrink */ ++ void *q; ++ ++ q = kmalloc(new_sz, gfp); ++ if (q) { ++ if (p) { ++ memcpy(q, p, new_sz); ++ kfree(p); ++ } ++ p = q; ++ } else ++ p = NULL; ++ } ++ ++out: ++ return p; ++} ++ ++void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, ++ int may_shrink) ++{ ++ p = au_krealloc(p, new_sz, gfp, may_shrink); ++ if (p && new_sz > nused) ++ memset(p + nused, 0, new_sz - nused); ++ return p; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * aufs caches ++ */ ++struct kmem_cache *au_cache[AuCache_Last]; ++ ++static void au_cache_fin(void) ++{ ++ int i; ++ ++ /* ++ * Make sure all delayed rcu free inodes are flushed before we ++ * destroy cache. ++ */ ++ rcu_barrier(); ++ ++ /* excluding AuCache_HNOTIFY */ ++ BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last); ++ for (i = 0; i < AuCache_HNOTIFY; i++) { ++ kmem_cache_destroy(au_cache[i]); ++ au_cache[i] = NULL; ++ } ++} ++ ++static int __init au_cache_init(void) ++{ ++ au_cache[AuCache_DINFO] = AuCacheCtor(au_dinfo, au_di_init_once); ++ if (au_cache[AuCache_DINFO]) ++ /* SLAB_DESTROY_BY_RCU */ ++ au_cache[AuCache_ICNTNR] = AuCacheCtor(au_icntnr, ++ au_icntnr_init_once); ++ if (au_cache[AuCache_ICNTNR]) ++ au_cache[AuCache_FINFO] = AuCacheCtor(au_finfo, ++ au_fi_init_once); ++ if (au_cache[AuCache_FINFO]) ++ au_cache[AuCache_VDIR] = AuCache(au_vdir); ++ if (au_cache[AuCache_VDIR]) ++ au_cache[AuCache_DEHSTR] = AuCache(au_vdir_dehstr); ++ if (au_cache[AuCache_DEHSTR]) ++ return 0; ++ ++ au_cache_fin(); ++ return -ENOMEM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_dir_roflags; ++ ++#ifdef CONFIG_AUFS_SBILIST ++/* ++ * iterate_supers_type() doesn't protect us from ++ * remounting (branch management) ++ */ ++struct hlist_bl_head au_sbilist; ++#endif ++ ++/* ++ * functions for module interface. ++ */ ++MODULE_LICENSE("GPL"); ++/* MODULE_LICENSE("GPL v2"); */ ++MODULE_AUTHOR("Junjiro R. Okajima "); ++MODULE_DESCRIPTION(AUFS_NAME ++ " -- Advanced multi layered unification filesystem"); ++MODULE_VERSION(AUFS_VERSION); ++MODULE_ALIAS_FS(AUFS_NAME); ++ ++/* this module parameter has no meaning when SYSFS is disabled */ ++int sysaufs_brs = 1; ++MODULE_PARM_DESC(brs, "use /fs/aufs/si_*/brN"); ++module_param_named(brs, sysaufs_brs, int, S_IRUGO); ++ ++/* this module parameter has no meaning when USER_NS is disabled */ ++bool au_userns; ++MODULE_PARM_DESC(allow_userns, "allow unprivileged to mount under userns"); ++module_param_named(allow_userns, au_userns, bool, S_IRUGO); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ ++ ++int au_seq_path(struct seq_file *seq, struct path *path) ++{ ++ int err; ++ ++ err = seq_path(seq, path, au_esc_chars); ++ if (err >= 0) ++ err = 0; ++ else ++ err = -ENOMEM; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int __init aufs_init(void) ++{ ++ int err, i; ++ char *p; ++ ++ p = au_esc_chars; ++ for (i = 1; i <= ' '; i++) ++ *p++ = i; ++ *p++ = '\\'; ++ *p++ = '\x7f'; ++ *p = 0; ++ ++ au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE); ++ ++ memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop)); ++ for (i = 0; i < AuIop_Last; i++) ++ aufs_iop_nogetattr[i].getattr = NULL; ++ ++ memset(au_cache, 0, sizeof(au_cache)); /* including hnotify */ ++ ++ au_sbilist_init(); ++ sysaufs_brs_init(); ++ au_debug_init(); ++ au_dy_init(); ++ err = sysaufs_init(); ++ if (unlikely(err)) ++ goto out; ++ err = au_procfs_init(); ++ if (unlikely(err)) ++ goto out_sysaufs; ++ err = au_wkq_init(); ++ if (unlikely(err)) ++ goto out_procfs; ++ err = au_loopback_init(); ++ if (unlikely(err)) ++ goto out_wkq; ++ err = au_hnotify_init(); ++ if (unlikely(err)) ++ goto out_loopback; ++ err = au_sysrq_init(); ++ if (unlikely(err)) ++ goto out_hin; ++ err = au_cache_init(); ++ if (unlikely(err)) ++ goto out_sysrq; ++ ++ aufs_fs_type.fs_flags |= au_userns ? FS_USERNS_MOUNT : 0; ++ err = register_filesystem(&aufs_fs_type); ++ if (unlikely(err)) ++ goto out_cache; ++ ++ /* since we define pr_fmt, call printk directly */ ++ printk(KERN_INFO AUFS_NAME " " AUFS_VERSION "\n"); ++ goto out; /* success */ ++ ++out_cache: ++ au_cache_fin(); ++out_sysrq: ++ au_sysrq_fin(); ++out_hin: ++ au_hnotify_fin(); ++out_loopback: ++ au_loopback_fin(); ++out_wkq: ++ au_wkq_fin(); ++out_procfs: ++ au_procfs_fin(); ++out_sysaufs: ++ sysaufs_fin(); ++ au_dy_fin(); ++out: ++ return err; ++} ++ ++static void __exit aufs_exit(void) ++{ ++ unregister_filesystem(&aufs_fs_type); ++ au_cache_fin(); ++ au_sysrq_fin(); ++ au_hnotify_fin(); ++ au_loopback_fin(); ++ au_wkq_fin(); ++ au_procfs_fin(); ++ sysaufs_fin(); ++ au_dy_fin(); ++} ++ ++module_init(aufs_init); ++module_exit(aufs_exit); +diff -Naur null/fs/aufs/module.h linux-4.15/fs/aufs/module.h +--- /dev/null ++++ linux-4.15/fs/aufs/module.h 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,101 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * module initialization and module-global ++ */ ++ ++#ifndef __AUFS_MODULE_H__ ++#define __AUFS_MODULE_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct path; ++struct seq_file; ++ ++/* module parameters */ ++extern int sysaufs_brs; ++extern bool au_userns; ++ ++/* ---------------------------------------------------------------------- */ ++ ++extern int au_dir_roflags; ++ ++void *au_krealloc(void *p, unsigned int new_sz, gfp_t gfp, int may_shrink); ++void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp, ++ int may_shrink); ++ ++static inline int au_kmidx_sub(size_t sz, size_t new_sz) ++{ ++#ifndef CONFIG_SLOB ++ return kmalloc_index(sz) - kmalloc_index(new_sz); ++#else ++ return -1; /* SLOB is untested */ ++#endif ++} ++ ++int au_seq_path(struct seq_file *seq, struct path *path); ++ ++#ifdef CONFIG_PROC_FS ++/* procfs.c */ ++int __init au_procfs_init(void); ++void au_procfs_fin(void); ++#else ++AuStubInt0(au_procfs_init, void); ++AuStubVoid(au_procfs_fin, void); ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* kmem cache */ ++enum { ++ AuCache_DINFO, ++ AuCache_ICNTNR, ++ AuCache_FINFO, ++ AuCache_VDIR, ++ AuCache_DEHSTR, ++ AuCache_HNOTIFY, /* must be last */ ++ AuCache_Last ++}; ++ ++extern struct kmem_cache *au_cache[AuCache_Last]; ++ ++#define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD) ++#define AuCache(type) KMEM_CACHE(type, AuCacheFlags) ++#define AuCacheCtor(type, ctor) \ ++ kmem_cache_create(#type, sizeof(struct type), \ ++ __alignof__(struct type), AuCacheFlags, ctor) ++ ++#define AuCacheFuncs(name, index) \ ++static inline struct au_##name *au_cache_alloc_##name(void) \ ++{ return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \ ++static inline void au_cache_free_##name(struct au_##name *p) \ ++{ kmem_cache_free(au_cache[AuCache_##index], p); } ++ ++AuCacheFuncs(dinfo, DINFO); ++AuCacheFuncs(icntnr, ICNTNR); ++AuCacheFuncs(finfo, FINFO); ++AuCacheFuncs(vdir, VDIR); ++AuCacheFuncs(vdir_dehstr, DEHSTR); ++#ifdef CONFIG_AUFS_HNOTIFY ++AuCacheFuncs(hnotify, HNOTIFY); ++#endif ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_MODULE_H__ */ +diff -Naur null/fs/aufs/mvdown.c linux-4.15/fs/aufs/mvdown.c +--- /dev/null ++++ linux-4.15/fs/aufs/mvdown.c 2018-02-25 02:38:09.203738006 +0100 +@@ -0,0 +1,704 @@ ++/* ++ * Copyright (C) 2011-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * move-down, opposite of copy-up ++ */ ++ ++#include "aufs.h" ++ ++struct au_mvd_args { ++ struct { ++ struct super_block *h_sb; ++ struct dentry *h_parent; ++ struct au_hinode *hdir; ++ struct inode *h_dir, *h_inode; ++ struct au_pin pin; ++ } info[AUFS_MVDOWN_NARRAY]; ++ ++ struct aufs_mvdown mvdown; ++ struct dentry *dentry, *parent; ++ struct inode *inode, *dir; ++ struct super_block *sb; ++ aufs_bindex_t bopq, bwh, bfound; ++ unsigned char rename_lock; ++}; ++ ++#define mvd_errno mvdown.au_errno ++#define mvd_bsrc mvdown.stbr[AUFS_MVDOWN_UPPER].bindex ++#define mvd_src_brid mvdown.stbr[AUFS_MVDOWN_UPPER].brid ++#define mvd_bdst mvdown.stbr[AUFS_MVDOWN_LOWER].bindex ++#define mvd_dst_brid mvdown.stbr[AUFS_MVDOWN_LOWER].brid ++ ++#define mvd_h_src_sb info[AUFS_MVDOWN_UPPER].h_sb ++#define mvd_h_src_parent info[AUFS_MVDOWN_UPPER].h_parent ++#define mvd_hdir_src info[AUFS_MVDOWN_UPPER].hdir ++#define mvd_h_src_dir info[AUFS_MVDOWN_UPPER].h_dir ++#define mvd_h_src_inode info[AUFS_MVDOWN_UPPER].h_inode ++#define mvd_pin_src info[AUFS_MVDOWN_UPPER].pin ++ ++#define mvd_h_dst_sb info[AUFS_MVDOWN_LOWER].h_sb ++#define mvd_h_dst_parent info[AUFS_MVDOWN_LOWER].h_parent ++#define mvd_hdir_dst info[AUFS_MVDOWN_LOWER].hdir ++#define mvd_h_dst_dir info[AUFS_MVDOWN_LOWER].h_dir ++#define mvd_h_dst_inode info[AUFS_MVDOWN_LOWER].h_inode ++#define mvd_pin_dst info[AUFS_MVDOWN_LOWER].pin ++ ++#define AU_MVD_PR(flag, ...) do { \ ++ if (flag) \ ++ pr_err(__VA_ARGS__); \ ++ } while (0) ++ ++static int find_lower_writable(struct au_mvd_args *a) ++{ ++ struct super_block *sb; ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ sb = a->sb; ++ bindex = a->mvd_bsrc; ++ bbot = au_sbbot(sb); ++ if (a->mvdown.flags & AUFS_MVDOWN_FHSM_LOWER) ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm) ++ && !sb_rdonly(au_br_sb(br))) ++ return bindex; ++ } ++ else if (!(a->mvdown.flags & AUFS_MVDOWN_ROLOWER)) ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_rdonly(br)) ++ return bindex; ++ } ++ else ++ for (bindex++; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!sb_rdonly(au_br_sb(br))) { ++ if (au_br_rdonly(br)) ++ a->mvdown.flags ++ |= AUFS_MVDOWN_ROLOWER_R; ++ return bindex; ++ } ++ } ++ ++ return -1; ++} ++ ++/* make the parent dir on bdst */ ++static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = 0; ++ a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc); ++ a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst); ++ a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc); ++ a->mvd_h_dst_parent = NULL; ++ if (au_dbbot(a->parent) >= a->mvd_bdst) ++ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); ++ if (!a->mvd_h_dst_parent) { ++ err = au_cpdown_dirs(a->dentry, a->mvd_bdst); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "cpdown_dirs failed\n"); ++ goto out; ++ } ++ a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* lock them all */ ++static int au_do_lock(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct dentry *h_trap; ++ ++ a->mvd_h_src_sb = au_sbr_sb(a->sb, a->mvd_bsrc); ++ a->mvd_h_dst_sb = au_sbr_sb(a->sb, a->mvd_bdst); ++ err = au_pin(&a->mvd_pin_dst, a->dentry, a->mvd_bdst, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ AuTraceErr(err); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_dst failed\n"); ++ goto out; ++ } ++ ++ if (a->mvd_h_src_sb != a->mvd_h_dst_sb) { ++ a->rename_lock = 0; ++ au_pin_init(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, ++ AuLsc_DI_PARENT, AuLsc_I_PARENT3, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ err = au_do_pin(&a->mvd_pin_src); ++ AuTraceErr(err); ++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_src failed\n"); ++ goto out_dst; ++ } ++ goto out; /* success */ ++ } ++ ++ a->rename_lock = 1; ++ au_pin_hdir_unlock(&a->mvd_pin_dst); ++ err = au_pin(&a->mvd_pin_src, a->dentry, a->mvd_bsrc, ++ au_opt_udba(a->sb), ++ AuPin_MNT_WRITE | AuPin_DI_LOCKED); ++ AuTraceErr(err); ++ a->mvd_h_src_dir = d_inode(a->mvd_h_src_parent); ++ if (unlikely(err)) { ++ AU_MVD_PR(dmsg, "pin_src failed\n"); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ goto out_dst; ++ } ++ au_pin_hdir_unlock(&a->mvd_pin_src); ++ h_trap = vfsub_lock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ if (h_trap) { ++ err = (h_trap != a->mvd_h_src_parent); ++ if (err) ++ err = (h_trap != a->mvd_h_dst_parent); ++ } ++ BUG_ON(err); /* it should never happen */ ++ if (unlikely(a->mvd_h_src_dir != au_pinned_h_dir(&a->mvd_pin_src))) { ++ err = -EBUSY; ++ AuTraceErr(err); ++ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ au_pin_hdir_lock(&a->mvd_pin_src); ++ au_unpin(&a->mvd_pin_src); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ goto out_dst; ++ } ++ goto out; /* success */ ++ ++out_dst: ++ au_unpin(&a->mvd_pin_dst); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static void au_do_unlock(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ if (!a->rename_lock) ++ au_unpin(&a->mvd_pin_src); ++ else { ++ vfsub_unlock_rename(a->mvd_h_src_parent, a->mvd_hdir_src, ++ a->mvd_h_dst_parent, a->mvd_hdir_dst); ++ au_pin_hdir_lock(&a->mvd_pin_src); ++ au_unpin(&a->mvd_pin_src); ++ au_pin_hdir_lock(&a->mvd_pin_dst); ++ } ++ au_unpin(&a->mvd_pin_dst); ++} ++ ++/* copy-down the file */ ++static int au_do_cpdown(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_cp_generic cpg = { ++ .dentry = a->dentry, ++ .bdst = a->mvd_bdst, ++ .bsrc = a->mvd_bsrc, ++ .len = -1, ++ .pin = &a->mvd_pin_dst, ++ .flags = AuCpup_DTIME | AuCpup_HOPEN ++ }; ++ ++ AuDbg("b%d, b%d\n", cpg.bsrc, cpg.bdst); ++ if (a->mvdown.flags & AUFS_MVDOWN_OWLOWER) ++ au_fset_cpup(cpg.flags, OVERWRITE); ++ if (a->mvdown.flags & AUFS_MVDOWN_ROLOWER) ++ au_fset_cpup(cpg.flags, RWDST); ++ err = au_sio_cpdown_simple(&cpg); ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "cpdown failed\n"); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * unlink the whiteout on bdst if exist which may be created by UDBA while we ++ * were sleeping ++ */ ++static int au_do_unlink_wh(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct path h_path; ++ struct au_branch *br; ++ struct inode *delegated; ++ ++ br = au_sbr(a->sb, a->mvd_bdst); ++ h_path.dentry = au_wh_lkup(a->mvd_h_dst_parent, &a->dentry->d_name, br); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) { ++ AU_MVD_PR(dmsg, "wh_lkup failed\n"); ++ goto out; ++ } ++ ++ err = 0; ++ if (d_is_positive(h_path.dentry)) { ++ h_path.mnt = au_br_mnt(br); ++ delegated = NULL; ++ err = vfsub_unlink(d_inode(a->mvd_h_dst_parent), &h_path, ++ &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "wh_unlink failed\n"); ++ } ++ dput(h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ++ * unlink the topmost h_dentry ++ */ ++static int au_do_unlink(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct path h_path; ++ struct inode *delegated; ++ ++ h_path.mnt = au_sbr_mnt(a->sb, a->mvd_bsrc); ++ h_path.dentry = au_h_dptr(a->dentry, a->mvd_bsrc); ++ delegated = NULL; ++ err = vfsub_unlink(a->mvd_h_src_dir, &h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) ++ AU_MVD_PR(dmsg, "unlink failed\n"); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++/* Since mvdown succeeded, we ignore an error of this function */ ++static void au_do_stfs(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_branch *br; ++ ++ a->mvdown.flags |= AUFS_MVDOWN_STFS_FAILED; ++ br = au_sbr(a->sb, a->mvd_bsrc); ++ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_UPPER].stfs); ++ if (!err) { ++ br = au_sbr(a->sb, a->mvd_bdst); ++ a->mvdown.stbr[AUFS_MVDOWN_LOWER].brid = br->br_id; ++ err = au_br_stfs(br, &a->mvdown.stbr[AUFS_MVDOWN_LOWER].stfs); ++ } ++ if (!err) ++ a->mvdown.flags &= ~AUFS_MVDOWN_STFS_FAILED; ++ else ++ AU_MVD_PR(dmsg, "statfs failed (%d), ignored\n", err); ++} ++ ++/* ++ * copy-down the file and unlink the bsrc file. ++ * - unlink the bdst whout if exist ++ * - copy-down the file (with whtmp name and rename) ++ * - unlink the bsrc file ++ */ ++static int au_do_mvdown(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = au_do_mkdir(dmsg, a); ++ if (!err) ++ err = au_do_lock(dmsg, a); ++ if (unlikely(err)) ++ goto out; ++ ++ /* ++ * do not revert the activities we made on bdst since they should be ++ * harmless in aufs. ++ */ ++ ++ err = au_do_cpdown(dmsg, a); ++ if (!err) ++ err = au_do_unlink_wh(dmsg, a); ++ if (!err && !(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) ++ err = au_do_unlink(dmsg, a); ++ if (unlikely(err)) ++ goto out_unlock; ++ ++ AuDbg("%pd2, 0x%x, %d --> %d\n", ++ a->dentry, a->mvdown.flags, a->mvd_bsrc, a->mvd_bdst); ++ if (find_lower_writable(a) < 0) ++ a->mvdown.flags |= AUFS_MVDOWN_BOTTOM; ++ ++ if (a->mvdown.flags & AUFS_MVDOWN_STFS) ++ au_do_stfs(dmsg, a); ++ ++ /* maintain internal array */ ++ if (!(a->mvdown.flags & AUFS_MVDOWN_KUPPER)) { ++ au_set_h_dptr(a->dentry, a->mvd_bsrc, NULL); ++ au_set_dbtop(a->dentry, a->mvd_bdst); ++ au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0); ++ au_set_ibtop(a->inode, a->mvd_bdst); ++ } else { ++ /* hide the lower */ ++ au_set_h_dptr(a->dentry, a->mvd_bdst, NULL); ++ au_set_dbbot(a->dentry, a->mvd_bsrc); ++ au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0); ++ au_set_ibbot(a->inode, a->mvd_bsrc); ++ } ++ if (au_dbbot(a->dentry) < a->mvd_bdst) ++ au_set_dbbot(a->dentry, a->mvd_bdst); ++ if (au_ibbot(a->inode) < a->mvd_bdst) ++ au_set_ibbot(a->inode, a->mvd_bdst); ++ ++out_unlock: ++ au_do_unlock(dmsg, a); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* make sure the file is idle */ ++static int au_mvd_args_busy(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err, plinked; ++ ++ err = 0; ++ plinked = !!au_opt_test(au_mntflags(a->sb), PLINK); ++ if (au_dbtop(a->dentry) == a->mvd_bsrc ++ && au_dcount(a->dentry) == 1 ++ && atomic_read(&a->inode->i_count) == 1 ++ /* && a->mvd_h_src_inode->i_nlink == 1 */ ++ && (!plinked || !au_plink_test(a->inode)) ++ && a->inode->i_nlink == 1) ++ goto out; ++ ++ err = -EBUSY; ++ AU_MVD_PR(dmsg, ++ "b%d, d{b%d, c%d?}, i{c%d?, l%u}, hi{l%u}, p{%d, %d}\n", ++ a->mvd_bsrc, au_dbtop(a->dentry), au_dcount(a->dentry), ++ atomic_read(&a->inode->i_count), a->inode->i_nlink, ++ a->mvd_h_src_inode->i_nlink, ++ plinked, plinked ? au_plink_test(a->inode) : 0); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* make sure the parent dir is fine */ ++static int au_mvd_args_parent(const unsigned char dmsg, ++ struct au_mvd_args *a) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ ++ err = 0; ++ if (unlikely(au_alive_dir(a->parent))) { ++ err = -ENOENT; ++ AU_MVD_PR(dmsg, "parent dir is dead\n"); ++ goto out; ++ } ++ ++ a->bopq = au_dbdiropq(a->parent); ++ bindex = au_wbr_nonopq(a->dentry, a->mvd_bdst); ++ AuDbg("b%d\n", bindex); ++ if (unlikely((bindex >= 0 && bindex < a->mvd_bdst) ++ || (a->bopq != -1 && a->bopq < a->mvd_bdst))) { ++ err = -EINVAL; ++ a->mvd_errno = EAU_MVDOWN_OPAQUE; ++ AU_MVD_PR(dmsg, "ancestor is opaque b%d, b%d\n", ++ a->bopq, a->mvd_bdst); ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args_intermediate(const unsigned char dmsg, ++ struct au_mvd_args *a) ++{ ++ int err; ++ struct au_dinfo *dinfo, *tmp; ++ ++ /* lookup the next lower positive entry */ ++ err = -ENOMEM; ++ tmp = au_di_alloc(a->sb, AuLsc_DI_TMP); ++ if (unlikely(!tmp)) ++ goto out; ++ ++ a->bfound = -1; ++ a->bwh = -1; ++ dinfo = au_di(a->dentry); ++ au_di_cp(tmp, dinfo); ++ au_di_swap(tmp, dinfo); ++ ++ /* returns the number of positive dentries */ ++ err = au_lkup_dentry(a->dentry, a->mvd_bsrc + 1, ++ /* AuLkup_IGNORE_PERM */ 0); ++ if (!err) ++ a->bwh = au_dbwh(a->dentry); ++ else if (err > 0) ++ a->bfound = au_dbtop(a->dentry); ++ ++ au_di_swap(tmp, dinfo); ++ au_rw_write_unlock(&tmp->di_rwsem); ++ au_di_free(tmp); ++ if (unlikely(err < 0)) ++ AU_MVD_PR(dmsg, "failed look-up lower\n"); ++ ++ /* ++ * here, we have these cases. ++ * bfound == -1 ++ * no positive dentry under bsrc. there are more sub-cases. ++ * bwh < 0 ++ * there no whiteout, we can safely move-down. ++ * bwh <= bsrc ++ * impossible ++ * bsrc < bwh && bwh < bdst ++ * there is a whiteout on RO branch. cannot proceed. ++ * bwh == bdst ++ * there is a whiteout on the RW target branch. it should ++ * be removed. ++ * bdst < bwh ++ * there is a whiteout somewhere unrelated branch. ++ * -1 < bfound && bfound <= bsrc ++ * impossible. ++ * bfound < bdst ++ * found, but it is on RO branch between bsrc and bdst. cannot ++ * proceed. ++ * bfound == bdst ++ * found, replace it if AUFS_MVDOWN_FORCE is set. otherwise return ++ * error. ++ * bdst < bfound ++ * found, after we create the file on bdst, it will be hidden. ++ */ ++ ++ AuDebugOn(a->bfound == -1 ++ && a->bwh != -1 ++ && a->bwh <= a->mvd_bsrc); ++ AuDebugOn(-1 < a->bfound ++ && a->bfound <= a->mvd_bsrc); ++ ++ err = -EINVAL; ++ if (a->bfound == -1 ++ && a->mvd_bsrc < a->bwh ++ && a->bwh != -1 ++ && a->bwh < a->mvd_bdst) { ++ a->mvd_errno = EAU_MVDOWN_WHITEOUT; ++ AU_MVD_PR(dmsg, "bsrc %d, bdst %d, bfound %d, bwh %d\n", ++ a->mvd_bsrc, a->mvd_bdst, a->bfound, a->bwh); ++ goto out; ++ } else if (a->bfound != -1 && a->bfound < a->mvd_bdst) { ++ a->mvd_errno = EAU_MVDOWN_UPPER; ++ AU_MVD_PR(dmsg, "bdst %d, bfound %d\n", ++ a->mvd_bdst, a->bfound); ++ goto out; ++ } ++ ++ err = 0; /* success */ ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args_exist(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ ++ err = 0; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_OWLOWER) ++ && a->bfound == a->mvd_bdst) ++ err = -EEXIST; ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_mvd_args(const unsigned char dmsg, struct au_mvd_args *a) ++{ ++ int err; ++ struct au_branch *br; ++ ++ err = -EISDIR; ++ if (unlikely(S_ISDIR(a->inode->i_mode))) ++ goto out; ++ ++ err = -EINVAL; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_UPPER)) ++ a->mvd_bsrc = au_ibtop(a->inode); ++ else { ++ a->mvd_bsrc = au_br_index(a->sb, a->mvd_src_brid); ++ if (unlikely(a->mvd_bsrc < 0 ++ || (a->mvd_bsrc < au_dbtop(a->dentry) ++ || au_dbbot(a->dentry) < a->mvd_bsrc ++ || !au_h_dptr(a->dentry, a->mvd_bsrc)) ++ || (a->mvd_bsrc < au_ibtop(a->inode) ++ || au_ibbot(a->inode) < a->mvd_bsrc ++ || !au_h_iptr(a->inode, a->mvd_bsrc)))) { ++ a->mvd_errno = EAU_MVDOWN_NOUPPER; ++ AU_MVD_PR(dmsg, "no upper\n"); ++ goto out; ++ } ++ } ++ if (unlikely(a->mvd_bsrc == au_sbbot(a->sb))) { ++ a->mvd_errno = EAU_MVDOWN_BOTTOM; ++ AU_MVD_PR(dmsg, "on the bottom\n"); ++ goto out; ++ } ++ a->mvd_h_src_inode = au_h_iptr(a->inode, a->mvd_bsrc); ++ br = au_sbr(a->sb, a->mvd_bsrc); ++ err = au_br_rdonly(br); ++ if (!(a->mvdown.flags & AUFS_MVDOWN_ROUPPER)) { ++ if (unlikely(err)) ++ goto out; ++ } else if (!(vfsub_native_ro(a->mvd_h_src_inode) ++ || IS_APPEND(a->mvd_h_src_inode))) { ++ if (err) ++ a->mvdown.flags |= AUFS_MVDOWN_ROUPPER_R; ++ /* go on */ ++ } else ++ goto out; ++ ++ err = -EINVAL; ++ if (!(a->mvdown.flags & AUFS_MVDOWN_BRID_LOWER)) { ++ a->mvd_bdst = find_lower_writable(a); ++ if (unlikely(a->mvd_bdst < 0)) { ++ a->mvd_errno = EAU_MVDOWN_BOTTOM; ++ AU_MVD_PR(dmsg, "no writable lower branch\n"); ++ goto out; ++ } ++ } else { ++ a->mvd_bdst = au_br_index(a->sb, a->mvd_dst_brid); ++ if (unlikely(a->mvd_bdst < 0 ++ || au_sbbot(a->sb) < a->mvd_bdst)) { ++ a->mvd_errno = EAU_MVDOWN_NOLOWERBR; ++ AU_MVD_PR(dmsg, "no lower brid\n"); ++ goto out; ++ } ++ } ++ ++ err = au_mvd_args_busy(dmsg, a); ++ if (!err) ++ err = au_mvd_args_parent(dmsg, a); ++ if (!err) ++ err = au_mvd_args_intermediate(dmsg, a); ++ if (!err) ++ err = au_mvd_args_exist(dmsg, a); ++ if (!err) ++ AuDbg("b%d, b%d\n", a->mvd_bsrc, a->mvd_bdst); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *uarg) ++{ ++ int err, e; ++ unsigned char dmsg; ++ struct au_mvd_args *args; ++ struct inode *inode; ++ ++ inode = d_inode(dentry); ++ err = -EPERM; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -ENOMEM; ++ args = kmalloc(sizeof(*args), GFP_NOFS); ++ if (unlikely(!args)) ++ goto out; ++ ++ err = copy_from_user(&args->mvdown, uarg, sizeof(args->mvdown)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, uarg, sizeof(*uarg)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out_free; ++ } ++ AuDbg("flags 0x%x\n", args->mvdown.flags); ++ args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R); ++ args->mvdown.au_errno = 0; ++ args->dentry = dentry; ++ args->inode = inode; ++ args->sb = dentry->d_sb; ++ ++ err = -ENOENT; ++ dmsg = !!(args->mvdown.flags & AUFS_MVDOWN_DMSG); ++ args->parent = dget_parent(dentry); ++ args->dir = d_inode(args->parent); ++ inode_lock_nested(args->dir, I_MUTEX_PARENT); ++ dput(args->parent); ++ if (unlikely(args->parent != dentry->d_parent)) { ++ AU_MVD_PR(dmsg, "parent dir is moved\n"); ++ goto out_dir; ++ } ++ ++ inode_lock_nested(inode, I_MUTEX_CHILD); ++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW); ++ if (unlikely(err)) ++ goto out_inode; ++ ++ di_write_lock_parent(args->parent); ++ err = au_mvd_args(dmsg, args); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ err = au_do_mvdown(dmsg, args); ++ if (unlikely(err)) ++ goto out_parent; ++ ++ au_cpup_attr_timesizes(args->dir); ++ au_cpup_attr_timesizes(inode); ++ if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER)) ++ au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst)); ++ /* au_digen_dec(dentry); */ ++ ++out_parent: ++ di_write_unlock(args->parent); ++ aufs_read_unlock(dentry, AuLock_DW); ++out_inode: ++ inode_unlock(inode); ++out_dir: ++ inode_unlock(args->dir); ++out_free: ++ e = copy_to_user(uarg, &args->mvdown, sizeof(args->mvdown)); ++ if (unlikely(e)) ++ err = -EFAULT; ++ kfree(args); ++out: ++ AuTraceErr(err); ++ return err; ++} +diff -Naur null/fs/aufs/opts.c linux-4.15/fs/aufs/opts.c +--- /dev/null ++++ linux-4.15/fs/aufs/opts.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,1891 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * mount options/flags ++ */ ++ ++#include ++#include /* a distribution requires */ ++#include ++#include "aufs.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++enum { ++ Opt_br, ++ Opt_add, Opt_del, Opt_mod, Opt_append, Opt_prepend, ++ Opt_idel, Opt_imod, ++ Opt_dirwh, Opt_rdcache, Opt_rdblk, Opt_rdhash, ++ Opt_rdblk_def, Opt_rdhash_def, ++ Opt_xino, Opt_noxino, ++ Opt_trunc_xino, Opt_trunc_xino_v, Opt_notrunc_xino, ++ Opt_trunc_xino_path, Opt_itrunc_xino, ++ Opt_trunc_xib, Opt_notrunc_xib, ++ Opt_shwh, Opt_noshwh, ++ Opt_plink, Opt_noplink, Opt_list_plink, ++ Opt_udba, ++ Opt_dio, Opt_nodio, ++ Opt_diropq_a, Opt_diropq_w, ++ Opt_warn_perm, Opt_nowarn_perm, ++ Opt_wbr_copyup, Opt_wbr_create, ++ Opt_fhsm_sec, ++ Opt_verbose, Opt_noverbose, ++ Opt_sum, Opt_nosum, Opt_wsum, ++ Opt_dirperm1, Opt_nodirperm1, ++ Opt_dirren, Opt_nodirren, ++ Opt_acl, Opt_noacl, ++ Opt_tail, Opt_ignore, Opt_ignore_silent, Opt_err ++}; ++ ++static match_table_t options = { ++ {Opt_br, "br=%s"}, ++ {Opt_br, "br:%s"}, ++ ++ {Opt_add, "add=%d:%s"}, ++ {Opt_add, "add:%d:%s"}, ++ {Opt_add, "ins=%d:%s"}, ++ {Opt_add, "ins:%d:%s"}, ++ {Opt_append, "append=%s"}, ++ {Opt_append, "append:%s"}, ++ {Opt_prepend, "prepend=%s"}, ++ {Opt_prepend, "prepend:%s"}, ++ ++ {Opt_del, "del=%s"}, ++ {Opt_del, "del:%s"}, ++ /* {Opt_idel, "idel:%d"}, */ ++ {Opt_mod, "mod=%s"}, ++ {Opt_mod, "mod:%s"}, ++ /* {Opt_imod, "imod:%d:%s"}, */ ++ ++ {Opt_dirwh, "dirwh=%d"}, ++ ++ {Opt_xino, "xino=%s"}, ++ {Opt_noxino, "noxino"}, ++ {Opt_trunc_xino, "trunc_xino"}, ++ {Opt_trunc_xino_v, "trunc_xino_v=%d:%d"}, ++ {Opt_notrunc_xino, "notrunc_xino"}, ++ {Opt_trunc_xino_path, "trunc_xino=%s"}, ++ {Opt_itrunc_xino, "itrunc_xino=%d"}, ++ /* {Opt_zxino, "zxino=%s"}, */ ++ {Opt_trunc_xib, "trunc_xib"}, ++ {Opt_notrunc_xib, "notrunc_xib"}, ++ ++#ifdef CONFIG_PROC_FS ++ {Opt_plink, "plink"}, ++#else ++ {Opt_ignore_silent, "plink"}, ++#endif ++ ++ {Opt_noplink, "noplink"}, ++ ++#ifdef CONFIG_AUFS_DEBUG ++ {Opt_list_plink, "list_plink"}, ++#endif ++ ++ {Opt_udba, "udba=%s"}, ++ ++ {Opt_dio, "dio"}, ++ {Opt_nodio, "nodio"}, ++ ++#ifdef CONFIG_AUFS_DIRREN ++ {Opt_dirren, "dirren"}, ++ {Opt_nodirren, "nodirren"}, ++#else ++ {Opt_ignore, "dirren"}, ++ {Opt_ignore_silent, "nodirren"}, ++#endif ++ ++#ifdef CONFIG_AUFS_FHSM ++ {Opt_fhsm_sec, "fhsm_sec=%d"}, ++#else ++ {Opt_ignore, "fhsm_sec=%d"}, ++#endif ++ ++ {Opt_diropq_a, "diropq=always"}, ++ {Opt_diropq_a, "diropq=a"}, ++ {Opt_diropq_w, "diropq=whiteouted"}, ++ {Opt_diropq_w, "diropq=w"}, ++ ++ {Opt_warn_perm, "warn_perm"}, ++ {Opt_nowarn_perm, "nowarn_perm"}, ++ ++ /* keep them temporary */ ++ {Opt_ignore_silent, "nodlgt"}, ++ {Opt_ignore, "clean_plink"}, ++ ++#ifdef CONFIG_AUFS_SHWH ++ {Opt_shwh, "shwh"}, ++#endif ++ {Opt_noshwh, "noshwh"}, ++ ++ {Opt_dirperm1, "dirperm1"}, ++ {Opt_nodirperm1, "nodirperm1"}, ++ ++ {Opt_verbose, "verbose"}, ++ {Opt_verbose, "v"}, ++ {Opt_noverbose, "noverbose"}, ++ {Opt_noverbose, "quiet"}, ++ {Opt_noverbose, "q"}, ++ {Opt_noverbose, "silent"}, ++ ++ {Opt_sum, "sum"}, ++ {Opt_nosum, "nosum"}, ++ {Opt_wsum, "wsum"}, ++ ++ {Opt_rdcache, "rdcache=%d"}, ++ {Opt_rdblk, "rdblk=%d"}, ++ {Opt_rdblk_def, "rdblk=def"}, ++ {Opt_rdhash, "rdhash=%d"}, ++ {Opt_rdhash_def, "rdhash=def"}, ++ ++ {Opt_wbr_create, "create=%s"}, ++ {Opt_wbr_create, "create_policy=%s"}, ++ {Opt_wbr_copyup, "cpup=%s"}, ++ {Opt_wbr_copyup, "copyup=%s"}, ++ {Opt_wbr_copyup, "copyup_policy=%s"}, ++ ++ /* generic VFS flag */ ++#ifdef CONFIG_FS_POSIX_ACL ++ {Opt_acl, "acl"}, ++ {Opt_noacl, "noacl"}, ++#else ++ {Opt_ignore, "acl"}, ++ {Opt_ignore_silent, "noacl"}, ++#endif ++ ++ /* internal use for the scripts */ ++ {Opt_ignore_silent, "si=%s"}, ++ ++ {Opt_br, "dirs=%s"}, ++ {Opt_ignore, "debug=%d"}, ++ {Opt_ignore, "delete=whiteout"}, ++ {Opt_ignore, "delete=all"}, ++ {Opt_ignore, "imap=%s"}, ++ ++ /* temporary workaround, due to old mount(8)? */ ++ {Opt_ignore_silent, "relatime"}, ++ ++ {Opt_err, NULL} ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const char *au_parser_pattern(int val, match_table_t tbl) ++{ ++ struct match_token *p; ++ ++ p = tbl; ++ while (p->pattern) { ++ if (p->token == val) ++ return p->pattern; ++ p++; ++ } ++ BUG(); ++ return "??"; ++} ++ ++static const char *au_optstr(int *val, match_table_t tbl) ++{ ++ struct match_token *p; ++ int v; ++ ++ v = *val; ++ if (!v) ++ goto out; ++ p = tbl; ++ while (p->pattern) { ++ if (p->token ++ && (v & p->token) == p->token) { ++ *val &= ~p->token; ++ return p->pattern; ++ } ++ p++; ++ } ++ ++out: ++ return NULL; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t brperm = { ++ {AuBrPerm_RO, AUFS_BRPERM_RO}, ++ {AuBrPerm_RR, AUFS_BRPERM_RR}, ++ {AuBrPerm_RW, AUFS_BRPERM_RW}, ++ {0, NULL} ++}; ++ ++static match_table_t brattr = { ++ /* general */ ++ {AuBrAttr_COO_REG, AUFS_BRATTR_COO_REG}, ++ {AuBrAttr_COO_ALL, AUFS_BRATTR_COO_ALL}, ++ /* 'unpin' attrib is meaningless since linux-3.18-rc1 */ ++ {AuBrAttr_UNPIN, AUFS_BRATTR_UNPIN}, ++#ifdef CONFIG_AUFS_FHSM ++ {AuBrAttr_FHSM, AUFS_BRATTR_FHSM}, ++#endif ++#ifdef CONFIG_AUFS_XATTR ++ {AuBrAttr_ICEX, AUFS_BRATTR_ICEX}, ++ {AuBrAttr_ICEX_SEC, AUFS_BRATTR_ICEX_SEC}, ++ {AuBrAttr_ICEX_SYS, AUFS_BRATTR_ICEX_SYS}, ++ {AuBrAttr_ICEX_TR, AUFS_BRATTR_ICEX_TR}, ++ {AuBrAttr_ICEX_USR, AUFS_BRATTR_ICEX_USR}, ++ {AuBrAttr_ICEX_OTH, AUFS_BRATTR_ICEX_OTH}, ++#endif ++ ++ /* ro/rr branch */ ++ {AuBrRAttr_WH, AUFS_BRRATTR_WH}, ++ ++ /* rw branch */ ++ {AuBrWAttr_MOO, AUFS_BRWATTR_MOO}, ++ {AuBrWAttr_NoLinkWH, AUFS_BRWATTR_NLWH}, ++ ++ {0, NULL} ++}; ++ ++static int br_attr_val(char *str, match_table_t table, substring_t args[]) ++{ ++ int attr, v; ++ char *p; ++ ++ attr = 0; ++ do { ++ p = strchr(str, '+'); ++ if (p) ++ *p = 0; ++ v = match_token(str, table, args); ++ if (v) { ++ if (v & AuBrAttr_CMOO_Mask) ++ attr &= ~AuBrAttr_CMOO_Mask; ++ attr |= v; ++ } else { ++ if (p) ++ *p = '+'; ++ pr_warn("ignored branch attribute %s\n", str); ++ break; ++ } ++ if (p) ++ str = p + 1; ++ } while (p); ++ ++ return attr; ++} ++ ++static int au_do_optstr_br_attr(au_br_perm_str_t *str, int perm) ++{ ++ int sz; ++ const char *p; ++ char *q; ++ ++ q = str->a; ++ *q = 0; ++ p = au_optstr(&perm, brattr); ++ if (p) { ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ } else ++ goto out; ++ ++ do { ++ p = au_optstr(&perm, brattr); ++ if (p) { ++ *q++ = '+'; ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ } ++ } while (p); ++ ++out: ++ return q - str->a; ++} ++ ++static int noinline_for_stack br_perm_val(char *perm) ++{ ++ int val, bad, sz; ++ char *p; ++ substring_t args[MAX_OPT_ARGS]; ++ au_br_perm_str_t attr; ++ ++ p = strchr(perm, '+'); ++ if (p) ++ *p = 0; ++ val = match_token(perm, brperm, args); ++ if (!val) { ++ if (p) ++ *p = '+'; ++ pr_warn("ignored branch permission %s\n", perm); ++ val = AuBrPerm_RO; ++ goto out; ++ } ++ if (!p) ++ goto out; ++ ++ val |= br_attr_val(p + 1, brattr, args); ++ ++ bad = 0; ++ switch (val & AuBrPerm_Mask) { ++ case AuBrPerm_RO: ++ case AuBrPerm_RR: ++ bad = val & AuBrWAttr_Mask; ++ val &= ~AuBrWAttr_Mask; ++ break; ++ case AuBrPerm_RW: ++ bad = val & AuBrRAttr_Mask; ++ val &= ~AuBrRAttr_Mask; ++ break; ++ } ++ ++ /* ++ * 'unpin' attrib becomes meaningless since linux-3.18-rc1, but aufs ++ * does not treat it as an error, just warning. ++ * this is a tiny guard for the user operation. ++ */ ++ if (val & AuBrAttr_UNPIN) { ++ bad |= AuBrAttr_UNPIN; ++ val &= ~AuBrAttr_UNPIN; ++ } ++ ++ if (unlikely(bad)) { ++ sz = au_do_optstr_br_attr(&attr, bad); ++ AuDebugOn(!sz); ++ pr_warn("ignored branch attribute %s\n", attr.a); ++ } ++ ++out: ++ return val; ++} ++ ++void au_optstr_br_perm(au_br_perm_str_t *str, int perm) ++{ ++ au_br_perm_str_t attr; ++ const char *p; ++ char *q; ++ int sz; ++ ++ q = str->a; ++ p = au_optstr(&perm, brperm); ++ AuDebugOn(!p || !*p); ++ sz = strlen(p); ++ memcpy(q, p, sz + 1); ++ q += sz; ++ ++ sz = au_do_optstr_br_attr(&attr, perm); ++ if (sz) { ++ *q++ = '+'; ++ memcpy(q, attr.a, sz + 1); ++ } ++ ++ AuDebugOn(strlen(str->a) >= sizeof(str->a)); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t udbalevel = { ++ {AuOpt_UDBA_REVAL, "reval"}, ++ {AuOpt_UDBA_NONE, "none"}, ++#ifdef CONFIG_AUFS_HNOTIFY ++ {AuOpt_UDBA_HNOTIFY, "notify"}, /* abstraction */ ++#ifdef CONFIG_AUFS_HFSNOTIFY ++ {AuOpt_UDBA_HNOTIFY, "fsnotify"}, ++#endif ++#endif ++ {-1, NULL} ++}; ++ ++static int noinline_for_stack udba_val(char *str) ++{ ++ substring_t args[MAX_OPT_ARGS]; ++ ++ return match_token(str, udbalevel, args); ++} ++ ++const char *au_optstr_udba(int udba) ++{ ++ return au_parser_pattern(udba, udbalevel); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static match_table_t au_wbr_create_policy = { ++ {AuWbrCreate_TDP, "tdp"}, ++ {AuWbrCreate_TDP, "top-down-parent"}, ++ {AuWbrCreate_RR, "rr"}, ++ {AuWbrCreate_RR, "round-robin"}, ++ {AuWbrCreate_MFS, "mfs"}, ++ {AuWbrCreate_MFS, "most-free-space"}, ++ {AuWbrCreate_MFSV, "mfs:%d"}, ++ {AuWbrCreate_MFSV, "most-free-space:%d"}, ++ ++ /* top-down regardless the parent, and then mfs */ ++ {AuWbrCreate_TDMFS, "tdmfs:%d"}, ++ {AuWbrCreate_TDMFSV, "tdmfs:%d:%d"}, ++ ++ {AuWbrCreate_MFSRR, "mfsrr:%d"}, ++ {AuWbrCreate_MFSRRV, "mfsrr:%d:%d"}, ++ {AuWbrCreate_PMFS, "pmfs"}, ++ {AuWbrCreate_PMFSV, "pmfs:%d"}, ++ {AuWbrCreate_PMFSRR, "pmfsrr:%d"}, ++ {AuWbrCreate_PMFSRRV, "pmfsrr:%d:%d"}, ++ ++ {-1, NULL} ++}; ++ ++static int au_wbr_mfs_wmark(substring_t *arg, char *str, ++ struct au_opt_wbr_create *create) ++{ ++ int err; ++ unsigned long long ull; ++ ++ err = 0; ++ if (!match_u64(arg, &ull)) ++ create->mfsrr_watermark = ull; ++ else { ++ pr_err("bad integer in %s\n", str); ++ err = -EINVAL; ++ } ++ ++ return err; ++} ++ ++static int au_wbr_mfs_sec(substring_t *arg, char *str, ++ struct au_opt_wbr_create *create) ++{ ++ int n, err; ++ ++ err = 0; ++ if (!match_int(arg, &n) && 0 <= n && n <= AUFS_MFS_MAX_SEC) ++ create->mfs_second = n; ++ else { ++ pr_err("bad integer in %s\n", str); ++ err = -EINVAL; ++ } ++ ++ return err; ++} ++ ++static int noinline_for_stack ++au_wbr_create_val(char *str, struct au_opt_wbr_create *create) ++{ ++ int err, e; ++ substring_t args[MAX_OPT_ARGS]; ++ ++ err = match_token(str, au_wbr_create_policy, args); ++ create->wbr_create = err; ++ switch (err) { ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ e = au_wbr_mfs_wmark(&args[0], str, create); ++ if (!e) ++ e = au_wbr_mfs_sec(&args[1], str, create); ++ if (unlikely(e)) ++ err = e; ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_PMFSRR: ++ e = au_wbr_mfs_wmark(&args[0], str, create); ++ if (unlikely(e)) { ++ err = e; ++ break; ++ } ++ /*FALLTHROUGH*/ ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_PMFS: ++ create->mfs_second = AUFS_MFS_DEF_SEC; ++ break; ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ e = au_wbr_mfs_sec(&args[0], str, create); ++ if (unlikely(e)) ++ err = e; ++ break; ++ } ++ ++ return err; ++} ++ ++const char *au_optstr_wbr_create(int wbr_create) ++{ ++ return au_parser_pattern(wbr_create, au_wbr_create_policy); ++} ++ ++static match_table_t au_wbr_copyup_policy = { ++ {AuWbrCopyup_TDP, "tdp"}, ++ {AuWbrCopyup_TDP, "top-down-parent"}, ++ {AuWbrCopyup_BUP, "bup"}, ++ {AuWbrCopyup_BUP, "bottom-up-parent"}, ++ {AuWbrCopyup_BU, "bu"}, ++ {AuWbrCopyup_BU, "bottom-up"}, ++ {-1, NULL} ++}; ++ ++static int noinline_for_stack au_wbr_copyup_val(char *str) ++{ ++ substring_t args[MAX_OPT_ARGS]; ++ ++ return match_token(str, au_wbr_copyup_policy, args); ++} ++ ++const char *au_optstr_wbr_copyup(int wbr_copyup) ++{ ++ return au_parser_pattern(wbr_copyup, au_wbr_copyup_policy); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static const int lkup_dirflags = LOOKUP_FOLLOW | LOOKUP_DIRECTORY; ++ ++static void dump_opts(struct au_opts *opts) ++{ ++#ifdef CONFIG_AUFS_DEBUG ++ /* reduce stack space */ ++ union { ++ struct au_opt_add *add; ++ struct au_opt_del *del; ++ struct au_opt_mod *mod; ++ struct au_opt_xino *xino; ++ struct au_opt_xino_itrunc *xino_itrunc; ++ struct au_opt_wbr_create *create; ++ } u; ++ struct au_opt *opt; ++ ++ opt = opts->opt; ++ while (opt->type != Opt_tail) { ++ switch (opt->type) { ++ case Opt_add: ++ u.add = &opt->add; ++ AuDbg("add {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_del: ++ case Opt_idel: ++ u.del = &opt->del; ++ AuDbg("del {%s, %p}\n", ++ u.del->pathname, u.del->h_path.dentry); ++ break; ++ case Opt_mod: ++ case Opt_imod: ++ u.mod = &opt->mod; ++ AuDbg("mod {%s, 0x%x, %p}\n", ++ u.mod->path, u.mod->perm, u.mod->h_root); ++ break; ++ case Opt_append: ++ u.add = &opt->add; ++ AuDbg("append {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_prepend: ++ u.add = &opt->add; ++ AuDbg("prepend {b%d, %s, 0x%x, %p}\n", ++ u.add->bindex, u.add->pathname, u.add->perm, ++ u.add->path.dentry); ++ break; ++ case Opt_dirwh: ++ AuDbg("dirwh %d\n", opt->dirwh); ++ break; ++ case Opt_rdcache: ++ AuDbg("rdcache %d\n", opt->rdcache); ++ break; ++ case Opt_rdblk: ++ AuDbg("rdblk %u\n", opt->rdblk); ++ break; ++ case Opt_rdblk_def: ++ AuDbg("rdblk_def\n"); ++ break; ++ case Opt_rdhash: ++ AuDbg("rdhash %u\n", opt->rdhash); ++ break; ++ case Opt_rdhash_def: ++ AuDbg("rdhash_def\n"); ++ break; ++ case Opt_xino: ++ u.xino = &opt->xino; ++ AuDbg("xino {%s %pD}\n", u.xino->path, u.xino->file); ++ break; ++ case Opt_trunc_xino: ++ AuLabel(trunc_xino); ++ break; ++ case Opt_notrunc_xino: ++ AuLabel(notrunc_xino); ++ break; ++ case Opt_trunc_xino_path: ++ case Opt_itrunc_xino: ++ u.xino_itrunc = &opt->xino_itrunc; ++ AuDbg("trunc_xino %d\n", u.xino_itrunc->bindex); ++ break; ++ case Opt_noxino: ++ AuLabel(noxino); ++ break; ++ case Opt_trunc_xib: ++ AuLabel(trunc_xib); ++ break; ++ case Opt_notrunc_xib: ++ AuLabel(notrunc_xib); ++ break; ++ case Opt_shwh: ++ AuLabel(shwh); ++ break; ++ case Opt_noshwh: ++ AuLabel(noshwh); ++ break; ++ case Opt_dirperm1: ++ AuLabel(dirperm1); ++ break; ++ case Opt_nodirperm1: ++ AuLabel(nodirperm1); ++ break; ++ case Opt_plink: ++ AuLabel(plink); ++ break; ++ case Opt_noplink: ++ AuLabel(noplink); ++ break; ++ case Opt_list_plink: ++ AuLabel(list_plink); ++ break; ++ case Opt_udba: ++ AuDbg("udba %d, %s\n", ++ opt->udba, au_optstr_udba(opt->udba)); ++ break; ++ case Opt_dio: ++ AuLabel(dio); ++ break; ++ case Opt_nodio: ++ AuLabel(nodio); ++ break; ++ case Opt_diropq_a: ++ AuLabel(diropq_a); ++ break; ++ case Opt_diropq_w: ++ AuLabel(diropq_w); ++ break; ++ case Opt_warn_perm: ++ AuLabel(warn_perm); ++ break; ++ case Opt_nowarn_perm: ++ AuLabel(nowarn_perm); ++ break; ++ case Opt_verbose: ++ AuLabel(verbose); ++ break; ++ case Opt_noverbose: ++ AuLabel(noverbose); ++ break; ++ case Opt_sum: ++ AuLabel(sum); ++ break; ++ case Opt_nosum: ++ AuLabel(nosum); ++ break; ++ case Opt_wsum: ++ AuLabel(wsum); ++ break; ++ case Opt_wbr_create: ++ u.create = &opt->wbr_create; ++ AuDbg("create %d, %s\n", u.create->wbr_create, ++ au_optstr_wbr_create(u.create->wbr_create)); ++ switch (u.create->wbr_create) { ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ AuDbg("%d sec\n", u.create->mfs_second); ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ AuDbg("%llu watermark\n", ++ u.create->mfsrr_watermark); ++ break; ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ AuDbg("%llu watermark, %d sec\n", ++ u.create->mfsrr_watermark, ++ u.create->mfs_second); ++ break; ++ } ++ break; ++ case Opt_wbr_copyup: ++ AuDbg("copyup %d, %s\n", opt->wbr_copyup, ++ au_optstr_wbr_copyup(opt->wbr_copyup)); ++ break; ++ case Opt_fhsm_sec: ++ AuDbg("fhsm_sec %u\n", opt->fhsm_second); ++ break; ++ case Opt_dirren: ++ AuLabel(dirren); ++ break; ++ case Opt_nodirren: ++ AuLabel(nodirren); ++ break; ++ case Opt_acl: ++ AuLabel(acl); ++ break; ++ case Opt_noacl: ++ AuLabel(noacl); ++ break; ++ default: ++ BUG(); ++ } ++ opt++; ++ } ++#endif ++} ++ ++void au_opts_free(struct au_opts *opts) ++{ ++ struct au_opt *opt; ++ ++ opt = opts->opt; ++ while (opt->type != Opt_tail) { ++ switch (opt->type) { ++ case Opt_add: ++ case Opt_append: ++ case Opt_prepend: ++ path_put(&opt->add.path); ++ break; ++ case Opt_del: ++ case Opt_idel: ++ path_put(&opt->del.h_path); ++ break; ++ case Opt_mod: ++ case Opt_imod: ++ dput(opt->mod.h_root); ++ break; ++ case Opt_xino: ++ fput(opt->xino.file); ++ break; ++ } ++ opt++; ++ } ++} ++ ++static int opt_add(struct au_opt *opt, char *opt_str, unsigned long sb_flags, ++ aufs_bindex_t bindex) ++{ ++ int err; ++ struct au_opt_add *add = &opt->add; ++ char *p; ++ ++ add->bindex = bindex; ++ add->perm = AuBrPerm_RO; ++ add->pathname = opt_str; ++ p = strchr(opt_str, '='); ++ if (p) { ++ *p++ = 0; ++ if (*p) ++ add->perm = br_perm_val(p); ++ } ++ ++ err = vfsub_kern_path(add->pathname, lkup_dirflags, &add->path); ++ if (!err) { ++ if (!p) { ++ add->perm = AuBrPerm_RO; ++ if (au_test_fs_rr(add->path.dentry->d_sb)) ++ add->perm = AuBrPerm_RR; ++ else if (!bindex && !(sb_flags & SB_RDONLY)) ++ add->perm = AuBrPerm_RW; ++ } ++ opt->type = Opt_add; ++ goto out; ++ } ++ pr_err("lookup failed %s (%d)\n", add->pathname, err); ++ err = -EINVAL; ++ ++out: ++ return err; ++} ++ ++static int au_opts_parse_del(struct au_opt_del *del, substring_t args[]) ++{ ++ int err; ++ ++ del->pathname = args[0].from; ++ AuDbg("del path %s\n", del->pathname); ++ ++ err = vfsub_kern_path(del->pathname, lkup_dirflags, &del->h_path); ++ if (unlikely(err)) ++ pr_err("lookup failed %s (%d)\n", del->pathname, err); ++ ++ return err; ++} ++ ++#if 0 /* reserved for future use */ ++static int au_opts_parse_idel(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_opt_del *del, substring_t args[]) ++{ ++ int err; ++ struct dentry *root; ++ ++ err = -EINVAL; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (bindex < 0 || au_sbbot(sb) < bindex) { ++ pr_err("out of bounds, %d\n", bindex); ++ goto out; ++ } ++ ++ err = 0; ++ del->h_path.dentry = dget(au_h_dptr(root, bindex)); ++ del->h_path.mnt = mntget(au_sbr_mnt(sb, bindex)); ++ ++out: ++ aufs_read_unlock(root, !AuLock_IR); ++ return err; ++} ++#endif ++ ++static int noinline_for_stack ++au_opts_parse_mod(struct au_opt_mod *mod, substring_t args[]) ++{ ++ int err; ++ struct path path; ++ char *p; ++ ++ err = -EINVAL; ++ mod->path = args[0].from; ++ p = strchr(mod->path, '='); ++ if (unlikely(!p)) { ++ pr_err("no permssion %s\n", args[0].from); ++ goto out; ++ } ++ ++ *p++ = 0; ++ err = vfsub_kern_path(mod->path, lkup_dirflags, &path); ++ if (unlikely(err)) { ++ pr_err("lookup failed %s (%d)\n", mod->path, err); ++ goto out; ++ } ++ ++ mod->perm = br_perm_val(p); ++ AuDbg("mod path %s, perm 0x%x, %s\n", mod->path, mod->perm, p); ++ mod->h_root = dget(path.dentry); ++ path_put(&path); ++ ++out: ++ return err; ++} ++ ++#if 0 /* reserved for future use */ ++static int au_opts_parse_imod(struct super_block *sb, aufs_bindex_t bindex, ++ struct au_opt_mod *mod, substring_t args[]) ++{ ++ int err; ++ struct dentry *root; ++ ++ err = -EINVAL; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (bindex < 0 || au_sbbot(sb) < bindex) { ++ pr_err("out of bounds, %d\n", bindex); ++ goto out; ++ } ++ ++ err = 0; ++ mod->perm = br_perm_val(args[1].from); ++ AuDbg("mod path %s, perm 0x%x, %s\n", ++ mod->path, mod->perm, args[1].from); ++ mod->h_root = dget(au_h_dptr(root, bindex)); ++ ++out: ++ aufs_read_unlock(root, !AuLock_IR); ++ return err; ++} ++#endif ++ ++static int au_opts_parse_xino(struct super_block *sb, struct au_opt_xino *xino, ++ substring_t args[]) ++{ ++ int err; ++ struct file *file; ++ ++ file = au_xino_create(sb, args[0].from, /*silent*/0); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(file->f_path.dentry->d_sb == sb)) { ++ fput(file); ++ pr_err("%s must be outside\n", args[0].from); ++ goto out; ++ } ++ ++ err = 0; ++ xino->file = file; ++ xino->path = args[0].from; ++ ++out: ++ return err; ++} ++ ++static int noinline_for_stack ++au_opts_parse_xino_itrunc_path(struct super_block *sb, ++ struct au_opt_xino_itrunc *xino_itrunc, ++ substring_t args[]) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct path path; ++ struct dentry *root; ++ ++ err = vfsub_kern_path(args[0].from, lkup_dirflags, &path); ++ if (unlikely(err)) { ++ pr_err("lookup failed %s (%d)\n", args[0].from, err); ++ goto out; ++ } ++ ++ xino_itrunc->bindex = -1; ++ root = sb->s_root; ++ aufs_read_lock(root, AuLock_FLUSH); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ if (au_h_dptr(root, bindex) == path.dentry) { ++ xino_itrunc->bindex = bindex; ++ break; ++ } ++ } ++ aufs_read_unlock(root, !AuLock_IR); ++ path_put(&path); ++ ++ if (unlikely(xino_itrunc->bindex < 0)) { ++ pr_err("no such branch %s\n", args[0].from); ++ err = -EINVAL; ++ } ++ ++out: ++ return err; ++} ++ ++/* called without aufs lock */ ++int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts) ++{ ++ int err, n, token; ++ aufs_bindex_t bindex; ++ unsigned char skipped; ++ struct dentry *root; ++ struct au_opt *opt, *opt_tail; ++ char *opt_str; ++ /* reduce the stack space */ ++ union { ++ struct au_opt_xino_itrunc *xino_itrunc; ++ struct au_opt_wbr_create *create; ++ } u; ++ struct { ++ substring_t args[MAX_OPT_ARGS]; ++ } *a; ++ ++ err = -ENOMEM; ++ a = kmalloc(sizeof(*a), GFP_NOFS); ++ if (unlikely(!a)) ++ goto out; ++ ++ root = sb->s_root; ++ err = 0; ++ bindex = 0; ++ opt = opts->opt; ++ opt_tail = opt + opts->max_opt - 1; ++ opt->type = Opt_tail; ++ while (!err && (opt_str = strsep(&str, ",")) && *opt_str) { ++ err = -EINVAL; ++ skipped = 0; ++ token = match_token(opt_str, options, a->args); ++ switch (token) { ++ case Opt_br: ++ err = 0; ++ while (!err && (opt_str = strsep(&a->args[0].from, ":")) ++ && *opt_str) { ++ err = opt_add(opt, opt_str, opts->sb_flags, ++ bindex++); ++ if (unlikely(!err && ++opt > opt_tail)) { ++ err = -E2BIG; ++ break; ++ } ++ opt->type = Opt_tail; ++ skipped = 1; ++ } ++ break; ++ case Opt_add: ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ bindex = n; ++ err = opt_add(opt, a->args[1].from, opts->sb_flags, ++ bindex); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_append: ++ err = opt_add(opt, a->args[0].from, opts->sb_flags, ++ /*dummy bindex*/1); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_prepend: ++ err = opt_add(opt, a->args[0].from, opts->sb_flags, ++ /*bindex*/0); ++ if (!err) ++ opt->type = token; ++ break; ++ case Opt_del: ++ err = au_opts_parse_del(&opt->del, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#if 0 /* reserved for future use */ ++ case Opt_idel: ++ del->pathname = "(indexed)"; ++ if (unlikely(match_int(&args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ err = au_opts_parse_idel(sb, n, &opt->del, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#endif ++ case Opt_mod: ++ err = au_opts_parse_mod(&opt->mod, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#ifdef IMOD /* reserved for future use */ ++ case Opt_imod: ++ u.mod->path = "(indexed)"; ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ err = au_opts_parse_imod(sb, n, &opt->mod, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++#endif ++ case Opt_xino: ++ err = au_opts_parse_xino(sb, &opt->xino, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++ ++ case Opt_trunc_xino_path: ++ err = au_opts_parse_xino_itrunc_path ++ (sb, &opt->xino_itrunc, a->args); ++ if (!err) ++ opt->type = token; ++ break; ++ ++ case Opt_itrunc_xino: ++ u.xino_itrunc = &opt->xino_itrunc; ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ u.xino_itrunc->bindex = n; ++ aufs_read_lock(root, AuLock_FLUSH); ++ if (n < 0 || au_sbbot(sb) < n) { ++ pr_err("out of bounds, %d\n", n); ++ aufs_read_unlock(root, !AuLock_IR); ++ break; ++ } ++ aufs_read_unlock(root, !AuLock_IR); ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_dirwh: ++ if (unlikely(match_int(&a->args[0], &opt->dirwh))) ++ break; ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_rdcache: ++ if (unlikely(match_int(&a->args[0], &n))) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (unlikely(n > AUFS_RDCACHE_MAX)) { ++ pr_err("rdcache must be smaller than %d\n", ++ AUFS_RDCACHE_MAX); ++ break; ++ } ++ opt->rdcache = n; ++ err = 0; ++ opt->type = token; ++ break; ++ case Opt_rdblk: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0 ++ || n > KMALLOC_MAX_SIZE)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (unlikely(n && n < NAME_MAX)) { ++ pr_err("rdblk must be larger than %d\n", ++ NAME_MAX); ++ break; ++ } ++ opt->rdblk = n; ++ err = 0; ++ opt->type = token; ++ break; ++ case Opt_rdhash: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0 ++ || n * sizeof(struct hlist_head) ++ > KMALLOC_MAX_SIZE)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ opt->rdhash = n; ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_trunc_xino: ++ case Opt_notrunc_xino: ++ case Opt_noxino: ++ case Opt_trunc_xib: ++ case Opt_notrunc_xib: ++ case Opt_shwh: ++ case Opt_noshwh: ++ case Opt_dirperm1: ++ case Opt_nodirperm1: ++ case Opt_plink: ++ case Opt_noplink: ++ case Opt_list_plink: ++ case Opt_dio: ++ case Opt_nodio: ++ case Opt_diropq_a: ++ case Opt_diropq_w: ++ case Opt_warn_perm: ++ case Opt_nowarn_perm: ++ case Opt_verbose: ++ case Opt_noverbose: ++ case Opt_sum: ++ case Opt_nosum: ++ case Opt_wsum: ++ case Opt_rdblk_def: ++ case Opt_rdhash_def: ++ case Opt_dirren: ++ case Opt_nodirren: ++ case Opt_acl: ++ case Opt_noacl: ++ err = 0; ++ opt->type = token; ++ break; ++ ++ case Opt_udba: ++ opt->udba = udba_val(a->args[0].from); ++ if (opt->udba >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ ++ case Opt_wbr_create: ++ u.create = &opt->wbr_create; ++ u.create->wbr_create ++ = au_wbr_create_val(a->args[0].from, u.create); ++ if (u.create->wbr_create >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ case Opt_wbr_copyup: ++ opt->wbr_copyup = au_wbr_copyup_val(a->args[0].from); ++ if (opt->wbr_copyup >= 0) { ++ err = 0; ++ opt->type = token; ++ } else ++ pr_err("wrong value, %s\n", opt_str); ++ break; ++ ++ case Opt_fhsm_sec: ++ if (unlikely(match_int(&a->args[0], &n) ++ || n < 0)) { ++ pr_err("bad integer in %s\n", opt_str); ++ break; ++ } ++ if (sysaufs_brs) { ++ opt->fhsm_second = n; ++ opt->type = token; ++ } else ++ pr_warn("ignored %s\n", opt_str); ++ err = 0; ++ break; ++ ++ case Opt_ignore: ++ pr_warn("ignored %s\n", opt_str); ++ /*FALLTHROUGH*/ ++ case Opt_ignore_silent: ++ skipped = 1; ++ err = 0; ++ break; ++ case Opt_err: ++ pr_err("unknown option %s\n", opt_str); ++ break; ++ } ++ ++ if (!err && !skipped) { ++ if (unlikely(++opt > opt_tail)) { ++ err = -E2BIG; ++ opt--; ++ opt->type = Opt_tail; ++ break; ++ } ++ opt->type = Opt_tail; ++ } ++ } ++ ++ kfree(a); ++ dump_opts(opts); ++ if (unlikely(err)) ++ au_opts_free(opts); ++ ++out: ++ return err; ++} ++ ++static int au_opt_wbr_create(struct super_block *sb, ++ struct au_opt_wbr_create *create) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = 1; /* handled */ ++ sbinfo = au_sbi(sb); ++ if (sbinfo->si_wbr_create_ops->fin) { ++ err = sbinfo->si_wbr_create_ops->fin(sb); ++ if (!err) ++ err = 1; ++ } ++ ++ sbinfo->si_wbr_create = create->wbr_create; ++ sbinfo->si_wbr_create_ops = au_wbr_create_ops + create->wbr_create; ++ switch (create->wbr_create) { ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRR: ++ case AuWbrCreate_PMFSRRV: ++ sbinfo->si_wbr_mfs.mfsrr_watermark = create->mfsrr_watermark; ++ /*FALLTHROUGH*/ ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFS: ++ case AuWbrCreate_PMFSV: ++ sbinfo->si_wbr_mfs.mfs_expire ++ = msecs_to_jiffies(create->mfs_second * MSEC_PER_SEC); ++ break; ++ } ++ ++ if (sbinfo->si_wbr_create_ops->init) ++ sbinfo->si_wbr_create_ops->init(sb); /* ignore */ ++ ++ return err; ++} ++ ++/* ++ * returns, ++ * plus: processed without an error ++ * zero: unprocessed ++ */ ++static int au_opt_simple(struct super_block *sb, struct au_opt *opt, ++ struct au_opts *opts) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = 1; /* handled */ ++ sbinfo = au_sbi(sb); ++ switch (opt->type) { ++ case Opt_udba: ++ sbinfo->si_mntflags &= ~AuOptMask_UDBA; ++ sbinfo->si_mntflags |= opt->udba; ++ opts->given_udba |= opt->udba; ++ break; ++ ++ case Opt_plink: ++ au_opt_set(sbinfo->si_mntflags, PLINK); ++ break; ++ case Opt_noplink: ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_put(sb, /*verbose*/1); ++ au_opt_clr(sbinfo->si_mntflags, PLINK); ++ break; ++ case Opt_list_plink: ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_list(sb); ++ break; ++ ++ case Opt_dio: ++ au_opt_set(sbinfo->si_mntflags, DIO); ++ au_fset_opts(opts->flags, REFRESH_DYAOP); ++ break; ++ case Opt_nodio: ++ au_opt_clr(sbinfo->si_mntflags, DIO); ++ au_fset_opts(opts->flags, REFRESH_DYAOP); ++ break; ++ ++ case Opt_fhsm_sec: ++ au_fhsm_set(sbinfo, opt->fhsm_second); ++ break; ++ ++ case Opt_diropq_a: ++ au_opt_set(sbinfo->si_mntflags, ALWAYS_DIROPQ); ++ break; ++ case Opt_diropq_w: ++ au_opt_clr(sbinfo->si_mntflags, ALWAYS_DIROPQ); ++ break; ++ ++ case Opt_warn_perm: ++ au_opt_set(sbinfo->si_mntflags, WARN_PERM); ++ break; ++ case Opt_nowarn_perm: ++ au_opt_clr(sbinfo->si_mntflags, WARN_PERM); ++ break; ++ ++ case Opt_verbose: ++ au_opt_set(sbinfo->si_mntflags, VERBOSE); ++ break; ++ case Opt_noverbose: ++ au_opt_clr(sbinfo->si_mntflags, VERBOSE); ++ break; ++ ++ case Opt_sum: ++ au_opt_set(sbinfo->si_mntflags, SUM); ++ break; ++ case Opt_wsum: ++ au_opt_clr(sbinfo->si_mntflags, SUM); ++ au_opt_set(sbinfo->si_mntflags, SUM_W); ++ case Opt_nosum: ++ au_opt_clr(sbinfo->si_mntflags, SUM); ++ au_opt_clr(sbinfo->si_mntflags, SUM_W); ++ break; ++ ++ case Opt_wbr_create: ++ err = au_opt_wbr_create(sb, &opt->wbr_create); ++ break; ++ case Opt_wbr_copyup: ++ sbinfo->si_wbr_copyup = opt->wbr_copyup; ++ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + opt->wbr_copyup; ++ break; ++ ++ case Opt_dirwh: ++ sbinfo->si_dirwh = opt->dirwh; ++ break; ++ ++ case Opt_rdcache: ++ sbinfo->si_rdcache ++ = msecs_to_jiffies(opt->rdcache * MSEC_PER_SEC); ++ break; ++ case Opt_rdblk: ++ sbinfo->si_rdblk = opt->rdblk; ++ break; ++ case Opt_rdblk_def: ++ sbinfo->si_rdblk = AUFS_RDBLK_DEF; ++ break; ++ case Opt_rdhash: ++ sbinfo->si_rdhash = opt->rdhash; ++ break; ++ case Opt_rdhash_def: ++ sbinfo->si_rdhash = AUFS_RDHASH_DEF; ++ break; ++ ++ case Opt_shwh: ++ au_opt_set(sbinfo->si_mntflags, SHWH); ++ break; ++ case Opt_noshwh: ++ au_opt_clr(sbinfo->si_mntflags, SHWH); ++ break; ++ ++ case Opt_dirperm1: ++ au_opt_set(sbinfo->si_mntflags, DIRPERM1); ++ break; ++ case Opt_nodirperm1: ++ au_opt_clr(sbinfo->si_mntflags, DIRPERM1); ++ break; ++ ++ case Opt_trunc_xino: ++ au_opt_set(sbinfo->si_mntflags, TRUNC_XINO); ++ break; ++ case Opt_notrunc_xino: ++ au_opt_clr(sbinfo->si_mntflags, TRUNC_XINO); ++ break; ++ ++ case Opt_trunc_xino_path: ++ case Opt_itrunc_xino: ++ err = au_xino_trunc(sb, opt->xino_itrunc.bindex); ++ if (!err) ++ err = 1; ++ break; ++ ++ case Opt_trunc_xib: ++ au_fset_opts(opts->flags, TRUNC_XIB); ++ break; ++ case Opt_notrunc_xib: ++ au_fclr_opts(opts->flags, TRUNC_XIB); ++ break; ++ ++ case Opt_dirren: ++ err = 1; ++ if (!au_opt_test(sbinfo->si_mntflags, DIRREN)) { ++ err = au_dr_opt_set(sb); ++ if (!err) ++ err = 1; ++ } ++ if (err == 1) ++ au_opt_set(sbinfo->si_mntflags, DIRREN); ++ break; ++ case Opt_nodirren: ++ err = 1; ++ if (au_opt_test(sbinfo->si_mntflags, DIRREN)) { ++ err = au_dr_opt_clr(sb, au_ftest_opts(opts->flags, ++ DR_FLUSHED)); ++ if (!err) ++ err = 1; ++ } ++ if (err == 1) ++ au_opt_clr(sbinfo->si_mntflags, DIRREN); ++ break; ++ ++ case Opt_acl: ++ sb->s_flags |= SB_POSIXACL; ++ break; ++ case Opt_noacl: ++ sb->s_flags &= ~SB_POSIXACL; ++ break; ++ ++ default: ++ err = 0; ++ break; ++ } ++ ++ return err; ++} ++ ++/* ++ * returns tri-state. ++ * plus: processed without an error ++ * zero: unprocessed ++ * minus: error ++ */ ++static int au_opt_br(struct super_block *sb, struct au_opt *opt, ++ struct au_opts *opts) ++{ ++ int err, do_refresh; ++ ++ err = 0; ++ switch (opt->type) { ++ case Opt_append: ++ opt->add.bindex = au_sbbot(sb) + 1; ++ if (opt->add.bindex < 0) ++ opt->add.bindex = 0; ++ goto add; ++ case Opt_prepend: ++ opt->add.bindex = 0; ++ add: /* indented label */ ++ case Opt_add: ++ err = au_br_add(sb, &opt->add, ++ au_ftest_opts(opts->flags, REMOUNT)); ++ if (!err) { ++ err = 1; ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ ++ case Opt_del: ++ case Opt_idel: ++ err = au_br_del(sb, &opt->del, ++ au_ftest_opts(opts->flags, REMOUNT)); ++ if (!err) { ++ err = 1; ++ au_fset_opts(opts->flags, TRUNC_XIB); ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ ++ case Opt_mod: ++ case Opt_imod: ++ err = au_br_mod(sb, &opt->mod, ++ au_ftest_opts(opts->flags, REMOUNT), ++ &do_refresh); ++ if (!err) { ++ err = 1; ++ if (do_refresh) ++ au_fset_opts(opts->flags, REFRESH); ++ } ++ break; ++ } ++ return err; ++} ++ ++static int au_opt_xino(struct super_block *sb, struct au_opt *opt, ++ struct au_opt_xino **opt_xino, ++ struct au_opts *opts) ++{ ++ int err; ++ aufs_bindex_t bbot, bindex; ++ struct dentry *root, *parent, *h_root; ++ ++ err = 0; ++ switch (opt->type) { ++ case Opt_xino: ++ err = au_xino_set(sb, &opt->xino, ++ !!au_ftest_opts(opts->flags, REMOUNT)); ++ if (unlikely(err)) ++ break; ++ ++ *opt_xino = &opt->xino; ++ au_xino_brid_set(sb, -1); ++ ++ /* safe d_parent access */ ++ parent = opt->xino.file->f_path.dentry->d_parent; ++ root = sb->s_root; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ h_root = au_h_dptr(root, bindex); ++ if (h_root == parent) { ++ au_xino_brid_set(sb, au_sbr_id(sb, bindex)); ++ break; ++ } ++ } ++ break; ++ ++ case Opt_noxino: ++ au_xino_clr(sb); ++ au_xino_brid_set(sb, -1); ++ *opt_xino = (void *)-1; ++ break; ++ } ++ ++ return err; ++} ++ ++int au_opts_verify(struct super_block *sb, unsigned long sb_flags, ++ unsigned int pending) ++{ ++ int err, fhsm; ++ aufs_bindex_t bindex, bbot; ++ unsigned char do_plink, skip, do_free, can_no_dreval; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *root, *dentry; ++ struct inode *dir, *h_dir; ++ struct au_sbinfo *sbinfo; ++ struct au_hinode *hdir; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!(sbinfo->si_mntflags & AuOptMask_UDBA)); ++ ++ if (!(sb_flags & SB_RDONLY)) { ++ if (unlikely(!au_br_writable(au_sbr_perm(sb, 0)))) ++ pr_warn("first branch should be rw\n"); ++ if (unlikely(au_opt_test(sbinfo->si_mntflags, SHWH))) ++ pr_warn_once("shwh should be used with ro\n"); ++ } ++ ++ if (au_opt_test((sbinfo->si_mntflags | pending), UDBA_HNOTIFY) ++ && !au_opt_test(sbinfo->si_mntflags, XINO)) ++ pr_warn_once("udba=*notify requires xino\n"); ++ ++ if (au_opt_test(sbinfo->si_mntflags, DIRPERM1)) ++ pr_warn_once("dirperm1 breaks the protection" ++ " by the permission bits on the lower branch\n"); ++ ++ err = 0; ++ fhsm = 0; ++ root = sb->s_root; ++ dir = d_inode(root); ++ do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK); ++ can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending), ++ UDBA_NONE); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) { ++ skip = 0; ++ h_dir = au_h_iptr(dir, bindex); ++ br = au_sbr(sb, bindex); ++ ++ if ((br->br_perm & AuBrAttr_ICEX) ++ && !h_dir->i_op->listxattr) ++ br->br_perm &= ~AuBrAttr_ICEX; ++#if 0 ++ if ((br->br_perm & AuBrAttr_ICEX_SEC) ++ && (au_br_sb(br)->s_flags & SB_NOSEC)) ++ br->br_perm &= ~AuBrAttr_ICEX_SEC; ++#endif ++ ++ do_free = 0; ++ wbr = br->br_wbr; ++ if (wbr) ++ wbr_wh_read_lock(wbr); ++ ++ if (!au_br_writable(br->br_perm)) { ++ do_free = !!wbr; ++ skip = (!wbr ++ || (!wbr->wbr_whbase ++ && !wbr->wbr_plink ++ && !wbr->wbr_orph)); ++ } else if (!au_br_wh_linkable(br->br_perm)) { ++ /* skip = (!br->br_whbase && !br->br_orph); */ ++ skip = (!wbr || !wbr->wbr_whbase); ++ if (skip && wbr) { ++ if (do_plink) ++ skip = !!wbr->wbr_plink; ++ else ++ skip = !wbr->wbr_plink; ++ } ++ } else { ++ /* skip = (br->br_whbase && br->br_ohph); */ ++ skip = (wbr && wbr->wbr_whbase); ++ if (skip) { ++ if (do_plink) ++ skip = !!wbr->wbr_plink; ++ else ++ skip = !wbr->wbr_plink; ++ } ++ } ++ if (wbr) ++ wbr_wh_read_unlock(wbr); ++ ++ if (can_no_dreval) { ++ dentry = br->br_path.dentry; ++ spin_lock(&dentry->d_lock); ++ if (dentry->d_flags & ++ (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE)) ++ can_no_dreval = 0; ++ spin_unlock(&dentry->d_lock); ++ } ++ ++ if (au_br_fhsm(br->br_perm)) { ++ fhsm++; ++ AuDebugOn(!br->br_fhsm); ++ } ++ ++ if (skip) ++ continue; ++ ++ hdir = au_hi(dir, bindex); ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ if (wbr) ++ wbr_wh_write_lock(wbr); ++ err = au_wh_init(br, sb); ++ if (wbr) ++ wbr_wh_write_unlock(wbr); ++ au_hn_inode_unlock(hdir); ++ ++ if (!err && do_free) { ++ kfree(wbr); ++ br->br_wbr = NULL; ++ } ++ } ++ ++ if (can_no_dreval) ++ au_fset_si(sbinfo, NO_DREVAL); ++ else ++ au_fclr_si(sbinfo, NO_DREVAL); ++ ++ if (fhsm >= 2) { ++ au_fset_si(sbinfo, FHSM); ++ for (bindex = bbot; bindex >= 0; bindex--) { ++ br = au_sbr(sb, bindex); ++ if (au_br_fhsm(br->br_perm)) { ++ au_fhsm_set_bottom(sb, bindex); ++ break; ++ } ++ } ++ } else { ++ au_fclr_si(sbinfo, FHSM); ++ au_fhsm_set_bottom(sb, -1); ++ } ++ ++ return err; ++} ++ ++int au_opts_mount(struct super_block *sb, struct au_opts *opts) ++{ ++ int err; ++ unsigned int tmp; ++ aufs_bindex_t bindex, bbot; ++ struct au_opt *opt; ++ struct au_opt_xino *opt_xino, xino; ++ struct au_sbinfo *sbinfo; ++ struct au_branch *br; ++ struct inode *dir; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ opt_xino = NULL; ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) ++ err = au_opt_simple(sb, opt++, opts); ++ if (err > 0) ++ err = 0; ++ else if (unlikely(err < 0)) ++ goto out; ++ ++ /* disable xino and udba temporary */ ++ sbinfo = au_sbi(sb); ++ tmp = sbinfo->si_mntflags; ++ au_opt_clr(sbinfo->si_mntflags, XINO); ++ au_opt_set_udba(sbinfo->si_mntflags, UDBA_REVAL); ++ ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) ++ err = au_opt_br(sb, opt++, opts); ++ if (err > 0) ++ err = 0; ++ else if (unlikely(err < 0)) ++ goto out; ++ ++ bbot = au_sbbot(sb); ++ if (unlikely(bbot < 0)) { ++ err = -EINVAL; ++ pr_err("no branches\n"); ++ goto out; ++ } ++ ++ if (au_opt_test(tmp, XINO)) ++ au_opt_set(sbinfo->si_mntflags, XINO); ++ opt = opts->opt; ++ while (!err && opt->type != Opt_tail) ++ err = au_opt_xino(sb, opt++, &opt_xino, opts); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_opts_verify(sb, sb->s_flags, tmp); ++ if (unlikely(err)) ++ goto out; ++ ++ /* restore xino */ ++ if (au_opt_test(tmp, XINO) && !opt_xino) { ++ xino.file = au_xino_def(sb); ++ err = PTR_ERR(xino.file); ++ if (IS_ERR(xino.file)) ++ goto out; ++ ++ err = au_xino_set(sb, &xino, /*remount*/0); ++ fput(xino.file); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ /* restore udba */ ++ tmp &= AuOptMask_UDBA; ++ sbinfo->si_mntflags &= ~AuOptMask_UDBA; ++ sbinfo->si_mntflags |= tmp; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_hnotify_reset_br(tmp, br, br->br_perm); ++ if (unlikely(err)) ++ AuIOErr("hnotify failed on br %d, %d, ignored\n", ++ bindex, err); ++ /* go on even if err */ ++ } ++ if (au_opt_test(tmp, UDBA_HNOTIFY)) { ++ dir = d_inode(sb->s_root); ++ au_hn_reset(dir, au_hi_flags(dir, /*isdir*/1) & ~AuHi_XINO); ++ } ++ ++out: ++ return err; ++} ++ ++int au_opts_remount(struct super_block *sb, struct au_opts *opts) ++{ ++ int err, rerr; ++ unsigned char no_dreval; ++ struct inode *dir; ++ struct au_opt_xino *opt_xino; ++ struct au_opt *opt; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = au_dr_opt_flush(sb); ++ if (unlikely(err)) ++ goto out; ++ au_fset_opts(opts->flags, DR_FLUSHED); ++ ++ dir = d_inode(sb->s_root); ++ sbinfo = au_sbi(sb); ++ opt_xino = NULL; ++ opt = opts->opt; ++ while (err >= 0 && opt->type != Opt_tail) { ++ err = au_opt_simple(sb, opt, opts); ++ if (!err) ++ err = au_opt_br(sb, opt, opts); ++ if (!err) ++ err = au_opt_xino(sb, opt, &opt_xino, opts); ++ opt++; ++ } ++ if (err > 0) ++ err = 0; ++ AuTraceErr(err); ++ /* go on even err */ ++ ++ no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL); ++ rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0); ++ if (unlikely(rerr && !err)) ++ err = rerr; ++ ++ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL)) ++ au_fset_opts(opts->flags, REFRESH_IDOP); ++ ++ if (au_ftest_opts(opts->flags, TRUNC_XIB)) { ++ rerr = au_xib_trunc(sb); ++ if (unlikely(rerr && !err)) ++ err = rerr; ++ } ++ ++ /* will be handled by the caller */ ++ if (!au_ftest_opts(opts->flags, REFRESH) ++ && (opts->given_udba ++ || au_opt_test(sbinfo->si_mntflags, XINO) ++ || au_ftest_opts(opts->flags, REFRESH_IDOP) ++ )) ++ au_fset_opts(opts->flags, REFRESH); ++ ++ AuDbg("status 0x%x\n", opts->flags); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++unsigned int au_opt_udba(struct super_block *sb) ++{ ++ return au_mntflags(sb) & AuOptMask_UDBA; ++} +diff -Naur null/fs/aufs/opts.h linux-4.15/fs/aufs/opts.h +--- /dev/null ++++ linux-4.15/fs/aufs/opts.h 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,224 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * mount options/flags ++ */ ++ ++#ifndef __AUFS_OPTS_H__ ++#define __AUFS_OPTS_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct file; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* mount flags */ ++#define AuOpt_XINO 1 /* external inode number bitmap ++ and translation table */ ++#define AuOpt_TRUNC_XINO (1 << 1) /* truncate xino files */ ++#define AuOpt_UDBA_NONE (1 << 2) /* users direct branch access */ ++#define AuOpt_UDBA_REVAL (1 << 3) ++#define AuOpt_UDBA_HNOTIFY (1 << 4) ++#define AuOpt_SHWH (1 << 5) /* show whiteout */ ++#define AuOpt_PLINK (1 << 6) /* pseudo-link */ ++#define AuOpt_DIRPERM1 (1 << 7) /* ignore the lower dir's perm ++ bits */ ++#define AuOpt_ALWAYS_DIROPQ (1 << 9) /* policy to creating diropq */ ++#define AuOpt_SUM (1 << 10) /* summation for statfs(2) */ ++#define AuOpt_SUM_W (1 << 11) /* unimplemented */ ++#define AuOpt_WARN_PERM (1 << 12) /* warn when add-branch */ ++#define AuOpt_VERBOSE (1 << 13) /* busy inode when del-branch */ ++#define AuOpt_DIO (1 << 14) /* direct io */ ++#define AuOpt_DIRREN (1 << 15) /* directory rename */ ++ ++#ifndef CONFIG_AUFS_HNOTIFY ++#undef AuOpt_UDBA_HNOTIFY ++#define AuOpt_UDBA_HNOTIFY 0 ++#endif ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuOpt_DIRREN ++#define AuOpt_DIRREN 0 ++#endif ++#ifndef CONFIG_AUFS_SHWH ++#undef AuOpt_SHWH ++#define AuOpt_SHWH 0 ++#endif ++ ++#define AuOpt_Def (AuOpt_XINO \ ++ | AuOpt_UDBA_REVAL \ ++ | AuOpt_PLINK \ ++ /* | AuOpt_DIRPERM1 */ \ ++ | AuOpt_WARN_PERM) ++#define AuOptMask_UDBA (AuOpt_UDBA_NONE \ ++ | AuOpt_UDBA_REVAL \ ++ | AuOpt_UDBA_HNOTIFY) ++ ++#define au_opt_test(flags, name) (flags & AuOpt_##name) ++#define au_opt_set(flags, name) do { \ ++ BUILD_BUG_ON(AuOpt_##name & AuOptMask_UDBA); \ ++ ((flags) |= AuOpt_##name); \ ++} while (0) ++#define au_opt_set_udba(flags, name) do { \ ++ (flags) &= ~AuOptMask_UDBA; \ ++ ((flags) |= AuOpt_##name); \ ++} while (0) ++#define au_opt_clr(flags, name) do { \ ++ ((flags) &= ~AuOpt_##name); \ ++} while (0) ++ ++static inline unsigned int au_opts_plink(unsigned int mntflags) ++{ ++#ifdef CONFIG_PROC_FS ++ return mntflags; ++#else ++ return mntflags & ~AuOpt_PLINK; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies to select one among multiple writable branches */ ++enum { ++ AuWbrCreate_TDP, /* top down parent */ ++ AuWbrCreate_RR, /* round robin */ ++ AuWbrCreate_MFS, /* most free space */ ++ AuWbrCreate_MFSV, /* mfs with seconds */ ++ AuWbrCreate_MFSRR, /* mfs then rr */ ++ AuWbrCreate_MFSRRV, /* mfs then rr with seconds */ ++ AuWbrCreate_TDMFS, /* top down regardless parent and mfs */ ++ AuWbrCreate_TDMFSV, /* top down regardless parent and mfs */ ++ AuWbrCreate_PMFS, /* parent and mfs */ ++ AuWbrCreate_PMFSV, /* parent and mfs with seconds */ ++ AuWbrCreate_PMFSRR, /* parent, mfs and round-robin */ ++ AuWbrCreate_PMFSRRV, /* plus seconds */ ++ ++ AuWbrCreate_Def = AuWbrCreate_TDP ++}; ++ ++enum { ++ AuWbrCopyup_TDP, /* top down parent */ ++ AuWbrCopyup_BUP, /* bottom up parent */ ++ AuWbrCopyup_BU, /* bottom up */ ++ ++ AuWbrCopyup_Def = AuWbrCopyup_TDP ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_opt_add { ++ aufs_bindex_t bindex; ++ char *pathname; ++ int perm; ++ struct path path; ++}; ++ ++struct au_opt_del { ++ char *pathname; ++ struct path h_path; ++}; ++ ++struct au_opt_mod { ++ char *path; ++ int perm; ++ struct dentry *h_root; ++}; ++ ++struct au_opt_xino { ++ char *path; ++ struct file *file; ++}; ++ ++struct au_opt_xino_itrunc { ++ aufs_bindex_t bindex; ++}; ++ ++struct au_opt_wbr_create { ++ int wbr_create; ++ int mfs_second; ++ unsigned long long mfsrr_watermark; ++}; ++ ++struct au_opt { ++ int type; ++ union { ++ struct au_opt_xino xino; ++ struct au_opt_xino_itrunc xino_itrunc; ++ struct au_opt_add add; ++ struct au_opt_del del; ++ struct au_opt_mod mod; ++ int dirwh; ++ int rdcache; ++ unsigned int rdblk; ++ unsigned int rdhash; ++ int udba; ++ struct au_opt_wbr_create wbr_create; ++ int wbr_copyup; ++ unsigned int fhsm_second; ++ }; ++}; ++ ++/* opts flags */ ++#define AuOpts_REMOUNT 1 ++#define AuOpts_REFRESH (1 << 1) ++#define AuOpts_TRUNC_XIB (1 << 2) ++#define AuOpts_REFRESH_DYAOP (1 << 3) ++#define AuOpts_REFRESH_IDOP (1 << 4) ++#define AuOpts_DR_FLUSHED (1 << 5) ++#define au_ftest_opts(flags, name) ((flags) & AuOpts_##name) ++#define au_fset_opts(flags, name) \ ++ do { (flags) |= AuOpts_##name; } while (0) ++#define au_fclr_opts(flags, name) \ ++ do { (flags) &= ~AuOpts_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_DIRREN ++#undef AuOpts_DR_FLUSHED ++#define AuOpts_DR_FLUSHED 0 ++#endif ++ ++struct au_opts { ++ struct au_opt *opt; ++ int max_opt; ++ ++ unsigned int given_udba; ++ unsigned int flags; ++ unsigned long sb_flags; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* opts.c */ ++void au_optstr_br_perm(au_br_perm_str_t *str, int perm); ++const char *au_optstr_udba(int udba); ++const char *au_optstr_wbr_copyup(int wbr_copyup); ++const char *au_optstr_wbr_create(int wbr_create); ++ ++void au_opts_free(struct au_opts *opts); ++struct super_block; ++int au_opts_parse(struct super_block *sb, char *str, struct au_opts *opts); ++int au_opts_verify(struct super_block *sb, unsigned long sb_flags, ++ unsigned int pending); ++int au_opts_mount(struct super_block *sb, struct au_opts *opts); ++int au_opts_remount(struct super_block *sb, struct au_opts *opts); ++ ++unsigned int au_opt_udba(struct super_block *sb); ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_OPTS_H__ */ +diff -Naur null/fs/aufs/plink.c linux-4.15/fs/aufs/plink.c +--- /dev/null ++++ linux-4.15/fs/aufs/plink.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,515 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * pseudo-link ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * the pseudo-link maintenance mode. ++ * during a user process maintains the pseudo-links, ++ * prohibit adding a new plink and branch manipulation. ++ * ++ * Flags ++ * NOPLM: ++ * For entry functions which will handle plink, and i_mutex is already held ++ * in VFS. ++ * They cannot wait and should return an error at once. ++ * Callers has to check the error. ++ * NOPLMW: ++ * For entry functions which will handle plink, but i_mutex is not held ++ * in VFS. ++ * They can wait the plink maintenance mode to finish. ++ * ++ * They behave like F_SETLK and F_SETLKW. ++ * If the caller never handle plink, then both flags are unnecessary. ++ */ ++ ++int au_plink_maint(struct super_block *sb, int flags) ++{ ++ int err; ++ pid_t pid, ppid; ++ struct task_struct *parent, *prev; ++ struct au_sbinfo *sbi; ++ ++ SiMustAnyLock(sb); ++ ++ err = 0; ++ if (!au_opt_test(au_mntflags(sb), PLINK)) ++ goto out; ++ ++ sbi = au_sbi(sb); ++ pid = sbi->si_plink_maint_pid; ++ if (!pid || pid == current->pid) ++ goto out; ++ ++ /* todo: it highly depends upon /sbin/mount.aufs */ ++ prev = NULL; ++ parent = current; ++ ppid = 0; ++ rcu_read_lock(); ++ while (1) { ++ parent = rcu_dereference(parent->real_parent); ++ if (parent == prev) ++ break; ++ ppid = task_pid_vnr(parent); ++ if (pid == ppid) { ++ rcu_read_unlock(); ++ goto out; ++ } ++ prev = parent; ++ } ++ rcu_read_unlock(); ++ ++ if (au_ftest_lock(flags, NOPLMW)) { ++ /* if there is no i_mutex lock in VFS, we don't need to wait */ ++ /* AuDebugOn(!lockdep_depth(current)); */ ++ while (sbi->si_plink_maint_pid) { ++ si_read_unlock(sb); ++ /* gave up wake_up_bit() */ ++ wait_event(sbi->si_plink_wq, !sbi->si_plink_maint_pid); ++ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&sbi->si_nowait); ++ si_noflush_read_lock(sb); ++ } ++ } else if (au_ftest_lock(flags, NOPLM)) { ++ AuDbg("ppid %d, pid %d\n", ppid, pid); ++ err = -EAGAIN; ++ } ++ ++out: ++ return err; ++} ++ ++void au_plink_maint_leave(struct au_sbinfo *sbinfo) ++{ ++ spin_lock(&sbinfo->si_plink_maint_lock); ++ sbinfo->si_plink_maint_pid = 0; ++ spin_unlock(&sbinfo->si_plink_maint_lock); ++ wake_up_all(&sbinfo->si_plink_wq); ++} ++ ++int au_plink_maint_enter(struct super_block *sb) ++{ ++ int err; ++ struct au_sbinfo *sbinfo; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ /* make sure i am the only one in this fs */ ++ si_write_lock(sb, AuLock_FLUSH); ++ if (au_opt_test(au_mntflags(sb), PLINK)) { ++ spin_lock(&sbinfo->si_plink_maint_lock); ++ if (!sbinfo->si_plink_maint_pid) ++ sbinfo->si_plink_maint_pid = current->pid; ++ else ++ err = -EBUSY; ++ spin_unlock(&sbinfo->si_plink_maint_lock); ++ } ++ si_write_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_DEBUG ++void au_plink_list(struct super_block *sb) ++{ ++ int i; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ ++ SiMustAnyLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) ++ AuDbg("%lu\n", icntnr->vfs_inode.i_ino); ++ hlist_bl_unlock(hbl); ++ } ++} ++#endif ++ ++/* is the inode pseudo-linked? */ ++int au_plink_test(struct inode *inode) ++{ ++ int found, i; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ ++ sbinfo = au_sbi(inode->i_sb); ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ AuDebugOn(!au_opt_test(au_mntflags(inode->i_sb), PLINK)); ++ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); ++ ++ found = 0; ++ i = au_plink_hash(inode->i_ino); ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) ++ if (&icntnr->vfs_inode == inode) { ++ found = 1; ++ break; ++ } ++ hlist_bl_unlock(hbl); ++ return found; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * generate a name for plink. ++ * the file will be stored under AUFS_WH_PLINKDIR. ++ */ ++/* 20 is max digits length of ulong 64 */ ++#define PLINK_NAME_LEN ((20 + 1) * 2) ++ ++static int plink_name(char *name, int len, struct inode *inode, ++ aufs_bindex_t bindex) ++{ ++ int rlen; ++ struct inode *h_inode; ++ ++ h_inode = au_h_iptr(inode, bindex); ++ rlen = snprintf(name, len, "%lu.%lu", inode->i_ino, h_inode->i_ino); ++ return rlen; ++} ++ ++struct au_do_plink_lkup_args { ++ struct dentry **errp; ++ struct qstr *tgtname; ++ struct dentry *h_parent; ++ struct au_branch *br; ++}; ++ ++static struct dentry *au_do_plink_lkup(struct qstr *tgtname, ++ struct dentry *h_parent, ++ struct au_branch *br) ++{ ++ struct dentry *h_dentry; ++ struct inode *h_inode; ++ ++ h_inode = d_inode(h_parent); ++ vfsub_inode_lock_shared_nested(h_inode, AuLsc_I_CHILD2); ++ h_dentry = vfsub_lkup_one(tgtname, h_parent); ++ inode_unlock_shared(h_inode); ++ return h_dentry; ++} ++ ++static void au_call_do_plink_lkup(void *args) ++{ ++ struct au_do_plink_lkup_args *a = args; ++ *a->errp = au_do_plink_lkup(a->tgtname, a->h_parent, a->br); ++} ++ ++/* lookup the plink-ed @inode under the branch at @bindex */ ++struct dentry *au_plink_lkup(struct inode *inode, aufs_bindex_t bindex) ++{ ++ struct dentry *h_dentry, *h_parent; ++ struct au_branch *br; ++ int wkq_err; ++ char a[PLINK_NAME_LEN]; ++ struct qstr tgtname = QSTR_INIT(a, 0); ++ ++ AuDebugOn(au_plink_maint(inode->i_sb, AuLock_NOPLM)); ++ ++ br = au_sbr(inode->i_sb, bindex); ++ h_parent = br->br_wbr->wbr_plink; ++ tgtname.len = plink_name(a, sizeof(a), inode, bindex); ++ ++ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { ++ struct au_do_plink_lkup_args args = { ++ .errp = &h_dentry, ++ .tgtname = &tgtname, ++ .h_parent = h_parent, ++ .br = br ++ }; ++ ++ wkq_err = au_wkq_wait(au_call_do_plink_lkup, &args); ++ if (unlikely(wkq_err)) ++ h_dentry = ERR_PTR(wkq_err); ++ } else ++ h_dentry = au_do_plink_lkup(&tgtname, h_parent, br); ++ ++ return h_dentry; ++} ++ ++/* create a pseudo-link */ ++static int do_whplink(struct qstr *tgt, struct dentry *h_parent, ++ struct dentry *h_dentry, struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ struct inode *h_dir, *delegated; ++ ++ h_dir = d_inode(h_parent); ++ inode_lock_nested(h_dir, AuLsc_I_CHILD2); ++again: ++ h_path.dentry = vfsub_lkup_one(tgt, h_parent); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ err = 0; ++ /* wh.plink dir is not monitored */ ++ /* todo: is it really safe? */ ++ if (d_is_positive(h_path.dentry) ++ && d_inode(h_path.dentry) != d_inode(h_dentry)) { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, &h_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ dput(h_path.dentry); ++ h_path.dentry = NULL; ++ if (!err) ++ goto again; ++ } ++ if (!err && d_is_negative(h_path.dentry)) { ++ delegated = NULL; ++ err = vfsub_link(h_dentry, h_dir, &h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ } ++ dput(h_path.dentry); ++ ++out: ++ inode_unlock(h_dir); ++ return err; ++} ++ ++struct do_whplink_args { ++ int *errp; ++ struct qstr *tgt; ++ struct dentry *h_parent; ++ struct dentry *h_dentry; ++ struct au_branch *br; ++}; ++ ++static void call_do_whplink(void *args) ++{ ++ struct do_whplink_args *a = args; ++ *a->errp = do_whplink(a->tgt, a->h_parent, a->h_dentry, a->br); ++} ++ ++static int whplink(struct dentry *h_dentry, struct inode *inode, ++ aufs_bindex_t bindex, struct au_branch *br) ++{ ++ int err, wkq_err; ++ struct au_wbr *wbr; ++ struct dentry *h_parent; ++ char a[PLINK_NAME_LEN]; ++ struct qstr tgtname = QSTR_INIT(a, 0); ++ ++ wbr = au_sbr(inode->i_sb, bindex)->br_wbr; ++ h_parent = wbr->wbr_plink; ++ tgtname.len = plink_name(a, sizeof(a), inode, bindex); ++ ++ /* always superio. */ ++ if (!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)) { ++ struct do_whplink_args args = { ++ .errp = &err, ++ .tgt = &tgtname, ++ .h_parent = h_parent, ++ .h_dentry = h_dentry, ++ .br = br ++ }; ++ wkq_err = au_wkq_wait(call_do_whplink, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } else ++ err = do_whplink(&tgtname, h_parent, h_dentry, br); ++ ++ return err; ++} ++ ++/* ++ * create a new pseudo-link for @h_dentry on @bindex. ++ * the linked inode is held in aufs @inode. ++ */ ++void au_plink_append(struct inode *inode, aufs_bindex_t bindex, ++ struct dentry *h_dentry) ++{ ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos; ++ struct au_icntnr *icntnr; ++ int found, err, cnt, i; ++ ++ sb = inode->i_sb; ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ found = au_plink_test(inode); ++ if (found) ++ return; ++ ++ i = au_plink_hash(inode->i_ino); ++ hbl = sbinfo->si_plink + i; ++ au_igrab(inode); ++ ++ hlist_bl_lock(hbl); ++ hlist_bl_for_each_entry(icntnr, pos, hbl, plink) { ++ if (&icntnr->vfs_inode == inode) { ++ found = 1; ++ break; ++ } ++ } ++ if (!found) { ++ icntnr = container_of(inode, struct au_icntnr, vfs_inode); ++ hlist_bl_add_head(&icntnr->plink, hbl); ++ } ++ hlist_bl_unlock(hbl); ++ if (!found) { ++ cnt = au_hbl_count(hbl); ++#define msg "unexpectedly unblanced or too many pseudo-links" ++ if (cnt > AUFS_PLINK_WARN) ++ AuWarn1(msg ", %d\n", cnt); ++#undef msg ++ err = whplink(h_dentry, inode, bindex, au_sbr(sb, bindex)); ++ if (unlikely(err)) { ++ pr_warn("err %d, damaged pseudo link.\n", err); ++ au_hbl_del(&icntnr->plink, hbl); ++ iput(&icntnr->vfs_inode); ++ } ++ } else ++ iput(&icntnr->vfs_inode); ++} ++ ++/* free all plinks */ ++void au_plink_put(struct super_block *sb, int verbose) ++{ ++ int i, warned; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_icntnr *icntnr; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ /* no spin_lock since sbinfo is write-locked */ ++ warned = 0; ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ if (!warned && verbose && !hlist_bl_empty(hbl)) { ++ pr_warn("pseudo-link is not flushed"); ++ warned = 1; ++ } ++ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) ++ iput(&icntnr->vfs_inode); ++ INIT_HLIST_BL_HEAD(hbl); ++ } ++} ++ ++void au_plink_clean(struct super_block *sb, int verbose) ++{ ++ struct dentry *root; ++ ++ root = sb->s_root; ++ aufs_write_lock(root); ++ if (au_opt_test(au_mntflags(sb), PLINK)) ++ au_plink_put(sb, verbose); ++ aufs_write_unlock(root); ++} ++ ++static int au_plink_do_half_refresh(struct inode *inode, aufs_bindex_t br_id) ++{ ++ int do_put; ++ aufs_bindex_t btop, bbot, bindex; ++ ++ do_put = 0; ++ btop = au_ibtop(inode); ++ bbot = au_ibbot(inode); ++ if (btop >= 0) { ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ if (!au_h_iptr(inode, bindex) ++ || au_ii_br_id(inode, bindex) != br_id) ++ continue; ++ au_set_h_iptr(inode, bindex, NULL, 0); ++ do_put = 1; ++ break; ++ } ++ if (do_put) ++ for (bindex = btop; bindex <= bbot; bindex++) ++ if (au_h_iptr(inode, bindex)) { ++ do_put = 0; ++ break; ++ } ++ } else ++ do_put = 1; ++ ++ return do_put; ++} ++ ++/* free the plinks on a branch specified by @br_id */ ++void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id) ++{ ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_head *hbl; ++ struct hlist_bl_node *pos, *tmp; ++ struct au_icntnr *icntnr; ++ struct inode *inode; ++ int i, do_put; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ AuDebugOn(!au_opt_test(au_mntflags(sb), PLINK)); ++ AuDebugOn(au_plink_maint(sb, AuLock_NOPLM)); ++ ++ /* no bit_lock since sbinfo is write-locked */ ++ for (i = 0; i < AuPlink_NHASH; i++) { ++ hbl = sbinfo->si_plink + i; ++ hlist_bl_for_each_entry_safe(icntnr, pos, tmp, hbl, plink) { ++ inode = au_igrab(&icntnr->vfs_inode); ++ ii_write_lock_child(inode); ++ do_put = au_plink_do_half_refresh(inode, br_id); ++ if (do_put) { ++ hlist_bl_del(&icntnr->plink); ++ iput(inode); ++ } ++ ii_write_unlock(inode); ++ iput(inode); ++ } ++ } ++} +diff -Naur null/fs/aufs/poll.c linux-4.15/fs/aufs/poll.c +--- /dev/null ++++ linux-4.15/fs/aufs/poll.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * poll operation ++ * There is only one filesystem which implements ->poll operation, currently. ++ */ ++ ++#include "aufs.h" ++ ++unsigned int aufs_poll(struct file *file, poll_table *wait) ++{ ++ unsigned int mask; ++ int err; ++ struct file *h_file; ++ struct super_block *sb; ++ ++ /* We should pretend an error happened. */ ++ mask = POLLERR /* | POLLIN | POLLOUT */; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); ++ ++ h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0); ++ err = PTR_ERR(h_file); ++ if (IS_ERR(h_file)) ++ goto out; ++ ++ /* it is not an error if h_file has no operation */ ++ mask = DEFAULT_POLLMASK; ++ if (h_file->f_op->poll) ++ mask = h_file->f_op->poll(h_file, wait); ++ fput(h_file); /* instead of au_read_post() */ ++ ++out: ++ si_read_unlock(sb); ++ AuTraceErr((int)mask); ++ return mask; ++} +diff -Naur null/fs/aufs/posix_acl.c linux-4.15/fs/aufs/posix_acl.c +--- /dev/null ++++ linux-4.15/fs/aufs/posix_acl.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,102 @@ ++/* ++ * Copyright (C) 2014-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * posix acl operations ++ */ ++ ++#include ++#include "aufs.h" ++ ++struct posix_acl *aufs_get_acl(struct inode *inode, int type) ++{ ++ struct posix_acl *acl; ++ int err; ++ aufs_bindex_t bindex; ++ struct inode *h_inode; ++ struct super_block *sb; ++ ++ acl = NULL; ++ sb = inode->i_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ ii_read_lock_child(inode); ++ if (!(sb->s_flags & SB_POSIXACL)) ++ goto out; ++ ++ bindex = au_ibtop(inode); ++ h_inode = au_h_iptr(inode, bindex); ++ if (unlikely(!h_inode ++ || ((h_inode->i_mode & S_IFMT) ++ != (inode->i_mode & S_IFMT)))) { ++ err = au_busy_or_stale(); ++ acl = ERR_PTR(err); ++ goto out; ++ } ++ ++ /* always topmost only */ ++ acl = get_acl(h_inode, type); ++ if (!IS_ERR_OR_NULL(acl)) ++ set_cached_acl(inode, type, acl); ++ ++out: ++ ii_read_unlock(inode); ++ si_read_unlock(sb); ++ ++ AuTraceErrPtr(acl); ++ return acl; ++} ++ ++int aufs_set_acl(struct inode *inode, struct posix_acl *acl, int type) ++{ ++ int err; ++ ssize_t ssz; ++ struct dentry *dentry; ++ struct au_sxattr arg = { ++ .type = AU_ACL_SET, ++ .u.acl_set = { ++ .acl = acl, ++ .type = type ++ }, ++ }; ++ ++ IMustLock(inode); ++ ++ if (inode->i_ino == AUFS_ROOT_INO) ++ dentry = dget(inode->i_sb->s_root); ++ else { ++ dentry = d_find_alias(inode); ++ if (!dentry) ++ dentry = d_find_any_alias(inode); ++ if (!dentry) { ++ pr_warn("cannot handle this inode, " ++ "please report to aufs-users ML\n"); ++ err = -ENOENT; ++ goto out; ++ } ++ } ++ ++ ssz = au_sxattr(dentry, inode, &arg); ++ dput(dentry); ++ err = ssz; ++ if (ssz >= 0) { ++ err = 0; ++ set_cached_acl(inode, type, acl); ++ } ++ ++out: ++ return err; ++} +diff -Naur null/fs/aufs/procfs.c linux-4.15/fs/aufs/procfs.c +--- /dev/null ++++ linux-4.15/fs/aufs/procfs.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,170 @@ ++/* ++ * Copyright (C) 2010-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * procfs interfaces ++ */ ++ ++#include ++#include "aufs.h" ++ ++static int au_procfs_plm_release(struct inode *inode, struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = file->private_data; ++ if (sbinfo) { ++ au_plink_maint_leave(sbinfo); ++ kobject_put(&sbinfo->si_kobj); ++ } ++ ++ return 0; ++} ++ ++static void au_procfs_plm_write_clean(struct file *file) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = file->private_data; ++ if (sbinfo) ++ au_plink_clean(sbinfo->si_sb, /*verbose*/0); ++} ++ ++static int au_procfs_plm_write_si(struct file *file, unsigned long id) ++{ ++ int err; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_node *pos; ++ ++ err = -EBUSY; ++ if (unlikely(file->private_data)) ++ goto out; ++ ++ sb = NULL; ++ /* don't use au_sbilist_lock() here */ ++ hlist_bl_lock(&au_sbilist); ++ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ if (id == sysaufs_si_id(sbinfo)) { ++ kobject_get(&sbinfo->si_kobj); ++ sb = sbinfo->si_sb; ++ break; ++ } ++ hlist_bl_unlock(&au_sbilist); ++ ++ err = -EINVAL; ++ if (unlikely(!sb)) ++ goto out; ++ ++ err = au_plink_maint_enter(sb); ++ if (!err) ++ /* keep kobject_get() */ ++ file->private_data = sbinfo; ++ else ++ kobject_put(&sbinfo->si_kobj); ++out: ++ return err; ++} ++ ++/* ++ * Accept a valid "si=xxxx" only. ++ * Once it is accepted successfully, accept "clean" too. ++ */ ++static ssize_t au_procfs_plm_write(struct file *file, const char __user *ubuf, ++ size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ unsigned long id; ++ /* last newline is allowed */ ++ char buf[3 + sizeof(unsigned long) * 2 + 1]; ++ ++ err = -EACCES; ++ if (unlikely(!capable(CAP_SYS_ADMIN))) ++ goto out; ++ ++ err = -EINVAL; ++ if (unlikely(count > sizeof(buf))) ++ goto out; ++ ++ err = copy_from_user(buf, ubuf, count); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ goto out; ++ } ++ buf[count] = 0; ++ ++ err = -EINVAL; ++ if (!strcmp("clean", buf)) { ++ au_procfs_plm_write_clean(file); ++ goto out_success; ++ } else if (unlikely(strncmp("si=", buf, 3))) ++ goto out; ++ ++ err = kstrtoul(buf + 3, 16, &id); ++ if (unlikely(err)) ++ goto out; ++ ++ err = au_procfs_plm_write_si(file, id); ++ if (unlikely(err)) ++ goto out; ++ ++out_success: ++ err = count; /* success */ ++out: ++ return err; ++} ++ ++static const struct file_operations au_procfs_plm_fop = { ++ .write = au_procfs_plm_write, ++ .release = au_procfs_plm_release, ++ .owner = THIS_MODULE ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct proc_dir_entry *au_procfs_dir; ++ ++void au_procfs_fin(void) ++{ ++ remove_proc_entry(AUFS_PLINK_MAINT_NAME, au_procfs_dir); ++ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); ++} ++ ++int __init au_procfs_init(void) ++{ ++ int err; ++ struct proc_dir_entry *entry; ++ ++ err = -ENOMEM; ++ au_procfs_dir = proc_mkdir(AUFS_PLINK_MAINT_DIR, NULL); ++ if (unlikely(!au_procfs_dir)) ++ goto out; ++ ++ entry = proc_create(AUFS_PLINK_MAINT_NAME, S_IFREG | S_IWUSR, ++ au_procfs_dir, &au_procfs_plm_fop); ++ if (unlikely(!entry)) ++ goto out_dir; ++ ++ err = 0; ++ goto out; /* success */ ++ ++ ++out_dir: ++ remove_proc_entry(AUFS_PLINK_MAINT_DIR, NULL); ++out: ++ return err; ++} +diff -Naur null/fs/aufs/rdu.c linux-4.15/fs/aufs/rdu.c +--- /dev/null ++++ linux-4.15/fs/aufs/rdu.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,381 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * readdir in userspace. ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++/* bits for struct aufs_rdu.flags */ ++#define AuRdu_CALLED 1 ++#define AuRdu_CONT (1 << 1) ++#define AuRdu_FULL (1 << 2) ++#define au_ftest_rdu(flags, name) ((flags) & AuRdu_##name) ++#define au_fset_rdu(flags, name) \ ++ do { (flags) |= AuRdu_##name; } while (0) ++#define au_fclr_rdu(flags, name) \ ++ do { (flags) &= ~AuRdu_##name; } while (0) ++ ++struct au_rdu_arg { ++ struct dir_context ctx; ++ struct aufs_rdu *rdu; ++ union au_rdu_ent_ul ent; ++ unsigned long end; ++ ++ struct super_block *sb; ++ int err; ++}; ++ ++static int au_rdu_fill(struct dir_context *ctx, const char *name, int nlen, ++ loff_t offset, u64 h_ino, unsigned int d_type) ++{ ++ int err, len; ++ struct au_rdu_arg *arg = container_of(ctx, struct au_rdu_arg, ctx); ++ struct aufs_rdu *rdu = arg->rdu; ++ struct au_rdu_ent ent; ++ ++ err = 0; ++ arg->err = 0; ++ au_fset_rdu(rdu->cookie.flags, CALLED); ++ len = au_rdu_len(nlen); ++ if (arg->ent.ul + len < arg->end) { ++ ent.ino = h_ino; ++ ent.bindex = rdu->cookie.bindex; ++ ent.type = d_type; ++ ent.nlen = nlen; ++ if (unlikely(nlen > AUFS_MAX_NAMELEN)) ++ ent.type = DT_UNKNOWN; ++ ++ /* unnecessary to support mmap_sem since this is a dir */ ++ err = -EFAULT; ++ if (copy_to_user(arg->ent.e, &ent, sizeof(ent))) ++ goto out; ++ if (copy_to_user(arg->ent.e->name, name, nlen)) ++ goto out; ++ /* the terminating NULL */ ++ if (__put_user(0, arg->ent.e->name + nlen)) ++ goto out; ++ err = 0; ++ /* AuDbg("%p, %.*s\n", arg->ent.p, nlen, name); */ ++ arg->ent.ul += len; ++ rdu->rent++; ++ } else { ++ err = -EFAULT; ++ au_fset_rdu(rdu->cookie.flags, FULL); ++ rdu->full = 1; ++ rdu->tail = arg->ent; ++ } ++ ++out: ++ /* AuTraceErr(err); */ ++ return err; ++} ++ ++static int au_rdu_do(struct file *h_file, struct au_rdu_arg *arg) ++{ ++ int err; ++ loff_t offset; ++ struct au_rdu_cookie *cookie = &arg->rdu->cookie; ++ ++ /* we don't have to care (FMODE_32BITHASH | FMODE_64BITHASH) for ext4 */ ++ offset = vfsub_llseek(h_file, cookie->h_pos, SEEK_SET); ++ err = offset; ++ if (unlikely(offset != cookie->h_pos)) ++ goto out; ++ ++ err = 0; ++ do { ++ arg->err = 0; ++ au_fclr_rdu(cookie->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(h_file, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err ++ && au_ftest_rdu(cookie->flags, CALLED) ++ && !au_ftest_rdu(cookie->flags, FULL)); ++ cookie->h_pos = h_file->f_pos; ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_rdu(struct file *file, struct aufs_rdu *rdu) ++{ ++ int err; ++ aufs_bindex_t bbot; ++ struct au_rdu_arg arg = { ++ .ctx = { ++ .actor = au_rdu_fill ++ } ++ }; ++ struct dentry *dentry; ++ struct inode *inode; ++ struct file *h_file; ++ struct au_rdu_cookie *cookie = &rdu->cookie; ++ ++ err = !access_ok(VERIFY_WRITE, rdu->ent.e, rdu->sz); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ rdu->rent = 0; ++ rdu->tail = rdu->ent; ++ rdu->full = 0; ++ arg.rdu = rdu; ++ arg.ent = rdu->ent; ++ arg.end = arg.ent.ul; ++ arg.end += rdu->sz; ++ ++ err = -ENOTDIR; ++ if (unlikely(!file->f_op->iterate && !file->f_op->iterate_shared)) ++ goto out; ++ ++ err = security_file_permission(file, MAY_READ); ++ AuTraceErr(err); ++ if (unlikely(err)) ++ goto out; ++ ++ dentry = file->f_path.dentry; ++ inode = d_inode(dentry); ++ inode_lock_shared(inode); ++ ++ arg.sb = inode->i_sb; ++ err = si_read_lock(arg.sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_mtx; ++ err = au_alive_dir(dentry); ++ if (unlikely(err)) ++ goto out_si; ++ /* todo: reval? */ ++ fi_read_lock(file); ++ ++ err = -EAGAIN; ++ if (unlikely(au_ftest_rdu(cookie->flags, CONT) ++ && cookie->generation != au_figen(file))) ++ goto out_unlock; ++ ++ err = 0; ++ if (!rdu->blk) { ++ rdu->blk = au_sbi(arg.sb)->si_rdblk; ++ if (!rdu->blk) ++ rdu->blk = au_dir_size(file, /*dentry*/NULL); ++ } ++ bbot = au_fbtop(file); ++ if (cookie->bindex < bbot) ++ cookie->bindex = bbot; ++ bbot = au_fbbot_dir(file); ++ /* AuDbg("b%d, b%d\n", cookie->bindex, bbot); */ ++ for (; !err && cookie->bindex <= bbot; ++ cookie->bindex++, cookie->h_pos = 0) { ++ h_file = au_hf_dir(file, cookie->bindex); ++ if (!h_file) ++ continue; ++ ++ au_fclr_rdu(cookie->flags, FULL); ++ err = au_rdu_do(h_file, &arg); ++ AuTraceErr(err); ++ if (unlikely(au_ftest_rdu(cookie->flags, FULL) || err)) ++ break; ++ } ++ AuDbg("rent %llu\n", rdu->rent); ++ ++ if (!err && !au_ftest_rdu(cookie->flags, CONT)) { ++ rdu->shwh = !!au_opt_test(au_sbi(arg.sb)->si_mntflags, SHWH); ++ au_fset_rdu(cookie->flags, CONT); ++ cookie->generation = au_figen(file); ++ } ++ ++ ii_read_lock_child(inode); ++ fsstack_copy_attr_atime(inode, au_h_iptr(inode, au_ibtop(inode))); ++ ii_read_unlock(inode); ++ ++out_unlock: ++ fi_read_unlock(file); ++out_si: ++ si_read_unlock(arg.sb); ++out_mtx: ++ inode_unlock_shared(inode); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_rdu_ino(struct file *file, struct aufs_rdu *rdu) ++{ ++ int err; ++ ino_t ino; ++ unsigned long long nent; ++ union au_rdu_ent_ul *u; ++ struct au_rdu_ent ent; ++ struct super_block *sb; ++ ++ err = 0; ++ nent = rdu->nent; ++ u = &rdu->ent; ++ sb = file->f_path.dentry->d_sb; ++ si_read_lock(sb, AuLock_FLUSH); ++ while (nent-- > 0) { ++ /* unnecessary to support mmap_sem since this is a dir */ ++ err = copy_from_user(&ent, u->e, sizeof(ent)); ++ if (!err) ++ err = !access_ok(VERIFY_WRITE, &u->e->ino, sizeof(ino)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ break; ++ } ++ ++ /* AuDbg("b%d, i%llu\n", ent.bindex, ent.ino); */ ++ if (!ent.wh) ++ err = au_ino(sb, ent.bindex, ent.ino, ent.type, &ino); ++ else ++ err = au_wh_ino(sb, ent.bindex, ent.ino, ent.type, ++ &ino); ++ if (unlikely(err)) { ++ AuTraceErr(err); ++ break; ++ } ++ ++ err = __put_user(ino, &u->e->ino); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ break; ++ } ++ u->ul += au_rdu_len(ent.nlen); ++ } ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_rdu_verify(struct aufs_rdu *rdu) ++{ ++ AuDbg("rdu{%llu, %p, %u | %u | %llu, %u, %u | " ++ "%llu, b%d, 0x%x, g%u}\n", ++ rdu->sz, rdu->ent.e, rdu->verify[AufsCtlRduV_SZ], ++ rdu->blk, ++ rdu->rent, rdu->shwh, rdu->full, ++ rdu->cookie.h_pos, rdu->cookie.bindex, rdu->cookie.flags, ++ rdu->cookie.generation); ++ ++ if (rdu->verify[AufsCtlRduV_SZ] == sizeof(*rdu)) ++ return 0; ++ ++ AuDbg("%u:%u\n", ++ rdu->verify[AufsCtlRduV_SZ], (unsigned int)sizeof(*rdu)); ++ return -EINVAL; ++} ++ ++long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err, e; ++ struct aufs_rdu rdu; ++ void __user *p = (void __user *)arg; ++ ++ err = copy_from_user(&rdu, p, sizeof(rdu)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ err = au_rdu_verify(&rdu); ++ if (unlikely(err)) ++ goto out; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ err = au_rdu(file, &rdu); ++ if (unlikely(err)) ++ break; ++ ++ e = copy_to_user(p, &rdu, sizeof(rdu)); ++ if (unlikely(e)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ break; ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ino(file, &rdu); ++ break; ++ ++ default: ++ /* err = -ENOTTY; */ ++ err = -EINVAL; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++#ifdef CONFIG_COMPAT ++long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ long err, e; ++ struct aufs_rdu rdu; ++ void __user *p = compat_ptr(arg); ++ ++ /* todo: get_user()? */ ++ err = copy_from_user(&rdu, p, sizeof(rdu)); ++ if (unlikely(err)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ goto out; ++ } ++ rdu.ent.e = compat_ptr(rdu.ent.ul); ++ err = au_rdu_verify(&rdu); ++ if (unlikely(err)) ++ goto out; ++ ++ switch (cmd) { ++ case AUFS_CTL_RDU: ++ err = au_rdu(file, &rdu); ++ if (unlikely(err)) ++ break; ++ ++ rdu.ent.ul = ptr_to_compat(rdu.ent.e); ++ rdu.tail.ul = ptr_to_compat(rdu.tail.e); ++ e = copy_to_user(p, &rdu, sizeof(rdu)); ++ if (unlikely(e)) { ++ err = -EFAULT; ++ AuTraceErr(err); ++ } ++ break; ++ case AUFS_CTL_RDU_INO: ++ err = au_rdu_ino(file, &rdu); ++ break; ++ ++ default: ++ /* err = -ENOTTY; */ ++ err = -EINVAL; ++ } ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++#endif +diff -Naur null/fs/aufs/rwsem.h linux-4.15/fs/aufs/rwsem.h +--- /dev/null ++++ linux-4.15/fs/aufs/rwsem.h 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,72 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * simple read-write semaphore wrappers ++ */ ++ ++#ifndef __AUFS_RWSEM_H__ ++#define __AUFS_RWSEM_H__ ++ ++#ifdef __KERNEL__ ++ ++#include "debug.h" ++ ++/* in the futre, the name 'au_rwsem' will be totally gone */ ++#define au_rwsem rw_semaphore ++ ++/* to debug easier, do not make them inlined functions */ ++#define AuRwMustNoWaiters(rw) AuDebugOn(rwsem_is_contended(rw)) ++/* rwsem_is_locked() is unusable */ ++#define AuRwMustReadLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held_type(rw, 1)) ++#define AuRwMustWriteLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held_type(rw, 0)) ++#define AuRwMustAnyLock(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && !lockdep_is_held(rw)) ++#define AuRwDestroy(rw) AuDebugOn(!lockdep_recursing(current) \ ++ && debug_locks \ ++ && lockdep_is_held(rw)) ++ ++#define au_rw_init(rw) init_rwsem(rw) ++ ++#define au_rw_init_wlock(rw) do { \ ++ au_rw_init(rw); \ ++ down_write(rw); \ ++ } while (0) ++ ++#define au_rw_init_wlock_nested(rw, lsc) do { \ ++ au_rw_init(rw); \ ++ down_write_nested(rw, lsc); \ ++ } while (0) ++ ++#define au_rw_read_lock(rw) down_read(rw) ++#define au_rw_read_lock_nested(rw, lsc) down_read_nested(rw, lsc) ++#define au_rw_read_unlock(rw) up_read(rw) ++#define au_rw_dgrade_lock(rw) downgrade_write(rw) ++#define au_rw_write_lock(rw) down_write(rw) ++#define au_rw_write_lock_nested(rw, lsc) down_write_nested(rw, lsc) ++#define au_rw_write_unlock(rw) up_write(rw) ++/* why is not _nested version defined? */ ++#define au_rw_read_trylock(rw) down_read_trylock(rw) ++#define au_rw_write_trylock(rw) down_write_trylock(rw) ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_RWSEM_H__ */ +diff -Naur null/fs/aufs/sbinfo.c linux-4.15/fs/aufs/sbinfo.c +--- /dev/null ++++ linux-4.15/fs/aufs/sbinfo.c 2018-02-25 02:38:09.204738113 +0100 +@@ -0,0 +1,304 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * superblock private data ++ */ ++ ++#include "aufs.h" ++ ++/* ++ * they are necessary regardless sysfs is disabled. ++ */ ++void au_si_free(struct kobject *kobj) ++{ ++ int i; ++ struct au_sbinfo *sbinfo; ++ char *locked __maybe_unused; /* debug only */ ++ ++ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); ++ for (i = 0; i < AuPlink_NHASH; i++) ++ AuDebugOn(!hlist_bl_empty(sbinfo->si_plink + i)); ++ AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); ++ ++ AuDebugOn(percpu_counter_sum(&sbinfo->si_ninodes)); ++ percpu_counter_destroy(&sbinfo->si_ninodes); ++ AuDebugOn(percpu_counter_sum(&sbinfo->si_nfiles)); ++ percpu_counter_destroy(&sbinfo->si_nfiles); ++ ++ au_rw_write_lock(&sbinfo->si_rwsem); ++ au_br_free(sbinfo); ++ au_rw_write_unlock(&sbinfo->si_rwsem); ++ ++ kfree(sbinfo->si_branch); ++ mutex_destroy(&sbinfo->si_xib_mtx); ++ AuRwDestroy(&sbinfo->si_rwsem); ++ ++ kfree(sbinfo); ++} ++ ++int au_si_alloc(struct super_block *sb) ++{ ++ int err, i; ++ struct au_sbinfo *sbinfo; ++ ++ err = -ENOMEM; ++ sbinfo = kzalloc(sizeof(*sbinfo), GFP_NOFS); ++ if (unlikely(!sbinfo)) ++ goto out; ++ ++ /* will be reallocated separately */ ++ sbinfo->si_branch = kzalloc(sizeof(*sbinfo->si_branch), GFP_NOFS); ++ if (unlikely(!sbinfo->si_branch)) ++ goto out_sbinfo; ++ ++ err = sysaufs_si_init(sbinfo); ++ if (unlikely(err)) ++ goto out_br; ++ ++ au_nwt_init(&sbinfo->si_nowait); ++ au_rw_init_wlock(&sbinfo->si_rwsem); ++ ++ percpu_counter_init(&sbinfo->si_ninodes, 0, GFP_NOFS); ++ percpu_counter_init(&sbinfo->si_nfiles, 0, GFP_NOFS); ++ ++ sbinfo->si_bbot = -1; ++ sbinfo->si_last_br_id = AUFS_BRANCH_MAX / 2; ++ ++ sbinfo->si_wbr_copyup = AuWbrCopyup_Def; ++ sbinfo->si_wbr_create = AuWbrCreate_Def; ++ sbinfo->si_wbr_copyup_ops = au_wbr_copyup_ops + sbinfo->si_wbr_copyup; ++ sbinfo->si_wbr_create_ops = au_wbr_create_ops + sbinfo->si_wbr_create; ++ ++ au_fhsm_init(sbinfo); ++ ++ sbinfo->si_mntflags = au_opts_plink(AuOpt_Def); ++ ++ sbinfo->si_xino_jiffy = jiffies; ++ sbinfo->si_xino_expire ++ = msecs_to_jiffies(AUFS_XINO_DEF_SEC * MSEC_PER_SEC); ++ mutex_init(&sbinfo->si_xib_mtx); ++ sbinfo->si_xino_brid = -1; ++ /* leave si_xib_last_pindex and si_xib_next_bit */ ++ ++ INIT_HLIST_BL_HEAD(&sbinfo->si_aopen); ++ ++ sbinfo->si_rdcache = msecs_to_jiffies(AUFS_RDCACHE_DEF * MSEC_PER_SEC); ++ sbinfo->si_rdblk = AUFS_RDBLK_DEF; ++ sbinfo->si_rdhash = AUFS_RDHASH_DEF; ++ sbinfo->si_dirwh = AUFS_DIRWH_DEF; ++ ++ for (i = 0; i < AuPlink_NHASH; i++) ++ INIT_HLIST_BL_HEAD(sbinfo->si_plink + i); ++ init_waitqueue_head(&sbinfo->si_plink_wq); ++ spin_lock_init(&sbinfo->si_plink_maint_lock); ++ ++ INIT_HLIST_BL_HEAD(&sbinfo->si_files); ++ ++ /* with getattr by default */ ++ sbinfo->si_iop_array = aufs_iop; ++ ++ /* leave other members for sysaufs and si_mnt. */ ++ sbinfo->si_sb = sb; ++ sb->s_fs_info = sbinfo; ++ si_pid_set(sb); ++ return 0; /* success */ ++ ++out_br: ++ kfree(sbinfo->si_branch); ++out_sbinfo: ++ kfree(sbinfo); ++out: ++ return err; ++} ++ ++int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink) ++{ ++ int err, sz; ++ struct au_branch **brp; ++ ++ AuRwMustWriteLock(&sbinfo->si_rwsem); ++ ++ err = -ENOMEM; ++ sz = sizeof(*brp) * (sbinfo->si_bbot + 1); ++ if (unlikely(!sz)) ++ sz = sizeof(*brp); ++ brp = au_kzrealloc(sbinfo->si_branch, sz, sizeof(*brp) * nbr, GFP_NOFS, ++ may_shrink); ++ if (brp) { ++ sbinfo->si_branch = brp; ++ err = 0; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++unsigned int au_sigen_inc(struct super_block *sb) ++{ ++ unsigned int gen; ++ struct inode *inode; ++ ++ SiMustWriteLock(sb); ++ ++ gen = ++au_sbi(sb)->si_generation; ++ au_update_digen(sb->s_root); ++ inode = d_inode(sb->s_root); ++ au_update_iigen(inode, /*half*/0); ++ inode->i_version++; ++ return gen; ++} ++ ++aufs_bindex_t au_new_br_id(struct super_block *sb) ++{ ++ aufs_bindex_t br_id; ++ int i; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ for (i = 0; i <= AUFS_BRANCH_MAX; i++) { ++ br_id = ++sbinfo->si_last_br_id; ++ AuDebugOn(br_id < 0); ++ if (br_id && au_br_index(sb, br_id) < 0) ++ return br_id; ++ } ++ ++ return -1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* it is ok that new 'nwt' tasks are appended while we are sleeping */ ++int si_read_lock(struct super_block *sb, int flags) ++{ ++ int err; ++ ++ err = 0; ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ ++ si_noflush_read_lock(sb); ++ err = au_plink_maint(sb, flags); ++ if (unlikely(err)) ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++int si_write_lock(struct super_block *sb, int flags) ++{ ++ int err; ++ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ ++ si_noflush_write_lock(sb); ++ err = au_plink_maint(sb, flags); ++ if (unlikely(err)) ++ si_write_unlock(sb); ++ ++ return err; ++} ++ ++/* dentry and super_block lock. call at entry point */ ++int aufs_read_lock(struct dentry *dentry, int flags) ++{ ++ int err; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ err = si_read_lock(sb, flags); ++ if (unlikely(err)) ++ goto out; ++ ++ if (au_ftest_lock(flags, DW)) ++ di_write_lock_child(dentry); ++ else ++ di_read_lock_child(dentry, flags); ++ ++ if (au_ftest_lock(flags, GEN)) { ++ err = au_digen_test(dentry, au_sigen(sb)); ++ if (!au_opt_test(au_mntflags(sb), UDBA_NONE)) ++ AuDebugOn(!err && au_dbrange_test(dentry)); ++ else if (!err) ++ err = au_dbrange_test(dentry); ++ if (unlikely(err)) ++ aufs_read_unlock(dentry, flags); ++ } ++ ++out: ++ return err; ++} ++ ++void aufs_read_unlock(struct dentry *dentry, int flags) ++{ ++ if (au_ftest_lock(flags, DW)) ++ di_write_unlock(dentry); ++ else ++ di_read_unlock(dentry, flags); ++ si_read_unlock(dentry->d_sb); ++} ++ ++void aufs_write_lock(struct dentry *dentry) ++{ ++ si_write_lock(dentry->d_sb, AuLock_FLUSH | AuLock_NOPLMW); ++ di_write_lock_child(dentry); ++} ++ ++void aufs_write_unlock(struct dentry *dentry) ++{ ++ di_write_unlock(dentry); ++ si_write_unlock(dentry->d_sb); ++} ++ ++int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags) ++{ ++ int err; ++ unsigned int sigen; ++ struct super_block *sb; ++ ++ sb = d1->d_sb; ++ err = si_read_lock(sb, flags); ++ if (unlikely(err)) ++ goto out; ++ ++ di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS)); ++ ++ if (au_ftest_lock(flags, GEN)) { ++ sigen = au_sigen(sb); ++ err = au_digen_test(d1, sigen); ++ AuDebugOn(!err && au_dbrange_test(d1)); ++ if (!err) { ++ err = au_digen_test(d2, sigen); ++ AuDebugOn(!err && au_dbrange_test(d2)); ++ } ++ if (unlikely(err)) ++ aufs_read_and_write_unlock2(d1, d2); ++ } ++ ++out: ++ return err; ++} ++ ++void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2) ++{ ++ di_write_unlock2(d1, d2); ++ si_read_unlock(d1->d_sb); ++} +diff -Naur null/fs/aufs/super.c linux-4.15/fs/aufs/super.c +--- /dev/null ++++ linux-4.15/fs/aufs/super.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,1046 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * mount and super_block operations ++ */ ++ ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++/* ++ * super_operations ++ */ ++static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused) ++{ ++ struct au_icntnr *c; ++ ++ c = au_cache_alloc_icntnr(); ++ if (c) { ++ au_icntnr_init(c); ++ c->vfs_inode.i_version = 1; /* sigen(sb); */ ++ c->iinfo.ii_hinode = NULL; ++ return &c->vfs_inode; ++ } ++ return NULL; ++} ++ ++static void aufs_destroy_inode_cb(struct rcu_head *head) ++{ ++ struct inode *inode = container_of(head, struct inode, i_rcu); ++ ++ au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode)); ++} ++ ++static void aufs_destroy_inode(struct inode *inode) ++{ ++ if (!au_is_bad_inode(inode)) ++ au_iinfo_fin(inode); ++ call_rcu(&inode->i_rcu, aufs_destroy_inode_cb); ++} ++ ++struct inode *au_iget_locked(struct super_block *sb, ino_t ino) ++{ ++ struct inode *inode; ++ int err; ++ ++ inode = iget_locked(sb, ino); ++ if (unlikely(!inode)) { ++ inode = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ if (!(inode->i_state & I_NEW)) ++ goto out; ++ ++ err = au_xigen_new(inode); ++ if (!err) ++ err = au_iinfo_init(inode); ++ if (!err) ++ inode->i_version++; ++ else { ++ iget_failed(inode); ++ inode = ERR_PTR(err); ++ } ++ ++out: ++ /* never return NULL */ ++ AuDebugOn(!inode); ++ AuTraceErrPtr(inode); ++ return inode; ++} ++ ++/* lock free root dinfo */ ++static int au_show_brs(struct seq_file *seq, struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ struct path path; ++ struct au_hdentry *hdp; ++ struct au_branch *br; ++ au_br_perm_str_t perm; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ bindex = 0; ++ hdp = au_hdentry(au_di(sb->s_root), bindex); ++ for (; !err && bindex <= bbot; bindex++, hdp++) { ++ br = au_sbr(sb, bindex); ++ path.mnt = au_br_mnt(br); ++ path.dentry = hdp->hd_dentry; ++ err = au_seq_path(seq, &path); ++ if (!err) { ++ au_optstr_br_perm(&perm, br->br_perm); ++ seq_printf(seq, "=%s", perm.a); ++ if (bindex != bbot) ++ seq_putc(seq, ':'); ++ } ++ } ++ if (unlikely(err || seq_has_overflowed(seq))) ++ err = -E2BIG; ++ ++ return err; ++} ++ ++static void au_gen_fmt(char *fmt, int len __maybe_unused, const char *pat, ++ const char *append) ++{ ++ char *p; ++ ++ p = fmt; ++ while (*pat != ':') ++ *p++ = *pat++; ++ *p++ = *pat++; ++ strcpy(p, append); ++ AuDebugOn(strlen(fmt) >= len); ++} ++ ++static void au_show_wbr_create(struct seq_file *m, int v, ++ struct au_sbinfo *sbinfo) ++{ ++ const char *pat; ++ char fmt[32]; ++ struct au_wbr_mfs *mfs; ++ ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ ++ seq_puts(m, ",create="); ++ pat = au_optstr_wbr_create(v); ++ mfs = &sbinfo->si_wbr_mfs; ++ switch (v) { ++ case AuWbrCreate_TDP: ++ case AuWbrCreate_RR: ++ case AuWbrCreate_MFS: ++ case AuWbrCreate_PMFS: ++ seq_puts(m, pat); ++ break; ++ case AuWbrCreate_MFSRR: ++ case AuWbrCreate_TDMFS: ++ case AuWbrCreate_PMFSRR: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu"); ++ seq_printf(m, fmt, mfs->mfsrr_watermark); ++ break; ++ case AuWbrCreate_MFSV: ++ case AuWbrCreate_PMFSV: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%lu"); ++ seq_printf(m, fmt, ++ jiffies_to_msecs(mfs->mfs_expire) ++ / MSEC_PER_SEC); ++ break; ++ case AuWbrCreate_MFSRRV: ++ case AuWbrCreate_TDMFSV: ++ case AuWbrCreate_PMFSRRV: ++ au_gen_fmt(fmt, sizeof(fmt), pat, "%llu:%lu"); ++ seq_printf(m, fmt, mfs->mfsrr_watermark, ++ jiffies_to_msecs(mfs->mfs_expire) / MSEC_PER_SEC); ++ break; ++ default: ++ BUG(); ++ } ++} ++ ++static int au_show_xino(struct seq_file *seq, struct super_block *sb) ++{ ++#ifdef CONFIG_SYSFS ++ return 0; ++#else ++ int err; ++ const int len = sizeof(AUFS_XINO_FNAME) - 1; ++ aufs_bindex_t bindex, brid; ++ struct qstr *name; ++ struct file *f; ++ struct dentry *d, *h_root; ++ ++ AuRwMustAnyLock(&sbinfo->si_rwsem); ++ ++ err = 0; ++ f = au_sbi(sb)->si_xib; ++ if (!f) ++ goto out; ++ ++ /* stop printing the default xino path on the first writable branch */ ++ h_root = NULL; ++ brid = au_xino_brid(sb); ++ if (brid >= 0) { ++ bindex = au_br_index(sb, brid); ++ h_root = au_hdentry(au_di(sb->s_root), bindex)->hd_dentry; ++ } ++ d = f->f_path.dentry; ++ name = &d->d_name; ++ /* safe ->d_parent because the file is unlinked */ ++ if (d->d_parent == h_root ++ && name->len == len ++ && !memcmp(name->name, AUFS_XINO_FNAME, len)) ++ goto out; ++ ++ seq_puts(seq, ",xino="); ++ err = au_xino_path(seq, f); ++ ++out: ++ return err; ++#endif ++} ++ ++/* seq_file will re-call me in case of too long string */ ++static int aufs_show_options(struct seq_file *m, struct dentry *dentry) ++{ ++ int err; ++ unsigned int mnt_flags, v; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++#define AuBool(name, str) do { \ ++ v = au_opt_test(mnt_flags, name); \ ++ if (v != au_opt_test(AuOpt_Def, name)) \ ++ seq_printf(m, ",%s" #str, v ? "" : "no"); \ ++} while (0) ++ ++#define AuStr(name, str) do { \ ++ v = mnt_flags & AuOptMask_##name; \ ++ if (v != (AuOpt_Def & AuOptMask_##name)) \ ++ seq_printf(m, "," #str "=%s", au_optstr_##str(v)); \ ++} while (0) ++ ++#define AuUInt(name, str, val) do { \ ++ if (val != AUFS_##name##_DEF) \ ++ seq_printf(m, "," #str "=%u", val); \ ++} while (0) ++ ++ sb = dentry->d_sb; ++ if (sb->s_flags & SB_POSIXACL) ++ seq_puts(m, ",acl"); ++ ++ /* lock free root dinfo */ ++ si_noflush_read_lock(sb); ++ sbinfo = au_sbi(sb); ++ seq_printf(m, ",si=%lx", sysaufs_si_id(sbinfo)); ++ ++ mnt_flags = au_mntflags(sb); ++ if (au_opt_test(mnt_flags, XINO)) { ++ err = au_show_xino(m, sb); ++ if (unlikely(err)) ++ goto out; ++ } else ++ seq_puts(m, ",noxino"); ++ ++ AuBool(TRUNC_XINO, trunc_xino); ++ AuStr(UDBA, udba); ++ AuBool(SHWH, shwh); ++ AuBool(PLINK, plink); ++ AuBool(DIO, dio); ++ AuBool(DIRPERM1, dirperm1); ++ ++ v = sbinfo->si_wbr_create; ++ if (v != AuWbrCreate_Def) ++ au_show_wbr_create(m, v, sbinfo); ++ ++ v = sbinfo->si_wbr_copyup; ++ if (v != AuWbrCopyup_Def) ++ seq_printf(m, ",cpup=%s", au_optstr_wbr_copyup(v)); ++ ++ v = au_opt_test(mnt_flags, ALWAYS_DIROPQ); ++ if (v != au_opt_test(AuOpt_Def, ALWAYS_DIROPQ)) ++ seq_printf(m, ",diropq=%c", v ? 'a' : 'w'); ++ ++ AuUInt(DIRWH, dirwh, sbinfo->si_dirwh); ++ ++ v = jiffies_to_msecs(sbinfo->si_rdcache) / MSEC_PER_SEC; ++ AuUInt(RDCACHE, rdcache, v); ++ ++ AuUInt(RDBLK, rdblk, sbinfo->si_rdblk); ++ AuUInt(RDHASH, rdhash, sbinfo->si_rdhash); ++ ++ au_fhsm_show(m, sbinfo); ++ ++ AuBool(DIRREN, dirren); ++ AuBool(SUM, sum); ++ /* AuBool(SUM_W, wsum); */ ++ AuBool(WARN_PERM, warn_perm); ++ AuBool(VERBOSE, verbose); ++ ++out: ++ /* be sure to print "br:" last */ ++ if (!sysaufs_brs) { ++ seq_puts(m, ",br:"); ++ au_show_brs(m, sb); ++ } ++ si_read_unlock(sb); ++ return 0; ++ ++#undef AuBool ++#undef AuStr ++#undef AuUInt ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* sum mode which returns the summation for statfs(2) */ ++ ++static u64 au_add_till_max(u64 a, u64 b) ++{ ++ u64 old; ++ ++ old = a; ++ a += b; ++ if (old <= a) ++ return a; ++ return ULLONG_MAX; ++} ++ ++static u64 au_mul_till_max(u64 a, long mul) ++{ ++ u64 old; ++ ++ old = a; ++ a *= mul; ++ if (old <= a) ++ return a; ++ return ULLONG_MAX; ++} ++ ++static int au_statfs_sum(struct super_block *sb, struct kstatfs *buf) ++{ ++ int err; ++ long bsize, factor; ++ u64 blocks, bfree, bavail, files, ffree; ++ aufs_bindex_t bbot, bindex, i; ++ unsigned char shared; ++ struct path h_path; ++ struct super_block *h_sb; ++ ++ err = 0; ++ bsize = LONG_MAX; ++ files = 0; ++ ffree = 0; ++ blocks = 0; ++ bfree = 0; ++ bavail = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ h_path.mnt = au_sbr_mnt(sb, bindex); ++ h_sb = h_path.mnt->mnt_sb; ++ shared = 0; ++ for (i = 0; !shared && i < bindex; i++) ++ shared = (au_sbr_sb(sb, i) == h_sb); ++ if (shared) ++ continue; ++ ++ /* sb->s_root for NFS is unreliable */ ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, buf); ++ if (unlikely(err)) ++ goto out; ++ ++ if (bsize > buf->f_bsize) { ++ /* ++ * we will reduce bsize, so we have to expand blocks ++ * etc. to match them again ++ */ ++ factor = (bsize / buf->f_bsize); ++ blocks = au_mul_till_max(blocks, factor); ++ bfree = au_mul_till_max(bfree, factor); ++ bavail = au_mul_till_max(bavail, factor); ++ bsize = buf->f_bsize; ++ } ++ ++ factor = (buf->f_bsize / bsize); ++ blocks = au_add_till_max(blocks, ++ au_mul_till_max(buf->f_blocks, factor)); ++ bfree = au_add_till_max(bfree, ++ au_mul_till_max(buf->f_bfree, factor)); ++ bavail = au_add_till_max(bavail, ++ au_mul_till_max(buf->f_bavail, factor)); ++ files = au_add_till_max(files, buf->f_files); ++ ffree = au_add_till_max(ffree, buf->f_ffree); ++ } ++ ++ buf->f_bsize = bsize; ++ buf->f_blocks = blocks; ++ buf->f_bfree = bfree; ++ buf->f_bavail = bavail; ++ buf->f_files = files; ++ buf->f_ffree = ffree; ++ buf->f_frsize = 0; ++ ++out: ++ return err; ++} ++ ++static int aufs_statfs(struct dentry *dentry, struct kstatfs *buf) ++{ ++ int err; ++ struct path h_path; ++ struct super_block *sb; ++ ++ /* lock free root dinfo */ ++ sb = dentry->d_sb; ++ si_noflush_read_lock(sb); ++ if (!au_opt_test(au_mntflags(sb), SUM)) { ++ /* sb->s_root for NFS is unreliable */ ++ h_path.mnt = au_sbr_mnt(sb, 0); ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, buf); ++ } else ++ err = au_statfs_sum(sb, buf); ++ si_read_unlock(sb); ++ ++ if (!err) { ++ buf->f_type = AUFS_SUPER_MAGIC; ++ buf->f_namelen = AUFS_MAX_NAMELEN; ++ memset(&buf->f_fsid, 0, sizeof(buf->f_fsid)); ++ } ++ /* buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; */ ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int aufs_sync_fs(struct super_block *sb, int wait) ++{ ++ int err, e; ++ aufs_bindex_t bbot, bindex; ++ struct au_branch *br; ++ struct super_block *h_sb; ++ ++ err = 0; ++ si_noflush_read_lock(sb); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!au_br_writable(br->br_perm)) ++ continue; ++ ++ h_sb = au_sbr_sb(sb, bindex); ++ e = vfsub_sync_filesystem(h_sb, wait); ++ if (unlikely(e && !err)) ++ err = e; ++ /* go on even if an error happens */ ++ } ++ si_read_unlock(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* final actions when unmounting a file system */ ++static void aufs_put_super(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = au_sbi(sb); ++ if (!sbinfo) ++ return; ++ ++ dbgaufs_si_fin(sbinfo); ++ kobject_put(&sbinfo->si_kobj); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, ++ struct super_block *sb, void *arg) ++{ ++ void *array; ++ unsigned long long n, sz; ++ ++ array = NULL; ++ n = 0; ++ if (!*hint) ++ goto out; ++ ++ if (*hint > ULLONG_MAX / sizeof(array)) { ++ array = ERR_PTR(-EMFILE); ++ pr_err("hint %llu\n", *hint); ++ goto out; ++ } ++ ++ sz = sizeof(array) * *hint; ++ array = kzalloc(sz, GFP_NOFS); ++ if (unlikely(!array)) ++ array = vzalloc(sz); ++ if (unlikely(!array)) { ++ array = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ n = cb(sb, array, *hint, arg); ++ AuDebugOn(n > *hint); ++ ++out: ++ *hint = n; ++ return array; ++} ++ ++static unsigned long long au_iarray_cb(struct super_block *sb, void *a, ++ unsigned long long max __maybe_unused, ++ void *arg) ++{ ++ unsigned long long n; ++ struct inode **p, *inode; ++ struct list_head *head; ++ ++ n = 0; ++ p = a; ++ head = arg; ++ spin_lock(&sb->s_inode_list_lock); ++ list_for_each_entry(inode, head, i_sb_list) { ++ if (!au_is_bad_inode(inode) ++ && au_ii(inode)->ii_btop >= 0) { ++ spin_lock(&inode->i_lock); ++ if (atomic_read(&inode->i_count)) { ++ au_igrab(inode); ++ *p++ = inode; ++ n++; ++ AuDebugOn(n > max); ++ } ++ spin_unlock(&inode->i_lock); ++ } ++ } ++ spin_unlock(&sb->s_inode_list_lock); ++ ++ return n; ++} ++ ++struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max) ++{ ++ *max = au_ninodes(sb); ++ return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes); ++} ++ ++void au_iarray_free(struct inode **a, unsigned long long max) ++{ ++ unsigned long long ull; ++ ++ for (ull = 0; ull < max; ull++) ++ iput(a[ull]); ++ kvfree(a); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * refresh dentry and inode at remount time. ++ */ ++/* todo: consolidate with simple_reval_dpath() and au_reval_for_attr() */ ++static int au_do_refresh(struct dentry *dentry, unsigned int dir_flags, ++ struct dentry *parent) ++{ ++ int err; ++ ++ di_write_lock_child(dentry); ++ di_read_lock_parent(parent, AuLock_IR); ++ err = au_refresh_dentry(dentry, parent); ++ if (!err && dir_flags) ++ au_hn_reset(d_inode(dentry), dir_flags); ++ di_read_unlock(parent, AuLock_IR); ++ di_write_unlock(dentry); ++ ++ return err; ++} ++ ++static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen, ++ struct au_sbinfo *sbinfo, ++ const unsigned int dir_flags, unsigned int do_idop) ++{ ++ int err; ++ struct dentry *parent; ++ ++ err = 0; ++ parent = dget_parent(dentry); ++ if (!au_digen_test(parent, sigen) && au_digen_test(dentry, sigen)) { ++ if (d_really_is_positive(dentry)) { ++ if (!d_is_dir(dentry)) ++ err = au_do_refresh(dentry, /*dir_flags*/0, ++ parent); ++ else { ++ err = au_do_refresh(dentry, dir_flags, parent); ++ if (unlikely(err)) ++ au_fset_si(sbinfo, FAILED_REFRESH_DIR); ++ } ++ } else ++ err = au_do_refresh(dentry, /*dir_flags*/0, parent); ++ AuDbgDentry(dentry); ++ } ++ dput(parent); ++ ++ if (!err) { ++ if (do_idop) ++ au_refresh_dop(dentry, /*force_reval*/0); ++ } else ++ au_refresh_dop(dentry, /*force_reval*/1); ++ ++ AuTraceErr(err); ++ return err; ++} ++ ++static int au_refresh_d(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, i, j, ndentry, e; ++ unsigned int sigen; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries, *d; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root = sb->s_root; ++ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); ++ ++ if (do_idop) ++ au_refresh_dop(root, /*force_reval*/0); ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_dcsub_pages(&dpages, root, NULL, NULL); ++ if (unlikely(err)) ++ goto out_dpages; ++ ++ sigen = au_sigen(sb); ++ sbinfo = au_sbi(sb); ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ d = dentries[j]; ++ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags, ++ do_idop); ++ if (unlikely(e && !err)) ++ err = e; ++ /* go on even err */ ++ } ++ } ++ ++out_dpages: ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int au_refresh_i(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, e; ++ unsigned int sigen; ++ unsigned long long max, ull; ++ struct inode *inode, **array; ++ ++ array = au_iarray_alloc(sb, &max); ++ err = PTR_ERR(array); ++ if (IS_ERR(array)) ++ goto out; ++ ++ err = 0; ++ sigen = au_sigen(sb); ++ for (ull = 0; ull < max; ull++) { ++ inode = array[ull]; ++ if (unlikely(!inode)) ++ break; ++ ++ e = 0; ++ ii_write_lock_child(inode); ++ if (au_iigen(inode, NULL) != sigen) { ++ e = au_refresh_hinode_self(inode); ++ if (unlikely(e)) { ++ au_refresh_iop(inode, /*force_getattr*/1); ++ pr_err("error %d, i%lu\n", e, inode->i_ino); ++ if (!err) ++ err = e; ++ /* go on even if err */ ++ } ++ } ++ if (!e && do_idop) ++ au_refresh_iop(inode, /*force_getattr*/0); ++ ii_write_unlock(inode); ++ } ++ ++ au_iarray_free(array, max); ++ ++out: ++ return err; ++} ++ ++static void au_remount_refresh(struct super_block *sb, unsigned int do_idop) ++{ ++ int err, e; ++ unsigned int udba; ++ aufs_bindex_t bindex, bbot; ++ struct dentry *root; ++ struct inode *inode; ++ struct au_branch *br; ++ struct au_sbinfo *sbi; ++ ++ au_sigen_inc(sb); ++ sbi = au_sbi(sb); ++ au_fclr_si(sbi, FAILED_REFRESH_DIR); ++ ++ root = sb->s_root; ++ DiMustNoWaiters(root); ++ inode = d_inode(root); ++ IiMustNoWaiters(inode); ++ ++ udba = au_opt_udba(sb); ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ err = au_hnotify_reset_br(udba, br, br->br_perm); ++ if (unlikely(err)) ++ AuIOErr("hnotify failed on br %d, %d, ignored\n", ++ bindex, err); ++ /* go on even if err */ ++ } ++ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1)); ++ ++ if (do_idop) { ++ if (au_ftest_si(sbi, NO_DREVAL)) { ++ AuDebugOn(sb->s_d_op == &aufs_dop_noreval); ++ sb->s_d_op = &aufs_dop_noreval; ++ AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr); ++ sbi->si_iop_array = aufs_iop_nogetattr; ++ } else { ++ AuDebugOn(sb->s_d_op == &aufs_dop); ++ sb->s_d_op = &aufs_dop; ++ AuDebugOn(sbi->si_iop_array == aufs_iop); ++ sbi->si_iop_array = aufs_iop; ++ } ++ pr_info("reset to %pf and %pf\n", ++ sb->s_d_op, sbi->si_iop_array); ++ } ++ ++ di_write_unlock(root); ++ err = au_refresh_d(sb, do_idop); ++ e = au_refresh_i(sb, do_idop); ++ if (unlikely(e && !err)) ++ err = e; ++ /* aufs_write_lock() calls ..._child() */ ++ di_write_lock_child(root); ++ ++ au_cpup_attr_all(inode, /*force*/1); ++ ++ if (unlikely(err)) ++ AuIOErr("refresh failed, ignored, %d\n", err); ++} ++ ++/* stop extra interpretation of errno in mount(8), and strange error messages */ ++static int cvt_err(int err) ++{ ++ AuTraceErr(err); ++ ++ switch (err) { ++ case -ENOENT: ++ case -ENOTDIR: ++ case -EEXIST: ++ case -EIO: ++ err = -EINVAL; ++ } ++ return err; ++} ++ ++static int aufs_remount_fs(struct super_block *sb, int *flags, char *data) ++{ ++ int err, do_dx; ++ unsigned int mntflags; ++ struct au_opts opts = { ++ .opt = NULL ++ }; ++ struct dentry *root; ++ struct inode *inode; ++ struct au_sbinfo *sbinfo; ++ ++ err = 0; ++ root = sb->s_root; ++ if (!data || !*data) { ++ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (!err) { ++ di_write_lock_child(root); ++ err = au_opts_verify(sb, *flags, /*pending*/0); ++ aufs_write_unlock(root); ++ } ++ goto out; ++ } ++ ++ err = -ENOMEM; ++ opts.opt = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!opts.opt)) ++ goto out; ++ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); ++ opts.flags = AuOpts_REMOUNT; ++ opts.sb_flags = *flags; ++ ++ /* parse it before aufs lock */ ++ err = au_opts_parse(sb, data, &opts); ++ if (unlikely(err)) ++ goto out_opts; ++ ++ sbinfo = au_sbi(sb); ++ inode = d_inode(root); ++ inode_lock(inode); ++ err = si_write_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out_mtx; ++ di_write_lock_child(root); ++ ++ /* au_opts_remount() may return an error */ ++ err = au_opts_remount(sb, &opts); ++ au_opts_free(&opts); ++ ++ if (au_ftest_opts(opts.flags, REFRESH)) ++ au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_IDOP)); ++ ++ if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) { ++ mntflags = au_mntflags(sb); ++ do_dx = !!au_opt_test(mntflags, DIO); ++ au_dy_arefresh(do_dx); ++ } ++ ++ au_fhsm_wrote_all(sb, /*force*/1); /* ?? */ ++ aufs_write_unlock(root); ++ ++out_mtx: ++ inode_unlock(inode); ++out_opts: ++ free_page((unsigned long)opts.opt); ++out: ++ err = cvt_err(err); ++ AuTraceErr(err); ++ return err; ++} ++ ++static const struct super_operations aufs_sop = { ++ .alloc_inode = aufs_alloc_inode, ++ .destroy_inode = aufs_destroy_inode, ++ /* always deleting, no clearing */ ++ .drop_inode = generic_delete_inode, ++ .show_options = aufs_show_options, ++ .statfs = aufs_statfs, ++ .put_super = aufs_put_super, ++ .sync_fs = aufs_sync_fs, ++ .remount_fs = aufs_remount_fs ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int alloc_root(struct super_block *sb) ++{ ++ int err; ++ struct inode *inode; ++ struct dentry *root; ++ ++ err = -ENOMEM; ++ inode = au_iget_locked(sb, AUFS_ROOT_INO); ++ err = PTR_ERR(inode); ++ if (IS_ERR(inode)) ++ goto out; ++ ++ inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */ ++ inode->i_fop = &aufs_dir_fop; ++ inode->i_mode = S_IFDIR; ++ set_nlink(inode, 2); ++ unlock_new_inode(inode); ++ ++ root = d_make_root(inode); ++ if (unlikely(!root)) ++ goto out; ++ err = PTR_ERR(root); ++ if (IS_ERR(root)) ++ goto out; ++ ++ err = au_di_init(root); ++ if (!err) { ++ sb->s_root = root; ++ return 0; /* success */ ++ } ++ dput(root); ++ ++out: ++ return err; ++} ++ ++static int aufs_fill_super(struct super_block *sb, void *raw_data, ++ int silent __maybe_unused) ++{ ++ int err; ++ struct au_opts opts = { ++ .opt = NULL ++ }; ++ struct au_sbinfo *sbinfo; ++ struct dentry *root; ++ struct inode *inode; ++ char *arg = raw_data; ++ ++ if (unlikely(!arg || !*arg)) { ++ err = -EINVAL; ++ pr_err("no arg\n"); ++ goto out; ++ } ++ ++ err = -ENOMEM; ++ opts.opt = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!opts.opt)) ++ goto out; ++ opts.max_opt = PAGE_SIZE / sizeof(*opts.opt); ++ opts.sb_flags = sb->s_flags; ++ ++ err = au_si_alloc(sb); ++ if (unlikely(err)) ++ goto out_opts; ++ sbinfo = au_sbi(sb); ++ ++ /* all timestamps always follow the ones on the branch */ ++ sb->s_flags |= SB_NOATIME | SB_NODIRATIME; ++ sb->s_op = &aufs_sop; ++ sb->s_d_op = &aufs_dop; ++ sb->s_magic = AUFS_SUPER_MAGIC; ++ sb->s_maxbytes = 0; ++ sb->s_stack_depth = 1; ++ au_export_init(sb); ++ au_xattr_init(sb); ++ ++ err = alloc_root(sb); ++ if (unlikely(err)) { ++ si_write_unlock(sb); ++ goto out_info; ++ } ++ root = sb->s_root; ++ inode = d_inode(root); ++ ++ /* ++ * actually we can parse options regardless aufs lock here. ++ * but at remount time, parsing must be done before aufs lock. ++ * so we follow the same rule. ++ */ ++ ii_write_lock_parent(inode); ++ aufs_write_unlock(root); ++ err = au_opts_parse(sb, arg, &opts); ++ if (unlikely(err)) ++ goto out_root; ++ ++ /* lock vfs_inode first, then aufs. */ ++ inode_lock(inode); ++ aufs_write_lock(root); ++ err = au_opts_mount(sb, &opts); ++ au_opts_free(&opts); ++ if (!err && au_ftest_si(sbinfo, NO_DREVAL)) { ++ sb->s_d_op = &aufs_dop_noreval; ++ pr_info("%pf\n", sb->s_d_op); ++ au_refresh_dop(root, /*force_reval*/0); ++ sbinfo->si_iop_array = aufs_iop_nogetattr; ++ au_refresh_iop(inode, /*force_getattr*/0); ++ } ++ aufs_write_unlock(root); ++ inode_unlock(inode); ++ if (!err) ++ goto out_opts; /* success */ ++ ++out_root: ++ dput(root); ++ sb->s_root = NULL; ++out_info: ++ dbgaufs_si_fin(sbinfo); ++ kobject_put(&sbinfo->si_kobj); ++ sb->s_fs_info = NULL; ++out_opts: ++ free_page((unsigned long)opts.opt); ++out: ++ AuTraceErr(err); ++ err = cvt_err(err); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct dentry *aufs_mount(struct file_system_type *fs_type, int flags, ++ const char *dev_name __maybe_unused, ++ void *raw_data) ++{ ++ struct dentry *root; ++ struct super_block *sb; ++ ++ /* all timestamps always follow the ones on the branch */ ++ /* mnt->mnt_flags |= MNT_NOATIME | MNT_NODIRATIME; */ ++ root = mount_nodev(fs_type, flags, raw_data, aufs_fill_super); ++ if (IS_ERR(root)) ++ goto out; ++ ++ sb = root->d_sb; ++ si_write_lock(sb, !AuLock_FLUSH); ++ sysaufs_brs_add(sb, 0); ++ si_write_unlock(sb); ++ au_sbilist_add(sb); ++ ++out: ++ return root; ++} ++ ++static void aufs_kill_sb(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ sbinfo = au_sbi(sb); ++ if (sbinfo) { ++ au_sbilist_del(sb); ++ aufs_write_lock(sb->s_root); ++ au_fhsm_fin(sb); ++ if (sbinfo->si_wbr_create_ops->fin) ++ sbinfo->si_wbr_create_ops->fin(sb); ++ if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) { ++ au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE); ++ au_remount_refresh(sb, /*do_idop*/0); ++ } ++ if (au_opt_test(sbinfo->si_mntflags, PLINK)) ++ au_plink_put(sb, /*verbose*/1); ++ au_xino_clr(sb); ++ au_dr_opt_flush(sb); ++ sbinfo->si_sb = NULL; ++ aufs_write_unlock(sb->s_root); ++ au_nwt_flush(&sbinfo->si_nowait); ++ } ++ kill_anon_super(sb); ++} ++ ++struct file_system_type aufs_fs_type = { ++ .name = AUFS_FSTYPE, ++ /* a race between rename and others */ ++ .fs_flags = FS_RENAME_DOES_D_MOVE, ++ .mount = aufs_mount, ++ .kill_sb = aufs_kill_sb, ++ /* no need to __module_get() and module_put(). */ ++ .owner = THIS_MODULE, ++}; +diff -Naur null/fs/aufs/super.h linux-4.15/fs/aufs/super.h +--- /dev/null ++++ linux-4.15/fs/aufs/super.h 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,626 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * super_block operations ++ */ ++ ++#ifndef __AUFS_SUPER_H__ ++#define __AUFS_SUPER_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include "hbl.h" ++#include "rwsem.h" ++#include "wkq.h" ++ ++/* policies to select one among multiple writable branches */ ++struct au_wbr_copyup_operations { ++ int (*copyup)(struct dentry *dentry); ++}; ++ ++#define AuWbr_DIR 1 /* target is a dir */ ++#define AuWbr_PARENT (1 << 1) /* always require a parent */ ++ ++#define au_ftest_wbr(flags, name) ((flags) & AuWbr_##name) ++#define au_fset_wbr(flags, name) { (flags) |= AuWbr_##name; } ++#define au_fclr_wbr(flags, name) { (flags) &= ~AuWbr_##name; } ++ ++struct au_wbr_create_operations { ++ int (*create)(struct dentry *dentry, unsigned int flags); ++ int (*init)(struct super_block *sb); ++ int (*fin)(struct super_block *sb); ++}; ++ ++struct au_wbr_mfs { ++ struct mutex mfs_lock; /* protect this structure */ ++ unsigned long mfs_jiffy; ++ unsigned long mfs_expire; ++ aufs_bindex_t mfs_bindex; ++ ++ unsigned long long mfsrr_bytes; ++ unsigned long long mfsrr_watermark; ++}; ++ ++#define AuPlink_NHASH 100 ++static inline int au_plink_hash(ino_t ino) ++{ ++ return ino % AuPlink_NHASH; ++} ++ ++/* File-based Hierarchical Storage Management */ ++struct au_fhsm { ++#ifdef CONFIG_AUFS_FHSM ++ /* allow only one process who can receive the notification */ ++ spinlock_t fhsm_spin; ++ pid_t fhsm_pid; ++ wait_queue_head_t fhsm_wqh; ++ atomic_t fhsm_readable; ++ ++ /* these are protected by si_rwsem */ ++ unsigned long fhsm_expire; ++ aufs_bindex_t fhsm_bottom; ++#endif ++}; ++ ++struct au_branch; ++struct au_sbinfo { ++ /* nowait tasks in the system-wide workqueue */ ++ struct au_nowait_tasks si_nowait; ++ ++ /* ++ * tried sb->s_umount, but failed due to the dependecy between i_mutex. ++ * rwsem for au_sbinfo is necessary. ++ */ ++ struct au_rwsem si_rwsem; ++ ++ /* ++ * dirty approach to protect sb->sb_inodes and ->s_files (gone) from ++ * remount. ++ */ ++ struct percpu_counter si_ninodes, si_nfiles; ++ ++ /* branch management */ ++ unsigned int si_generation; ++ ++ /* see AuSi_ flags */ ++ unsigned char au_si_status; ++ ++ aufs_bindex_t si_bbot; ++ ++ /* dirty trick to keep br_id plus */ ++ unsigned int si_last_br_id : ++ sizeof(aufs_bindex_t) * BITS_PER_BYTE - 1; ++ struct au_branch **si_branch; ++ ++ /* policy to select a writable branch */ ++ unsigned char si_wbr_copyup; ++ unsigned char si_wbr_create; ++ struct au_wbr_copyup_operations *si_wbr_copyup_ops; ++ struct au_wbr_create_operations *si_wbr_create_ops; ++ ++ /* round robin */ ++ atomic_t si_wbr_rr_next; ++ ++ /* most free space */ ++ struct au_wbr_mfs si_wbr_mfs; ++ ++ /* File-based Hierarchical Storage Management */ ++ struct au_fhsm si_fhsm; ++ ++ /* mount flags */ ++ /* include/asm-ia64/siginfo.h defines a macro named si_flags */ ++ unsigned int si_mntflags; ++ ++ /* external inode number (bitmap and translation table) */ ++ vfs_readf_t si_xread; ++ vfs_writef_t si_xwrite; ++ struct file *si_xib; ++ struct mutex si_xib_mtx; /* protect xib members */ ++ unsigned long *si_xib_buf; ++ unsigned long si_xib_last_pindex; ++ int si_xib_next_bit; ++ aufs_bindex_t si_xino_brid; ++ unsigned long si_xino_jiffy; ++ unsigned long si_xino_expire; ++ /* reserved for future use */ ++ /* unsigned long long si_xib_limit; */ /* Max xib file size */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++ /* i_generation */ ++ struct file *si_xigen; ++ atomic_t si_xigen_next; ++#endif ++ ++ /* dirty trick to suppoer atomic_open */ ++ struct hlist_bl_head si_aopen; ++ ++ /* vdir parameters */ ++ unsigned long si_rdcache; /* max cache time in jiffies */ ++ unsigned int si_rdblk; /* deblk size */ ++ unsigned int si_rdhash; /* hash size */ ++ ++ /* ++ * If the number of whiteouts are larger than si_dirwh, leave all of ++ * them after au_whtmp_ren to reduce the cost of rmdir(2). ++ * future fsck.aufs or kernel thread will remove them later. ++ * Otherwise, remove all whiteouts and the dir in rmdir(2). ++ */ ++ unsigned int si_dirwh; ++ ++ /* pseudo_link list */ ++ struct hlist_bl_head si_plink[AuPlink_NHASH]; ++ wait_queue_head_t si_plink_wq; ++ spinlock_t si_plink_maint_lock; ++ pid_t si_plink_maint_pid; ++ ++ /* file list */ ++ struct hlist_bl_head si_files; ++ ++ /* with/without getattr, brother of sb->s_d_op */ ++ struct inode_operations *si_iop_array; ++ ++ /* ++ * sysfs and lifetime management. ++ * this is not a small structure and it may be a waste of memory in case ++ * of sysfs is disabled, particulary when many aufs-es are mounted. ++ * but using sysfs is majority. ++ */ ++ struct kobject si_kobj; ++#ifdef CONFIG_DEBUG_FS ++ struct dentry *si_dbgaufs; ++ struct dentry *si_dbgaufs_plink; ++ struct dentry *si_dbgaufs_xib; ++#ifdef CONFIG_AUFS_EXPORT ++ struct dentry *si_dbgaufs_xigen; ++#endif ++#endif ++ ++#ifdef CONFIG_AUFS_SBILIST ++ struct hlist_bl_node si_list; ++#endif ++ ++ /* dirty, necessary for unmounting, sysfs and sysrq */ ++ struct super_block *si_sb; ++}; ++ ++/* sbinfo status flags */ ++/* ++ * set true when refresh_dirs() failed at remount time. ++ * then try refreshing dirs at access time again. ++ * if it is false, refreshing dirs at access time is unnecesary ++ */ ++#define AuSi_FAILED_REFRESH_DIR 1 ++#define AuSi_FHSM (1 << 1) /* fhsm is active now */ ++#define AuSi_NO_DREVAL (1 << 2) /* disable all d_revalidate */ ++ ++#ifndef CONFIG_AUFS_FHSM ++#undef AuSi_FHSM ++#define AuSi_FHSM 0 ++#endif ++ ++static inline unsigned char au_do_ftest_si(struct au_sbinfo *sbi, ++ unsigned int flag) ++{ ++ AuRwMustAnyLock(&sbi->si_rwsem); ++ return sbi->au_si_status & flag; ++} ++#define au_ftest_si(sbinfo, name) au_do_ftest_si(sbinfo, AuSi_##name) ++#define au_fset_si(sbinfo, name) do { \ ++ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ ++ (sbinfo)->au_si_status |= AuSi_##name; \ ++} while (0) ++#define au_fclr_si(sbinfo, name) do { \ ++ AuRwMustWriteLock(&(sbinfo)->si_rwsem); \ ++ (sbinfo)->au_si_status &= ~AuSi_##name; \ ++} while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policy to select one among writable branches */ ++#define AuWbrCopyup(sbinfo, ...) \ ++ ((sbinfo)->si_wbr_copyup_ops->copyup(__VA_ARGS__)) ++#define AuWbrCreate(sbinfo, ...) \ ++ ((sbinfo)->si_wbr_create_ops->create(__VA_ARGS__)) ++ ++/* flags for si_read_lock()/aufs_read_lock()/di_read_lock() */ ++#define AuLock_DW 1 /* write-lock dentry */ ++#define AuLock_IR (1 << 1) /* read-lock inode */ ++#define AuLock_IW (1 << 2) /* write-lock inode */ ++#define AuLock_FLUSH (1 << 3) /* wait for 'nowait' tasks */ ++#define AuLock_DIRS (1 << 4) /* target is a pair of dirs */ ++ /* except RENAME_EXCHANGE */ ++#define AuLock_NOPLM (1 << 5) /* return err in plm mode */ ++#define AuLock_NOPLMW (1 << 6) /* wait for plm mode ends */ ++#define AuLock_GEN (1 << 7) /* test digen/iigen */ ++#define au_ftest_lock(flags, name) ((flags) & AuLock_##name) ++#define au_fset_lock(flags, name) \ ++ do { (flags) |= AuLock_##name; } while (0) ++#define au_fclr_lock(flags, name) \ ++ do { (flags) &= ~AuLock_##name; } while (0) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* super.c */ ++extern struct file_system_type aufs_fs_type; ++struct inode *au_iget_locked(struct super_block *sb, ino_t ino); ++typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array, ++ unsigned long long max, void *arg); ++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, ++ struct super_block *sb, void *arg); ++struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max); ++void au_iarray_free(struct inode **a, unsigned long long max); ++ ++/* sbinfo.c */ ++void au_si_free(struct kobject *kobj); ++int au_si_alloc(struct super_block *sb); ++int au_sbr_realloc(struct au_sbinfo *sbinfo, int nbr, int may_shrink); ++ ++unsigned int au_sigen_inc(struct super_block *sb); ++aufs_bindex_t au_new_br_id(struct super_block *sb); ++ ++int si_read_lock(struct super_block *sb, int flags); ++int si_write_lock(struct super_block *sb, int flags); ++int aufs_read_lock(struct dentry *dentry, int flags); ++void aufs_read_unlock(struct dentry *dentry, int flags); ++void aufs_write_lock(struct dentry *dentry); ++void aufs_write_unlock(struct dentry *dentry); ++int aufs_read_and_write_lock2(struct dentry *d1, struct dentry *d2, int flags); ++void aufs_read_and_write_unlock2(struct dentry *d1, struct dentry *d2); ++ ++/* wbr_policy.c */ ++extern struct au_wbr_copyup_operations au_wbr_copyup_ops[]; ++extern struct au_wbr_create_operations au_wbr_create_ops[]; ++int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst); ++int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex); ++int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop); ++ ++/* mvdown.c */ ++int au_mvdown(struct dentry *dentry, struct aufs_mvdown __user *arg); ++ ++#ifdef CONFIG_AUFS_FHSM ++/* fhsm.c */ ++ ++static inline pid_t au_fhsm_pid(struct au_fhsm *fhsm) ++{ ++ pid_t pid; ++ ++ spin_lock(&fhsm->fhsm_spin); ++ pid = fhsm->fhsm_pid; ++ spin_unlock(&fhsm->fhsm_spin); ++ ++ return pid; ++} ++ ++void au_fhsm_wrote(struct super_block *sb, aufs_bindex_t bindex, int force); ++void au_fhsm_wrote_all(struct super_block *sb, int force); ++int au_fhsm_fd(struct super_block *sb, int oflags); ++int au_fhsm_br_alloc(struct au_branch *br); ++void au_fhsm_set_bottom(struct super_block *sb, aufs_bindex_t bindex); ++void au_fhsm_fin(struct super_block *sb); ++void au_fhsm_init(struct au_sbinfo *sbinfo); ++void au_fhsm_set(struct au_sbinfo *sbinfo, unsigned int sec); ++void au_fhsm_show(struct seq_file *seq, struct au_sbinfo *sbinfo); ++#else ++AuStubVoid(au_fhsm_wrote, struct super_block *sb, aufs_bindex_t bindex, ++ int force) ++AuStubVoid(au_fhsm_wrote_all, struct super_block *sb, int force) ++AuStub(int, au_fhsm_fd, return -EOPNOTSUPP, struct super_block *sb, int oflags) ++AuStub(pid_t, au_fhsm_pid, return 0, struct au_fhsm *fhsm) ++AuStubInt0(au_fhsm_br_alloc, struct au_branch *br) ++AuStubVoid(au_fhsm_set_bottom, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(au_fhsm_fin, struct super_block *sb) ++AuStubVoid(au_fhsm_init, struct au_sbinfo *sbinfo) ++AuStubVoid(au_fhsm_set, struct au_sbinfo *sbinfo, unsigned int sec) ++AuStubVoid(au_fhsm_show, struct seq_file *seq, struct au_sbinfo *sbinfo) ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct au_sbinfo *au_sbi(struct super_block *sb) ++{ ++ return sb->s_fs_info; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_EXPORT ++int au_test_nfsd(void); ++void au_export_init(struct super_block *sb); ++void au_xigen_inc(struct inode *inode); ++int au_xigen_new(struct inode *inode); ++int au_xigen_set(struct super_block *sb, struct file *base); ++void au_xigen_clr(struct super_block *sb); ++ ++static inline int au_busy_or_stale(void) ++{ ++ if (!au_test_nfsd()) ++ return -EBUSY; ++ return -ESTALE; ++} ++#else ++AuStubInt0(au_test_nfsd, void) ++AuStubVoid(au_export_init, struct super_block *sb) ++AuStubVoid(au_xigen_inc, struct inode *inode) ++AuStubInt0(au_xigen_new, struct inode *inode) ++AuStubInt0(au_xigen_set, struct super_block *sb, struct file *base) ++AuStubVoid(au_xigen_clr, struct super_block *sb) ++AuStub(int, au_busy_or_stale, return -EBUSY, void) ++#endif /* CONFIG_AUFS_EXPORT */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_SBILIST ++/* module.c */ ++extern struct hlist_bl_head au_sbilist; ++ ++static inline void au_sbilist_init(void) ++{ ++ INIT_HLIST_BL_HEAD(&au_sbilist); ++} ++ ++static inline void au_sbilist_add(struct super_block *sb) ++{ ++ au_hbl_add(&au_sbi(sb)->si_list, &au_sbilist); ++} ++ ++static inline void au_sbilist_del(struct super_block *sb) ++{ ++ au_hbl_del(&au_sbi(sb)->si_list, &au_sbilist); ++} ++ ++#ifdef CONFIG_AUFS_MAGIC_SYSRQ ++static inline void au_sbilist_lock(void) ++{ ++ hlist_bl_lock(&au_sbilist); ++} ++ ++static inline void au_sbilist_unlock(void) ++{ ++ hlist_bl_unlock(&au_sbilist); ++} ++#define AuGFP_SBILIST GFP_ATOMIC ++#else ++AuStubVoid(au_sbilist_lock, void) ++AuStubVoid(au_sbilist_unlock, void) ++#define AuGFP_SBILIST GFP_NOFS ++#endif /* CONFIG_AUFS_MAGIC_SYSRQ */ ++#else ++AuStubVoid(au_sbilist_init, void) ++AuStubVoid(au_sbilist_add, struct super_block *sb) ++AuStubVoid(au_sbilist_del, struct super_block *sb) ++AuStubVoid(au_sbilist_lock, void) ++AuStubVoid(au_sbilist_unlock, void) ++#define AuGFP_SBILIST GFP_NOFS ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void dbgaufs_si_null(struct au_sbinfo *sbinfo) ++{ ++ /* ++ * This function is a dynamic '__init' function actually, ++ * so the tiny check for si_rwsem is unnecessary. ++ */ ++ /* AuRwMustWriteLock(&sbinfo->si_rwsem); */ ++#ifdef CONFIG_DEBUG_FS ++ sbinfo->si_dbgaufs = NULL; ++ sbinfo->si_dbgaufs_plink = NULL; ++ sbinfo->si_dbgaufs_xib = NULL; ++#ifdef CONFIG_AUFS_EXPORT ++ sbinfo->si_dbgaufs_xigen = NULL; ++#endif ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* current->atomic_flags */ ++/* this value should never corrupt the ones defined in linux/sched.h */ ++#define PFA_AUFS 7 ++ ++TASK_PFA_TEST(AUFS, test_aufs) /* task_test_aufs */ ++TASK_PFA_SET(AUFS, aufs) /* task_set_aufs */ ++TASK_PFA_CLEAR(AUFS, aufs) /* task_clear_aufs */ ++ ++static inline int si_pid_test(struct super_block *sb) ++{ ++ return !!task_test_aufs(current); ++} ++ ++static inline void si_pid_clr(struct super_block *sb) ++{ ++ AuDebugOn(!task_test_aufs(current)); ++ task_clear_aufs(current); ++} ++ ++static inline void si_pid_set(struct super_block *sb) ++{ ++ AuDebugOn(task_test_aufs(current)); ++ task_set_aufs(current); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock superblock. mainly for entry point functions */ ++#define __si_read_lock(sb) au_rw_read_lock(&au_sbi(sb)->si_rwsem) ++#define __si_write_lock(sb) au_rw_write_lock(&au_sbi(sb)->si_rwsem) ++#define __si_read_trylock(sb) au_rw_read_trylock(&au_sbi(sb)->si_rwsem) ++#define __si_write_trylock(sb) au_rw_write_trylock(&au_sbi(sb)->si_rwsem) ++/* ++#define __si_read_trylock_nested(sb) \ ++ au_rw_read_trylock_nested(&au_sbi(sb)->si_rwsem) ++#define __si_write_trylock_nested(sb) \ ++ au_rw_write_trylock_nested(&au_sbi(sb)->si_rwsem) ++*/ ++ ++#define __si_read_unlock(sb) au_rw_read_unlock(&au_sbi(sb)->si_rwsem) ++#define __si_write_unlock(sb) au_rw_write_unlock(&au_sbi(sb)->si_rwsem) ++#define __si_downgrade_lock(sb) au_rw_dgrade_lock(&au_sbi(sb)->si_rwsem) ++ ++#define SiMustNoWaiters(sb) AuRwMustNoWaiters(&au_sbi(sb)->si_rwsem) ++#define SiMustAnyLock(sb) AuRwMustAnyLock(&au_sbi(sb)->si_rwsem) ++#define SiMustWriteLock(sb) AuRwMustWriteLock(&au_sbi(sb)->si_rwsem) ++ ++static inline void si_noflush_read_lock(struct super_block *sb) ++{ ++ __si_read_lock(sb); ++ si_pid_set(sb); ++} ++ ++static inline int si_noflush_read_trylock(struct super_block *sb) ++{ ++ int locked; ++ ++ locked = __si_read_trylock(sb); ++ if (locked) ++ si_pid_set(sb); ++ return locked; ++} ++ ++static inline void si_noflush_write_lock(struct super_block *sb) ++{ ++ __si_write_lock(sb); ++ si_pid_set(sb); ++} ++ ++static inline int si_noflush_write_trylock(struct super_block *sb) ++{ ++ int locked; ++ ++ locked = __si_write_trylock(sb); ++ if (locked) ++ si_pid_set(sb); ++ return locked; ++} ++ ++#if 0 /* reserved */ ++static inline int si_read_trylock(struct super_block *sb, int flags) ++{ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ return si_noflush_read_trylock(sb); ++} ++#endif ++ ++static inline void si_read_unlock(struct super_block *sb) ++{ ++ si_pid_clr(sb); ++ __si_read_unlock(sb); ++} ++ ++#if 0 /* reserved */ ++static inline int si_write_trylock(struct super_block *sb, int flags) ++{ ++ if (au_ftest_lock(flags, FLUSH)) ++ au_nwt_flush(&au_sbi(sb)->si_nowait); ++ return si_noflush_write_trylock(sb); ++} ++#endif ++ ++static inline void si_write_unlock(struct super_block *sb) ++{ ++ si_pid_clr(sb); ++ __si_write_unlock(sb); ++} ++ ++#if 0 /* reserved */ ++static inline void si_downgrade_lock(struct super_block *sb) ++{ ++ __si_downgrade_lock(sb); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline aufs_bindex_t au_sbbot(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_bbot; ++} ++ ++static inline unsigned int au_mntflags(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_mntflags; ++} ++ ++static inline unsigned int au_sigen(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_generation; ++} ++ ++static inline unsigned long long au_ninodes(struct super_block *sb) ++{ ++ s64 n = percpu_counter_sum(&au_sbi(sb)->si_ninodes); ++ ++ BUG_ON(n < 0); ++ return n; ++} ++ ++static inline void au_ninodes_inc(struct super_block *sb) ++{ ++ percpu_counter_inc(&au_sbi(sb)->si_ninodes); ++} ++ ++static inline void au_ninodes_dec(struct super_block *sb) ++{ ++ percpu_counter_dec(&au_sbi(sb)->si_ninodes); ++} ++ ++static inline unsigned long long au_nfiles(struct super_block *sb) ++{ ++ s64 n = percpu_counter_sum(&au_sbi(sb)->si_nfiles); ++ ++ BUG_ON(n < 0); ++ return n; ++} ++ ++static inline void au_nfiles_inc(struct super_block *sb) ++{ ++ percpu_counter_inc(&au_sbi(sb)->si_nfiles); ++} ++ ++static inline void au_nfiles_dec(struct super_block *sb) ++{ ++ percpu_counter_dec(&au_sbi(sb)->si_nfiles); ++} ++ ++static inline struct au_branch *au_sbr(struct super_block *sb, ++ aufs_bindex_t bindex) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_branch[0 + bindex]; ++} ++ ++static inline void au_xino_brid_set(struct super_block *sb, aufs_bindex_t brid) ++{ ++ SiMustWriteLock(sb); ++ au_sbi(sb)->si_xino_brid = brid; ++} ++ ++static inline aufs_bindex_t au_xino_brid(struct super_block *sb) ++{ ++ SiMustAnyLock(sb); ++ return au_sbi(sb)->si_xino_brid; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_SUPER_H__ */ +diff -Naur null/fs/aufs/sysaufs.c linux-4.15/fs/aufs/sysaufs.c +--- /dev/null ++++ linux-4.15/fs/aufs/sysaufs.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,104 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sysfs interface and lifetime management ++ * they are necessary regardless sysfs is disabled. ++ */ ++ ++#include ++#include "aufs.h" ++ ++unsigned long sysaufs_si_mask; ++struct kset *sysaufs_kset; ++ ++#define AuSiAttr(_name) { \ ++ .attr = { .name = __stringify(_name), .mode = 0444 }, \ ++ .show = sysaufs_si_##_name, \ ++} ++ ++static struct sysaufs_si_attr sysaufs_si_attr_xi_path = AuSiAttr(xi_path); ++struct attribute *sysaufs_si_attrs[] = { ++ &sysaufs_si_attr_xi_path.attr, ++ NULL, ++}; ++ ++static const struct sysfs_ops au_sbi_ops = { ++ .show = sysaufs_si_show ++}; ++ ++static struct kobj_type au_sbi_ktype = { ++ .release = au_si_free, ++ .sysfs_ops = &au_sbi_ops, ++ .default_attrs = sysaufs_si_attrs ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int sysaufs_si_init(struct au_sbinfo *sbinfo) ++{ ++ int err; ++ ++ sbinfo->si_kobj.kset = sysaufs_kset; ++ /* cf. sysaufs_name() */ ++ err = kobject_init_and_add ++ (&sbinfo->si_kobj, &au_sbi_ktype, /*&sysaufs_kset->kobj*/NULL, ++ SysaufsSiNamePrefix "%lx", sysaufs_si_id(sbinfo)); ++ ++ dbgaufs_si_null(sbinfo); ++ if (!err) { ++ err = dbgaufs_si_init(sbinfo); ++ if (unlikely(err)) ++ kobject_put(&sbinfo->si_kobj); ++ } ++ return err; ++} ++ ++void sysaufs_fin(void) ++{ ++ dbgaufs_fin(); ++ sysfs_remove_group(&sysaufs_kset->kobj, sysaufs_attr_group); ++ kset_unregister(sysaufs_kset); ++} ++ ++int __init sysaufs_init(void) ++{ ++ int err; ++ ++ do { ++ get_random_bytes(&sysaufs_si_mask, sizeof(sysaufs_si_mask)); ++ } while (!sysaufs_si_mask); ++ ++ err = -EINVAL; ++ sysaufs_kset = kset_create_and_add(AUFS_NAME, NULL, fs_kobj); ++ if (unlikely(!sysaufs_kset)) ++ goto out; ++ err = PTR_ERR(sysaufs_kset); ++ if (IS_ERR(sysaufs_kset)) ++ goto out; ++ err = sysfs_create_group(&sysaufs_kset->kobj, sysaufs_attr_group); ++ if (unlikely(err)) { ++ kset_unregister(sysaufs_kset); ++ goto out; ++ } ++ ++ err = dbgaufs_init(); ++ if (unlikely(err)) ++ sysaufs_fin(); ++out: ++ return err; ++} +diff -Naur null/fs/aufs/sysaufs.h linux-4.15/fs/aufs/sysaufs.h +--- /dev/null ++++ linux-4.15/fs/aufs/sysaufs.h 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,101 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sysfs interface and mount lifetime management ++ */ ++ ++#ifndef __SYSAUFS_H__ ++#define __SYSAUFS_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include "module.h" ++ ++struct super_block; ++struct au_sbinfo; ++ ++struct sysaufs_si_attr { ++ struct attribute attr; ++ int (*show)(struct seq_file *seq, struct super_block *sb); ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* sysaufs.c */ ++extern unsigned long sysaufs_si_mask; ++extern struct kset *sysaufs_kset; ++extern struct attribute *sysaufs_si_attrs[]; ++int sysaufs_si_init(struct au_sbinfo *sbinfo); ++int __init sysaufs_init(void); ++void sysaufs_fin(void); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* some people doesn't like to show a pointer in kernel */ ++static inline unsigned long sysaufs_si_id(struct au_sbinfo *sbinfo) ++{ ++ return sysaufs_si_mask ^ (unsigned long)sbinfo; ++} ++ ++#define SysaufsSiNamePrefix "si_" ++#define SysaufsSiNameLen (sizeof(SysaufsSiNamePrefix) + 16) ++static inline void sysaufs_name(struct au_sbinfo *sbinfo, char *name) ++{ ++ snprintf(name, SysaufsSiNameLen, SysaufsSiNamePrefix "%lx", ++ sysaufs_si_id(sbinfo)); ++} ++ ++struct au_branch; ++#ifdef CONFIG_SYSFS ++/* sysfs.c */ ++extern struct attribute_group *sysaufs_attr_group; ++ ++int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb); ++ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, ++ char *buf); ++long au_brinfo_ioctl(struct file *file, unsigned long arg); ++#ifdef CONFIG_COMPAT ++long au_brinfo_compat_ioctl(struct file *file, unsigned long arg); ++#endif ++ ++void sysaufs_br_init(struct au_branch *br); ++void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex); ++void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex); ++ ++#define sysaufs_brs_init() do {} while (0) ++ ++#else ++#define sysaufs_attr_group NULL ++ ++AuStubInt0(sysaufs_si_xi_path, struct seq_file *seq, struct super_block *sb) ++AuStub(ssize_t, sysaufs_si_show, return 0, struct kobject *kobj, ++ struct attribute *attr, char *buf) ++AuStubVoid(sysaufs_br_init, struct au_branch *br) ++AuStubVoid(sysaufs_brs_add, struct super_block *sb, aufs_bindex_t bindex) ++AuStubVoid(sysaufs_brs_del, struct super_block *sb, aufs_bindex_t bindex) ++ ++static inline void sysaufs_brs_init(void) ++{ ++ sysaufs_brs = 0; ++} ++ ++#endif /* CONFIG_SYSFS */ ++ ++#endif /* __KERNEL__ */ ++#endif /* __SYSAUFS_H__ */ +diff -Naur null/fs/aufs/sysfs.c linux-4.15/fs/aufs/sysfs.c +--- /dev/null ++++ linux-4.15/fs/aufs/sysfs.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,376 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sysfs interface ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++#ifdef CONFIG_AUFS_FS_MODULE ++/* this entry violates the "one line per file" policy of sysfs */ ++static ssize_t config_show(struct kobject *kobj, struct kobj_attribute *attr, ++ char *buf) ++{ ++ ssize_t err; ++ static char *conf = ++/* this file is generated at compiling */ ++#include "conf.str" ++ ; ++ ++ err = snprintf(buf, PAGE_SIZE, conf); ++ if (unlikely(err >= PAGE_SIZE)) ++ err = -EFBIG; ++ return err; ++} ++ ++static struct kobj_attribute au_config_attr = __ATTR_RO(config); ++#endif ++ ++static struct attribute *au_attr[] = { ++#ifdef CONFIG_AUFS_FS_MODULE ++ &au_config_attr.attr, ++#endif ++ NULL, /* need to NULL terminate the list of attributes */ ++}; ++ ++static struct attribute_group sysaufs_attr_group_body = { ++ .attrs = au_attr ++}; ++ ++struct attribute_group *sysaufs_attr_group = &sysaufs_attr_group_body; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int sysaufs_si_xi_path(struct seq_file *seq, struct super_block *sb) ++{ ++ int err; ++ ++ SiMustAnyLock(sb); ++ ++ err = 0; ++ if (au_opt_test(au_mntflags(sb), XINO)) { ++ err = au_xino_path(seq, au_sbi(sb)->si_xib); ++ seq_putc(seq, '\n'); ++ } ++ return err; ++} ++ ++/* ++ * the lifetime of branch is independent from the entry under sysfs. ++ * sysfs handles the lifetime of the entry, and never call ->show() after it is ++ * unlinked. ++ */ ++static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb, ++ aufs_bindex_t bindex, int idx) ++{ ++ int err; ++ struct path path; ++ struct dentry *root; ++ struct au_branch *br; ++ au_br_perm_str_t perm; ++ ++ AuDbg("b%d\n", bindex); ++ ++ err = 0; ++ root = sb->s_root; ++ di_read_lock_parent(root, !AuLock_IR); ++ br = au_sbr(sb, bindex); ++ ++ switch (idx) { ++ case AuBrSysfs_BR: ++ path.mnt = au_br_mnt(br); ++ path.dentry = au_h_dptr(root, bindex); ++ err = au_seq_path(seq, &path); ++ if (!err) { ++ au_optstr_br_perm(&perm, br->br_perm); ++ seq_printf(seq, "=%s\n", perm.a); ++ } ++ break; ++ case AuBrSysfs_BRID: ++ seq_printf(seq, "%d\n", br->br_id); ++ break; ++ } ++ di_read_unlock(root, !AuLock_IR); ++ if (unlikely(err || seq_has_overflowed(seq))) ++ err = -E2BIG; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static struct seq_file *au_seq(char *p, ssize_t len) ++{ ++ struct seq_file *seq; ++ ++ seq = kzalloc(sizeof(*seq), GFP_NOFS); ++ if (seq) { ++ /* mutex_init(&seq.lock); */ ++ seq->buf = p; ++ seq->size = len; ++ return seq; /* success */ ++ } ++ ++ seq = ERR_PTR(-ENOMEM); ++ return seq; ++} ++ ++#define SysaufsBr_PREFIX "br" ++#define SysaufsBrid_PREFIX "brid" ++ ++/* todo: file size may exceed PAGE_SIZE */ ++ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, ++ char *buf) ++{ ++ ssize_t err; ++ int idx; ++ long l; ++ aufs_bindex_t bbot; ++ struct au_sbinfo *sbinfo; ++ struct super_block *sb; ++ struct seq_file *seq; ++ char *name; ++ struct attribute **cattr; ++ ++ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); ++ sb = sbinfo->si_sb; ++ ++ /* ++ * prevent a race condition between sysfs and aufs. ++ * for instance, sysfs_file_read() calls sysfs_get_active_two() which ++ * prohibits maintaining the sysfs entries. ++ * hew we acquire read lock after sysfs_get_active_two(). ++ * on the other hand, the remount process may maintain the sysfs/aufs ++ * entries after acquiring write lock. ++ * it can cause a deadlock. ++ * simply we gave up processing read here. ++ */ ++ err = -EBUSY; ++ if (unlikely(!si_noflush_read_trylock(sb))) ++ goto out; ++ ++ seq = au_seq(buf, PAGE_SIZE); ++ err = PTR_ERR(seq); ++ if (IS_ERR(seq)) ++ goto out_unlock; ++ ++ name = (void *)attr->name; ++ cattr = sysaufs_si_attrs; ++ while (*cattr) { ++ if (!strcmp(name, (*cattr)->name)) { ++ err = container_of(*cattr, struct sysaufs_si_attr, attr) ++ ->show(seq, sb); ++ goto out_seq; ++ } ++ cattr++; ++ } ++ ++ if (!strncmp(name, SysaufsBrid_PREFIX, ++ sizeof(SysaufsBrid_PREFIX) - 1)) { ++ idx = AuBrSysfs_BRID; ++ name += sizeof(SysaufsBrid_PREFIX) - 1; ++ } else if (!strncmp(name, SysaufsBr_PREFIX, ++ sizeof(SysaufsBr_PREFIX) - 1)) { ++ idx = AuBrSysfs_BR; ++ name += sizeof(SysaufsBr_PREFIX) - 1; ++ } else ++ BUG(); ++ ++ err = kstrtol(name, 10, &l); ++ if (!err) { ++ bbot = au_sbbot(sb); ++ if (l <= bbot) ++ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx); ++ else ++ err = -ENOENT; ++ } ++ ++out_seq: ++ if (!err) { ++ err = seq->count; ++ /* sysfs limit */ ++ if (unlikely(err == PAGE_SIZE)) ++ err = -EFBIG; ++ } ++ kfree(seq); ++out_unlock: ++ si_read_unlock(sb); ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_brinfo(struct super_block *sb, union aufs_brinfo __user *arg) ++{ ++ int err; ++ int16_t brid; ++ aufs_bindex_t bindex, bbot; ++ size_t sz; ++ char *buf; ++ struct seq_file *seq; ++ struct au_branch *br; ++ ++ si_read_lock(sb, AuLock_FLUSH); ++ bbot = au_sbbot(sb); ++ err = bbot + 1; ++ if (!arg) ++ goto out; ++ ++ err = -ENOMEM; ++ buf = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!buf)) ++ goto out; ++ ++ seq = au_seq(buf, PAGE_SIZE); ++ err = PTR_ERR(seq); ++ if (IS_ERR(seq)) ++ goto out_buf; ++ ++ sz = sizeof(*arg) - offsetof(union aufs_brinfo, path); ++ for (bindex = 0; bindex <= bbot; bindex++, arg++) { ++ err = !access_ok(VERIFY_WRITE, arg, sizeof(*arg)); ++ if (unlikely(err)) ++ break; ++ ++ br = au_sbr(sb, bindex); ++ brid = br->br_id; ++ BUILD_BUG_ON(sizeof(brid) != sizeof(arg->id)); ++ err = __put_user(brid, &arg->id); ++ if (unlikely(err)) ++ break; ++ ++ BUILD_BUG_ON(sizeof(br->br_perm) != sizeof(arg->perm)); ++ err = __put_user(br->br_perm, &arg->perm); ++ if (unlikely(err)) ++ break; ++ ++ err = au_seq_path(seq, &br->br_path); ++ if (unlikely(err)) ++ break; ++ seq_putc(seq, '\0'); ++ if (!seq_has_overflowed(seq)) { ++ err = copy_to_user(arg->path, seq->buf, seq->count); ++ seq->count = 0; ++ if (unlikely(err)) ++ break; ++ } else { ++ err = -E2BIG; ++ goto out_seq; ++ } ++ } ++ if (unlikely(err)) ++ err = -EFAULT; ++ ++out_seq: ++ kfree(seq); ++out_buf: ++ free_page((unsigned long)buf); ++out: ++ si_read_unlock(sb); ++ return err; ++} ++ ++long au_brinfo_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_brinfo(file->f_path.dentry->d_sb, (void __user *)arg); ++} ++ ++#ifdef CONFIG_COMPAT ++long au_brinfo_compat_ioctl(struct file *file, unsigned long arg) ++{ ++ return au_brinfo(file->f_path.dentry->d_sb, compat_ptr(arg)); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++void sysaufs_br_init(struct au_branch *br) ++{ ++ int i; ++ struct au_brsysfs *br_sysfs; ++ struct attribute *attr; ++ ++ br_sysfs = br->br_sysfs; ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ attr = &br_sysfs->attr; ++ sysfs_attr_init(attr); ++ attr->name = br_sysfs->name; ++ attr->mode = S_IRUGO; ++ br_sysfs++; ++ } ++} ++ ++void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ struct au_branch *br; ++ struct kobject *kobj; ++ struct au_brsysfs *br_sysfs; ++ int i; ++ aufs_bindex_t bbot; ++ ++ dbgaufs_brs_del(sb, bindex); ++ ++ if (!sysaufs_brs) ++ return; ++ ++ kobj = &au_sbi(sb)->si_kobj; ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ br_sysfs = br->br_sysfs; ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ sysfs_remove_file(kobj, &br_sysfs->attr); ++ br_sysfs++; ++ } ++ } ++} ++ ++void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ int err, i; ++ aufs_bindex_t bbot; ++ struct kobject *kobj; ++ struct au_branch *br; ++ struct au_brsysfs *br_sysfs; ++ ++ dbgaufs_brs_add(sb, bindex); ++ ++ if (!sysaufs_brs) ++ return; ++ ++ kobj = &au_sbi(sb)->si_kobj; ++ bbot = au_sbbot(sb); ++ for (; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ br_sysfs = br->br_sysfs; ++ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name), ++ SysaufsBr_PREFIX "%d", bindex); ++ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name), ++ SysaufsBrid_PREFIX "%d", bindex); ++ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) { ++ err = sysfs_create_file(kobj, &br_sysfs->attr); ++ if (unlikely(err)) ++ pr_warn("failed %s under sysfs(%d)\n", ++ br_sysfs->name, err); ++ br_sysfs++; ++ } ++ } ++} +diff -Naur null/fs/aufs/sysrq.c linux-4.15/fs/aufs/sysrq.c +--- /dev/null ++++ linux-4.15/fs/aufs/sysrq.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,159 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * magic sysrq hanlder ++ */ ++ ++/* #include */ ++#include ++#include "aufs.h" ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void sysrq_sb(struct super_block *sb) ++{ ++ char *plevel; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ struct hlist_bl_head *files; ++ struct hlist_bl_node *pos; ++ struct au_finfo *finfo; ++ ++ plevel = au_plevel; ++ au_plevel = KERN_WARNING; ++ ++ /* since we define pr_fmt, call printk directly */ ++#define pr(str) printk(KERN_WARNING AUFS_NAME ": " str) ++ ++ sbinfo = au_sbi(sb); ++ printk(KERN_WARNING "si=%lx\n", sysaufs_si_id(sbinfo)); ++ pr("superblock\n"); ++ au_dpri_sb(sb); ++ ++#if 0 ++ pr("root dentry\n"); ++ au_dpri_dentry(sb->s_root); ++ pr("root inode\n"); ++ au_dpri_inode(d_inode(sb->s_root)); ++#endif ++ ++#if 0 ++ do { ++ int err, i, j, ndentry; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ ++ err = au_dpages_init(&dpages, GFP_ATOMIC); ++ if (unlikely(err)) ++ break; ++ err = au_dcsub_pages(&dpages, sb->s_root, NULL, NULL); ++ if (!err) ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) ++ au_dpri_dentry(dpage->dentries[j]); ++ } ++ au_dpages_free(&dpages); ++ } while (0); ++#endif ++ ++#if 1 ++ { ++ struct inode *i; ++ ++ pr("isolated inode\n"); ++ spin_lock(&sb->s_inode_list_lock); ++ list_for_each_entry(i, &sb->s_inodes, i_sb_list) { ++ spin_lock(&i->i_lock); ++ if (1 || hlist_empty(&i->i_dentry)) ++ au_dpri_inode(i); ++ spin_unlock(&i->i_lock); ++ } ++ spin_unlock(&sb->s_inode_list_lock); ++ } ++#endif ++ pr("files\n"); ++ files = &au_sbi(sb)->si_files; ++ hlist_bl_lock(files); ++ hlist_bl_for_each_entry(finfo, pos, files, fi_hlist) { ++ umode_t mode; ++ ++ file = finfo->fi_file; ++ mode = file_inode(file)->i_mode; ++ if (!special_file(mode)) ++ au_dpri_file(file); ++ } ++ hlist_bl_unlock(files); ++ pr("done\n"); ++ ++#undef pr ++ au_plevel = plevel; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* module parameter */ ++static char *aufs_sysrq_key = "a"; ++module_param_named(sysrq, aufs_sysrq_key, charp, S_IRUGO); ++MODULE_PARM_DESC(sysrq, "MagicSysRq key for " AUFS_NAME); ++ ++static void au_sysrq(int key __maybe_unused) ++{ ++ struct au_sbinfo *sbinfo; ++ struct hlist_bl_node *pos; ++ ++ lockdep_off(); ++ au_sbilist_lock(); ++ hlist_bl_for_each_entry(sbinfo, pos, &au_sbilist, si_list) ++ sysrq_sb(sbinfo->si_sb); ++ au_sbilist_unlock(); ++ lockdep_on(); ++} ++ ++static struct sysrq_key_op au_sysrq_op = { ++ .handler = au_sysrq, ++ .help_msg = "Aufs", ++ .action_msg = "Aufs", ++ .enable_mask = SYSRQ_ENABLE_DUMP ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++int __init au_sysrq_init(void) ++{ ++ int err; ++ char key; ++ ++ err = -1; ++ key = *aufs_sysrq_key; ++ if ('a' <= key && key <= 'z') ++ err = register_sysrq_key(key, &au_sysrq_op); ++ if (unlikely(err)) ++ pr_err("err %d, sysrq=%c\n", err, key); ++ return err; ++} ++ ++void au_sysrq_fin(void) ++{ ++ int err; ++ ++ err = unregister_sysrq_key(*aufs_sysrq_key, &au_sysrq_op); ++ if (unlikely(err)) ++ pr_err("err %d (ignored)\n", err); ++} +diff -Naur null/fs/aufs/vdir.c linux-4.15/fs/aufs/vdir.c +--- /dev/null ++++ linux-4.15/fs/aufs/vdir.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,892 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * virtual or vertical directory ++ */ ++ ++#include "aufs.h" ++ ++static unsigned int calc_size(int nlen) ++{ ++ return ALIGN(sizeof(struct au_vdir_de) + nlen, sizeof(ino_t)); ++} ++ ++static int set_deblk_end(union au_vdir_deblk_p *p, ++ union au_vdir_deblk_p *deblk_end) ++{ ++ if (calc_size(0) <= deblk_end->deblk - p->deblk) { ++ p->de->de_str.len = 0; ++ /* smp_mb(); */ ++ return 0; ++ } ++ return -1; /* error */ ++} ++ ++/* returns true or false */ ++static int is_deblk_end(union au_vdir_deblk_p *p, ++ union au_vdir_deblk_p *deblk_end) ++{ ++ if (calc_size(0) <= deblk_end->deblk - p->deblk) ++ return !p->de->de_str.len; ++ return 1; ++} ++ ++static unsigned char *last_deblk(struct au_vdir *vdir) ++{ ++ return vdir->vd_deblk[vdir->vd_nblk - 1]; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* estimate the appropriate size for name hash table */ ++unsigned int au_rdhash_est(loff_t sz) ++{ ++ unsigned int n; ++ ++ n = UINT_MAX; ++ sz >>= 10; ++ if (sz < n) ++ n = sz; ++ if (sz < AUFS_RDHASH_DEF) ++ n = AUFS_RDHASH_DEF; ++ /* pr_info("n %u\n", n); */ ++ return n; ++} ++ ++/* ++ * the allocated memory has to be freed by ++ * au_nhash_wh_free() or au_nhash_de_free(). ++ */ ++int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp) ++{ ++ struct hlist_head *head; ++ unsigned int u; ++ size_t sz; ++ ++ sz = sizeof(*nhash->nh_head) * num_hash; ++ head = kmalloc(sz, gfp); ++ if (head) { ++ nhash->nh_num = num_hash; ++ nhash->nh_head = head; ++ for (u = 0; u < num_hash; u++) ++ INIT_HLIST_HEAD(head++); ++ return 0; /* success */ ++ } ++ ++ return -ENOMEM; ++} ++ ++static void nhash_count(struct hlist_head *head) ++{ ++#if 0 ++ unsigned long n; ++ struct hlist_node *pos; ++ ++ n = 0; ++ hlist_for_each(pos, head) ++ n++; ++ pr_info("%lu\n", n); ++#endif ++} ++ ++static void au_nhash_wh_do_free(struct hlist_head *head) ++{ ++ struct au_vdir_wh *pos; ++ struct hlist_node *node; ++ ++ hlist_for_each_entry_safe(pos, node, head, wh_hash) ++ kfree(pos); ++} ++ ++static void au_nhash_de_do_free(struct hlist_head *head) ++{ ++ struct au_vdir_dehstr *pos; ++ struct hlist_node *node; ++ ++ hlist_for_each_entry_safe(pos, node, head, hash) ++ au_cache_free_vdir_dehstr(pos); ++} ++ ++static void au_nhash_do_free(struct au_nhash *nhash, ++ void (*free)(struct hlist_head *head)) ++{ ++ unsigned int n; ++ struct hlist_head *head; ++ ++ n = nhash->nh_num; ++ if (!n) ++ return; ++ ++ head = nhash->nh_head; ++ while (n-- > 0) { ++ nhash_count(head); ++ free(head++); ++ } ++ kfree(nhash->nh_head); ++} ++ ++void au_nhash_wh_free(struct au_nhash *whlist) ++{ ++ au_nhash_do_free(whlist, au_nhash_wh_do_free); ++} ++ ++static void au_nhash_de_free(struct au_nhash *delist) ++{ ++ au_nhash_do_free(delist, au_nhash_de_do_free); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, ++ int limit) ++{ ++ int num; ++ unsigned int u, n; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ ++ num = 0; ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (u = 0; u < n; u++, head++) ++ hlist_for_each_entry(pos, head, wh_hash) ++ if (pos->wh_bindex == btgt && ++num > limit) ++ return 1; ++ return 0; ++} ++ ++static struct hlist_head *au_name_hash(struct au_nhash *nhash, ++ unsigned char *name, ++ unsigned int len) ++{ ++ unsigned int v; ++ /* const unsigned int magic_bit = 12; */ ++ ++ AuDebugOn(!nhash->nh_num || !nhash->nh_head); ++ ++ v = 0; ++ if (len > 8) ++ len = 8; ++ while (len--) ++ v += *name++; ++ /* v = hash_long(v, magic_bit); */ ++ v %= nhash->nh_num; ++ return nhash->nh_head + v; ++} ++ ++static int au_nhash_test_name(struct au_vdir_destr *str, const char *name, ++ int nlen) ++{ ++ return str->len == nlen && !memcmp(str->name, name, nlen); ++} ++ ++/* returns found or not */ ++int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen) ++{ ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct au_vdir_destr *str; ++ ++ head = au_name_hash(whlist, name, nlen); ++ hlist_for_each_entry(pos, head, wh_hash) { ++ str = &pos->wh_str; ++ AuDbg("%.*s\n", str->len, str->name); ++ if (au_nhash_test_name(str, name, nlen)) ++ return 1; ++ } ++ return 0; ++} ++ ++/* returns found(true) or not */ ++static int test_known(struct au_nhash *delist, char *name, int nlen) ++{ ++ struct hlist_head *head; ++ struct au_vdir_dehstr *pos; ++ struct au_vdir_destr *str; ++ ++ head = au_name_hash(delist, name, nlen); ++ hlist_for_each_entry(pos, head, hash) { ++ str = pos->str; ++ AuDbg("%.*s\n", str->len, str->name); ++ if (au_nhash_test_name(str, name, nlen)) ++ return 1; ++ } ++ return 0; ++} ++ ++static void au_shwh_init_wh(struct au_vdir_wh *wh, ino_t ino, ++ unsigned char d_type) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ wh->wh_ino = ino; ++ wh->wh_type = d_type; ++#endif ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, ++ unsigned int d_type, aufs_bindex_t bindex, ++ unsigned char shwh) ++{ ++ int err; ++ struct au_vdir_destr *str; ++ struct au_vdir_wh *wh; ++ ++ AuDbg("%.*s\n", nlen, name); ++ AuDebugOn(!whlist->nh_num || !whlist->nh_head); ++ ++ err = -ENOMEM; ++ wh = kmalloc(sizeof(*wh) + nlen, GFP_NOFS); ++ if (unlikely(!wh)) ++ goto out; ++ ++ err = 0; ++ wh->wh_bindex = bindex; ++ if (shwh) ++ au_shwh_init_wh(wh, ino, d_type); ++ str = &wh->wh_str; ++ str->len = nlen; ++ memcpy(str->name, name, nlen); ++ hlist_add_head(&wh->wh_hash, au_name_hash(whlist, name, nlen)); ++ /* smp_mb(); */ ++ ++out: ++ return err; ++} ++ ++static int append_deblk(struct au_vdir *vdir) ++{ ++ int err; ++ unsigned long ul; ++ const unsigned int deblk_sz = vdir->vd_deblk_sz; ++ union au_vdir_deblk_p p, deblk_end; ++ unsigned char **o; ++ ++ err = -ENOMEM; ++ o = au_krealloc(vdir->vd_deblk, sizeof(*o) * (vdir->vd_nblk + 1), ++ GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!o)) ++ goto out; ++ ++ vdir->vd_deblk = o; ++ p.deblk = kmalloc(deblk_sz, GFP_NOFS); ++ if (p.deblk) { ++ ul = vdir->vd_nblk++; ++ vdir->vd_deblk[ul] = p.deblk; ++ vdir->vd_last.ul = ul; ++ vdir->vd_last.p.deblk = p.deblk; ++ deblk_end.deblk = p.deblk + deblk_sz; ++ err = set_deblk_end(&p, &deblk_end); ++ } ++ ++out: ++ return err; ++} ++ ++static int append_de(struct au_vdir *vdir, char *name, int nlen, ino_t ino, ++ unsigned int d_type, struct au_nhash *delist) ++{ ++ int err; ++ unsigned int sz; ++ const unsigned int deblk_sz = vdir->vd_deblk_sz; ++ union au_vdir_deblk_p p, *room, deblk_end; ++ struct au_vdir_dehstr *dehstr; ++ ++ p.deblk = last_deblk(vdir); ++ deblk_end.deblk = p.deblk + deblk_sz; ++ room = &vdir->vd_last.p; ++ AuDebugOn(room->deblk < p.deblk || deblk_end.deblk <= room->deblk ++ || !is_deblk_end(room, &deblk_end)); ++ ++ sz = calc_size(nlen); ++ if (unlikely(sz > deblk_end.deblk - room->deblk)) { ++ err = append_deblk(vdir); ++ if (unlikely(err)) ++ goto out; ++ ++ p.deblk = last_deblk(vdir); ++ deblk_end.deblk = p.deblk + deblk_sz; ++ /* smp_mb(); */ ++ AuDebugOn(room->deblk != p.deblk); ++ } ++ ++ err = -ENOMEM; ++ dehstr = au_cache_alloc_vdir_dehstr(); ++ if (unlikely(!dehstr)) ++ goto out; ++ ++ dehstr->str = &room->de->de_str; ++ hlist_add_head(&dehstr->hash, au_name_hash(delist, name, nlen)); ++ room->de->de_ino = ino; ++ room->de->de_type = d_type; ++ room->de->de_str.len = nlen; ++ memcpy(room->de->de_str.name, name, nlen); ++ ++ err = 0; ++ room->deblk += sz; ++ if (unlikely(set_deblk_end(room, &deblk_end))) ++ err = append_deblk(vdir); ++ /* smp_mb(); */ ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_vdir_free(struct au_vdir *vdir) ++{ ++ unsigned char **deblk; ++ ++ deblk = vdir->vd_deblk; ++ while (vdir->vd_nblk--) ++ kfree(*deblk++); ++ kfree(vdir->vd_deblk); ++ au_cache_free_vdir(vdir); ++} ++ ++static struct au_vdir *alloc_vdir(struct file *file) ++{ ++ struct au_vdir *vdir; ++ struct super_block *sb; ++ int err; ++ ++ sb = file->f_path.dentry->d_sb; ++ SiMustAnyLock(sb); ++ ++ err = -ENOMEM; ++ vdir = au_cache_alloc_vdir(); ++ if (unlikely(!vdir)) ++ goto out; ++ ++ vdir->vd_deblk = kzalloc(sizeof(*vdir->vd_deblk), GFP_NOFS); ++ if (unlikely(!vdir->vd_deblk)) ++ goto out_free; ++ ++ vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk; ++ if (!vdir->vd_deblk_sz) { ++ /* estimate the appropriate size for deblk */ ++ vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL); ++ /* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */ ++ } ++ vdir->vd_nblk = 0; ++ vdir->vd_version = 0; ++ vdir->vd_jiffy = 0; ++ err = append_deblk(vdir); ++ if (!err) ++ return vdir; /* success */ ++ ++ kfree(vdir->vd_deblk); ++ ++out_free: ++ au_cache_free_vdir(vdir); ++out: ++ vdir = ERR_PTR(err); ++ return vdir; ++} ++ ++static int reinit_vdir(struct au_vdir *vdir) ++{ ++ int err; ++ union au_vdir_deblk_p p, deblk_end; ++ ++ while (vdir->vd_nblk > 1) { ++ kfree(vdir->vd_deblk[vdir->vd_nblk - 1]); ++ /* vdir->vd_deblk[vdir->vd_nblk - 1] = NULL; */ ++ vdir->vd_nblk--; ++ } ++ p.deblk = vdir->vd_deblk[0]; ++ deblk_end.deblk = p.deblk + vdir->vd_deblk_sz; ++ err = set_deblk_end(&p, &deblk_end); ++ /* keep vd_dblk_sz */ ++ vdir->vd_last.ul = 0; ++ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; ++ vdir->vd_version = 0; ++ vdir->vd_jiffy = 0; ++ /* smp_mb(); */ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuFillVdir_CALLED 1 ++#define AuFillVdir_WHABLE (1 << 1) ++#define AuFillVdir_SHWH (1 << 2) ++#define au_ftest_fillvdir(flags, name) ((flags) & AuFillVdir_##name) ++#define au_fset_fillvdir(flags, name) \ ++ do { (flags) |= AuFillVdir_##name; } while (0) ++#define au_fclr_fillvdir(flags, name) \ ++ do { (flags) &= ~AuFillVdir_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_SHWH ++#undef AuFillVdir_SHWH ++#define AuFillVdir_SHWH 0 ++#endif ++ ++struct fillvdir_arg { ++ struct dir_context ctx; ++ struct file *file; ++ struct au_vdir *vdir; ++ struct au_nhash delist; ++ struct au_nhash whlist; ++ aufs_bindex_t bindex; ++ unsigned int flags; ++ int err; ++}; ++ ++static int fillvdir(struct dir_context *ctx, const char *__name, int nlen, ++ loff_t offset __maybe_unused, u64 h_ino, ++ unsigned int d_type) ++{ ++ struct fillvdir_arg *arg = container_of(ctx, struct fillvdir_arg, ctx); ++ char *name = (void *)__name; ++ struct super_block *sb; ++ ino_t ino; ++ const unsigned char shwh = !!au_ftest_fillvdir(arg->flags, SHWH); ++ ++ arg->err = 0; ++ sb = arg->file->f_path.dentry->d_sb; ++ au_fset_fillvdir(arg->flags, CALLED); ++ /* smp_mb(); */ ++ if (nlen <= AUFS_WH_PFX_LEN ++ || memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)) { ++ if (test_known(&arg->delist, name, nlen) ++ || au_nhash_test_known_wh(&arg->whlist, name, nlen)) ++ goto out; /* already exists or whiteouted */ ++ ++ arg->err = au_ino(sb, arg->bindex, h_ino, d_type, &ino); ++ if (!arg->err) { ++ if (unlikely(nlen > AUFS_MAX_NAMELEN)) ++ d_type = DT_UNKNOWN; ++ arg->err = append_de(arg->vdir, name, nlen, ino, ++ d_type, &arg->delist); ++ } ++ } else if (au_ftest_fillvdir(arg->flags, WHABLE)) { ++ name += AUFS_WH_PFX_LEN; ++ nlen -= AUFS_WH_PFX_LEN; ++ if (au_nhash_test_known_wh(&arg->whlist, name, nlen)) ++ goto out; /* already whiteouted */ ++ ++ if (shwh) ++ arg->err = au_wh_ino(sb, arg->bindex, h_ino, d_type, ++ &ino); ++ if (!arg->err) { ++ if (nlen <= AUFS_MAX_NAMELEN + AUFS_WH_PFX_LEN) ++ d_type = DT_UNKNOWN; ++ arg->err = au_nhash_append_wh ++ (&arg->whlist, name, nlen, ino, d_type, ++ arg->bindex, shwh); ++ } ++ } ++ ++out: ++ if (!arg->err) ++ arg->vdir->vd_jiffy = jiffies; ++ /* smp_mb(); */ ++ AuTraceErr(arg->err); ++ return arg->err; ++} ++ ++static int au_handle_shwh(struct super_block *sb, struct au_vdir *vdir, ++ struct au_nhash *whlist, struct au_nhash *delist) ++{ ++#ifdef CONFIG_AUFS_SHWH ++ int err; ++ unsigned int nh, u; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct hlist_node *n; ++ char *p, *o; ++ struct au_vdir_destr *destr; ++ ++ AuDebugOn(!au_opt_test(au_mntflags(sb), SHWH)); ++ ++ err = -ENOMEM; ++ o = p = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!p)) ++ goto out; ++ ++ err = 0; ++ nh = whlist->nh_num; ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ p += AUFS_WH_PFX_LEN; ++ for (u = 0; u < nh; u++) { ++ head = whlist->nh_head + u; ++ hlist_for_each_entry_safe(pos, n, head, wh_hash) { ++ destr = &pos->wh_str; ++ memcpy(p, destr->name, destr->len); ++ err = append_de(vdir, o, destr->len + AUFS_WH_PFX_LEN, ++ pos->wh_ino, pos->wh_type, delist); ++ if (unlikely(err)) ++ break; ++ } ++ } ++ ++ free_page((unsigned long)o); ++ ++out: ++ AuTraceErr(err); ++ return err; ++#else ++ return 0; ++#endif ++} ++ ++static int au_do_read_vdir(struct fillvdir_arg *arg) ++{ ++ int err; ++ unsigned int rdhash; ++ loff_t offset; ++ aufs_bindex_t bbot, bindex, btop; ++ unsigned char shwh; ++ struct file *hf, *file; ++ struct super_block *sb; ++ ++ file = arg->file; ++ sb = file->f_path.dentry->d_sb; ++ SiMustAnyLock(sb); ++ ++ rdhash = au_sbi(sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = au_rdhash_est(au_dir_size(file, /*dentry*/NULL)); ++ err = au_nhash_alloc(&arg->delist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ err = au_nhash_alloc(&arg->whlist, rdhash, GFP_NOFS); ++ if (unlikely(err)) ++ goto out_delist; ++ ++ err = 0; ++ arg->flags = 0; ++ shwh = 0; ++ if (au_opt_test(au_mntflags(sb), SHWH)) { ++ shwh = 1; ++ au_fset_fillvdir(arg->flags, SHWH); ++ } ++ btop = au_fbtop(file); ++ bbot = au_fbbot_dir(file); ++ for (bindex = btop; !err && bindex <= bbot; bindex++) { ++ hf = au_hf_dir(file, bindex); ++ if (!hf) ++ continue; ++ ++ offset = vfsub_llseek(hf, 0, SEEK_SET); ++ err = offset; ++ if (unlikely(offset)) ++ break; ++ ++ arg->bindex = bindex; ++ au_fclr_fillvdir(arg->flags, WHABLE); ++ if (shwh ++ || (bindex != bbot ++ && au_br_whable(au_sbr_perm(sb, bindex)))) ++ au_fset_fillvdir(arg->flags, WHABLE); ++ do { ++ arg->err = 0; ++ au_fclr_fillvdir(arg->flags, CALLED); ++ /* smp_mb(); */ ++ err = vfsub_iterate_dir(hf, &arg->ctx); ++ if (err >= 0) ++ err = arg->err; ++ } while (!err && au_ftest_fillvdir(arg->flags, CALLED)); ++ ++ /* ++ * dir_relax() may be good for concurrency, but aufs should not ++ * use it since it will cause a lockdep problem. ++ */ ++ } ++ ++ if (!err && shwh) ++ err = au_handle_shwh(sb, arg->vdir, &arg->whlist, &arg->delist); ++ ++ au_nhash_wh_free(&arg->whlist); ++ ++out_delist: ++ au_nhash_de_free(&arg->delist); ++out: ++ return err; ++} ++ ++static int read_vdir(struct file *file, int may_read) ++{ ++ int err; ++ unsigned long expire; ++ unsigned char do_read; ++ struct fillvdir_arg arg = { ++ .ctx = { ++ .actor = fillvdir ++ } ++ }; ++ struct inode *inode; ++ struct au_vdir *vdir, *allocated; ++ ++ err = 0; ++ inode = file_inode(file); ++ IMustLock(inode); ++ IiMustWriteLock(inode); ++ SiMustAnyLock(inode->i_sb); ++ ++ allocated = NULL; ++ do_read = 0; ++ expire = au_sbi(inode->i_sb)->si_rdcache; ++ vdir = au_ivdir(inode); ++ if (!vdir) { ++ do_read = 1; ++ vdir = alloc_vdir(file); ++ err = PTR_ERR(vdir); ++ if (IS_ERR(vdir)) ++ goto out; ++ err = 0; ++ allocated = vdir; ++ } else if (may_read ++ && (inode->i_version != vdir->vd_version ++ || time_after(jiffies, vdir->vd_jiffy + expire))) { ++ do_read = 1; ++ err = reinit_vdir(vdir); ++ if (unlikely(err)) ++ goto out; ++ } ++ ++ if (!do_read) ++ return 0; /* success */ ++ ++ arg.file = file; ++ arg.vdir = vdir; ++ err = au_do_read_vdir(&arg); ++ if (!err) { ++ /* file->f_pos = 0; */ /* todo: ctx->pos? */ ++ vdir->vd_version = inode->i_version; ++ vdir->vd_last.ul = 0; ++ vdir->vd_last.p.deblk = vdir->vd_deblk[0]; ++ if (allocated) ++ au_set_ivdir(inode, allocated); ++ } else if (allocated) ++ au_vdir_free(allocated); ++ ++out: ++ return err; ++} ++ ++static int copy_vdir(struct au_vdir *tgt, struct au_vdir *src) ++{ ++ int err, rerr; ++ unsigned long ul, n; ++ const unsigned int deblk_sz = src->vd_deblk_sz; ++ ++ AuDebugOn(tgt->vd_nblk != 1); ++ ++ err = -ENOMEM; ++ if (tgt->vd_nblk < src->vd_nblk) { ++ unsigned char **p; ++ ++ p = au_krealloc(tgt->vd_deblk, sizeof(*p) * src->vd_nblk, ++ GFP_NOFS, /*may_shrink*/0); ++ if (unlikely(!p)) ++ goto out; ++ tgt->vd_deblk = p; ++ } ++ ++ if (tgt->vd_deblk_sz != deblk_sz) { ++ unsigned char *p; ++ ++ tgt->vd_deblk_sz = deblk_sz; ++ p = au_krealloc(tgt->vd_deblk[0], deblk_sz, GFP_NOFS, ++ /*may_shrink*/1); ++ if (unlikely(!p)) ++ goto out; ++ tgt->vd_deblk[0] = p; ++ } ++ memcpy(tgt->vd_deblk[0], src->vd_deblk[0], deblk_sz); ++ tgt->vd_version = src->vd_version; ++ tgt->vd_jiffy = src->vd_jiffy; ++ ++ n = src->vd_nblk; ++ for (ul = 1; ul < n; ul++) { ++ tgt->vd_deblk[ul] = kmemdup(src->vd_deblk[ul], deblk_sz, ++ GFP_NOFS); ++ if (unlikely(!tgt->vd_deblk[ul])) ++ goto out; ++ tgt->vd_nblk++; ++ } ++ tgt->vd_nblk = n; ++ tgt->vd_last.ul = tgt->vd_last.ul; ++ tgt->vd_last.p.deblk = tgt->vd_deblk[tgt->vd_last.ul]; ++ tgt->vd_last.p.deblk += src->vd_last.p.deblk ++ - src->vd_deblk[src->vd_last.ul]; ++ /* smp_mb(); */ ++ return 0; /* success */ ++ ++out: ++ rerr = reinit_vdir(tgt); ++ BUG_ON(rerr); ++ return err; ++} ++ ++int au_vdir_init(struct file *file) ++{ ++ int err; ++ struct inode *inode; ++ struct au_vdir *vdir_cache, *allocated; ++ ++ /* test file->f_pos here instead of ctx->pos */ ++ err = read_vdir(file, !file->f_pos); ++ if (unlikely(err)) ++ goto out; ++ ++ allocated = NULL; ++ vdir_cache = au_fvdir_cache(file); ++ if (!vdir_cache) { ++ vdir_cache = alloc_vdir(file); ++ err = PTR_ERR(vdir_cache); ++ if (IS_ERR(vdir_cache)) ++ goto out; ++ allocated = vdir_cache; ++ } else if (!file->f_pos && vdir_cache->vd_version != file->f_version) { ++ /* test file->f_pos here instead of ctx->pos */ ++ err = reinit_vdir(vdir_cache); ++ if (unlikely(err)) ++ goto out; ++ } else ++ return 0; /* success */ ++ ++ inode = file_inode(file); ++ err = copy_vdir(vdir_cache, au_ivdir(inode)); ++ if (!err) { ++ file->f_version = inode->i_version; ++ if (allocated) ++ au_set_fvdir_cache(file, allocated); ++ } else if (allocated) ++ au_vdir_free(allocated); ++ ++out: ++ return err; ++} ++ ++static loff_t calc_offset(struct au_vdir *vdir) ++{ ++ loff_t offset; ++ union au_vdir_deblk_p p; ++ ++ p.deblk = vdir->vd_deblk[vdir->vd_last.ul]; ++ offset = vdir->vd_last.p.deblk - p.deblk; ++ offset += vdir->vd_deblk_sz * vdir->vd_last.ul; ++ return offset; ++} ++ ++/* returns true or false */ ++static int seek_vdir(struct file *file, struct dir_context *ctx) ++{ ++ int valid; ++ unsigned int deblk_sz; ++ unsigned long ul, n; ++ loff_t offset; ++ union au_vdir_deblk_p p, deblk_end; ++ struct au_vdir *vdir_cache; ++ ++ valid = 1; ++ vdir_cache = au_fvdir_cache(file); ++ offset = calc_offset(vdir_cache); ++ AuDbg("offset %lld\n", offset); ++ if (ctx->pos == offset) ++ goto out; ++ ++ vdir_cache->vd_last.ul = 0; ++ vdir_cache->vd_last.p.deblk = vdir_cache->vd_deblk[0]; ++ if (!ctx->pos) ++ goto out; ++ ++ valid = 0; ++ deblk_sz = vdir_cache->vd_deblk_sz; ++ ul = div64_u64(ctx->pos, deblk_sz); ++ AuDbg("ul %lu\n", ul); ++ if (ul >= vdir_cache->vd_nblk) ++ goto out; ++ ++ n = vdir_cache->vd_nblk; ++ for (; ul < n; ul++) { ++ p.deblk = vdir_cache->vd_deblk[ul]; ++ deblk_end.deblk = p.deblk + deblk_sz; ++ offset = ul; ++ offset *= deblk_sz; ++ while (!is_deblk_end(&p, &deblk_end) && offset < ctx->pos) { ++ unsigned int l; ++ ++ l = calc_size(p.de->de_str.len); ++ offset += l; ++ p.deblk += l; ++ } ++ if (!is_deblk_end(&p, &deblk_end)) { ++ valid = 1; ++ vdir_cache->vd_last.ul = ul; ++ vdir_cache->vd_last.p = p; ++ break; ++ } ++ } ++ ++out: ++ /* smp_mb(); */ ++ AuTraceErr(!valid); ++ return valid; ++} ++ ++int au_vdir_fill_de(struct file *file, struct dir_context *ctx) ++{ ++ unsigned int l, deblk_sz; ++ union au_vdir_deblk_p deblk_end; ++ struct au_vdir *vdir_cache; ++ struct au_vdir_de *de; ++ ++ vdir_cache = au_fvdir_cache(file); ++ if (!seek_vdir(file, ctx)) ++ return 0; ++ ++ deblk_sz = vdir_cache->vd_deblk_sz; ++ while (1) { ++ deblk_end.deblk = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; ++ deblk_end.deblk += deblk_sz; ++ while (!is_deblk_end(&vdir_cache->vd_last.p, &deblk_end)) { ++ de = vdir_cache->vd_last.p.de; ++ AuDbg("%.*s, off%lld, i%lu, dt%d\n", ++ de->de_str.len, de->de_str.name, ctx->pos, ++ (unsigned long)de->de_ino, de->de_type); ++ if (unlikely(!dir_emit(ctx, de->de_str.name, ++ de->de_str.len, de->de_ino, ++ de->de_type))) { ++ /* todo: ignore the error caused by udba? */ ++ /* return err; */ ++ return 0; ++ } ++ ++ l = calc_size(de->de_str.len); ++ vdir_cache->vd_last.p.deblk += l; ++ ctx->pos += l; ++ } ++ if (vdir_cache->vd_last.ul < vdir_cache->vd_nblk - 1) { ++ vdir_cache->vd_last.ul++; ++ vdir_cache->vd_last.p.deblk ++ = vdir_cache->vd_deblk[vdir_cache->vd_last.ul]; ++ ctx->pos = deblk_sz * vdir_cache->vd_last.ul; ++ continue; ++ } ++ break; ++ } ++ ++ /* smp_mb(); */ ++ return 0; ++} +diff -Naur null/fs/aufs/vfsub.c linux-4.15/fs/aufs/vfsub.c +--- /dev/null ++++ linux-4.15/fs/aufs/vfsub.c 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,894 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sub-routines for VFS ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "aufs.h" ++ ++#ifdef CONFIG_AUFS_BR_FUSE ++int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb) ++{ ++ if (!au_test_fuse(h_sb) || !au_userns) ++ return 0; ++ ++ return is_current_mnt_ns(mnt) ? 0 : -EACCES; ++} ++#endif ++ ++int vfsub_sync_filesystem(struct super_block *h_sb, int wait) ++{ ++ int err; ++ ++ lockdep_off(); ++ down_read(&h_sb->s_umount); ++ err = __sync_filesystem(h_sb, wait); ++ up_read(&h_sb->s_umount); ++ lockdep_on(); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_update_h_iattr(struct path *h_path, int *did) ++{ ++ int err; ++ struct kstat st; ++ struct super_block *h_sb; ++ ++ /* for remote fs, leave work for its getattr or d_revalidate */ ++ /* for bad i_attr fs, handle them in aufs_getattr() */ ++ /* still some fs may acquire i_mutex. we need to skip them */ ++ err = 0; ++ if (!did) ++ did = &err; ++ h_sb = h_path->dentry->d_sb; ++ *did = (!au_test_fs_remote(h_sb) && au_test_fs_refresh_iattr(h_sb)); ++ if (*did) ++ err = vfsub_getattr(h_path, &st); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct file *vfsub_dentry_open(struct path *path, int flags) ++{ ++ struct file *file; ++ ++ file = dentry_open(path, flags /* | __FMODE_NONOTIFY */, ++ current_cred()); ++ if (!IS_ERR_OR_NULL(file) ++ && (file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) ++ i_readcount_inc(d_inode(path->dentry)); ++ ++ return file; ++} ++ ++struct file *vfsub_filp_open(const char *path, int oflags, int mode) ++{ ++ struct file *file; ++ ++ lockdep_off(); ++ file = filp_open(path, ++ oflags /* | __FMODE_NONOTIFY */, ++ mode); ++ lockdep_on(); ++ if (IS_ERR(file)) ++ goto out; ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ ++out: ++ return file; ++} ++ ++/* ++ * Ideally this function should call VFS:do_last() in order to keep all its ++ * checkings. But it is very hard for aufs to regenerate several VFS internal ++ * structure such as nameidata. This is a second (or third) best approach. ++ * cf. linux/fs/namei.c:do_last(), lookup_open() and atomic_open(). ++ */ ++int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args, struct au_branch *br) ++{ ++ int err; ++ struct file *file = args->file; ++ /* copied from linux/fs/namei.c:atomic_open() */ ++ struct dentry *const DENTRY_NOT_SET = (void *)-1UL; ++ ++ IMustLock(dir); ++ AuDebugOn(!dir->i_op->atomic_open); ++ ++ err = au_br_test_oflag(args->open_flag, br); ++ if (unlikely(err)) ++ goto out; ++ ++ args->file->f_path.dentry = DENTRY_NOT_SET; ++ args->file->f_path.mnt = au_br_mnt(br); ++ err = dir->i_op->atomic_open(dir, dentry, file, args->open_flag, ++ args->create_mode, args->opened); ++ if (err >= 0) { ++ /* some filesystems don't set FILE_CREATED while succeeded? */ ++ if (*args->opened & FILE_CREATED) ++ fsnotify_create(dir, dentry); ++ } else ++ goto out; ++ ++ ++ if (!err) { ++ /* todo: call VFS:may_open() here */ ++ err = open_check_o_direct(file); ++ /* todo: ima_file_check() too? */ ++ if (!err && (args->open_flag & __FMODE_EXEC)) ++ err = deny_write_access(file); ++ if (unlikely(err)) ++ /* note that the file is created and still opened */ ++ goto out; ++ } ++ ++ au_br_get(br); ++ fsnotify_open(file); ++ ++out: ++ return err; ++} ++ ++int vfsub_kern_path(const char *name, unsigned int flags, struct path *path) ++{ ++ int err; ++ ++ err = kern_path(name, flags, path); ++ if (!err && d_is_positive(path->dentry)) ++ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++struct dentry *vfsub_lookup_one_len_unlocked(const char *name, ++ struct dentry *parent, int len) ++{ ++ struct path path = { ++ .mnt = NULL ++ }; ++ ++ path.dentry = lookup_one_len_unlocked(name, parent, len); ++ if (IS_ERR(path.dentry)) ++ goto out; ++ if (d_is_positive(path.dentry)) ++ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ ++ ++out: ++ AuTraceErrPtr(path.dentry); ++ return path.dentry; ++} ++ ++struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, ++ int len) ++{ ++ struct path path = { ++ .mnt = NULL ++ }; ++ ++ /* VFS checks it too, but by WARN_ON_ONCE() */ ++ IMustLock(d_inode(parent)); ++ ++ path.dentry = lookup_one_len(name, parent, len); ++ if (IS_ERR(path.dentry)) ++ goto out; ++ if (d_is_positive(path.dentry)) ++ vfsub_update_h_iattr(&path, /*did*/NULL); /*ignore*/ ++ ++out: ++ AuTraceErrPtr(path.dentry); ++ return path.dentry; ++} ++ ++void vfsub_call_lkup_one(void *args) ++{ ++ struct vfsub_lkup_one_args *a = args; ++ *a->errp = vfsub_lkup_one(a->name, a->parent); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2) ++{ ++ struct dentry *d; ++ ++ lockdep_off(); ++ d = lock_rename(d1, d2); ++ lockdep_on(); ++ au_hn_suspend(hdir1); ++ if (hdir1 != hdir2) ++ au_hn_suspend(hdir2); ++ ++ return d; ++} ++ ++void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2) ++{ ++ au_hn_resume(hdir1); ++ if (hdir1 != hdir2) ++ au_hn_resume(hdir2); ++ lockdep_off(); ++ unlock_rename(d1, d2); ++ lockdep_on(); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_create(struct inode *dir, struct path *path, int mode, bool want_excl) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mknod(path, d, mode, 0); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_create(dir, path->dentry, mode, want_excl); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_symlink(struct inode *dir, struct path *path, const char *symname) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_symlink(path, d, symname); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_symlink(dir, path->dentry, symname); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mknod(path, d, mode, new_encode_dev(dev)); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_mknod(dir, path->dentry, mode, dev); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++static int au_test_nlink(struct inode *inode) ++{ ++ const unsigned int link_max = UINT_MAX >> 1; /* rough margin */ ++ ++ if (!au_test_fs_no_limit_nlink(inode->i_sb) ++ || inode->i_nlink < link_max) ++ return 0; ++ return -EMLINK; ++} ++ ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, struct path *path, ++ struct inode **delegated_inode) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ err = au_test_nlink(d_inode(src_dentry)); ++ if (unlikely(err)) ++ return err; ++ ++ /* we don't call may_linkat() */ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_link(src_dentry, path, d); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_link(src_dentry, dir, path->dentry, delegated_inode); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ /* fuse has different memory inode for the same inumber */ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ tmp.dentry = src_dentry; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry, ++ struct inode *dir, struct path *path, ++ struct inode **delegated_inode, unsigned int flags) ++{ ++ int err; ++ struct path tmp = { ++ .mnt = path->mnt ++ }; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ IMustLock(src_dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ tmp.dentry = src_dentry->d_parent; ++ err = security_path_rename(&tmp, src_dentry, path, d, /*flags*/0); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_rename(src_dir, src_dentry, dir, path->dentry, ++ delegated_inode, flags); ++ lockdep_on(); ++ if (!err) { ++ int did; ++ ++ tmp.dentry = d->d_parent; ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = src_dentry; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ tmp.dentry = src_dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_mkdir(struct inode *dir, struct path *path, int mode) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_mkdir(path, d, mode); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_mkdir(dir, path->dentry, mode); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = *path; ++ int did; ++ ++ vfsub_update_h_iattr(&tmp, &did); ++ if (did) { ++ tmp.dentry = path->dentry->d_parent; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); ++ } ++ /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++int vfsub_rmdir(struct inode *dir, struct path *path) ++{ ++ int err; ++ struct dentry *d; ++ ++ IMustLock(dir); ++ ++ d = path->dentry; ++ path->dentry = d->d_parent; ++ err = security_path_rmdir(path, d); ++ path->dentry = d; ++ if (unlikely(err)) ++ goto out; ++ ++ lockdep_off(); ++ err = vfs_rmdir(dir, path->dentry); ++ lockdep_on(); ++ if (!err) { ++ struct path tmp = { ++ .dentry = path->dentry->d_parent, ++ .mnt = path->mnt ++ }; ++ ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* todo: support mmap_sem? */ ++ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ ++ lockdep_off(); ++ err = vfs_read(file, ubuf, count, ppos); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++/* todo: kernel_read()? */ ++ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ char __user *u; ++ } buf; ++ ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ err = vfsub_read_u(file, buf.u, count, ppos); ++ set_fs(oldfs); ++ return err; ++} ++ ++ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, ++ loff_t *ppos) ++{ ++ ssize_t err; ++ ++ lockdep_off(); ++ err = vfs_write(file, ubuf, count, ppos); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ const char __user *u; ++ } buf; ++ ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ err = vfsub_write_u(file, buf.u, count, ppos); ++ set_fs(oldfs); ++ return err; ++} ++ ++int vfsub_flush(struct file *file, fl_owner_t id) ++{ ++ int err; ++ ++ err = 0; ++ if (file->f_op->flush) { ++ if (!au_test_nfs(file->f_path.dentry->d_sb)) ++ err = file->f_op->flush(file, id); ++ else { ++ lockdep_off(); ++ err = file->f_op->flush(file, id); ++ lockdep_on(); ++ } ++ if (!err) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); ++ /*ignore*/ ++ } ++ return err; ++} ++ ++int vfsub_iterate_dir(struct file *file, struct dir_context *ctx) ++{ ++ int err; ++ ++ AuDbg("%pD, ctx{%pf, %llu}\n", file, ctx->actor, ctx->pos); ++ ++ lockdep_off(); ++ err = iterate_dir(file, ctx); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/ ++ ++ return err; ++} ++ ++long vfsub_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = do_splice_to(in, ppos, pipe, len, flags); ++ lockdep_on(); ++ file_accessed(in); ++ if (err >= 0) ++ vfsub_update_h_iattr(&in->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = do_splice_from(pipe, out, ppos, len, flags); ++ lockdep_on(); ++ if (err >= 0) ++ vfsub_update_h_iattr(&out->f_path, /*did*/NULL); /*ignore*/ ++ return err; ++} ++ ++int vfsub_fsync(struct file *file, struct path *path, int datasync) ++{ ++ int err; ++ ++ /* file can be NULL */ ++ lockdep_off(); ++ err = vfs_fsync(file, datasync); ++ lockdep_on(); ++ if (!err) { ++ if (!path) { ++ AuDebugOn(!file); ++ path = &file->f_path; ++ } ++ vfsub_update_h_iattr(path, /*did*/NULL); /*ignore*/ ++ } ++ return err; ++} ++ ++/* cf. open.c:do_sys_truncate() and do_sys_ftruncate() */ ++int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, ++ struct file *h_file) ++{ ++ int err; ++ struct inode *h_inode; ++ struct super_block *h_sb; ++ ++ if (!h_file) { ++ err = vfsub_truncate(h_path, length); ++ goto out; ++ } ++ ++ h_inode = d_inode(h_path->dentry); ++ h_sb = h_inode->i_sb; ++ lockdep_off(); ++ sb_start_write(h_sb); ++ lockdep_on(); ++ err = locks_verify_truncate(h_inode, h_file, length); ++ if (!err) ++ err = security_path_truncate(h_path); ++ if (!err) { ++ lockdep_off(); ++ err = do_truncate(h_path->dentry, length, attr, h_file); ++ lockdep_on(); ++ } ++ lockdep_off(); ++ sb_end_write(h_sb); ++ lockdep_on(); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_vfsub_mkdir_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++ int mode; ++}; ++ ++static void au_call_vfsub_mkdir(void *args) ++{ ++ struct au_vfsub_mkdir_args *a = args; ++ *a->errp = vfsub_mkdir(a->dir, a->path, a->mode); ++} ++ ++int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode) ++{ ++ int err, do_sio, wkq_err; ++ ++ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); ++ if (!do_sio) { ++ lockdep_off(); ++ err = vfsub_mkdir(dir, path, mode); ++ lockdep_on(); ++ } else { ++ struct au_vfsub_mkdir_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path, ++ .mode = mode ++ }; ++ wkq_err = au_wkq_wait(au_call_vfsub_mkdir, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++ ++struct au_vfsub_rmdir_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++}; ++ ++static void au_call_vfsub_rmdir(void *args) ++{ ++ struct au_vfsub_rmdir_args *a = args; ++ *a->errp = vfsub_rmdir(a->dir, a->path); ++} ++ ++int vfsub_sio_rmdir(struct inode *dir, struct path *path) ++{ ++ int err, do_sio, wkq_err; ++ ++ do_sio = au_test_h_perm_sio(dir, MAY_EXEC | MAY_WRITE); ++ if (!do_sio) { ++ lockdep_off(); ++ err = vfsub_rmdir(dir, path); ++ lockdep_on(); ++ } else { ++ struct au_vfsub_rmdir_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path ++ }; ++ wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct notify_change_args { ++ int *errp; ++ struct path *path; ++ struct iattr *ia; ++ struct inode **delegated_inode; ++}; ++ ++static void call_notify_change(void *args) ++{ ++ struct notify_change_args *a = args; ++ struct inode *h_inode; ++ ++ h_inode = d_inode(a->path->dentry); ++ IMustLock(h_inode); ++ ++ *a->errp = -EPERM; ++ if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) { ++ lockdep_off(); ++ *a->errp = notify_change(a->path->dentry, a->ia, ++ a->delegated_inode); ++ lockdep_on(); ++ if (!*a->errp) ++ vfsub_update_h_iattr(a->path, /*did*/NULL); /*ignore*/ ++ } ++ AuTraceErr(*a->errp); ++} ++ ++int vfsub_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode) ++{ ++ int err; ++ struct notify_change_args args = { ++ .errp = &err, ++ .path = path, ++ .ia = ia, ++ .delegated_inode = delegated_inode ++ }; ++ ++ call_notify_change(&args); ++ ++ return err; ++} ++ ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode) ++{ ++ int err, wkq_err; ++ struct notify_change_args args = { ++ .errp = &err, ++ .path = path, ++ .ia = ia, ++ .delegated_inode = delegated_inode ++ }; ++ ++ wkq_err = au_wkq_wait(call_notify_change, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct unlink_args { ++ int *errp; ++ struct inode *dir; ++ struct path *path; ++ struct inode **delegated_inode; ++}; ++ ++static void call_unlink(void *args) ++{ ++ struct unlink_args *a = args; ++ struct dentry *d = a->path->dentry; ++ struct inode *h_inode; ++ const int stop_sillyrename = (au_test_nfs(d->d_sb) ++ && au_dcount(d) == 1); ++ ++ IMustLock(a->dir); ++ ++ a->path->dentry = d->d_parent; ++ *a->errp = security_path_unlink(a->path, d); ++ a->path->dentry = d; ++ if (unlikely(*a->errp)) ++ return; ++ ++ if (!stop_sillyrename) ++ dget(d); ++ h_inode = NULL; ++ if (d_is_positive(d)) { ++ h_inode = d_inode(d); ++ ihold(h_inode); ++ } ++ ++ lockdep_off(); ++ *a->errp = vfs_unlink(a->dir, d, a->delegated_inode); ++ lockdep_on(); ++ if (!*a->errp) { ++ struct path tmp = { ++ .dentry = d->d_parent, ++ .mnt = a->path->mnt ++ }; ++ vfsub_update_h_iattr(&tmp, /*did*/NULL); /*ignore*/ ++ } ++ ++ if (!stop_sillyrename) ++ dput(d); ++ if (h_inode) ++ iput(h_inode); ++ ++ AuTraceErr(*a->errp); ++} ++ ++/* ++ * @dir: must be locked. ++ * @dentry: target dentry. ++ */ ++int vfsub_unlink(struct inode *dir, struct path *path, ++ struct inode **delegated_inode, int force) ++{ ++ int err; ++ struct unlink_args args = { ++ .errp = &err, ++ .dir = dir, ++ .path = path, ++ .delegated_inode = delegated_inode ++ }; ++ ++ if (!force) ++ call_unlink(&args); ++ else { ++ int wkq_err; ++ ++ wkq_err = au_wkq_wait(call_unlink, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ ++ return err; ++} +diff -Naur null/fs/aufs/vfsub.h linux-4.15/fs/aufs/vfsub.h +--- /dev/null ++++ linux-4.15/fs/aufs/vfsub.h 2018-02-25 02:38:09.205738221 +0100 +@@ -0,0 +1,360 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * sub-routines for VFS ++ */ ++ ++#ifndef __AUFS_VFSUB_H__ ++#define __AUFS_VFSUB_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++#include ++#include ++#include ++#include "debug.h" ++ ++/* copied from linux/fs/internal.h */ ++/* todo: BAD approach!! */ ++extern void __mnt_drop_write(struct vfsmount *); ++extern int open_check_o_direct(struct file *f); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* lock subclass for lower inode */ ++/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */ ++/* reduce? gave up. */ ++enum { ++ AuLsc_I_Begin = I_MUTEX_PARENT2, /* 5 */ ++ AuLsc_I_PARENT, /* lower inode, parent first */ ++ AuLsc_I_PARENT2, /* copyup dirs */ ++ AuLsc_I_PARENT3, /* copyup wh */ ++ AuLsc_I_CHILD, ++ AuLsc_I_CHILD2, ++ AuLsc_I_End ++}; ++ ++/* to debug easier, do not make them inlined functions */ ++#define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx)) ++#define IMustLock(i) AuDebugOn(!inode_is_locked(i)) ++ ++/* why VFS doesn't define it? */ ++static inline ++void vfsub_inode_lock_shared_nested(struct inode *inode, unsigned int sc) ++{ ++ down_read_nested(&inode->i_rwsem, sc); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline void vfsub_drop_nlink(struct inode *inode) ++{ ++ AuDebugOn(!inode->i_nlink); ++ drop_nlink(inode); ++} ++ ++static inline void vfsub_dead_dir(struct inode *inode) ++{ ++ AuDebugOn(!S_ISDIR(inode->i_mode)); ++ inode->i_flags |= S_DEAD; ++ clear_nlink(inode); ++} ++ ++static inline int vfsub_native_ro(struct inode *inode) ++{ ++ return sb_rdonly(inode->i_sb) ++ || IS_RDONLY(inode) ++ /* || IS_APPEND(inode) */ ++ || IS_IMMUTABLE(inode); ++} ++ ++#ifdef CONFIG_AUFS_BR_FUSE ++int vfsub_test_mntns(struct vfsmount *mnt, struct super_block *h_sb); ++#else ++AuStubInt0(vfsub_test_mntns, struct vfsmount *mnt, struct super_block *h_sb); ++#endif ++ ++int vfsub_sync_filesystem(struct super_block *h_sb, int wait); ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_update_h_iattr(struct path *h_path, int *did); ++struct file *vfsub_dentry_open(struct path *path, int flags); ++struct file *vfsub_filp_open(const char *path, int oflags, int mode); ++struct vfsub_aopen_args { ++ struct file *file; ++ unsigned int open_flag; ++ umode_t create_mode; ++ int *opened; ++}; ++struct au_branch; ++int vfsub_atomic_open(struct inode *dir, struct dentry *dentry, ++ struct vfsub_aopen_args *args, struct au_branch *br); ++int vfsub_kern_path(const char *name, unsigned int flags, struct path *path); ++ ++struct dentry *vfsub_lookup_one_len_unlocked(const char *name, ++ struct dentry *parent, int len); ++struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent, ++ int len); ++ ++struct vfsub_lkup_one_args { ++ struct dentry **errp; ++ struct qstr *name; ++ struct dentry *parent; ++}; ++ ++static inline struct dentry *vfsub_lkup_one(struct qstr *name, ++ struct dentry *parent) ++{ ++ return vfsub_lookup_one_len(name->name, parent, name->len); ++} ++ ++void vfsub_call_lkup_one(void *args); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int vfsub_mnt_want_write(struct vfsmount *mnt) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = mnt_want_write(mnt); ++ lockdep_on(); ++ return err; ++} ++ ++static inline void vfsub_mnt_drop_write(struct vfsmount *mnt) ++{ ++ lockdep_off(); ++ mnt_drop_write(mnt); ++ lockdep_on(); ++} ++ ++#if 0 /* reserved */ ++static inline void vfsub_mnt_drop_write_file(struct file *file) ++{ ++ lockdep_off(); ++ mnt_drop_write_file(file); ++ lockdep_on(); ++} ++#endif ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_hinode; ++struct dentry *vfsub_lock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2); ++void vfsub_unlock_rename(struct dentry *d1, struct au_hinode *hdir1, ++ struct dentry *d2, struct au_hinode *hdir2); ++ ++int vfsub_create(struct inode *dir, struct path *path, int mode, ++ bool want_excl); ++int vfsub_symlink(struct inode *dir, struct path *path, ++ const char *symname); ++int vfsub_mknod(struct inode *dir, struct path *path, int mode, dev_t dev); ++int vfsub_link(struct dentry *src_dentry, struct inode *dir, ++ struct path *path, struct inode **delegated_inode); ++int vfsub_rename(struct inode *src_hdir, struct dentry *src_dentry, ++ struct inode *hdir, struct path *path, ++ struct inode **delegated_inode, unsigned int flags); ++int vfsub_mkdir(struct inode *dir, struct path *path, int mode); ++int vfsub_rmdir(struct inode *dir, struct path *path); ++ ++/* ---------------------------------------------------------------------- */ ++ ++ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count, ++ loff_t *ppos); ++ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, ++ loff_t *ppos); ++int vfsub_flush(struct file *file, fl_owner_t id); ++int vfsub_iterate_dir(struct file *file, struct dir_context *ctx); ++ ++static inline loff_t vfsub_f_size_read(struct file *file) ++{ ++ return i_size_read(file_inode(file)); ++} ++ ++static inline unsigned int vfsub_file_flags(struct file *file) ++{ ++ unsigned int flags; ++ ++ spin_lock(&file->f_lock); ++ flags = file->f_flags; ++ spin_unlock(&file->f_lock); ++ ++ return flags; ++} ++ ++static inline int vfsub_file_execed(struct file *file) ++{ ++ /* todo: direct access f_flags */ ++ return !!(vfsub_file_flags(file) & __FMODE_EXEC); ++} ++ ++#if 0 /* reserved */ ++static inline void vfsub_file_accessed(struct file *h_file) ++{ ++ file_accessed(h_file); ++ vfsub_update_h_iattr(&h_file->f_path, /*did*/NULL); /*ignore*/ ++} ++#endif ++ ++#if 0 /* reserved */ ++static inline void vfsub_touch_atime(struct vfsmount *h_mnt, ++ struct dentry *h_dentry) ++{ ++ struct path h_path = { ++ .dentry = h_dentry, ++ .mnt = h_mnt ++ }; ++ touch_atime(&h_path); ++ vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/ ++} ++#endif ++ ++static inline int vfsub_update_time(struct inode *h_inode, struct timespec *ts, ++ int flags) ++{ ++ return update_time(h_inode, ts, flags); ++ /* no vfsub_update_h_iattr() since we don't have struct path */ ++} ++ ++#ifdef CONFIG_FS_POSIX_ACL ++static inline int vfsub_acl_chmod(struct inode *h_inode, umode_t h_mode) ++{ ++ int err; ++ ++ err = posix_acl_chmod(h_inode, h_mode); ++ if (err == -EOPNOTSUPP) ++ err = 0; ++ return err; ++} ++#else ++AuStubInt0(vfsub_acl_chmod, struct inode *h_inode, umode_t h_mode); ++#endif ++ ++long vfsub_splice_to(struct file *in, loff_t *ppos, ++ struct pipe_inode_info *pipe, size_t len, ++ unsigned int flags); ++long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out, ++ loff_t *ppos, size_t len, unsigned int flags); ++ ++static inline long vfsub_truncate(struct path *path, loff_t length) ++{ ++ long err; ++ ++ lockdep_off(); ++ err = vfs_truncate(path, length); ++ lockdep_on(); ++ return err; ++} ++ ++int vfsub_trunc(struct path *h_path, loff_t length, unsigned int attr, ++ struct file *h_file); ++int vfsub_fsync(struct file *file, struct path *path, int datasync); ++ ++/* ++ * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such ++ * ioctl. ++ */ ++static inline int vfsub_clone_file_range(struct file *src, struct file *dst, ++ u64 len) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_clone_file_range(src, 0, dst, 0, len); ++ lockdep_on(); ++ ++ return err; ++} ++ ++/* copy_file_range(2) is a systemcall */ ++static inline ssize_t vfsub_copy_file_range(struct file *src, loff_t src_pos, ++ struct file *dst, loff_t dst_pos, ++ size_t len, unsigned int flags) ++{ ++ ssize_t ssz; ++ ++ lockdep_off(); ++ ssz = vfs_copy_file_range(src, src_pos, dst, dst_pos, len, flags); ++ lockdep_on(); ++ ++ return ssz; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline loff_t vfsub_llseek(struct file *file, loff_t offset, int origin) ++{ ++ loff_t err; ++ ++ lockdep_off(); ++ err = vfs_llseek(file, offset, origin); ++ lockdep_on(); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int vfsub_sio_mkdir(struct inode *dir, struct path *path, int mode); ++int vfsub_sio_rmdir(struct inode *dir, struct path *path); ++int vfsub_sio_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode); ++int vfsub_notify_change(struct path *path, struct iattr *ia, ++ struct inode **delegated_inode); ++int vfsub_unlink(struct inode *dir, struct path *path, ++ struct inode **delegated_inode, int force); ++ ++static inline int vfsub_getattr(const struct path *path, struct kstat *st) ++{ ++ return vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int vfsub_setxattr(struct dentry *dentry, const char *name, ++ const void *value, size_t size, int flags) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_setxattr(dentry, name, value, size, flags); ++ lockdep_on(); ++ ++ return err; ++} ++ ++static inline int vfsub_removexattr(struct dentry *dentry, const char *name) ++{ ++ int err; ++ ++ lockdep_off(); ++ err = vfs_removexattr(dentry, name); ++ lockdep_on(); ++ ++ return err; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_VFSUB_H__ */ +diff -Naur null/fs/aufs/wbr_policy.c linux-4.15/fs/aufs/wbr_policy.c +--- /dev/null ++++ linux-4.15/fs/aufs/wbr_policy.c 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,830 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * policies for selecting one among multiple writable branches ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* subset of cpup_attr() */ ++static noinline_for_stack ++int au_cpdown_attr(struct path *h_path, struct dentry *h_src) ++{ ++ int err, sbits; ++ struct iattr ia; ++ struct inode *h_isrc; ++ ++ h_isrc = d_inode(h_src); ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE | ATTR_UID | ATTR_GID; ++ ia.ia_mode = h_isrc->i_mode; ++ ia.ia_uid = h_isrc->i_uid; ++ ia.ia_gid = h_isrc->i_gid; ++ sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID)); ++ au_cpup_attr_flags(d_inode(h_path->dentry), h_isrc->i_flags); ++ /* no delegation since it is just created */ ++ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ ++ /* is this nfs only? */ ++ if (!err && sbits && au_test_nfs(h_path->dentry->d_sb)) { ++ ia.ia_valid = ATTR_FORCE | ATTR_MODE; ++ ia.ia_mode = h_isrc->i_mode; ++ err = vfsub_sio_notify_change(h_path, &ia, /*delegated*/NULL); ++ } ++ ++ return err; ++} ++ ++#define AuCpdown_PARENT_OPQ 1 ++#define AuCpdown_WHED (1 << 1) ++#define AuCpdown_MADE_DIR (1 << 2) ++#define AuCpdown_DIROPQ (1 << 3) ++#define au_ftest_cpdown(flags, name) ((flags) & AuCpdown_##name) ++#define au_fset_cpdown(flags, name) \ ++ do { (flags) |= AuCpdown_##name; } while (0) ++#define au_fclr_cpdown(flags, name) \ ++ do { (flags) &= ~AuCpdown_##name; } while (0) ++ ++static int au_cpdown_dir_opq(struct dentry *dentry, aufs_bindex_t bdst, ++ unsigned int *flags) ++{ ++ int err; ++ struct dentry *opq_dentry; ++ ++ opq_dentry = au_diropq_create(dentry, bdst); ++ err = PTR_ERR(opq_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out; ++ dput(opq_dentry); ++ au_fset_cpdown(*flags, DIROPQ); ++ ++out: ++ return err; ++} ++ ++static int au_cpdown_dir_wh(struct dentry *dentry, struct dentry *h_parent, ++ struct inode *dir, aufs_bindex_t bdst) ++{ ++ int err; ++ struct path h_path; ++ struct au_branch *br; ++ ++ br = au_sbr(dentry->d_sb, bdst); ++ h_path.dentry = au_wh_lkup(h_parent, &dentry->d_name, br); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ err = 0; ++ if (d_is_positive(h_path.dentry)) { ++ h_path.mnt = au_br_mnt(br); ++ err = au_wh_unlink_dentry(au_h_iptr(dir, bdst), &h_path, ++ dentry); ++ } ++ dput(h_path.dentry); ++ ++out: ++ return err; ++} ++ ++static int au_cpdown_dir(struct dentry *dentry, aufs_bindex_t bdst, ++ struct au_pin *pin, ++ struct dentry *h_parent, void *arg) ++{ ++ int err, rerr; ++ aufs_bindex_t bopq, btop; ++ struct path h_path; ++ struct dentry *parent; ++ struct inode *h_dir, *h_inode, *inode, *dir; ++ unsigned int *flags = arg; ++ ++ btop = au_dbtop(dentry); ++ /* dentry is di-locked */ ++ parent = dget_parent(dentry); ++ dir = d_inode(parent); ++ h_dir = d_inode(h_parent); ++ AuDebugOn(h_dir != au_h_iptr(dir, bdst)); ++ IMustLock(h_dir); ++ ++ err = au_lkup_neg(dentry, bdst, /*wh*/0); ++ if (unlikely(err < 0)) ++ goto out; ++ h_path.dentry = au_h_dptr(dentry, bdst); ++ h_path.mnt = au_sbr_mnt(dentry->d_sb, bdst); ++ err = vfsub_sio_mkdir(au_h_iptr(dir, bdst), &h_path, ++ S_IRWXU | S_IRUGO | S_IXUGO); ++ if (unlikely(err)) ++ goto out_put; ++ au_fset_cpdown(*flags, MADE_DIR); ++ ++ bopq = au_dbdiropq(dentry); ++ au_fclr_cpdown(*flags, WHED); ++ au_fclr_cpdown(*flags, DIROPQ); ++ if (au_dbwh(dentry) == bdst) ++ au_fset_cpdown(*flags, WHED); ++ if (!au_ftest_cpdown(*flags, PARENT_OPQ) && bopq <= bdst) ++ au_fset_cpdown(*flags, PARENT_OPQ); ++ h_inode = d_inode(h_path.dentry); ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ if (au_ftest_cpdown(*flags, WHED)) { ++ err = au_cpdown_dir_opq(dentry, bdst, flags); ++ if (unlikely(err)) { ++ inode_unlock(h_inode); ++ goto out_dir; ++ } ++ } ++ ++ err = au_cpdown_attr(&h_path, au_h_dptr(dentry, btop)); ++ inode_unlock(h_inode); ++ if (unlikely(err)) ++ goto out_opq; ++ ++ if (au_ftest_cpdown(*flags, WHED)) { ++ err = au_cpdown_dir_wh(dentry, h_parent, dir, bdst); ++ if (unlikely(err)) ++ goto out_opq; ++ } ++ ++ inode = d_inode(dentry); ++ if (au_ibbot(inode) < bdst) ++ au_set_ibbot(inode, bdst); ++ au_set_h_iptr(inode, bdst, au_igrab(h_inode), ++ au_hi_flags(inode, /*isdir*/1)); ++ au_fhsm_wrote(dentry->d_sb, bdst, /*force*/0); ++ goto out; /* success */ ++ ++ /* revert */ ++out_opq: ++ if (au_ftest_cpdown(*flags, DIROPQ)) { ++ inode_lock_nested(h_inode, AuLsc_I_CHILD); ++ rerr = au_diropq_remove(dentry, bdst); ++ inode_unlock(h_inode); ++ if (unlikely(rerr)) { ++ AuIOErr("failed removing diropq for %pd b%d (%d)\n", ++ dentry, bdst, rerr); ++ err = -EIO; ++ goto out; ++ } ++ } ++out_dir: ++ if (au_ftest_cpdown(*flags, MADE_DIR)) { ++ rerr = vfsub_sio_rmdir(au_h_iptr(dir, bdst), &h_path); ++ if (unlikely(rerr)) { ++ AuIOErr("failed removing %pd b%d (%d)\n", ++ dentry, bdst, rerr); ++ err = -EIO; ++ } ++ } ++out_put: ++ au_set_h_dptr(dentry, bdst, NULL); ++ if (au_dbbot(dentry) == bdst) ++ au_update_dbbot(dentry); ++out: ++ dput(parent); ++ return err; ++} ++ ++int au_cpdown_dirs(struct dentry *dentry, aufs_bindex_t bdst) ++{ ++ int err; ++ unsigned int flags; ++ ++ flags = 0; ++ err = au_cp_dirs(dentry, bdst, au_cpdown_dir, &flags); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies for create */ ++ ++int au_wbr_nonopq(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ int err, i, j, ndentry; ++ aufs_bindex_t bopq; ++ struct au_dcsub_pages dpages; ++ struct au_dpage *dpage; ++ struct dentry **dentries, *parent, *d; ++ ++ err = au_dpages_init(&dpages, GFP_NOFS); ++ if (unlikely(err)) ++ goto out; ++ parent = dget_parent(dentry); ++ err = au_dcsub_pages_rev_aufs(&dpages, parent, /*do_include*/0); ++ if (unlikely(err)) ++ goto out_free; ++ ++ err = bindex; ++ for (i = 0; i < dpages.ndpage; i++) { ++ dpage = dpages.dpages + i; ++ dentries = dpage->dentries; ++ ndentry = dpage->ndentry; ++ for (j = 0; j < ndentry; j++) { ++ d = dentries[j]; ++ di_read_lock_parent2(d, !AuLock_IR); ++ bopq = au_dbdiropq(d); ++ di_read_unlock(d, !AuLock_IR); ++ if (bopq >= 0 && bopq < err) ++ err = bopq; ++ } ++ } ++ ++out_free: ++ dput(parent); ++ au_dpages_free(&dpages); ++out: ++ return err; ++} ++ ++static int au_wbr_bu(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ for (; bindex >= 0; bindex--) ++ if (!au_br_rdonly(au_sbr(sb, bindex))) ++ return bindex; ++ return -EROFS; ++} ++ ++/* top down parent */ ++static int au_wbr_create_tdp(struct dentry *dentry, ++ unsigned int flags __maybe_unused) ++{ ++ int err; ++ aufs_bindex_t btop, bindex; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent; ++ ++ sb = dentry->d_sb; ++ btop = au_dbtop(dentry); ++ err = btop; ++ if (!au_br_rdonly(au_sbr(sb, btop))) ++ goto out; ++ ++ err = -EROFS; ++ parent = dget_parent(dentry); ++ for (bindex = au_dbtop(parent); bindex < btop; bindex++) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = bindex; ++ break; ++ } ++ } ++ dput(parent); ++ ++ /* bottom up here */ ++ if (unlikely(err < 0)) { ++ err = au_wbr_bu(sb, btop - 1); ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ } ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* an exception for the policy other than tdp */ ++static int au_wbr_create_exp(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bwh, bdiropq; ++ struct dentry *parent; ++ ++ err = -1; ++ bwh = au_dbwh(dentry); ++ parent = dget_parent(dentry); ++ bdiropq = au_dbdiropq(parent); ++ if (bwh >= 0) { ++ if (bdiropq >= 0) ++ err = min(bdiropq, bwh); ++ else ++ err = bwh; ++ AuDbg("%d\n", err); ++ } else if (bdiropq >= 0) { ++ err = bdiropq; ++ AuDbg("%d\n", err); ++ } ++ dput(parent); ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++ if (err >= 0 && au_br_rdonly(au_sbr(dentry->d_sb, err))) ++ err = -1; ++ ++ AuDbg("%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* round robin */ ++static int au_wbr_create_init_rr(struct super_block *sb) ++{ ++ int err; ++ ++ err = au_wbr_bu(sb, au_sbbot(sb)); ++ atomic_set(&au_sbi(sb)->si_wbr_rr_next, -err); /* less important */ ++ /* smp_mb(); */ ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_rr(struct dentry *dentry, unsigned int flags) ++{ ++ int err, nbr; ++ unsigned int u; ++ aufs_bindex_t bindex, bbot; ++ struct super_block *sb; ++ atomic_t *next; ++ ++ err = au_wbr_create_exp(dentry); ++ if (err >= 0) ++ goto out; ++ ++ sb = dentry->d_sb; ++ next = &au_sbi(sb)->si_wbr_rr_next; ++ bbot = au_sbbot(sb); ++ nbr = bbot + 1; ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ if (!au_ftest_wbr(flags, DIR)) { ++ err = atomic_dec_return(next) + 1; ++ /* modulo for 0 is meaningless */ ++ if (unlikely(!err)) ++ err = atomic_dec_return(next) + 1; ++ } else ++ err = atomic_read(next); ++ AuDbg("%d\n", err); ++ u = err; ++ err = u % nbr; ++ AuDbg("%d\n", err); ++ if (!au_br_rdonly(au_sbr(sb, err))) ++ break; ++ err = -EROFS; ++ } ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out: ++ AuDbg("%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* most free space */ ++static void au_mfs(struct dentry *dentry, struct dentry *parent) ++{ ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_wbr_mfs *mfs; ++ struct dentry *h_parent; ++ aufs_bindex_t bindex, bbot; ++ int err; ++ unsigned long long b, bavail; ++ struct path h_path; ++ /* reduce the stack usage */ ++ struct kstatfs *st; ++ ++ st = kmalloc(sizeof(*st), GFP_NOFS); ++ if (unlikely(!st)) { ++ AuWarn1("failed updating mfs(%d), ignored\n", -ENOMEM); ++ return; ++ } ++ ++ bavail = 0; ++ sb = dentry->d_sb; ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ MtxMustLock(&mfs->mfs_lock); ++ mfs->mfs_bindex = -EROFS; ++ mfs->mfsrr_bytes = 0; ++ if (!parent) { ++ bindex = 0; ++ bbot = au_sbbot(sb); ++ } else { ++ bindex = au_dbtop(parent); ++ bbot = au_dbtaildir(parent); ++ } ++ ++ for (; bindex <= bbot; bindex++) { ++ if (parent) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ } ++ br = au_sbr(sb, bindex); ++ if (au_br_rdonly(br)) ++ continue; ++ ++ /* sb->s_root for NFS is unreliable */ ++ h_path.mnt = au_br_mnt(br); ++ h_path.dentry = h_path.mnt->mnt_root; ++ err = vfs_statfs(&h_path, st); ++ if (unlikely(err)) { ++ AuWarn1("failed statfs, b%d, %d\n", bindex, err); ++ continue; ++ } ++ ++ /* when the available size is equal, select the lower one */ ++ BUILD_BUG_ON(sizeof(b) < sizeof(st->f_bavail) ++ || sizeof(b) < sizeof(st->f_bsize)); ++ b = st->f_bavail * st->f_bsize; ++ br->br_wbr->wbr_bytes = b; ++ if (b >= bavail) { ++ bavail = b; ++ mfs->mfs_bindex = bindex; ++ mfs->mfs_jiffy = jiffies; ++ } ++ } ++ ++ mfs->mfsrr_bytes = bavail; ++ AuDbg("b%d\n", mfs->mfs_bindex); ++ kfree(st); ++} ++ ++static int au_wbr_create_mfs(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ struct dentry *parent; ++ struct super_block *sb; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_exp(dentry); ++ if (err >= 0) ++ goto out; ++ ++ sb = dentry->d_sb; ++ parent = NULL; ++ if (au_ftest_wbr(flags, PARENT)) ++ parent = dget_parent(dentry); ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) ++ || mfs->mfs_bindex < 0 ++ || au_br_rdonly(au_sbr(sb, mfs->mfs_bindex))) ++ au_mfs(dentry, parent); ++ mutex_unlock(&mfs->mfs_lock); ++ err = mfs->mfs_bindex; ++ dput(parent); ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_init_mfs(struct super_block *sb) ++{ ++ struct au_wbr_mfs *mfs; ++ ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_init(&mfs->mfs_lock); ++ mfs->mfs_jiffy = 0; ++ mfs->mfs_bindex = -EROFS; ++ ++ return 0; ++} ++ ++static int au_wbr_create_fin_mfs(struct super_block *sb __maybe_unused) ++{ ++ mutex_destroy(&au_sbi(sb)->si_wbr_mfs.mfs_lock); ++ return 0; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* top down regardless parent, and then mfs */ ++static int au_wbr_create_tdmfs(struct dentry *dentry, ++ unsigned int flags __maybe_unused) ++{ ++ int err; ++ aufs_bindex_t bwh, btail, bindex, bfound, bmfs; ++ unsigned long long watermark; ++ struct super_block *sb; ++ struct au_wbr_mfs *mfs; ++ struct au_branch *br; ++ struct dentry *parent; ++ ++ sb = dentry->d_sb; ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (time_after(jiffies, mfs->mfs_jiffy + mfs->mfs_expire) ++ || mfs->mfs_bindex < 0) ++ au_mfs(dentry, /*parent*/NULL); ++ watermark = mfs->mfsrr_watermark; ++ bmfs = mfs->mfs_bindex; ++ mutex_unlock(&mfs->mfs_lock); ++ ++ /* another style of au_wbr_create_exp() */ ++ bwh = au_dbwh(dentry); ++ parent = dget_parent(dentry); ++ btail = au_dbtaildir(parent); ++ if (bwh >= 0 && bwh < btail) ++ btail = bwh; ++ ++ err = au_wbr_nonopq(dentry, btail); ++ if (unlikely(err < 0)) ++ goto out; ++ btail = err; ++ bfound = -1; ++ for (bindex = 0; bindex <= btail; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_rdonly(br)) ++ continue; ++ if (br->br_wbr->wbr_bytes > watermark) { ++ bfound = bindex; ++ break; ++ } ++ } ++ err = bfound; ++ if (err < 0) ++ err = bmfs; ++ ++out: ++ dput(parent); ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* most free space and then round robin */ ++static int au_wbr_create_mfsrr(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_mfs(dentry, flags); ++ if (err >= 0) { ++ mfs = &au_sbi(dentry->d_sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ if (mfs->mfsrr_bytes < mfs->mfsrr_watermark) ++ err = au_wbr_create_rr(dentry, flags); ++ mutex_unlock(&mfs->mfs_lock); ++ } ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_create_init_mfsrr(struct super_block *sb) ++{ ++ int err; ++ ++ au_wbr_create_init_mfs(sb); /* ignore */ ++ err = au_wbr_create_init_rr(sb); ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* top down parent and most free space */ ++static int au_wbr_create_pmfs(struct dentry *dentry, unsigned int flags) ++{ ++ int err, e2; ++ unsigned long long b; ++ aufs_bindex_t bindex, btop, bbot; ++ struct super_block *sb; ++ struct dentry *parent, *h_parent; ++ struct au_branch *br; ++ ++ err = au_wbr_create_tdp(dentry, flags); ++ if (unlikely(err < 0)) ++ goto out; ++ parent = dget_parent(dentry); ++ btop = au_dbtop(parent); ++ bbot = au_dbtaildir(parent); ++ if (btop == bbot) ++ goto out_parent; /* success */ ++ ++ e2 = au_wbr_create_mfs(dentry, flags); ++ if (e2 < 0) ++ goto out_parent; /* success */ ++ ++ /* when the available size is equal, select upper one */ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, err); ++ b = br->br_wbr->wbr_bytes; ++ AuDbg("b%d, %llu\n", err, b); ++ ++ for (bindex = btop; bindex <= bbot; bindex++) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ br = au_sbr(sb, bindex); ++ if (!au_br_rdonly(br) && br->br_wbr->wbr_bytes > b) { ++ b = br->br_wbr->wbr_bytes; ++ err = bindex; ++ AuDbg("b%d, %llu\n", err, b); ++ } ++ } ++ ++ if (err >= 0) ++ err = au_wbr_nonopq(dentry, err); ++ ++out_parent: ++ dput(parent); ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * - top down parent ++ * - most free space with parent ++ * - most free space round-robin regardless parent ++ */ ++static int au_wbr_create_pmfsrr(struct dentry *dentry, unsigned int flags) ++{ ++ int err; ++ unsigned long long watermark; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct au_wbr_mfs *mfs; ++ ++ err = au_wbr_create_pmfs(dentry, flags | AuWbr_PARENT); ++ if (unlikely(err < 0)) ++ goto out; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, err); ++ mfs = &au_sbi(sb)->si_wbr_mfs; ++ mutex_lock(&mfs->mfs_lock); ++ watermark = mfs->mfsrr_watermark; ++ mutex_unlock(&mfs->mfs_lock); ++ if (br->br_wbr->wbr_bytes < watermark) ++ /* regardless the parent dir */ ++ err = au_wbr_create_mfsrr(dentry, flags); ++ ++out: ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* policies for copyup */ ++ ++/* top down parent */ ++static int au_wbr_copyup_tdp(struct dentry *dentry) ++{ ++ return au_wbr_create_tdp(dentry, /*flags, anything is ok*/0); ++} ++ ++/* bottom up parent */ ++static int au_wbr_copyup_bup(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t bindex, btop; ++ struct dentry *parent, *h_parent; ++ struct super_block *sb; ++ ++ err = -EROFS; ++ sb = dentry->d_sb; ++ parent = dget_parent(dentry); ++ btop = au_dbtop(parent); ++ for (bindex = au_dbtop(dentry); bindex >= btop; bindex--) { ++ h_parent = au_h_dptr(parent, bindex); ++ if (!h_parent || d_is_negative(h_parent)) ++ continue; ++ ++ if (!au_br_rdonly(au_sbr(sb, bindex))) { ++ err = bindex; ++ break; ++ } ++ } ++ dput(parent); ++ ++ /* bottom up here */ ++ if (unlikely(err < 0)) ++ err = au_wbr_bu(sb, btop - 1); ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++/* bottom up */ ++int au_wbr_do_copyup_bu(struct dentry *dentry, aufs_bindex_t btop) ++{ ++ int err; ++ ++ err = au_wbr_bu(dentry->d_sb, btop); ++ AuDbg("b%d\n", err); ++ if (err > btop) ++ err = au_wbr_nonopq(dentry, err); ++ ++ AuDbg("b%d\n", err); ++ return err; ++} ++ ++static int au_wbr_copyup_bu(struct dentry *dentry) ++{ ++ int err; ++ aufs_bindex_t btop; ++ ++ btop = au_dbtop(dentry); ++ err = au_wbr_do_copyup_bu(dentry, btop); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_wbr_copyup_operations au_wbr_copyup_ops[] = { ++ [AuWbrCopyup_TDP] = { ++ .copyup = au_wbr_copyup_tdp ++ }, ++ [AuWbrCopyup_BUP] = { ++ .copyup = au_wbr_copyup_bup ++ }, ++ [AuWbrCopyup_BU] = { ++ .copyup = au_wbr_copyup_bu ++ } ++}; ++ ++struct au_wbr_create_operations au_wbr_create_ops[] = { ++ [AuWbrCreate_TDP] = { ++ .create = au_wbr_create_tdp ++ }, ++ [AuWbrCreate_RR] = { ++ .create = au_wbr_create_rr, ++ .init = au_wbr_create_init_rr ++ }, ++ [AuWbrCreate_MFS] = { ++ .create = au_wbr_create_mfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSV] = { ++ .create = au_wbr_create_mfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSRR] = { ++ .create = au_wbr_create_mfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_MFSRRV] = { ++ .create = au_wbr_create_mfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_TDMFS] = { ++ .create = au_wbr_create_tdmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_TDMFSV] = { ++ .create = au_wbr_create_tdmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFS] = { ++ .create = au_wbr_create_pmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSV] = { ++ .create = au_wbr_create_pmfs, ++ .init = au_wbr_create_init_mfs, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSRR] = { ++ .create = au_wbr_create_pmfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ }, ++ [AuWbrCreate_PMFSRRV] = { ++ .create = au_wbr_create_pmfsrr, ++ .init = au_wbr_create_init_mfsrr, ++ .fin = au_wbr_create_fin_mfs ++ } ++}; +diff -Naur null/fs/aufs/whout.c linux-4.15/fs/aufs/whout.c +--- /dev/null ++++ linux-4.15/fs/aufs/whout.c 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,1061 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * whiteout for logical deletion and opaque directory ++ */ ++ ++#include "aufs.h" ++ ++#define WH_MASK S_IRUGO ++ ++/* ++ * If a directory contains this file, then it is opaque. We start with the ++ * .wh. flag so that it is blocked by lookup. ++ */ ++static struct qstr diropq_name = QSTR_INIT(AUFS_WH_DIROPQ, ++ sizeof(AUFS_WH_DIROPQ) - 1); ++ ++/* ++ * generate whiteout name, which is NOT terminated by NULL. ++ * @name: original d_name.name ++ * @len: original d_name.len ++ * @wh: whiteout qstr ++ * returns zero when succeeds, otherwise error. ++ * succeeded value as wh->name should be freed by kfree(). ++ */ ++int au_wh_name_alloc(struct qstr *wh, const struct qstr *name) ++{ ++ char *p; ++ ++ if (unlikely(name->len > PATH_MAX - AUFS_WH_PFX_LEN)) ++ return -ENAMETOOLONG; ++ ++ wh->len = name->len + AUFS_WH_PFX_LEN; ++ p = kmalloc(wh->len, GFP_NOFS); ++ wh->name = p; ++ if (p) { ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ memcpy(p + AUFS_WH_PFX_LEN, name->name, name->len); ++ /* smp_mb(); */ ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * test if the @wh_name exists under @h_parent. ++ * @try_sio specifies the necessary of super-io. ++ */ ++int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, int try_sio) ++{ ++ int err; ++ struct dentry *wh_dentry; ++ ++ if (!try_sio) ++ wh_dentry = vfsub_lkup_one(wh_name, h_parent); ++ else ++ wh_dentry = au_sio_lkup_one(wh_name, h_parent); ++ err = PTR_ERR(wh_dentry); ++ if (IS_ERR(wh_dentry)) { ++ if (err == -ENAMETOOLONG) ++ err = 0; ++ goto out; ++ } ++ ++ err = 0; ++ if (d_is_negative(wh_dentry)) ++ goto out_wh; /* success */ ++ ++ err = 1; ++ if (d_is_reg(wh_dentry)) ++ goto out_wh; /* success */ ++ ++ err = -EIO; ++ AuIOErr("%pd Invalid whiteout entry type 0%o.\n", ++ wh_dentry, d_inode(wh_dentry)->i_mode); ++ ++out_wh: ++ dput(wh_dentry); ++out: ++ return err; ++} ++ ++/* ++ * test if the @h_dentry sets opaque or not. ++ */ ++int au_diropq_test(struct dentry *h_dentry) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ h_dir = d_inode(h_dentry); ++ err = au_wh_test(h_dentry, &diropq_name, ++ au_test_h_perm_sio(h_dir, MAY_EXEC)); ++ return err; ++} ++ ++/* ++ * returns a negative dentry whose name is unique and temporary. ++ */ ++struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, ++ struct qstr *prefix) ++{ ++ struct dentry *dentry; ++ int i; ++ char defname[NAME_MAX - AUFS_MAX_NAMELEN + DNAME_INLINE_LEN + 1], ++ *name, *p; ++ /* strict atomic_t is unnecessary here */ ++ static unsigned short cnt; ++ struct qstr qs; ++ ++ BUILD_BUG_ON(sizeof(cnt) * 2 > AUFS_WH_TMP_LEN); ++ ++ name = defname; ++ qs.len = sizeof(defname) - DNAME_INLINE_LEN + prefix->len - 1; ++ if (unlikely(prefix->len > DNAME_INLINE_LEN)) { ++ dentry = ERR_PTR(-ENAMETOOLONG); ++ if (unlikely(qs.len > NAME_MAX)) ++ goto out; ++ dentry = ERR_PTR(-ENOMEM); ++ name = kmalloc(qs.len + 1, GFP_NOFS); ++ if (unlikely(!name)) ++ goto out; ++ } ++ ++ /* doubly whiteout-ed */ ++ memcpy(name, AUFS_WH_PFX AUFS_WH_PFX, AUFS_WH_PFX_LEN * 2); ++ p = name + AUFS_WH_PFX_LEN * 2; ++ memcpy(p, prefix->name, prefix->len); ++ p += prefix->len; ++ *p++ = '.'; ++ AuDebugOn(name + qs.len + 1 - p <= AUFS_WH_TMP_LEN); ++ ++ qs.name = name; ++ for (i = 0; i < 3; i++) { ++ sprintf(p, "%.*x", AUFS_WH_TMP_LEN, cnt++); ++ dentry = au_sio_lkup_one(&qs, h_parent); ++ if (IS_ERR(dentry) || d_is_negative(dentry)) ++ goto out_name; ++ dput(dentry); ++ } ++ /* pr_warn("could not get random name\n"); */ ++ dentry = ERR_PTR(-EEXIST); ++ AuDbg("%.*s\n", AuLNPair(&qs)); ++ BUG(); ++ ++out_name: ++ if (name != defname) ++ kfree(name); ++out: ++ AuTraceErrPtr(dentry); ++ return dentry; ++} ++ ++/* ++ * rename the @h_dentry on @br to the whiteouted temporary name. ++ */ ++int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ struct inode *h_dir, *delegated; ++ struct dentry *h_parent; ++ ++ h_parent = h_dentry->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ h_path.dentry = au_whtmp_lkup(h_parent, br, &h_dentry->d_name); ++ err = PTR_ERR(h_path.dentry); ++ if (IS_ERR(h_path.dentry)) ++ goto out; ++ ++ /* under the same dir, no need to lock_rename() */ ++ delegated = NULL; ++ err = vfsub_rename(h_dir, h_dentry, h_dir, &h_path, &delegated, ++ /*flags*/0); ++ AuTraceErr(err); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal rename\n"); ++ iput(delegated); ++ } ++ dput(h_path.dentry); ++ ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * functions for removing a whiteout ++ */ ++ ++static int do_unlink_wh(struct inode *h_dir, struct path *h_path) ++{ ++ int err, force; ++ struct inode *delegated; ++ ++ /* ++ * forces superio when the dir has a sticky bit. ++ * this may be a violation of unix fs semantics. ++ */ ++ force = (h_dir->i_mode & S_ISVTX) ++ && !uid_eq(current_fsuid(), d_inode(h_path->dentry)->i_uid); ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, h_path, &delegated, force); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ return err; ++} ++ ++int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, ++ struct dentry *dentry) ++{ ++ int err; ++ ++ err = do_unlink_wh(h_dir, h_path); ++ if (!err && dentry) ++ au_set_dbwh(dentry, -1); ++ ++ return err; ++} ++ ++static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh, ++ struct au_branch *br) ++{ ++ int err; ++ struct path h_path = { ++ .mnt = au_br_mnt(br) ++ }; ++ ++ err = 0; ++ h_path.dentry = vfsub_lkup_one(wh, h_parent); ++ if (IS_ERR(h_path.dentry)) ++ err = PTR_ERR(h_path.dentry); ++ else { ++ if (d_is_reg(h_path.dentry)) ++ err = do_unlink_wh(d_inode(h_parent), &h_path); ++ dput(h_path.dentry); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * initialize/clean whiteout for a branch ++ */ ++ ++static void au_wh_clean(struct inode *h_dir, struct path *whpath, ++ const int isdir) ++{ ++ int err; ++ struct inode *delegated; ++ ++ if (d_is_negative(whpath->dentry)) ++ return; ++ ++ if (isdir) ++ err = vfsub_rmdir(h_dir, whpath); ++ else { ++ delegated = NULL; ++ err = vfsub_unlink(h_dir, whpath, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } ++ if (unlikely(err)) ++ pr_warn("failed removing %pd (%d), ignored.\n", ++ whpath->dentry, err); ++} ++ ++static int test_linkable(struct dentry *h_root) ++{ ++ struct inode *h_dir = d_inode(h_root); ++ ++ if (h_dir->i_op->link) ++ return 0; ++ ++ pr_err("%pd (%s) doesn't support link(2), use noplink and rw+nolwh\n", ++ h_root, au_sbtype(h_root->d_sb)); ++ return -ENOSYS; ++} ++ ++/* todo: should this mkdir be done in /sbin/mount.aufs helper? */ ++static int au_whdir(struct inode *h_dir, struct path *path) ++{ ++ int err; ++ ++ err = -EEXIST; ++ if (d_is_negative(path->dentry)) { ++ int mode = S_IRWXU; ++ ++ if (au_test_nfs(path->dentry->d_sb)) ++ mode |= S_IXUGO; ++ err = vfsub_mkdir(h_dir, path, mode); ++ } else if (d_is_dir(path->dentry)) ++ err = 0; ++ else ++ pr_err("unknown %pd exists\n", path->dentry); ++ ++ return err; ++} ++ ++struct au_wh_base { ++ const struct qstr *name; ++ struct dentry *dentry; ++}; ++ ++static void au_wh_init_ro(struct inode *h_dir, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/0); ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++} ++ ++/* ++ * returns tri-state, ++ * minus: error, caller should print the message ++ * zero: succuess ++ * plus: error, caller should NOT print the message ++ */ ++static int au_wh_init_rw_nolink(struct dentry *h_root, struct au_wbr *wbr, ++ int do_plink, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ h_dir = d_inode(h_root); ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ au_wh_clean(h_dir, h_path, /*isdir*/0); ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ if (do_plink) { ++ err = test_linkable(h_root); ++ if (unlikely(err)) { ++ err = 1; ++ goto out; ++ } ++ ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); ++ } else ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * for the moment, aufs supports the branch filesystem which does not support ++ * link(2). testing on FAT which does not support i_op->setattr() fully either, ++ * copyup failed. finally, such filesystem will not be used as the writable ++ * branch. ++ * ++ * returns tri-state, see above. ++ */ ++static int au_wh_init_rw(struct dentry *h_root, struct au_wbr *wbr, ++ int do_plink, struct au_wh_base base[], ++ struct path *h_path) ++{ ++ int err; ++ struct inode *h_dir; ++ ++ WbrWhMustWriteLock(wbr); ++ ++ err = test_linkable(h_root); ++ if (unlikely(err)) { ++ err = 1; ++ goto out; ++ } ++ ++ /* ++ * todo: should this create be done in /sbin/mount.aufs helper? ++ */ ++ err = -EEXIST; ++ h_dir = d_inode(h_root); ++ if (d_is_negative(base[AuBrWh_BASE].dentry)) { ++ h_path->dentry = base[AuBrWh_BASE].dentry; ++ err = vfsub_create(h_dir, h_path, WH_MASK, /*want_excl*/true); ++ } else if (d_is_reg(base[AuBrWh_BASE].dentry)) ++ err = 0; ++ else ++ pr_err("unknown %pd2 exists\n", base[AuBrWh_BASE].dentry); ++ if (unlikely(err)) ++ goto out; ++ ++ h_path->dentry = base[AuBrWh_PLINK].dentry; ++ if (do_plink) { ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_plink = dget(base[AuBrWh_PLINK].dentry); ++ } else ++ au_wh_clean(h_dir, h_path, /*isdir*/1); ++ wbr->wbr_whbase = dget(base[AuBrWh_BASE].dentry); ++ ++ h_path->dentry = base[AuBrWh_ORPH].dentry; ++ err = au_whdir(h_dir, h_path); ++ if (unlikely(err)) ++ goto out; ++ wbr->wbr_orph = dget(base[AuBrWh_ORPH].dentry); ++ ++out: ++ return err; ++} ++ ++/* ++ * initialize the whiteout base file/dir for @br. ++ */ ++int au_wh_init(struct au_branch *br, struct super_block *sb) ++{ ++ int err, i; ++ const unsigned char do_plink ++ = !!au_opt_test(au_mntflags(sb), PLINK); ++ struct inode *h_dir; ++ struct path path = br->br_path; ++ struct dentry *h_root = path.dentry; ++ struct au_wbr *wbr = br->br_wbr; ++ static const struct qstr base_name[] = { ++ [AuBrWh_BASE] = QSTR_INIT(AUFS_BASE_NAME, ++ sizeof(AUFS_BASE_NAME) - 1), ++ [AuBrWh_PLINK] = QSTR_INIT(AUFS_PLINKDIR_NAME, ++ sizeof(AUFS_PLINKDIR_NAME) - 1), ++ [AuBrWh_ORPH] = QSTR_INIT(AUFS_ORPHDIR_NAME, ++ sizeof(AUFS_ORPHDIR_NAME) - 1) ++ }; ++ struct au_wh_base base[] = { ++ [AuBrWh_BASE] = { ++ .name = base_name + AuBrWh_BASE, ++ .dentry = NULL ++ }, ++ [AuBrWh_PLINK] = { ++ .name = base_name + AuBrWh_PLINK, ++ .dentry = NULL ++ }, ++ [AuBrWh_ORPH] = { ++ .name = base_name + AuBrWh_ORPH, ++ .dentry = NULL ++ } ++ }; ++ ++ if (wbr) ++ WbrWhMustWriteLock(wbr); ++ ++ for (i = 0; i < AuBrWh_Last; i++) { ++ /* doubly whiteouted */ ++ struct dentry *d; ++ ++ d = au_wh_lkup(h_root, (void *)base[i].name, br); ++ err = PTR_ERR(d); ++ if (IS_ERR(d)) ++ goto out; ++ ++ base[i].dentry = d; ++ AuDebugOn(wbr ++ && wbr->wbr_wh[i] ++ && wbr->wbr_wh[i] != base[i].dentry); ++ } ++ ++ if (wbr) ++ for (i = 0; i < AuBrWh_Last; i++) { ++ dput(wbr->wbr_wh[i]); ++ wbr->wbr_wh[i] = NULL; ++ } ++ ++ err = 0; ++ if (!au_br_writable(br->br_perm)) { ++ h_dir = d_inode(h_root); ++ au_wh_init_ro(h_dir, base, &path); ++ } else if (!au_br_wh_linkable(br->br_perm)) { ++ err = au_wh_init_rw_nolink(h_root, wbr, do_plink, base, &path); ++ if (err > 0) ++ goto out; ++ else if (err) ++ goto out_err; ++ } else { ++ err = au_wh_init_rw(h_root, wbr, do_plink, base, &path); ++ if (err > 0) ++ goto out; ++ else if (err) ++ goto out_err; ++ } ++ goto out; /* success */ ++ ++out_err: ++ pr_err("an error(%d) on the writable branch %pd(%s)\n", ++ err, h_root, au_sbtype(h_root->d_sb)); ++out: ++ for (i = 0; i < AuBrWh_Last; i++) ++ dput(base[i].dentry); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * whiteouts are all hard-linked usually. ++ * when its link count reaches a ceiling, we create a new whiteout base ++ * asynchronously. ++ */ ++ ++struct reinit_br_wh { ++ struct super_block *sb; ++ struct au_branch *br; ++}; ++ ++static void reinit_br_wh(void *arg) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct path h_path; ++ struct reinit_br_wh *a = arg; ++ struct au_wbr *wbr; ++ struct inode *dir, *delegated; ++ struct dentry *h_root; ++ struct au_hinode *hdir; ++ ++ err = 0; ++ wbr = a->br->br_wbr; ++ /* big aufs lock */ ++ si_noflush_write_lock(a->sb); ++ if (!au_br_writable(a->br->br_perm)) ++ goto out; ++ bindex = au_br_index(a->sb, a->br->br_id); ++ if (unlikely(bindex < 0)) ++ goto out; ++ ++ di_read_lock_parent(a->sb->s_root, AuLock_IR); ++ dir = d_inode(a->sb->s_root); ++ hdir = au_hi(dir, bindex); ++ h_root = au_h_dptr(a->sb->s_root, bindex); ++ AuDebugOn(h_root != au_br_dentry(a->br)); ++ ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ wbr_wh_write_lock(wbr); ++ err = au_h_verify(wbr->wbr_whbase, au_opt_udba(a->sb), hdir->hi_inode, ++ h_root, a->br); ++ if (!err) { ++ h_path.dentry = wbr->wbr_whbase; ++ h_path.mnt = au_br_mnt(a->br); ++ delegated = NULL; ++ err = vfsub_unlink(hdir->hi_inode, &h_path, &delegated, ++ /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ } else { ++ pr_warn("%pd is moved, ignored\n", wbr->wbr_whbase); ++ err = 0; ++ } ++ dput(wbr->wbr_whbase); ++ wbr->wbr_whbase = NULL; ++ if (!err) ++ err = au_wh_init(a->br, a->sb); ++ wbr_wh_write_unlock(wbr); ++ au_hn_inode_unlock(hdir); ++ di_read_unlock(a->sb->s_root, AuLock_IR); ++ if (!err) ++ au_fhsm_wrote(a->sb, bindex, /*force*/0); ++ ++out: ++ if (wbr) ++ atomic_dec(&wbr->wbr_wh_running); ++ au_br_put(a->br); ++ si_write_unlock(a->sb); ++ au_nwt_done(&au_sbi(a->sb)->si_nowait); ++ kfree(arg); ++ if (unlikely(err)) ++ AuIOErr("err %d\n", err); ++} ++ ++static void kick_reinit_br_wh(struct super_block *sb, struct au_branch *br) ++{ ++ int do_dec, wkq_err; ++ struct reinit_br_wh *arg; ++ ++ do_dec = 1; ++ if (atomic_inc_return(&br->br_wbr->wbr_wh_running) != 1) ++ goto out; ++ ++ /* ignore ENOMEM */ ++ arg = kmalloc(sizeof(*arg), GFP_NOFS); ++ if (arg) { ++ /* ++ * dec(wh_running), kfree(arg) and dec(br_count) ++ * in reinit function ++ */ ++ arg->sb = sb; ++ arg->br = br; ++ au_br_get(br); ++ wkq_err = au_wkq_nowait(reinit_br_wh, arg, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ atomic_dec(&br->br_wbr->wbr_wh_running); ++ au_br_put(br); ++ kfree(arg); ++ } ++ do_dec = 0; ++ } ++ ++out: ++ if (do_dec) ++ atomic_dec(&br->br_wbr->wbr_wh_running); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create the whiteout @wh. ++ */ ++static int link_or_create_wh(struct super_block *sb, aufs_bindex_t bindex, ++ struct dentry *wh) ++{ ++ int err; ++ struct path h_path = { ++ .dentry = wh ++ }; ++ struct au_branch *br; ++ struct au_wbr *wbr; ++ struct dentry *h_parent; ++ struct inode *h_dir, *delegated; ++ ++ h_parent = wh->d_parent; /* dir inode is locked */ ++ h_dir = d_inode(h_parent); ++ IMustLock(h_dir); ++ ++ br = au_sbr(sb, bindex); ++ h_path.mnt = au_br_mnt(br); ++ wbr = br->br_wbr; ++ wbr_wh_read_lock(wbr); ++ if (wbr->wbr_whbase) { ++ delegated = NULL; ++ err = vfsub_link(wbr->wbr_whbase, h_dir, &h_path, &delegated); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal link\n"); ++ iput(delegated); ++ } ++ if (!err || err != -EMLINK) ++ goto out; ++ ++ /* link count full. re-initialize br_whbase. */ ++ kick_reinit_br_wh(sb, br); ++ } ++ ++ /* return this error in this context */ ++ err = vfsub_create(h_dir, &h_path, WH_MASK, /*want_excl*/true); ++ if (!err) ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ ++out: ++ wbr_wh_read_unlock(wbr); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create or remove the diropq. ++ */ ++static struct dentry *do_diropq(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags) ++{ ++ struct dentry *opq_dentry, *h_dentry; ++ struct super_block *sb; ++ struct au_branch *br; ++ int err; ++ ++ sb = dentry->d_sb; ++ br = au_sbr(sb, bindex); ++ h_dentry = au_h_dptr(dentry, bindex); ++ opq_dentry = vfsub_lkup_one(&diropq_name, h_dentry); ++ if (IS_ERR(opq_dentry)) ++ goto out; ++ ++ if (au_ftest_diropq(flags, CREATE)) { ++ err = link_or_create_wh(sb, bindex, opq_dentry); ++ if (!err) { ++ au_set_dbdiropq(dentry, bindex); ++ goto out; /* success */ ++ } ++ } else { ++ struct path tmp = { ++ .dentry = opq_dentry, ++ .mnt = au_br_mnt(br) ++ }; ++ err = do_unlink_wh(au_h_iptr(d_inode(dentry), bindex), &tmp); ++ if (!err) ++ au_set_dbdiropq(dentry, -1); ++ } ++ dput(opq_dentry); ++ opq_dentry = ERR_PTR(err); ++ ++out: ++ return opq_dentry; ++} ++ ++struct do_diropq_args { ++ struct dentry **errp; ++ struct dentry *dentry; ++ aufs_bindex_t bindex; ++ unsigned int flags; ++}; ++ ++static void call_do_diropq(void *args) ++{ ++ struct do_diropq_args *a = args; ++ *a->errp = do_diropq(a->dentry, a->bindex, a->flags); ++} ++ ++struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags) ++{ ++ struct dentry *diropq, *h_dentry; ++ ++ h_dentry = au_h_dptr(dentry, bindex); ++ if (!au_test_h_perm_sio(d_inode(h_dentry), MAY_EXEC | MAY_WRITE)) ++ diropq = do_diropq(dentry, bindex, flags); ++ else { ++ int wkq_err; ++ struct do_diropq_args args = { ++ .errp = &diropq, ++ .dentry = dentry, ++ .bindex = bindex, ++ .flags = flags ++ }; ++ ++ wkq_err = au_wkq_wait(call_do_diropq, &args); ++ if (unlikely(wkq_err)) ++ diropq = ERR_PTR(wkq_err); ++ } ++ ++ return diropq; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * lookup whiteout dentry. ++ * @h_parent: lower parent dentry which must exist and be locked ++ * @base_name: name of dentry which will be whiteouted ++ * returns dentry for whiteout. ++ */ ++struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, ++ struct au_branch *br) ++{ ++ int err; ++ struct qstr wh_name; ++ struct dentry *wh_dentry; ++ ++ err = au_wh_name_alloc(&wh_name, base_name); ++ wh_dentry = ERR_PTR(err); ++ if (!err) { ++ wh_dentry = vfsub_lkup_one(&wh_name, h_parent); ++ kfree(wh_name.name); ++ } ++ return wh_dentry; ++} ++ ++/* ++ * link/create a whiteout for @dentry on @bindex. ++ */ ++struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent) ++{ ++ struct dentry *wh_dentry; ++ struct super_block *sb; ++ int err; ++ ++ sb = dentry->d_sb; ++ wh_dentry = au_wh_lkup(h_parent, &dentry->d_name, au_sbr(sb, bindex)); ++ if (!IS_ERR(wh_dentry) && d_is_negative(wh_dentry)) { ++ err = link_or_create_wh(sb, bindex, wh_dentry); ++ if (!err) { ++ au_set_dbwh(dentry, bindex); ++ au_fhsm_wrote(sb, bindex, /*force*/0); ++ } else { ++ dput(wh_dentry); ++ wh_dentry = ERR_PTR(err); ++ } ++ } ++ ++ return wh_dentry; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* Delete all whiteouts in this directory on branch bindex. */ ++static int del_wh_children(struct dentry *h_dentry, struct au_nhash *whlist, ++ aufs_bindex_t bindex, struct au_branch *br) ++{ ++ int err; ++ unsigned long ul, n; ++ struct qstr wh_name; ++ char *p; ++ struct hlist_head *head; ++ struct au_vdir_wh *pos; ++ struct au_vdir_destr *str; ++ ++ err = -ENOMEM; ++ p = (void *)__get_free_page(GFP_NOFS); ++ wh_name.name = p; ++ if (unlikely(!wh_name.name)) ++ goto out; ++ ++ err = 0; ++ memcpy(p, AUFS_WH_PFX, AUFS_WH_PFX_LEN); ++ p += AUFS_WH_PFX_LEN; ++ n = whlist->nh_num; ++ head = whlist->nh_head; ++ for (ul = 0; !err && ul < n; ul++, head++) { ++ hlist_for_each_entry(pos, head, wh_hash) { ++ if (pos->wh_bindex != bindex) ++ continue; ++ ++ str = &pos->wh_str; ++ if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) { ++ memcpy(p, str->name, str->len); ++ wh_name.len = AUFS_WH_PFX_LEN + str->len; ++ err = unlink_wh_name(h_dentry, &wh_name, br); ++ if (!err) ++ continue; ++ break; ++ } ++ AuIOErr("whiteout name too long %.*s\n", ++ str->len, str->name); ++ err = -EIO; ++ break; ++ } ++ } ++ free_page((unsigned long)wh_name.name); ++ ++out: ++ return err; ++} ++ ++struct del_wh_children_args { ++ int *errp; ++ struct dentry *h_dentry; ++ struct au_nhash *whlist; ++ aufs_bindex_t bindex; ++ struct au_branch *br; ++}; ++ ++static void call_del_wh_children(void *args) ++{ ++ struct del_wh_children_args *a = args; ++ *a->errp = del_wh_children(a->h_dentry, a->whlist, a->bindex, a->br); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp) ++{ ++ struct au_whtmp_rmdir *whtmp; ++ int err; ++ unsigned int rdhash; ++ ++ SiMustAnyLock(sb); ++ ++ whtmp = kzalloc(sizeof(*whtmp), gfp); ++ if (unlikely(!whtmp)) { ++ whtmp = ERR_PTR(-ENOMEM); ++ goto out; ++ } ++ ++ /* no estimation for dir size */ ++ rdhash = au_sbi(sb)->si_rdhash; ++ if (!rdhash) ++ rdhash = AUFS_RDHASH_DEF; ++ err = au_nhash_alloc(&whtmp->whlist, rdhash, gfp); ++ if (unlikely(err)) { ++ kfree(whtmp); ++ whtmp = ERR_PTR(err); ++ } ++ ++out: ++ return whtmp; ++} ++ ++void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp) ++{ ++ if (whtmp->br) ++ au_br_put(whtmp->br); ++ dput(whtmp->wh_dentry); ++ iput(whtmp->dir); ++ au_nhash_wh_free(&whtmp->whlist); ++ kfree(whtmp); ++} ++ ++/* ++ * rmdir the whiteouted temporary named dir @h_dentry. ++ * @whlist: whiteouted children. ++ */ ++int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_nhash *whlist) ++{ ++ int err; ++ unsigned int h_nlink; ++ struct path h_tmp; ++ struct inode *wh_inode, *h_dir; ++ struct au_branch *br; ++ ++ h_dir = d_inode(wh_dentry->d_parent); /* dir inode is locked */ ++ IMustLock(h_dir); ++ ++ br = au_sbr(dir->i_sb, bindex); ++ wh_inode = d_inode(wh_dentry); ++ inode_lock_nested(wh_inode, AuLsc_I_CHILD); ++ ++ /* ++ * someone else might change some whiteouts while we were sleeping. ++ * it means this whlist may have an obsoleted entry. ++ */ ++ if (!au_test_h_perm_sio(wh_inode, MAY_EXEC | MAY_WRITE)) ++ err = del_wh_children(wh_dentry, whlist, bindex, br); ++ else { ++ int wkq_err; ++ struct del_wh_children_args args = { ++ .errp = &err, ++ .h_dentry = wh_dentry, ++ .whlist = whlist, ++ .bindex = bindex, ++ .br = br ++ }; ++ ++ wkq_err = au_wkq_wait(call_del_wh_children, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ } ++ inode_unlock(wh_inode); ++ ++ if (!err) { ++ h_tmp.dentry = wh_dentry; ++ h_tmp.mnt = au_br_mnt(br); ++ h_nlink = h_dir->i_nlink; ++ err = vfsub_rmdir(h_dir, &h_tmp); ++ /* some fs doesn't change the parent nlink in some cases */ ++ h_nlink -= h_dir->i_nlink; ++ } ++ ++ if (!err) { ++ if (au_ibtop(dir) == bindex) { ++ /* todo: dir->i_mutex is necessary */ ++ au_cpup_attr_timesizes(dir); ++ if (h_nlink) ++ vfsub_drop_nlink(dir); ++ } ++ return 0; /* success */ ++ } ++ ++ pr_warn("failed removing %pd(%d), ignored\n", wh_dentry, err); ++ return err; ++} ++ ++static void call_rmdir_whtmp(void *args) ++{ ++ int err; ++ aufs_bindex_t bindex; ++ struct au_whtmp_rmdir *a = args; ++ struct super_block *sb; ++ struct dentry *h_parent; ++ struct inode *h_dir; ++ struct au_hinode *hdir; ++ ++ /* rmdir by nfsd may cause deadlock with this i_mutex */ ++ /* inode_lock(a->dir); */ ++ err = -EROFS; ++ sb = a->dir->i_sb; ++ si_read_lock(sb, !AuLock_FLUSH); ++ if (!au_br_writable(a->br->br_perm)) ++ goto out; ++ bindex = au_br_index(sb, a->br->br_id); ++ if (unlikely(bindex < 0)) ++ goto out; ++ ++ err = -EIO; ++ ii_write_lock_parent(a->dir); ++ h_parent = dget_parent(a->wh_dentry); ++ h_dir = d_inode(h_parent); ++ hdir = au_hi(a->dir, bindex); ++ err = vfsub_mnt_want_write(au_br_mnt(a->br)); ++ if (unlikely(err)) ++ goto out_mnt; ++ au_hn_inode_lock_nested(hdir, AuLsc_I_PARENT); ++ err = au_h_verify(a->wh_dentry, au_opt_udba(sb), h_dir, h_parent, ++ a->br); ++ if (!err) ++ err = au_whtmp_rmdir(a->dir, bindex, a->wh_dentry, &a->whlist); ++ au_hn_inode_unlock(hdir); ++ vfsub_mnt_drop_write(au_br_mnt(a->br)); ++ ++out_mnt: ++ dput(h_parent); ++ ii_write_unlock(a->dir); ++out: ++ /* inode_unlock(a->dir); */ ++ au_whtmp_rmdir_free(a); ++ si_read_unlock(sb); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ if (unlikely(err)) ++ AuIOErr("err %d\n", err); ++} ++ ++void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_whtmp_rmdir *args) ++{ ++ int wkq_err; ++ struct super_block *sb; ++ ++ IMustLock(dir); ++ ++ /* all post-process will be done in do_rmdir_whtmp(). */ ++ sb = dir->i_sb; ++ args->dir = au_igrab(dir); ++ args->br = au_sbr(sb, bindex); ++ au_br_get(args->br); ++ args->wh_dentry = dget(wh_dentry); ++ wkq_err = au_wkq_nowait(call_rmdir_whtmp, args, sb, /*flags*/0); ++ if (unlikely(wkq_err)) { ++ pr_warn("rmdir error %pd (%d), ignored\n", wh_dentry, wkq_err); ++ au_whtmp_rmdir_free(args); ++ } ++} +diff -Naur null/fs/aufs/whout.h linux-4.15/fs/aufs/whout.h +--- /dev/null ++++ linux-4.15/fs/aufs/whout.h 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,85 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * whiteout for logical deletion and opaque directory ++ */ ++ ++#ifndef __AUFS_WHOUT_H__ ++#define __AUFS_WHOUT_H__ ++ ++#ifdef __KERNEL__ ++ ++#include "dir.h" ++ ++/* whout.c */ ++int au_wh_name_alloc(struct qstr *wh, const struct qstr *name); ++int au_wh_test(struct dentry *h_parent, struct qstr *wh_name, int try_sio); ++int au_diropq_test(struct dentry *h_dentry); ++struct au_branch; ++struct dentry *au_whtmp_lkup(struct dentry *h_parent, struct au_branch *br, ++ struct qstr *prefix); ++int au_whtmp_ren(struct dentry *h_dentry, struct au_branch *br); ++int au_wh_unlink_dentry(struct inode *h_dir, struct path *h_path, ++ struct dentry *dentry); ++int au_wh_init(struct au_branch *br, struct super_block *sb); ++ ++/* diropq flags */ ++#define AuDiropq_CREATE 1 ++#define au_ftest_diropq(flags, name) ((flags) & AuDiropq_##name) ++#define au_fset_diropq(flags, name) \ ++ do { (flags) |= AuDiropq_##name; } while (0) ++#define au_fclr_diropq(flags, name) \ ++ do { (flags) &= ~AuDiropq_##name; } while (0) ++ ++struct dentry *au_diropq_sio(struct dentry *dentry, aufs_bindex_t bindex, ++ unsigned int flags); ++struct dentry *au_wh_lkup(struct dentry *h_parent, struct qstr *base_name, ++ struct au_branch *br); ++struct dentry *au_wh_create(struct dentry *dentry, aufs_bindex_t bindex, ++ struct dentry *h_parent); ++ ++/* real rmdir for the whiteout-ed dir */ ++struct au_whtmp_rmdir { ++ struct inode *dir; ++ struct au_branch *br; ++ struct dentry *wh_dentry; ++ struct au_nhash whlist; ++}; ++ ++struct au_whtmp_rmdir *au_whtmp_rmdir_alloc(struct super_block *sb, gfp_t gfp); ++void au_whtmp_rmdir_free(struct au_whtmp_rmdir *whtmp); ++int au_whtmp_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_nhash *whlist); ++void au_whtmp_kick_rmdir(struct inode *dir, aufs_bindex_t bindex, ++ struct dentry *wh_dentry, struct au_whtmp_rmdir *args); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline struct dentry *au_diropq_create(struct dentry *dentry, ++ aufs_bindex_t bindex) ++{ ++ return au_diropq_sio(dentry, bindex, AuDiropq_CREATE); ++} ++ ++static inline int au_diropq_remove(struct dentry *dentry, aufs_bindex_t bindex) ++{ ++ return PTR_ERR(au_diropq_sio(dentry, bindex, !AuDiropq_CREATE)); ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_WHOUT_H__ */ +diff -Naur null/fs/aufs/wkq.c linux-4.15/fs/aufs/wkq.c +--- /dev/null ++++ linux-4.15/fs/aufs/wkq.c 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,390 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * workqueue for asynchronous/super-io operations ++ * todo: try new dredential scheme ++ */ ++ ++#include ++#include "aufs.h" ++ ++/* internal workqueue named AUFS_WKQ_NAME */ ++ ++static struct workqueue_struct *au_wkq; ++ ++struct au_wkinfo { ++ struct work_struct wk; ++ struct kobject *kobj; ++ ++ unsigned int flags; /* see wkq.h */ ++ ++ au_wkq_func_t func; ++ void *args; ++ ++#ifdef CONFIG_LOCKDEP ++ int dont_check; ++ struct held_lock **hlock; ++#endif ++ ++ struct completion *comp; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++/* ++ * Aufs passes some operations to the workqueue such as the internal copyup. ++ * This scheme looks rather unnatural for LOCKDEP debugging feature, since the ++ * job run by workqueue depends upon the locks acquired in the other task. ++ * Delegating a small operation to the workqueue, aufs passes its lockdep ++ * information too. And the job in the workqueue restores the info in order to ++ * pretend as if it acquired those locks. This is just to make LOCKDEP work ++ * correctly and expectedly. ++ */ ++ ++#ifndef CONFIG_LOCKDEP ++AuStubInt0(au_wkq_lockdep_alloc, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_free, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_pre, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_post, struct au_wkinfo *wkinfo); ++AuStubVoid(au_wkq_lockdep_init, struct au_wkinfo *wkinfo); ++#else ++static void au_wkq_lockdep_init(struct au_wkinfo *wkinfo) ++{ ++ wkinfo->hlock = NULL; ++ wkinfo->dont_check = 0; ++} ++ ++/* ++ * 1: matched ++ * 0: unmatched ++ */ ++static int au_wkq_lockdep_test(struct lock_class_key *key, const char *name) ++{ ++ static DEFINE_SPINLOCK(spin); ++ static struct { ++ char *name; ++ struct lock_class_key *key; ++ } a[] = { ++ { .name = "&sbinfo->si_rwsem" }, ++ { .name = "&finfo->fi_rwsem" }, ++ { .name = "&dinfo->di_rwsem" }, ++ { .name = "&iinfo->ii_rwsem" } ++ }; ++ static int set; ++ int i; ++ ++ /* lockless read from 'set.' see below */ ++ if (set == ARRAY_SIZE(a)) { ++ for (i = 0; i < ARRAY_SIZE(a); i++) ++ if (a[i].key == key) ++ goto match; ++ goto unmatch; ++ } ++ ++ spin_lock(&spin); ++ if (set) ++ for (i = 0; i < ARRAY_SIZE(a); i++) ++ if (a[i].key == key) { ++ spin_unlock(&spin); ++ goto match; ++ } ++ for (i = 0; i < ARRAY_SIZE(a); i++) { ++ if (a[i].key) { ++ if (unlikely(a[i].key == key)) { /* rare but possible */ ++ spin_unlock(&spin); ++ goto match; ++ } else ++ continue; ++ } ++ if (strstr(a[i].name, name)) { ++ /* ++ * the order of these three lines is important for the ++ * lockless read above. ++ */ ++ a[i].key = key; ++ spin_unlock(&spin); ++ set++; ++ /* AuDbg("%d, %s\n", set, name); */ ++ goto match; ++ } ++ } ++ spin_unlock(&spin); ++ goto unmatch; ++ ++match: ++ return 1; ++unmatch: ++ return 0; ++} ++ ++static int au_wkq_lockdep_alloc(struct au_wkinfo *wkinfo) ++{ ++ int err, n; ++ struct task_struct *curr; ++ struct held_lock **hl, *held_locks, *p; ++ ++ err = 0; ++ curr = current; ++ wkinfo->dont_check = lockdep_recursing(curr); ++ if (wkinfo->dont_check) ++ goto out; ++ n = curr->lockdep_depth; ++ if (!n) ++ goto out; ++ ++ err = -ENOMEM; ++ wkinfo->hlock = kmalloc_array(n + 1, sizeof(*wkinfo->hlock), GFP_NOFS); ++ if (unlikely(!wkinfo->hlock)) ++ goto out; ++ ++ err = 0; ++#if 0 ++ if (0 && au_debug_test()) /* left for debugging */ ++ lockdep_print_held_locks(curr); ++#endif ++ held_locks = curr->held_locks; ++ hl = wkinfo->hlock; ++ while (n--) { ++ p = held_locks++; ++ if (au_wkq_lockdep_test(p->instance->key, p->instance->name)) ++ *hl++ = p; ++ } ++ *hl = NULL; ++ ++out: ++ return err; ++} ++ ++static void au_wkq_lockdep_free(struct au_wkinfo *wkinfo) ++{ ++ kfree(wkinfo->hlock); ++} ++ ++static void au_wkq_lockdep_pre(struct au_wkinfo *wkinfo) ++{ ++ struct held_lock *p, **hl = wkinfo->hlock; ++ int subclass; ++ ++ if (wkinfo->dont_check) ++ lockdep_off(); ++ if (!hl) ++ return; ++ while ((p = *hl++)) { /* assignment */ ++ subclass = lockdep_hlock_class(p)->subclass; ++ /* AuDbg("%s, %d\n", p->instance->name, subclass); */ ++ if (p->read) ++ rwsem_acquire_read(p->instance, subclass, 0, ++ /*p->acquire_ip*/_RET_IP_); ++ else ++ rwsem_acquire(p->instance, subclass, 0, ++ /*p->acquire_ip*/_RET_IP_); ++ } ++} ++ ++static void au_wkq_lockdep_post(struct au_wkinfo *wkinfo) ++{ ++ struct held_lock *p, **hl = wkinfo->hlock; ++ ++ if (wkinfo->dont_check) ++ lockdep_on(); ++ if (!hl) ++ return; ++ while ((p = *hl++)) /* assignment */ ++ rwsem_release(p->instance, 0, /*p->acquire_ip*/_RET_IP_); ++} ++#endif ++ ++static void wkq_func(struct work_struct *wk) ++{ ++ struct au_wkinfo *wkinfo = container_of(wk, struct au_wkinfo, wk); ++ ++ AuDebugOn(!uid_eq(current_fsuid(), GLOBAL_ROOT_UID)); ++ AuDebugOn(rlimit(RLIMIT_FSIZE) != RLIM_INFINITY); ++ ++ au_wkq_lockdep_pre(wkinfo); ++ wkinfo->func(wkinfo->args); ++ au_wkq_lockdep_post(wkinfo); ++ if (au_ftest_wkq(wkinfo->flags, WAIT)) ++ complete(wkinfo->comp); ++ else { ++ kobject_put(wkinfo->kobj); ++ module_put(THIS_MODULE); /* todo: ?? */ ++ kfree(wkinfo); ++ } ++} ++ ++/* ++ * Since struct completion is large, try allocating it dynamically. ++ */ ++#if 1 /* defined(CONFIG_4KSTACKS) || defined(AuTest4KSTACKS) */ ++#define AuWkqCompDeclare(name) struct completion *comp = NULL ++ ++static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) ++{ ++ *comp = kmalloc(sizeof(**comp), GFP_NOFS); ++ if (*comp) { ++ init_completion(*comp); ++ wkinfo->comp = *comp; ++ return 0; ++ } ++ return -ENOMEM; ++} ++ ++static void au_wkq_comp_free(struct completion *comp) ++{ ++ kfree(comp); ++} ++ ++#else ++ ++/* no braces */ ++#define AuWkqCompDeclare(name) \ ++ DECLARE_COMPLETION_ONSTACK(_ ## name); \ ++ struct completion *comp = &_ ## name ++ ++static int au_wkq_comp_alloc(struct au_wkinfo *wkinfo, struct completion **comp) ++{ ++ wkinfo->comp = *comp; ++ return 0; ++} ++ ++static void au_wkq_comp_free(struct completion *comp __maybe_unused) ++{ ++ /* empty */ ++} ++#endif /* 4KSTACKS */ ++ ++static void au_wkq_run(struct au_wkinfo *wkinfo) ++{ ++ if (au_ftest_wkq(wkinfo->flags, NEST)) { ++ if (au_wkq_test()) { ++ AuWarn1("wkq from wkq, unless silly-rename on NFS," ++ " due to a dead dir by UDBA?\n"); ++ AuDebugOn(au_ftest_wkq(wkinfo->flags, WAIT)); ++ } ++ } else ++ au_dbg_verify_kthread(); ++ ++ if (au_ftest_wkq(wkinfo->flags, WAIT)) { ++ INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func); ++ queue_work(au_wkq, &wkinfo->wk); ++ } else { ++ INIT_WORK(&wkinfo->wk, wkq_func); ++ schedule_work(&wkinfo->wk); ++ } ++} ++ ++/* ++ * Be careful. It is easy to make deadlock happen. ++ * processA: lock, wkq and wait ++ * processB: wkq and wait, lock in wkq ++ * --> deadlock ++ */ ++int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args) ++{ ++ int err; ++ AuWkqCompDeclare(comp); ++ struct au_wkinfo wkinfo = { ++ .flags = flags, ++ .func = func, ++ .args = args ++ }; ++ ++ err = au_wkq_comp_alloc(&wkinfo, &comp); ++ if (unlikely(err)) ++ goto out; ++ err = au_wkq_lockdep_alloc(&wkinfo); ++ if (unlikely(err)) ++ goto out_comp; ++ if (!err) { ++ au_wkq_run(&wkinfo); ++ /* no timeout, no interrupt */ ++ wait_for_completion(wkinfo.comp); ++ } ++ au_wkq_lockdep_free(&wkinfo); ++ ++out_comp: ++ au_wkq_comp_free(comp); ++out: ++ destroy_work_on_stack(&wkinfo.wk); ++ return err; ++} ++ ++/* ++ * Note: dget/dput() in func for aufs dentries are not supported. It will be a ++ * problem in a concurrent umounting. ++ */ ++int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, ++ unsigned int flags) ++{ ++ int err; ++ struct au_wkinfo *wkinfo; ++ ++ atomic_inc(&au_sbi(sb)->si_nowait.nw_len); ++ ++ /* ++ * wkq_func() must free this wkinfo. ++ * it highly depends upon the implementation of workqueue. ++ */ ++ err = 0; ++ wkinfo = kmalloc(sizeof(*wkinfo), GFP_NOFS); ++ if (wkinfo) { ++ wkinfo->kobj = &au_sbi(sb)->si_kobj; ++ wkinfo->flags = flags & ~AuWkq_WAIT; ++ wkinfo->func = func; ++ wkinfo->args = args; ++ wkinfo->comp = NULL; ++ au_wkq_lockdep_init(wkinfo); ++ kobject_get(wkinfo->kobj); ++ __module_get(THIS_MODULE); /* todo: ?? */ ++ ++ au_wkq_run(wkinfo); ++ } else { ++ err = -ENOMEM; ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_nwt_init(struct au_nowait_tasks *nwt) ++{ ++ atomic_set(&nwt->nw_len, 0); ++ /* smp_mb(); */ /* atomic_set */ ++ init_waitqueue_head(&nwt->nw_wq); ++} ++ ++void au_wkq_fin(void) ++{ ++ destroy_workqueue(au_wkq); ++} ++ ++int __init au_wkq_init(void) ++{ ++ int err; ++ ++ err = 0; ++ au_wkq = alloc_workqueue(AUFS_WKQ_NAME, 0, WQ_DFL_ACTIVE); ++ if (IS_ERR(au_wkq)) ++ err = PTR_ERR(au_wkq); ++ else if (!au_wkq) ++ err = -ENOMEM; ++ ++ return err; ++} +diff -Naur null/fs/aufs/wkq.h linux-4.15/fs/aufs/wkq.h +--- /dev/null ++++ linux-4.15/fs/aufs/wkq.h 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,93 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * workqueue for asynchronous/super-io operations ++ * todo: try new credentials management scheme ++ */ ++ ++#ifndef __AUFS_WKQ_H__ ++#define __AUFS_WKQ_H__ ++ ++#ifdef __KERNEL__ ++ ++#include ++ ++struct super_block; ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * in the next operation, wait for the 'nowait' tasks in system-wide workqueue ++ */ ++struct au_nowait_tasks { ++ atomic_t nw_len; ++ wait_queue_head_t nw_wq; ++}; ++ ++/* ---------------------------------------------------------------------- */ ++ ++typedef void (*au_wkq_func_t)(void *args); ++ ++/* wkq flags */ ++#define AuWkq_WAIT 1 ++#define AuWkq_NEST (1 << 1) ++#define au_ftest_wkq(flags, name) ((flags) & AuWkq_##name) ++#define au_fset_wkq(flags, name) \ ++ do { (flags) |= AuWkq_##name; } while (0) ++#define au_fclr_wkq(flags, name) \ ++ do { (flags) &= ~AuWkq_##name; } while (0) ++ ++#ifndef CONFIG_AUFS_HNOTIFY ++#undef AuWkq_NEST ++#define AuWkq_NEST 0 ++#endif ++ ++/* wkq.c */ ++int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args); ++int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb, ++ unsigned int flags); ++void au_nwt_init(struct au_nowait_tasks *nwt); ++int __init au_wkq_init(void); ++void au_wkq_fin(void); ++ ++/* ---------------------------------------------------------------------- */ ++ ++static inline int au_wkq_test(void) ++{ ++ return current->flags & PF_WQ_WORKER; ++} ++ ++static inline int au_wkq_wait(au_wkq_func_t func, void *args) ++{ ++ return au_wkq_do_wait(AuWkq_WAIT, func, args); ++} ++ ++static inline void au_nwt_done(struct au_nowait_tasks *nwt) ++{ ++ if (atomic_dec_and_test(&nwt->nw_len)) ++ wake_up_all(&nwt->nw_wq); ++} ++ ++static inline int au_nwt_flush(struct au_nowait_tasks *nwt) ++{ ++ wait_event(nwt->nw_wq, !atomic_read(&nwt->nw_len)); ++ return 0; ++} ++ ++#endif /* __KERNEL__ */ ++#endif /* __AUFS_WKQ_H__ */ +diff -Naur null/fs/aufs/xattr.c linux-4.15/fs/aufs/xattr.c +--- /dev/null ++++ linux-4.15/fs/aufs/xattr.c 2018-02-25 02:38:09.206738328 +0100 +@@ -0,0 +1,355 @@ ++/* ++ * Copyright (C) 2014-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * handling xattr functions ++ */ ++ ++#include ++#include ++#include ++#include "aufs.h" ++ ++static int au_xattr_ignore(int err, char *name, unsigned int ignore_flags) ++{ ++ if (!ignore_flags) ++ goto out; ++ switch (err) { ++ case -ENOMEM: ++ case -EDQUOT: ++ goto out; ++ } ++ ++ if ((ignore_flags & AuBrAttr_ICEX) == AuBrAttr_ICEX) { ++ err = 0; ++ goto out; ++ } ++ ++#define cmp(brattr, prefix) do { \ ++ if (!strncmp(name, XATTR_##prefix##_PREFIX, \ ++ XATTR_##prefix##_PREFIX_LEN)) { \ ++ if (ignore_flags & AuBrAttr_ICEX_##brattr) \ ++ err = 0; \ ++ goto out; \ ++ } \ ++ } while (0) ++ ++ cmp(SEC, SECURITY); ++ cmp(SYS, SYSTEM); ++ cmp(TR, TRUSTED); ++ cmp(USR, USER); ++#undef cmp ++ ++ if (ignore_flags & AuBrAttr_ICEX_OTH) ++ err = 0; ++ ++out: ++ return err; ++} ++ ++static const int au_xattr_out_of_list = AuBrAttr_ICEX_OTH << 1; ++ ++static int au_do_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, ++ char *name, char **buf, unsigned int ignore_flags, ++ unsigned int verbose) ++{ ++ int err; ++ ssize_t ssz; ++ struct inode *h_idst; ++ ++ ssz = vfs_getxattr_alloc(h_src, name, buf, 0, GFP_NOFS); ++ err = ssz; ++ if (unlikely(err <= 0)) { ++ if (err == -ENODATA ++ || (err == -EOPNOTSUPP ++ && ((ignore_flags & au_xattr_out_of_list) ++ || (au_test_nfs_noacl(d_inode(h_src)) ++ && (!strcmp(name, XATTR_NAME_POSIX_ACL_ACCESS) ++ || !strcmp(name, ++ XATTR_NAME_POSIX_ACL_DEFAULT)))) ++ )) ++ err = 0; ++ if (err && (verbose || au_debug_test())) ++ pr_err("%s, err %d\n", name, err); ++ goto out; ++ } ++ ++ /* unlock it temporary */ ++ h_idst = d_inode(h_dst); ++ inode_unlock(h_idst); ++ err = vfsub_setxattr(h_dst, name, *buf, ssz, /*flags*/0); ++ inode_lock_nested(h_idst, AuLsc_I_CHILD2); ++ if (unlikely(err)) { ++ if (verbose || au_debug_test()) ++ pr_err("%s, err %d\n", name, err); ++ err = au_xattr_ignore(err, name, ignore_flags); ++ } ++ ++out: ++ return err; ++} ++ ++int au_cpup_xattr(struct dentry *h_dst, struct dentry *h_src, int ignore_flags, ++ unsigned int verbose) ++{ ++ int err, unlocked, acl_access, acl_default; ++ ssize_t ssz; ++ struct inode *h_isrc, *h_idst; ++ char *value, *p, *o, *e; ++ ++ /* try stopping to update the source inode while we are referencing */ ++ /* there should not be the parent-child relationship between them */ ++ h_isrc = d_inode(h_src); ++ h_idst = d_inode(h_dst); ++ inode_unlock(h_idst); ++ vfsub_inode_lock_shared_nested(h_isrc, AuLsc_I_CHILD); ++ inode_lock_nested(h_idst, AuLsc_I_CHILD2); ++ unlocked = 0; ++ ++ /* some filesystems don't list POSIX ACL, for example tmpfs */ ++ ssz = vfs_listxattr(h_src, NULL, 0); ++ err = ssz; ++ if (unlikely(err < 0)) { ++ AuTraceErr(err); ++ if (err == -ENODATA ++ || err == -EOPNOTSUPP) ++ err = 0; /* ignore */ ++ goto out; ++ } ++ ++ err = 0; ++ p = NULL; ++ o = NULL; ++ if (ssz) { ++ err = -ENOMEM; ++ p = kmalloc(ssz, GFP_NOFS); ++ o = p; ++ if (unlikely(!p)) ++ goto out; ++ err = vfs_listxattr(h_src, p, ssz); ++ } ++ inode_unlock_shared(h_isrc); ++ unlocked = 1; ++ AuDbg("err %d, ssz %zd\n", err, ssz); ++ if (unlikely(err < 0)) ++ goto out_free; ++ ++ err = 0; ++ e = p + ssz; ++ value = NULL; ++ acl_access = 0; ++ acl_default = 0; ++ while (!err && p < e) { ++ acl_access |= !strncmp(p, XATTR_NAME_POSIX_ACL_ACCESS, ++ sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1); ++ acl_default |= !strncmp(p, XATTR_NAME_POSIX_ACL_DEFAULT, ++ sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) ++ - 1); ++ err = au_do_cpup_xattr(h_dst, h_src, p, &value, ignore_flags, ++ verbose); ++ p += strlen(p) + 1; ++ } ++ AuTraceErr(err); ++ ignore_flags |= au_xattr_out_of_list; ++ if (!err && !acl_access) { ++ err = au_do_cpup_xattr(h_dst, h_src, ++ XATTR_NAME_POSIX_ACL_ACCESS, &value, ++ ignore_flags, verbose); ++ AuTraceErr(err); ++ } ++ if (!err && !acl_default) { ++ err = au_do_cpup_xattr(h_dst, h_src, ++ XATTR_NAME_POSIX_ACL_DEFAULT, &value, ++ ignore_flags, verbose); ++ AuTraceErr(err); ++ } ++ ++ kfree(value); ++ ++out_free: ++ kfree(o); ++out: ++ if (!unlocked) ++ inode_unlock_shared(h_isrc); ++ AuTraceErr(err); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_smack_reentering(struct super_block *sb) ++{ ++#if IS_ENABLED(CONFIG_SECURITY_SMACK) ++ /* ++ * as a part of lookup, smack_d_instantiate() is called, and it calls ++ * i_op->getxattr(). ouch. ++ */ ++ return si_pid_test(sb); ++#else ++ return 0; ++#endif ++} ++ ++enum { ++ AU_XATTR_LIST, ++ AU_XATTR_GET ++}; ++ ++struct au_lgxattr { ++ int type; ++ union { ++ struct { ++ char *list; ++ size_t size; ++ } list; ++ struct { ++ const char *name; ++ void *value; ++ size_t size; ++ } get; ++ } u; ++}; ++ ++static ssize_t au_lgxattr(struct dentry *dentry, struct au_lgxattr *arg) ++{ ++ ssize_t err; ++ int reenter; ++ struct path h_path; ++ struct super_block *sb; ++ ++ sb = dentry->d_sb; ++ reenter = au_smack_reentering(sb); ++ if (!reenter) { ++ err = si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLM); ++ if (unlikely(err)) ++ goto out; ++ } ++ err = au_h_path_getattr(dentry, /*force*/1, &h_path, reenter); ++ if (unlikely(err)) ++ goto out_si; ++ if (unlikely(!h_path.dentry)) ++ /* illegally overlapped or something */ ++ goto out_di; /* pretending success */ ++ ++ /* always topmost entry only */ ++ switch (arg->type) { ++ case AU_XATTR_LIST: ++ err = vfs_listxattr(h_path.dentry, ++ arg->u.list.list, arg->u.list.size); ++ break; ++ case AU_XATTR_GET: ++ AuDebugOn(d_is_negative(h_path.dentry)); ++ err = vfs_getxattr(h_path.dentry, ++ arg->u.get.name, arg->u.get.value, ++ arg->u.get.size); ++ break; ++ } ++ ++out_di: ++ if (!reenter) ++ di_read_unlock(dentry, AuLock_IR); ++out_si: ++ if (!reenter) ++ si_read_unlock(sb); ++out: ++ AuTraceErr(err); ++ return err; ++} ++ ++ssize_t aufs_listxattr(struct dentry *dentry, char *list, size_t size) ++{ ++ struct au_lgxattr arg = { ++ .type = AU_XATTR_LIST, ++ .u.list = { ++ .list = list, ++ .size = size ++ }, ++ }; ++ ++ return au_lgxattr(dentry, &arg); ++} ++ ++static ssize_t au_getxattr(struct dentry *dentry, ++ struct inode *inode __maybe_unused, ++ const char *name, void *value, size_t size) ++{ ++ struct au_lgxattr arg = { ++ .type = AU_XATTR_GET, ++ .u.get = { ++ .name = name, ++ .value = value, ++ .size = size ++ }, ++ }; ++ ++ return au_lgxattr(dentry, &arg); ++} ++ ++static int au_setxattr(struct dentry *dentry, struct inode *inode, ++ const char *name, const void *value, size_t size, ++ int flags) ++{ ++ struct au_sxattr arg = { ++ .type = AU_XATTR_SET, ++ .u.set = { ++ .name = name, ++ .value = value, ++ .size = size, ++ .flags = flags ++ }, ++ }; ++ ++ return au_sxattr(dentry, inode, &arg); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_xattr_get(const struct xattr_handler *handler, ++ struct dentry *dentry, struct inode *inode, ++ const char *name, void *buffer, size_t size) ++{ ++ return au_getxattr(dentry, inode, name, buffer, size); ++} ++ ++static int au_xattr_set(const struct xattr_handler *handler, ++ struct dentry *dentry, struct inode *inode, ++ const char *name, const void *value, size_t size, ++ int flags) ++{ ++ return au_setxattr(dentry, inode, name, value, size, flags); ++} ++ ++static const struct xattr_handler au_xattr_handler = { ++ .name = "", ++ .prefix = "", ++ .get = au_xattr_get, ++ .set = au_xattr_set ++}; ++ ++static const struct xattr_handler *au_xattr_handlers[] = { ++#ifdef CONFIG_FS_POSIX_ACL ++ &posix_acl_access_xattr_handler, ++ &posix_acl_default_xattr_handler, ++#endif ++ &au_xattr_handler, /* must be last */ ++ NULL ++}; ++ ++void au_xattr_init(struct super_block *sb) ++{ ++ sb->s_xattr = au_xattr_handlers; ++} +diff -Naur null/fs/aufs/xino.c linux-4.15/fs/aufs/xino.c +--- /dev/null ++++ linux-4.15/fs/aufs/xino.c 2018-02-25 02:38:09.207738436 +0100 +@@ -0,0 +1,1469 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++/* ++ * external inode number translation table and bitmap ++ */ ++ ++#include ++#include ++#include "aufs.h" ++ ++static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++ ++/* todo: unnecessary to support mmap_sem since kernel-space? */ ++ssize_t xino_fread(vfs_readf_t func, struct file *file, void *kbuf, size_t size, ++ loff_t *pos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ char __user *u; ++ } buf; ++ int i; ++ const int prevent_endless = 10; ++ ++ i = 0; ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ do { ++ err = func(file, buf.u, size, pos); ++ if (err == -EINTR ++ && !au_wkq_test() ++ && fatal_signal_pending(current)) { ++ set_fs(oldfs); ++ err = xino_fread_wkq(func, file, kbuf, size, pos); ++ BUG_ON(err == -EINTR); ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ } ++ } while (i++ < prevent_endless ++ && (err == -EAGAIN || err == -EINTR)); ++ set_fs(oldfs); ++ ++#if 0 /* reserved for future use */ ++ if (err > 0) ++ fsnotify_access(file->f_path.dentry); ++#endif ++ ++ return err; ++} ++ ++struct xino_fread_args { ++ ssize_t *errp; ++ vfs_readf_t func; ++ struct file *file; ++ void *buf; ++ size_t size; ++ loff_t *pos; ++}; ++ ++static void call_xino_fread(void *args) ++{ ++ struct xino_fread_args *a = args; ++ *a->errp = xino_fread(a->func, a->file, a->buf, a->size, a->pos); ++} ++ ++static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ int wkq_err; ++ struct xino_fread_args args = { ++ .errp = &err, ++ .func = func, ++ .file = file, ++ .buf = buf, ++ .size = size, ++ .pos = pos ++ }; ++ ++ wkq_err = au_wkq_wait(call_xino_fread, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos); ++ ++static ssize_t do_xino_fwrite(vfs_writef_t func, struct file *file, void *kbuf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ mm_segment_t oldfs; ++ union { ++ void *k; ++ const char __user *u; ++ } buf; ++ int i; ++ const int prevent_endless = 10; ++ ++ i = 0; ++ buf.k = kbuf; ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ do { ++ err = func(file, buf.u, size, pos); ++ if (err == -EINTR ++ && !au_wkq_test() ++ && fatal_signal_pending(current)) { ++ set_fs(oldfs); ++ err = xino_fwrite_wkq(func, file, kbuf, size, pos); ++ BUG_ON(err == -EINTR); ++ oldfs = get_fs(); ++ set_fs(KERNEL_DS); ++ } ++ } while (i++ < prevent_endless ++ && (err == -EAGAIN || err == -EINTR)); ++ set_fs(oldfs); ++ ++#if 0 /* reserved for future use */ ++ if (err > 0) ++ fsnotify_modify(file->f_path.dentry); ++#endif ++ ++ return err; ++} ++ ++struct do_xino_fwrite_args { ++ ssize_t *errp; ++ vfs_writef_t func; ++ struct file *file; ++ void *buf; ++ size_t size; ++ loff_t *pos; ++}; ++ ++static void call_do_xino_fwrite(void *args) ++{ ++ struct do_xino_fwrite_args *a = args; ++ *a->errp = do_xino_fwrite(a->func, a->file, a->buf, a->size, a->pos); ++} ++ ++static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ int wkq_err; ++ struct do_xino_fwrite_args args = { ++ .errp = &err, ++ .func = func, ++ .file = file, ++ .buf = buf, ++ .size = size, ++ .pos = pos ++ }; ++ ++ /* ++ * it breaks RLIMIT_FSIZE and normal user's limit, ++ * users should care about quota and real 'filesystem full.' ++ */ ++ wkq_err = au_wkq_wait(call_do_xino_fwrite, &args); ++ if (unlikely(wkq_err)) ++ err = wkq_err; ++ ++ return err; ++} ++ ++ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf, ++ size_t size, loff_t *pos) ++{ ++ ssize_t err; ++ ++ if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) { ++ lockdep_off(); ++ err = do_xino_fwrite(func, file, buf, size, pos); ++ lockdep_on(); ++ } else { ++ lockdep_off(); ++ err = xino_fwrite_wkq(func, file, buf, size, pos); ++ lockdep_on(); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create a new xinofile at the same place/path as @base_file. ++ */ ++struct file *au_xino_create2(struct file *base_file, struct file *copy_src) ++{ ++ struct file *file; ++ struct dentry *base, *parent; ++ struct inode *dir, *delegated; ++ struct qstr *name; ++ struct path path; ++ int err; ++ ++ base = base_file->f_path.dentry; ++ parent = base->d_parent; /* dir inode is locked */ ++ dir = d_inode(parent); ++ IMustLock(dir); ++ ++ file = ERR_PTR(-EINVAL); ++ name = &base->d_name; ++ path.dentry = vfsub_lookup_one_len(name->name, parent, name->len); ++ if (IS_ERR(path.dentry)) { ++ file = (void *)path.dentry; ++ pr_err("%pd lookup err %ld\n", ++ base, PTR_ERR(path.dentry)); ++ goto out; ++ } ++ ++ /* no need to mnt_want_write() since we call dentry_open() later */ ++ err = vfs_create(dir, path.dentry, S_IRUGO | S_IWUGO, NULL); ++ if (unlikely(err)) { ++ file = ERR_PTR(err); ++ pr_err("%pd create err %d\n", base, err); ++ goto out_dput; ++ } ++ ++ path.mnt = base_file->f_path.mnt; ++ file = vfsub_dentry_open(&path, ++ O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE ++ /* | __FMODE_NONOTIFY */); ++ if (IS_ERR(file)) { ++ pr_err("%pd open err %ld\n", base, PTR_ERR(file)); ++ goto out_dput; ++ } ++ ++ delegated = NULL; ++ err = vfsub_unlink(dir, &file->f_path, &delegated, /*force*/0); ++ if (unlikely(err == -EWOULDBLOCK)) { ++ pr_warn("cannot retry for NFSv4 delegation" ++ " for an internal unlink\n"); ++ iput(delegated); ++ } ++ if (unlikely(err)) { ++ pr_err("%pd unlink err %d\n", base, err); ++ goto out_fput; ++ } ++ ++ if (copy_src) { ++ /* no one can touch copy_src xino */ ++ err = au_copy_file(file, copy_src, vfsub_f_size_read(copy_src)); ++ if (unlikely(err)) { ++ pr_err("%pd copy err %d\n", base, err); ++ goto out_fput; ++ } ++ } ++ goto out_dput; /* success */ ++ ++out_fput: ++ fput(file); ++ file = ERR_PTR(err); ++out_dput: ++ dput(path.dentry); ++out: ++ return file; ++} ++ ++struct au_xino_lock_dir { ++ struct au_hinode *hdir; ++ struct dentry *parent; ++ struct inode *dir; ++}; ++ ++static void au_xino_lock_dir(struct super_block *sb, struct file *xino, ++ struct au_xino_lock_dir *ldir) ++{ ++ aufs_bindex_t brid, bindex; ++ ++ ldir->hdir = NULL; ++ bindex = -1; ++ brid = au_xino_brid(sb); ++ if (brid >= 0) ++ bindex = au_br_index(sb, brid); ++ if (bindex >= 0) { ++ ldir->hdir = au_hi(d_inode(sb->s_root), bindex); ++ au_hn_inode_lock_nested(ldir->hdir, AuLsc_I_PARENT); ++ } else { ++ ldir->parent = dget_parent(xino->f_path.dentry); ++ ldir->dir = d_inode(ldir->parent); ++ inode_lock_nested(ldir->dir, AuLsc_I_PARENT); ++ } ++} ++ ++static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir) ++{ ++ if (ldir->hdir) ++ au_hn_inode_unlock(ldir->hdir); ++ else { ++ inode_unlock(ldir->dir); ++ dput(ldir->parent); ++ } ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* trucate xino files asynchronously */ ++ ++int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex) ++{ ++ int err; ++ unsigned long jiffy; ++ blkcnt_t blocks; ++ aufs_bindex_t bi, bbot; ++ struct kstatfs *st; ++ struct au_branch *br; ++ struct file *new_xino, *file; ++ struct super_block *h_sb; ++ struct au_xino_lock_dir ldir; ++ ++ err = -ENOMEM; ++ st = kmalloc(sizeof(*st), GFP_NOFS); ++ if (unlikely(!st)) ++ goto out; ++ ++ err = -EINVAL; ++ bbot = au_sbbot(sb); ++ if (unlikely(bindex < 0 || bbot < bindex)) ++ goto out_st; ++ br = au_sbr(sb, bindex); ++ file = br->br_xino.xi_file; ++ if (!file) ++ goto out_st; ++ ++ err = vfs_statfs(&file->f_path, st); ++ if (unlikely(err)) ++ AuErr1("statfs err %d, ignored\n", err); ++ jiffy = jiffies; ++ blocks = file_inode(file)->i_blocks; ++ pr_info("begin truncating xino(b%d), ib%llu, %llu/%llu free blks\n", ++ bindex, (u64)blocks, st->f_bfree, st->f_blocks); ++ ++ au_xino_lock_dir(sb, file, &ldir); ++ /* mnt_want_write() is unnecessary here */ ++ new_xino = au_xino_create2(file, file); ++ au_xino_unlock_dir(&ldir); ++ err = PTR_ERR(new_xino); ++ if (IS_ERR(new_xino)) { ++ pr_err("err %d, ignored\n", err); ++ goto out_st; ++ } ++ err = 0; ++ fput(file); ++ br->br_xino.xi_file = new_xino; ++ ++ h_sb = au_br_sb(br); ++ for (bi = 0; bi <= bbot; bi++) { ++ if (unlikely(bi == bindex)) ++ continue; ++ br = au_sbr(sb, bi); ++ if (au_br_sb(br) != h_sb) ++ continue; ++ ++ fput(br->br_xino.xi_file); ++ br->br_xino.xi_file = new_xino; ++ get_file(new_xino); ++ } ++ ++ err = vfs_statfs(&new_xino->f_path, st); ++ if (!err) { ++ pr_info("end truncating xino(b%d), ib%llu, %llu/%llu free blks\n", ++ bindex, (u64)file_inode(new_xino)->i_blocks, ++ st->f_bfree, st->f_blocks); ++ if (file_inode(new_xino)->i_blocks < blocks) ++ au_sbi(sb)->si_xino_jiffy = jiffy; ++ } else ++ AuErr1("statfs err %d, ignored\n", err); ++ ++out_st: ++ kfree(st); ++out: ++ return err; ++} ++ ++struct xino_do_trunc_args { ++ struct super_block *sb; ++ struct au_branch *br; ++}; ++ ++static void xino_do_trunc(void *_args) ++{ ++ struct xino_do_trunc_args *args = _args; ++ struct super_block *sb; ++ struct au_branch *br; ++ struct inode *dir; ++ int err; ++ aufs_bindex_t bindex; ++ ++ err = 0; ++ sb = args->sb; ++ dir = d_inode(sb->s_root); ++ br = args->br; ++ ++ si_noflush_write_lock(sb); ++ ii_read_lock_parent(dir); ++ bindex = au_br_index(sb, br->br_id); ++ err = au_xino_trunc(sb, bindex); ++ ii_read_unlock(dir); ++ if (unlikely(err)) ++ pr_warn("err b%d, (%d)\n", bindex, err); ++ atomic_dec(&br->br_xino_running); ++ au_br_put(br); ++ si_write_unlock(sb); ++ au_nwt_done(&au_sbi(sb)->si_nowait); ++ kfree(args); ++} ++ ++static int xino_trunc_test(struct super_block *sb, struct au_branch *br) ++{ ++ int err; ++ struct kstatfs st; ++ struct au_sbinfo *sbinfo; ++ ++ /* todo: si_xino_expire and the ratio should be customizable */ ++ sbinfo = au_sbi(sb); ++ if (time_before(jiffies, ++ sbinfo->si_xino_jiffy + sbinfo->si_xino_expire)) ++ return 0; ++ ++ /* truncation border */ ++ err = vfs_statfs(&br->br_xino.xi_file->f_path, &st); ++ if (unlikely(err)) { ++ AuErr1("statfs err %d, ignored\n", err); ++ return 0; ++ } ++ if (div64_u64(st.f_bfree * 100, st.f_blocks) >= AUFS_XINO_DEF_TRUNC) ++ return 0; ++ ++ return 1; ++} ++ ++static void xino_try_trunc(struct super_block *sb, struct au_branch *br) ++{ ++ struct xino_do_trunc_args *args; ++ int wkq_err; ++ ++ if (!xino_trunc_test(sb, br)) ++ return; ++ ++ if (atomic_inc_return(&br->br_xino_running) > 1) ++ goto out; ++ ++ /* lock and kfree() will be called in trunc_xino() */ ++ args = kmalloc(sizeof(*args), GFP_NOFS); ++ if (unlikely(!args)) { ++ AuErr1("no memory\n"); ++ goto out; ++ } ++ ++ au_br_get(br); ++ args->sb = sb; ++ args->br = br; ++ wkq_err = au_wkq_nowait(xino_do_trunc, args, sb, /*flags*/0); ++ if (!wkq_err) ++ return; /* success */ ++ ++ pr_err("wkq %d\n", wkq_err); ++ au_br_put(br); ++ kfree(args); ++ ++out: ++ atomic_dec(&br->br_xino_running); ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static int au_xino_do_write(vfs_writef_t write, struct file *file, ++ ino_t h_ino, ino_t ino) ++{ ++ loff_t pos; ++ ssize_t sz; ++ ++ pos = h_ino; ++ if (unlikely(au_loff_max / sizeof(ino) - 1 < pos)) { ++ AuIOErr1("too large hi%lu\n", (unsigned long)h_ino); ++ return -EFBIG; ++ } ++ pos *= sizeof(ino); ++ sz = xino_fwrite(write, file, &ino, sizeof(ino), &pos); ++ if (sz == sizeof(ino)) ++ return 0; /* success */ ++ ++ AuIOErr("write failed (%zd)\n", sz); ++ return -EIO; ++} ++ ++/* ++ * write @ino to the xinofile for the specified branch{@sb, @bindex} ++ * at the position of @h_ino. ++ * even if @ino is zero, it is written to the xinofile and means no entry. ++ * if the size of the xino file on a specific filesystem exceeds the watermark, ++ * try truncating it. ++ */ ++int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t ino) ++{ ++ int err; ++ unsigned int mnt_flags; ++ struct au_branch *br; ++ ++ BUILD_BUG_ON(sizeof(long long) != sizeof(au_loff_max) ++ || ((loff_t)-1) > 0); ++ SiMustAnyLock(sb); ++ ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, XINO)) ++ return 0; ++ ++ br = au_sbr(sb, bindex); ++ err = au_xino_do_write(au_sbi(sb)->si_xwrite, br->br_xino.xi_file, ++ h_ino, ino); ++ if (!err) { ++ if (au_opt_test(mnt_flags, TRUNC_XINO) ++ && au_test_fs_trunc_xino(au_br_sb(br))) ++ xino_try_trunc(sb, br); ++ return 0; /* success */ ++ } ++ ++ AuIOErr("write failed (%d)\n", err); ++ return -EIO; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* aufs inode number bitmap */ ++ ++static const int page_bits = (int)PAGE_SIZE * BITS_PER_BYTE; ++static ino_t xib_calc_ino(unsigned long pindex, int bit) ++{ ++ ino_t ino; ++ ++ AuDebugOn(bit < 0 || page_bits <= bit); ++ ino = AUFS_FIRST_INO + pindex * page_bits + bit; ++ return ino; ++} ++ ++static void xib_calc_bit(ino_t ino, unsigned long *pindex, int *bit) ++{ ++ AuDebugOn(ino < AUFS_FIRST_INO); ++ ino -= AUFS_FIRST_INO; ++ *pindex = ino / page_bits; ++ *bit = ino % page_bits; ++} ++ ++static int xib_pindex(struct super_block *sb, unsigned long pindex) ++{ ++ int err; ++ loff_t pos; ++ ssize_t sz; ++ struct au_sbinfo *sbinfo; ++ struct file *xib; ++ unsigned long *p; ++ ++ sbinfo = au_sbi(sb); ++ MtxMustLock(&sbinfo->si_xib_mtx); ++ AuDebugOn(pindex > ULONG_MAX / PAGE_SIZE ++ || !au_opt_test(sbinfo->si_mntflags, XINO)); ++ ++ if (pindex == sbinfo->si_xib_last_pindex) ++ return 0; ++ ++ xib = sbinfo->si_xib; ++ p = sbinfo->si_xib_buf; ++ pos = sbinfo->si_xib_last_pindex; ++ pos *= PAGE_SIZE; ++ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); ++ if (unlikely(sz != PAGE_SIZE)) ++ goto out; ++ ++ pos = pindex; ++ pos *= PAGE_SIZE; ++ if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE) ++ sz = xino_fread(sbinfo->si_xread, xib, p, PAGE_SIZE, &pos); ++ else { ++ memset(p, 0, PAGE_SIZE); ++ sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos); ++ } ++ if (sz == PAGE_SIZE) { ++ sbinfo->si_xib_last_pindex = pindex; ++ return 0; /* success */ ++ } ++ ++out: ++ AuIOErr1("write failed (%zd)\n", sz); ++ err = sz; ++ if (sz >= 0) ++ err = -EIO; ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++static void au_xib_clear_bit(struct inode *inode) ++{ ++ int err, bit; ++ unsigned long pindex; ++ struct super_block *sb; ++ struct au_sbinfo *sbinfo; ++ ++ AuDebugOn(inode->i_nlink); ++ ++ sb = inode->i_sb; ++ xib_calc_bit(inode->i_ino, &pindex, &bit); ++ AuDebugOn(page_bits <= bit); ++ sbinfo = au_sbi(sb); ++ mutex_lock(&sbinfo->si_xib_mtx); ++ err = xib_pindex(sb, pindex); ++ if (!err) { ++ clear_bit(bit, sbinfo->si_xib_buf); ++ sbinfo->si_xib_next_bit = bit; ++ } ++ mutex_unlock(&sbinfo->si_xib_mtx); ++} ++ ++/* for s_op->delete_inode() */ ++void au_xino_delete_inode(struct inode *inode, const int unlinked) ++{ ++ int err; ++ unsigned int mnt_flags; ++ aufs_bindex_t bindex, bbot, bi; ++ unsigned char try_trunc; ++ struct au_iinfo *iinfo; ++ struct super_block *sb; ++ struct au_hinode *hi; ++ struct inode *h_inode; ++ struct au_branch *br; ++ vfs_writef_t xwrite; ++ ++ AuDebugOn(au_is_bad_inode(inode)); ++ ++ sb = inode->i_sb; ++ mnt_flags = au_mntflags(sb); ++ if (!au_opt_test(mnt_flags, XINO) ++ || inode->i_ino == AUFS_ROOT_INO) ++ return; ++ ++ if (unlinked) { ++ au_xigen_inc(inode); ++ au_xib_clear_bit(inode); ++ } ++ ++ iinfo = au_ii(inode); ++ bindex = iinfo->ii_btop; ++ if (bindex < 0) ++ return; ++ ++ xwrite = au_sbi(sb)->si_xwrite; ++ try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO); ++ hi = au_hinode(iinfo, bindex); ++ bbot = iinfo->ii_bbot; ++ for (; bindex <= bbot; bindex++, hi++) { ++ h_inode = hi->hi_inode; ++ if (!h_inode ++ || (!unlinked && h_inode->i_nlink)) ++ continue; ++ ++ /* inode may not be revalidated */ ++ bi = au_br_index(sb, hi->hi_id); ++ if (bi < 0) ++ continue; ++ ++ br = au_sbr(sb, bi); ++ err = au_xino_do_write(xwrite, br->br_xino.xi_file, ++ h_inode->i_ino, /*ino*/0); ++ if (!err && try_trunc ++ && au_test_fs_trunc_xino(au_br_sb(br))) ++ xino_try_trunc(sb, br); ++ } ++} ++ ++/* get an unused inode number from bitmap */ ++ino_t au_xino_new_ino(struct super_block *sb) ++{ ++ ino_t ino; ++ unsigned long *p, pindex, ul, pend; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ int free_bit, err; ++ ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ return iunique(sb, AUFS_FIRST_INO); ++ ++ sbinfo = au_sbi(sb); ++ mutex_lock(&sbinfo->si_xib_mtx); ++ p = sbinfo->si_xib_buf; ++ free_bit = sbinfo->si_xib_next_bit; ++ if (free_bit < page_bits && !test_bit(free_bit, p)) ++ goto out; /* success */ ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ ++ pindex = sbinfo->si_xib_last_pindex; ++ for (ul = pindex - 1; ul < ULONG_MAX; ul--) { ++ err = xib_pindex(sb, ul); ++ if (unlikely(err)) ++ goto out_err; ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ } ++ ++ file = sbinfo->si_xib; ++ pend = vfsub_f_size_read(file) / PAGE_SIZE; ++ for (ul = pindex + 1; ul <= pend; ul++) { ++ err = xib_pindex(sb, ul); ++ if (unlikely(err)) ++ goto out_err; ++ free_bit = find_first_zero_bit(p, page_bits); ++ if (free_bit < page_bits) ++ goto out; /* success */ ++ } ++ BUG(); ++ ++out: ++ set_bit(free_bit, p); ++ sbinfo->si_xib_next_bit = free_bit + 1; ++ pindex = sbinfo->si_xib_last_pindex; ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ ino = xib_calc_ino(pindex, free_bit); ++ AuDbg("i%lu\n", (unsigned long)ino); ++ return ino; ++out_err: ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ AuDbg("i0\n"); ++ return 0; ++} ++ ++/* ++ * read @ino from xinofile for the specified branch{@sb, @bindex} ++ * at the position of @h_ino. ++ * if @ino does not exist and @do_new is true, get new one. ++ */ ++int au_xino_read(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ ino_t *ino) ++{ ++ int err; ++ ssize_t sz; ++ loff_t pos; ++ struct file *file; ++ struct au_sbinfo *sbinfo; ++ ++ *ino = 0; ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ return 0; /* no xino */ ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ pos = h_ino; ++ if (unlikely(au_loff_max / sizeof(*ino) - 1 < pos)) { ++ AuIOErr1("too large hi%lu\n", (unsigned long)h_ino); ++ return -EFBIG; ++ } ++ pos *= sizeof(*ino); ++ ++ file = au_sbr(sb, bindex)->br_xino.xi_file; ++ if (vfsub_f_size_read(file) < pos + sizeof(*ino)) ++ return 0; /* no ino */ ++ ++ sz = xino_fread(sbinfo->si_xread, file, ino, sizeof(*ino), &pos); ++ if (sz == sizeof(*ino)) ++ return 0; /* success */ ++ ++ err = sz; ++ if (unlikely(sz >= 0)) { ++ err = -EIO; ++ AuIOErr("xino read error (%zd)\n", sz); ++ } ++ ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* create and set a new xino file */ ++ ++struct file *au_xino_create(struct super_block *sb, char *fname, int silent) ++{ ++ struct file *file; ++ struct dentry *h_parent, *d; ++ struct inode *h_dir, *inode; ++ int err; ++ ++ /* ++ * at mount-time, and the xino file is the default path, ++ * hnotify is disabled so we have no notify events to ignore. ++ * when a user specified the xino, we cannot get au_hdir to be ignored. ++ */ ++ file = vfsub_filp_open(fname, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE ++ /* | __FMODE_NONOTIFY */, ++ S_IRUGO | S_IWUGO); ++ if (IS_ERR(file)) { ++ if (!silent) ++ pr_err("open %s(%ld)\n", fname, PTR_ERR(file)); ++ return file; ++ } ++ ++ /* keep file count */ ++ err = 0; ++ inode = file_inode(file); ++ h_parent = dget_parent(file->f_path.dentry); ++ h_dir = d_inode(h_parent); ++ inode_lock_nested(h_dir, AuLsc_I_PARENT); ++ /* mnt_want_write() is unnecessary here */ ++ /* no delegation since it is just created */ ++ if (inode->i_nlink) ++ err = vfsub_unlink(h_dir, &file->f_path, /*delegated*/NULL, ++ /*force*/0); ++ inode_unlock(h_dir); ++ dput(h_parent); ++ if (unlikely(err)) { ++ if (!silent) ++ pr_err("unlink %s(%d)\n", fname, err); ++ goto out; ++ } ++ ++ err = -EINVAL; ++ d = file->f_path.dentry; ++ if (unlikely(sb == d->d_sb)) { ++ if (!silent) ++ pr_err("%s must be outside\n", fname); ++ goto out; ++ } ++ if (unlikely(au_test_fs_bad_xino(d->d_sb))) { ++ if (!silent) ++ pr_err("xino doesn't support %s(%s)\n", ++ fname, au_sbtype(d->d_sb)); ++ goto out; ++ } ++ return file; /* success */ ++ ++out: ++ fput(file); ++ file = ERR_PTR(err); ++ return file; ++} ++ ++/* ++ * find another branch who is on the same filesystem of the specified ++ * branch{@btgt}. search until @bbot. ++ */ ++static int is_sb_shared(struct super_block *sb, aufs_bindex_t btgt, ++ aufs_bindex_t bbot) ++{ ++ aufs_bindex_t bindex; ++ struct super_block *tgt_sb = au_sbr_sb(sb, btgt); ++ ++ for (bindex = 0; bindex < btgt; bindex++) ++ if (unlikely(tgt_sb == au_sbr_sb(sb, bindex))) ++ return bindex; ++ for (bindex++; bindex <= bbot; bindex++) ++ if (unlikely(tgt_sb == au_sbr_sb(sb, bindex))) ++ return bindex; ++ return -1; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * initialize the xinofile for the specified branch @br ++ * at the place/path where @base_file indicates. ++ * test whether another branch is on the same filesystem or not, ++ * if @do_test is true. ++ */ ++int au_xino_br(struct super_block *sb, struct au_branch *br, ino_t h_ino, ++ struct file *base_file, int do_test) ++{ ++ int err; ++ ino_t ino; ++ aufs_bindex_t bbot, bindex; ++ struct au_branch *shared_br, *b; ++ struct file *file; ++ struct super_block *tgt_sb; ++ ++ shared_br = NULL; ++ bbot = au_sbbot(sb); ++ if (do_test) { ++ tgt_sb = au_br_sb(br); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ b = au_sbr(sb, bindex); ++ if (tgt_sb == au_br_sb(b)) { ++ shared_br = b; ++ break; ++ } ++ } ++ } ++ ++ if (!shared_br || !shared_br->br_xino.xi_file) { ++ struct au_xino_lock_dir ldir; ++ ++ au_xino_lock_dir(sb, base_file, &ldir); ++ /* mnt_want_write() is unnecessary here */ ++ file = au_xino_create2(base_file, NULL); ++ au_xino_unlock_dir(&ldir); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ br->br_xino.xi_file = file; ++ } else { ++ br->br_xino.xi_file = shared_br->br_xino.xi_file; ++ get_file(br->br_xino.xi_file); ++ } ++ ++ ino = AUFS_ROOT_INO; ++ err = au_xino_do_write(au_sbi(sb)->si_xwrite, br->br_xino.xi_file, ++ h_ino, ino); ++ if (unlikely(err)) { ++ fput(br->br_xino.xi_file); ++ br->br_xino.xi_file = NULL; ++ } ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* trucate a xino bitmap file */ ++ ++/* todo: slow */ ++static int do_xib_restore(struct super_block *sb, struct file *file, void *page) ++{ ++ int err, bit; ++ ssize_t sz; ++ unsigned long pindex; ++ loff_t pos, pend; ++ struct au_sbinfo *sbinfo; ++ vfs_readf_t func; ++ ino_t *ino; ++ unsigned long *p; ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ MtxMustLock(&sbinfo->si_xib_mtx); ++ p = sbinfo->si_xib_buf; ++ func = sbinfo->si_xread; ++ pend = vfsub_f_size_read(file); ++ pos = 0; ++ while (pos < pend) { ++ sz = xino_fread(func, file, page, PAGE_SIZE, &pos); ++ err = sz; ++ if (unlikely(sz <= 0)) ++ goto out; ++ ++ err = 0; ++ for (ino = page; sz > 0; ino++, sz -= sizeof(ino)) { ++ if (unlikely(*ino < AUFS_FIRST_INO)) ++ continue; ++ ++ xib_calc_bit(*ino, &pindex, &bit); ++ AuDebugOn(page_bits <= bit); ++ err = xib_pindex(sb, pindex); ++ if (!err) ++ set_bit(bit, p); ++ else ++ goto out; ++ } ++ } ++ ++out: ++ return err; ++} ++ ++static int xib_restore(struct super_block *sb) ++{ ++ int err; ++ aufs_bindex_t bindex, bbot; ++ void *page; ++ ++ err = -ENOMEM; ++ page = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!page)) ++ goto out; ++ ++ err = 0; ++ bbot = au_sbbot(sb); ++ for (bindex = 0; !err && bindex <= bbot; bindex++) ++ if (!bindex || is_sb_shared(sb, bindex, bindex - 1) < 0) ++ err = do_xib_restore ++ (sb, au_sbr(sb, bindex)->br_xino.xi_file, page); ++ else ++ AuDbg("b%d\n", bindex); ++ free_page((unsigned long)page); ++ ++out: ++ return err; ++} ++ ++int au_xib_trunc(struct super_block *sb) ++{ ++ int err; ++ ssize_t sz; ++ loff_t pos; ++ struct au_xino_lock_dir ldir; ++ struct au_sbinfo *sbinfo; ++ unsigned long *p; ++ struct file *file; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ if (!au_opt_test(sbinfo->si_mntflags, XINO)) ++ goto out; ++ ++ file = sbinfo->si_xib; ++ if (vfsub_f_size_read(file) <= PAGE_SIZE) ++ goto out; ++ ++ au_xino_lock_dir(sb, file, &ldir); ++ /* mnt_want_write() is unnecessary here */ ++ file = au_xino_create2(sbinfo->si_xib, NULL); ++ au_xino_unlock_dir(&ldir); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = file; ++ ++ p = sbinfo->si_xib_buf; ++ memset(p, 0, PAGE_SIZE); ++ pos = 0; ++ sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xib, p, PAGE_SIZE, &pos); ++ if (unlikely(sz != PAGE_SIZE)) { ++ err = sz; ++ AuIOErr("err %d\n", err); ++ if (sz >= 0) ++ err = -EIO; ++ goto out; ++ } ++ ++ mutex_lock(&sbinfo->si_xib_mtx); ++ /* mnt_want_write() is unnecessary here */ ++ err = xib_restore(sb); ++ mutex_unlock(&sbinfo->si_xib_mtx); ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * xino mount option handlers ++ */ ++ ++/* xino bitmap */ ++static void xino_clear_xib(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ sbinfo->si_xread = NULL; ++ sbinfo->si_xwrite = NULL; ++ if (sbinfo->si_xib) ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = NULL; ++ if (sbinfo->si_xib_buf) ++ free_page((unsigned long)sbinfo->si_xib_buf); ++ sbinfo->si_xib_buf = NULL; ++} ++ ++static int au_xino_set_xib(struct super_block *sb, struct file *base) ++{ ++ int err; ++ loff_t pos; ++ struct au_sbinfo *sbinfo; ++ struct file *file; ++ ++ SiMustWriteLock(sb); ++ ++ sbinfo = au_sbi(sb); ++ file = au_xino_create2(base, sbinfo->si_xib); ++ err = PTR_ERR(file); ++ if (IS_ERR(file)) ++ goto out; ++ if (sbinfo->si_xib) ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = file; ++ sbinfo->si_xread = vfs_readf(file); ++ sbinfo->si_xwrite = vfs_writef(file); ++ ++ err = -ENOMEM; ++ if (!sbinfo->si_xib_buf) ++ sbinfo->si_xib_buf = (void *)get_zeroed_page(GFP_NOFS); ++ if (unlikely(!sbinfo->si_xib_buf)) ++ goto out_unset; ++ ++ sbinfo->si_xib_last_pindex = 0; ++ sbinfo->si_xib_next_bit = 0; ++ if (vfsub_f_size_read(file) < PAGE_SIZE) { ++ pos = 0; ++ err = xino_fwrite(sbinfo->si_xwrite, file, sbinfo->si_xib_buf, ++ PAGE_SIZE, &pos); ++ if (unlikely(err != PAGE_SIZE)) ++ goto out_free; ++ } ++ err = 0; ++ goto out; /* success */ ++ ++out_free: ++ if (sbinfo->si_xib_buf) ++ free_page((unsigned long)sbinfo->si_xib_buf); ++ sbinfo->si_xib_buf = NULL; ++ if (err >= 0) ++ err = -EIO; ++out_unset: ++ fput(sbinfo->si_xib); ++ sbinfo->si_xib = NULL; ++ sbinfo->si_xread = NULL; ++ sbinfo->si_xwrite = NULL; ++out: ++ return err; ++} ++ ++/* xino for each branch */ ++static void xino_clear_br(struct super_block *sb) ++{ ++ aufs_bindex_t bindex, bbot; ++ struct au_branch *br; ++ ++ bbot = au_sbbot(sb); ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (!br || !br->br_xino.xi_file) ++ continue; ++ ++ fput(br->br_xino.xi_file); ++ br->br_xino.xi_file = NULL; ++ } ++} ++ ++static int au_xino_set_br(struct super_block *sb, struct file *base) ++{ ++ int err; ++ ino_t ino; ++ aufs_bindex_t bindex, bbot, bshared; ++ struct { ++ struct file *old, *new; ++ } *fpair, *p; ++ struct au_branch *br; ++ struct inode *inode; ++ vfs_writef_t writef; ++ ++ SiMustWriteLock(sb); ++ ++ err = -ENOMEM; ++ bbot = au_sbbot(sb); ++ fpair = kcalloc(bbot + 1, sizeof(*fpair), GFP_NOFS); ++ if (unlikely(!fpair)) ++ goto out; ++ ++ inode = d_inode(sb->s_root); ++ ino = AUFS_ROOT_INO; ++ writef = au_sbi(sb)->si_xwrite; ++ for (bindex = 0, p = fpair; bindex <= bbot; bindex++, p++) { ++ bshared = is_sb_shared(sb, bindex, bindex - 1); ++ if (bshared >= 0) { ++ /* shared xino */ ++ *p = fpair[bshared]; ++ get_file(p->new); ++ } ++ ++ if (!p->new) { ++ /* new xino */ ++ br = au_sbr(sb, bindex); ++ p->old = br->br_xino.xi_file; ++ p->new = au_xino_create2(base, br->br_xino.xi_file); ++ err = PTR_ERR(p->new); ++ if (IS_ERR(p->new)) { ++ p->new = NULL; ++ goto out_pair; ++ } ++ } ++ ++ err = au_xino_do_write(writef, p->new, ++ au_h_iptr(inode, bindex)->i_ino, ino); ++ if (unlikely(err)) ++ goto out_pair; ++ } ++ ++ for (bindex = 0, p = fpair; bindex <= bbot; bindex++, p++) { ++ br = au_sbr(sb, bindex); ++ if (br->br_xino.xi_file) ++ fput(br->br_xino.xi_file); ++ get_file(p->new); ++ br->br_xino.xi_file = p->new; ++ } ++ ++out_pair: ++ for (bindex = 0, p = fpair; bindex <= bbot; bindex++, p++) ++ if (p->new) ++ fput(p->new); ++ else ++ break; ++ kfree(fpair); ++out: ++ return err; ++} ++ ++void au_xino_clr(struct super_block *sb) ++{ ++ struct au_sbinfo *sbinfo; ++ ++ au_xigen_clr(sb); ++ xino_clear_xib(sb); ++ xino_clear_br(sb); ++ sbinfo = au_sbi(sb); ++ /* lvalue, do not call au_mntflags() */ ++ au_opt_clr(sbinfo->si_mntflags, XINO); ++} ++ ++int au_xino_set(struct super_block *sb, struct au_opt_xino *xino, int remount) ++{ ++ int err, skip; ++ struct dentry *parent, *cur_parent; ++ struct qstr *dname, *cur_name; ++ struct file *cur_xino; ++ struct inode *dir; ++ struct au_sbinfo *sbinfo; ++ ++ SiMustWriteLock(sb); ++ ++ err = 0; ++ sbinfo = au_sbi(sb); ++ parent = dget_parent(xino->file->f_path.dentry); ++ if (remount) { ++ skip = 0; ++ dname = &xino->file->f_path.dentry->d_name; ++ cur_xino = sbinfo->si_xib; ++ if (cur_xino) { ++ cur_parent = dget_parent(cur_xino->f_path.dentry); ++ cur_name = &cur_xino->f_path.dentry->d_name; ++ skip = (cur_parent == parent ++ && au_qstreq(dname, cur_name)); ++ dput(cur_parent); ++ } ++ if (skip) ++ goto out; ++ } ++ ++ au_opt_set(sbinfo->si_mntflags, XINO); ++ dir = d_inode(parent); ++ inode_lock_nested(dir, AuLsc_I_PARENT); ++ /* mnt_want_write() is unnecessary here */ ++ err = au_xino_set_xib(sb, xino->file); ++ if (!err) ++ err = au_xigen_set(sb, xino->file); ++ if (!err) ++ err = au_xino_set_br(sb, xino->file); ++ inode_unlock(dir); ++ if (!err) ++ goto out; /* success */ ++ ++ /* reset all */ ++ AuIOErr("failed creating xino(%d).\n", err); ++ au_xigen_clr(sb); ++ xino_clear_xib(sb); ++ ++out: ++ dput(parent); ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * create a xinofile at the default place/path. ++ */ ++struct file *au_xino_def(struct super_block *sb) ++{ ++ struct file *file; ++ char *page, *p; ++ struct au_branch *br; ++ struct super_block *h_sb; ++ struct path path; ++ aufs_bindex_t bbot, bindex, bwr; ++ ++ br = NULL; ++ bbot = au_sbbot(sb); ++ bwr = -1; ++ for (bindex = 0; bindex <= bbot; bindex++) { ++ br = au_sbr(sb, bindex); ++ if (au_br_writable(br->br_perm) ++ && !au_test_fs_bad_xino(au_br_sb(br))) { ++ bwr = bindex; ++ break; ++ } ++ } ++ ++ if (bwr >= 0) { ++ file = ERR_PTR(-ENOMEM); ++ page = (void *)__get_free_page(GFP_NOFS); ++ if (unlikely(!page)) ++ goto out; ++ path.mnt = au_br_mnt(br); ++ path.dentry = au_h_dptr(sb->s_root, bwr); ++ p = d_path(&path, page, PATH_MAX - sizeof(AUFS_XINO_FNAME)); ++ file = (void *)p; ++ if (!IS_ERR(p)) { ++ strcat(p, "/" AUFS_XINO_FNAME); ++ AuDbg("%s\n", p); ++ file = au_xino_create(sb, p, /*silent*/0); ++ if (!IS_ERR(file)) ++ au_xino_brid_set(sb, br->br_id); ++ } ++ free_page((unsigned long)page); ++ } else { ++ file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0); ++ if (IS_ERR(file)) ++ goto out; ++ h_sb = file->f_path.dentry->d_sb; ++ if (unlikely(au_test_fs_bad_xino(h_sb))) { ++ pr_err("xino doesn't support %s(%s)\n", ++ AUFS_XINO_DEFPATH, au_sbtype(h_sb)); ++ fput(file); ++ file = ERR_PTR(-EINVAL); ++ } ++ if (!IS_ERR(file)) ++ au_xino_brid_set(sb, -1); ++ } ++ ++out: ++ return file; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++int au_xino_path(struct seq_file *seq, struct file *file) ++{ ++ int err; ++ ++ err = au_seq_path(seq, &file->f_path); ++ if (unlikely(err)) ++ goto out; ++ ++#define Deleted "\\040(deleted)" ++ seq->count -= sizeof(Deleted) - 1; ++ AuDebugOn(memcmp(seq->buf + seq->count, Deleted, ++ sizeof(Deleted) - 1)); ++#undef Deleted ++ ++out: ++ return err; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++void au_xinondir_leave(struct super_block *sb, aufs_bindex_t bindex, ++ ino_t h_ino, int idx) ++{ ++ struct au_xino_file *xino; ++ ++ AuDebugOn(!au_opt_test(au_mntflags(sb), XINO)); ++ xino = &au_sbr(sb, bindex)->br_xino; ++ AuDebugOn(idx < 0 || xino->xi_nondir.total <= idx); ++ ++ spin_lock(&xino->xi_nondir.spin); ++ AuDebugOn(xino->xi_nondir.array[idx] != h_ino); ++ xino->xi_nondir.array[idx] = 0; ++ spin_unlock(&xino->xi_nondir.spin); ++ wake_up_all(&xino->xi_nondir.wqh); ++} ++ ++static int au_xinondir_find(struct au_xino_file *xino, ino_t h_ino) ++{ ++ int found, total, i; ++ ++ found = -1; ++ total = xino->xi_nondir.total; ++ for (i = 0; i < total; i++) { ++ if (xino->xi_nondir.array[i] != h_ino) ++ continue; ++ found = i; ++ break; ++ } ++ ++ return found; ++} ++ ++static int au_xinondir_expand(struct au_xino_file *xino) ++{ ++ int err, sz; ++ ino_t *p; ++ ++ BUILD_BUG_ON(KMALLOC_MAX_SIZE > INT_MAX); ++ ++ err = -ENOMEM; ++ sz = xino->xi_nondir.total * sizeof(ino_t); ++ if (unlikely(sz > KMALLOC_MAX_SIZE / 2)) ++ goto out; ++ p = au_kzrealloc(xino->xi_nondir.array, sz, sz << 1, GFP_ATOMIC, ++ /*may_shrink*/0); ++ if (p) { ++ xino->xi_nondir.array = p; ++ xino->xi_nondir.total <<= 1; ++ AuDbg("xi_nondir.total %d\n", xino->xi_nondir.total); ++ err = 0; ++ } ++ ++out: ++ return err; ++} ++ ++int au_xinondir_enter(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino, ++ int *idx) ++{ ++ int err, found, empty; ++ struct au_xino_file *xino; ++ ++ err = 0; ++ *idx = -1; ++ if (!au_opt_test(au_mntflags(sb), XINO)) ++ goto out; /* no xino */ ++ ++ xino = &au_sbr(sb, bindex)->br_xino; ++ ++again: ++ spin_lock(&xino->xi_nondir.spin); ++ found = au_xinondir_find(xino, h_ino); ++ if (found == -1) { ++ empty = au_xinondir_find(xino, /*h_ino*/0); ++ if (empty == -1) { ++ empty = xino->xi_nondir.total; ++ err = au_xinondir_expand(xino); ++ if (unlikely(err)) ++ goto out_unlock; ++ } ++ xino->xi_nondir.array[empty] = h_ino; ++ *idx = empty; ++ } else { ++ spin_unlock(&xino->xi_nondir.spin); ++ wait_event(xino->xi_nondir.wqh, ++ xino->xi_nondir.array[found] != h_ino); ++ goto again; ++ } ++ ++out_unlock: ++ spin_unlock(&xino->xi_nondir.spin); ++out: ++ return err; ++} +diff -Naur null/include/uapi/linux/aufs_type.h linux-4.15/include/uapi/linux/aufs_type.h +--- /dev/null ++++ linux-4.15/include/uapi/linux/aufs_type.h 2018-02-25 02:38:09.207738436 +0100 +@@ -0,0 +1,447 @@ ++/* ++ * Copyright (C) 2005-2017 Junjiro R. Okajima ++ * ++ * This program, aufs is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program. If not, see . ++ */ ++ ++#ifndef __AUFS_TYPE_H__ ++#define __AUFS_TYPE_H__ ++ ++#define AUFS_NAME "aufs" ++ ++#ifdef __KERNEL__ ++/* ++ * define it before including all other headers. ++ * sched.h may use pr_* macros before defining "current", so define the ++ * no-current version first, and re-define later. ++ */ ++#define pr_fmt(fmt) AUFS_NAME " %s:%d: " fmt, __func__, __LINE__ ++#include ++#undef pr_fmt ++#define pr_fmt(fmt) \ ++ AUFS_NAME " %s:%d:%.*s[%d]: " fmt, __func__, __LINE__, \ ++ (int)sizeof(current->comm), current->comm, current->pid ++#else ++#include ++#include ++#endif /* __KERNEL__ */ ++ ++#include ++ ++#define AUFS_VERSION "4.15-20180219" ++ ++/* todo? move this to linux-2.6.19/include/magic.h */ ++#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's') ++ ++/* ---------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_AUFS_BRANCH_MAX_127 ++typedef int8_t aufs_bindex_t; ++#define AUFS_BRANCH_MAX 127 ++#else ++typedef int16_t aufs_bindex_t; ++#ifdef CONFIG_AUFS_BRANCH_MAX_511 ++#define AUFS_BRANCH_MAX 511 ++#elif defined(CONFIG_AUFS_BRANCH_MAX_1023) ++#define AUFS_BRANCH_MAX 1023 ++#elif defined(CONFIG_AUFS_BRANCH_MAX_32767) ++#define AUFS_BRANCH_MAX 32767 ++#endif ++#endif ++ ++#ifdef __KERNEL__ ++#ifndef AUFS_BRANCH_MAX ++#error unknown CONFIG_AUFS_BRANCH_MAX value ++#endif ++#endif /* __KERNEL__ */ ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AUFS_FSTYPE AUFS_NAME ++ ++#define AUFS_ROOT_INO 2 ++#define AUFS_FIRST_INO 11 ++ ++#define AUFS_WH_PFX ".wh." ++#define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1) ++#define AUFS_WH_TMP_LEN 4 ++/* a limit for rmdir/rename a dir and copyup */ ++#define AUFS_MAX_NAMELEN (NAME_MAX \ ++ - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\ ++ - 1 /* dot */\ ++ - AUFS_WH_TMP_LEN) /* hex */ ++#define AUFS_XINO_FNAME "." AUFS_NAME ".xino" ++#define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME ++#define AUFS_XINO_DEF_SEC 30 /* seconds */ ++#define AUFS_XINO_DEF_TRUNC 45 /* percentage */ ++#define AUFS_DIRWH_DEF 3 ++#define AUFS_RDCACHE_DEF 10 /* seconds */ ++#define AUFS_RDCACHE_MAX 3600 /* seconds */ ++#define AUFS_RDBLK_DEF 512 /* bytes */ ++#define AUFS_RDHASH_DEF 32 ++#define AUFS_WKQ_NAME AUFS_NAME "d" ++#define AUFS_MFS_DEF_SEC 30 /* seconds */ ++#define AUFS_MFS_MAX_SEC 3600 /* seconds */ ++#define AUFS_FHSM_CACHE_DEF_SEC 30 /* seconds */ ++#define AUFS_PLINK_WARN 50 /* number of plinks in a single bucket */ ++ ++/* pseudo-link maintenace under /proc */ ++#define AUFS_PLINK_MAINT_NAME "plink_maint" ++#define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME ++#define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME ++ ++/* dirren, renamed dir */ ++#define AUFS_DR_INFO_PFX AUFS_WH_PFX ".dr." ++#define AUFS_DR_BRHINO_NAME AUFS_WH_PFX "hino" ++/* whiteouted doubly */ ++#define AUFS_WH_DR_INFO_PFX AUFS_WH_PFX AUFS_DR_INFO_PFX ++#define AUFS_WH_DR_BRHINO AUFS_WH_PFX AUFS_DR_BRHINO_NAME ++ ++#define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */ ++#define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME ++ ++#define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME ++#define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk" ++#define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph" ++ ++/* doubly whiteouted */ ++#define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME ++#define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME ++#define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME ++ ++/* branch permissions and attributes */ ++#define AUFS_BRPERM_RW "rw" ++#define AUFS_BRPERM_RO "ro" ++#define AUFS_BRPERM_RR "rr" ++#define AUFS_BRATTR_COO_REG "coo_reg" ++#define AUFS_BRATTR_COO_ALL "coo_all" ++#define AUFS_BRATTR_FHSM "fhsm" ++#define AUFS_BRATTR_UNPIN "unpin" ++#define AUFS_BRATTR_ICEX "icex" ++#define AUFS_BRATTR_ICEX_SEC "icexsec" ++#define AUFS_BRATTR_ICEX_SYS "icexsys" ++#define AUFS_BRATTR_ICEX_TR "icextr" ++#define AUFS_BRATTR_ICEX_USR "icexusr" ++#define AUFS_BRATTR_ICEX_OTH "icexoth" ++#define AUFS_BRRATTR_WH "wh" ++#define AUFS_BRWATTR_NLWH "nolwh" ++#define AUFS_BRWATTR_MOO "moo" ++ ++#define AuBrPerm_RW 1 /* writable, hardlinkable wh */ ++#define AuBrPerm_RO (1 << 1) /* readonly */ ++#define AuBrPerm_RR (1 << 2) /* natively readonly */ ++#define AuBrPerm_Mask (AuBrPerm_RW | AuBrPerm_RO | AuBrPerm_RR) ++ ++#define AuBrAttr_COO_REG (1 << 3) /* copy-up on open */ ++#define AuBrAttr_COO_ALL (1 << 4) ++#define AuBrAttr_COO_Mask (AuBrAttr_COO_REG | AuBrAttr_COO_ALL) ++ ++#define AuBrAttr_FHSM (1 << 5) /* file-based hsm */ ++#define AuBrAttr_UNPIN (1 << 6) /* rename-able top dir of ++ branch. meaningless since ++ linux-3.18-rc1 */ ++ ++/* ignore error in copying XATTR */ ++#define AuBrAttr_ICEX_SEC (1 << 7) ++#define AuBrAttr_ICEX_SYS (1 << 8) ++#define AuBrAttr_ICEX_TR (1 << 9) ++#define AuBrAttr_ICEX_USR (1 << 10) ++#define AuBrAttr_ICEX_OTH (1 << 11) ++#define AuBrAttr_ICEX (AuBrAttr_ICEX_SEC \ ++ | AuBrAttr_ICEX_SYS \ ++ | AuBrAttr_ICEX_TR \ ++ | AuBrAttr_ICEX_USR \ ++ | AuBrAttr_ICEX_OTH) ++ ++#define AuBrRAttr_WH (1 << 12) /* whiteout-able */ ++#define AuBrRAttr_Mask AuBrRAttr_WH ++ ++#define AuBrWAttr_NoLinkWH (1 << 13) /* un-hardlinkable whiteouts */ ++#define AuBrWAttr_MOO (1 << 14) /* move-up on open */ ++#define AuBrWAttr_Mask (AuBrWAttr_NoLinkWH | AuBrWAttr_MOO) ++ ++#define AuBrAttr_CMOO_Mask (AuBrAttr_COO_Mask | AuBrWAttr_MOO) ++ ++/* #warning test userspace */ ++#ifdef __KERNEL__ ++#ifndef CONFIG_AUFS_FHSM ++#undef AuBrAttr_FHSM ++#define AuBrAttr_FHSM 0 ++#endif ++#ifndef CONFIG_AUFS_XATTR ++#undef AuBrAttr_ICEX ++#define AuBrAttr_ICEX 0 ++#undef AuBrAttr_ICEX_SEC ++#define AuBrAttr_ICEX_SEC 0 ++#undef AuBrAttr_ICEX_SYS ++#define AuBrAttr_ICEX_SYS 0 ++#undef AuBrAttr_ICEX_TR ++#define AuBrAttr_ICEX_TR 0 ++#undef AuBrAttr_ICEX_USR ++#define AuBrAttr_ICEX_USR 0 ++#undef AuBrAttr_ICEX_OTH ++#define AuBrAttr_ICEX_OTH 0 ++#endif ++#endif ++ ++/* the longest combination */ ++/* AUFS_BRATTR_ICEX and AUFS_BRATTR_ICEX_TR don't affect here */ ++#define AuBrPermStrSz sizeof(AUFS_BRPERM_RW \ ++ "+" AUFS_BRATTR_COO_REG \ ++ "+" AUFS_BRATTR_FHSM \ ++ "+" AUFS_BRATTR_UNPIN \ ++ "+" AUFS_BRATTR_ICEX_SEC \ ++ "+" AUFS_BRATTR_ICEX_SYS \ ++ "+" AUFS_BRATTR_ICEX_USR \ ++ "+" AUFS_BRATTR_ICEX_OTH \ ++ "+" AUFS_BRWATTR_NLWH) ++ ++typedef struct { ++ char a[AuBrPermStrSz]; ++} au_br_perm_str_t; ++ ++static inline int au_br_writable(int brperm) ++{ ++ return brperm & AuBrPerm_RW; ++} ++ ++static inline int au_br_whable(int brperm) ++{ ++ return brperm & (AuBrPerm_RW | AuBrRAttr_WH); ++} ++ ++static inline int au_br_wh_linkable(int brperm) ++{ ++ return !(brperm & AuBrWAttr_NoLinkWH); ++} ++ ++static inline int au_br_cmoo(int brperm) ++{ ++ return brperm & AuBrAttr_CMOO_Mask; ++} ++ ++static inline int au_br_fhsm(int brperm) ++{ ++ return brperm & AuBrAttr_FHSM; ++} ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ioctl */ ++enum { ++ /* readdir in userspace */ ++ AuCtl_RDU, ++ AuCtl_RDU_INO, ++ ++ AuCtl_WBR_FD, /* pathconf wrapper */ ++ AuCtl_IBUSY, /* busy inode */ ++ AuCtl_MVDOWN, /* move-down */ ++ AuCtl_BR, /* info about branches */ ++ AuCtl_FHSM_FD /* connection for fhsm */ ++}; ++ ++/* borrowed from linux/include/linux/kernel.h */ ++#ifndef ALIGN ++#define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) ++#define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) ++#endif ++ ++/* borrowed from linux/include/linux/compiler-gcc3.h */ ++#ifndef __aligned ++#define __aligned(x) __attribute__((aligned(x))) ++#endif ++ ++#ifdef __KERNEL__ ++#ifndef __packed ++#define __packed __attribute__((packed)) ++#endif ++#endif ++ ++struct au_rdu_cookie { ++ uint64_t h_pos; ++ int16_t bindex; ++ uint8_t flags; ++ uint8_t pad; ++ uint32_t generation; ++} __aligned(8); ++ ++struct au_rdu_ent { ++ uint64_t ino; ++ int16_t bindex; ++ uint8_t type; ++ uint8_t nlen; ++ uint8_t wh; ++ char name[0]; ++} __aligned(8); ++ ++static inline int au_rdu_len(int nlen) ++{ ++ /* include the terminating NULL */ ++ return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1, ++ sizeof(uint64_t)); ++} ++ ++union au_rdu_ent_ul { ++ struct au_rdu_ent __user *e; ++ uint64_t ul; ++}; ++ ++enum { ++ AufsCtlRduV_SZ, ++ AufsCtlRduV_End ++}; ++ ++struct aufs_rdu { ++ /* input */ ++ union { ++ uint64_t sz; /* AuCtl_RDU */ ++ uint64_t nent; /* AuCtl_RDU_INO */ ++ }; ++ union au_rdu_ent_ul ent; ++ uint16_t verify[AufsCtlRduV_End]; ++ ++ /* input/output */ ++ uint32_t blk; ++ ++ /* output */ ++ union au_rdu_ent_ul tail; ++ /* number of entries which were added in a single call */ ++ uint64_t rent; ++ uint8_t full; ++ uint8_t shwh; ++ ++ struct au_rdu_cookie cookie; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* dirren. the branch is identified by the filename who contains this */ ++struct au_drinfo { ++ uint64_t ino; ++ union { ++ uint8_t oldnamelen; ++ uint64_t _padding; ++ }; ++ uint8_t oldname[0]; ++} __aligned(8); ++ ++struct au_drinfo_fdata { ++ uint32_t magic; ++ struct au_drinfo drinfo; ++} __aligned(8); ++ ++#define AUFS_DRINFO_MAGIC_V1 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x01) ++/* future */ ++#define AUFS_DRINFO_MAGIC_V2 ('a' << 24 | 'd' << 16 | 'r' << 8 | 0x02) ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct aufs_wbr_fd { ++ uint32_t oflags; ++ int16_t brid; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++struct aufs_ibusy { ++ uint64_t ino, h_ino; ++ int16_t bindex; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* error code for move-down */ ++/* the actual message strings are implemented in aufs-util.git */ ++enum { ++ EAU_MVDOWN_OPAQUE = 1, ++ EAU_MVDOWN_WHITEOUT, ++ EAU_MVDOWN_UPPER, ++ EAU_MVDOWN_BOTTOM, ++ EAU_MVDOWN_NOUPPER, ++ EAU_MVDOWN_NOLOWERBR, ++ EAU_Last ++}; ++ ++/* flags for move-down */ ++#define AUFS_MVDOWN_DMSG 1 ++#define AUFS_MVDOWN_OWLOWER (1 << 1) /* overwrite lower */ ++#define AUFS_MVDOWN_KUPPER (1 << 2) /* keep upper */ ++#define AUFS_MVDOWN_ROLOWER (1 << 3) /* do even if lower is RO */ ++#define AUFS_MVDOWN_ROLOWER_R (1 << 4) /* did on lower RO */ ++#define AUFS_MVDOWN_ROUPPER (1 << 5) /* do even if upper is RO */ ++#define AUFS_MVDOWN_ROUPPER_R (1 << 6) /* did on upper RO */ ++#define AUFS_MVDOWN_BRID_UPPER (1 << 7) /* upper brid */ ++#define AUFS_MVDOWN_BRID_LOWER (1 << 8) /* lower brid */ ++#define AUFS_MVDOWN_FHSM_LOWER (1 << 9) /* find fhsm attr for lower */ ++#define AUFS_MVDOWN_STFS (1 << 10) /* req. stfs */ ++#define AUFS_MVDOWN_STFS_FAILED (1 << 11) /* output: stfs is unusable */ ++#define AUFS_MVDOWN_BOTTOM (1 << 12) /* output: no more lowers */ ++ ++/* index for move-down */ ++enum { ++ AUFS_MVDOWN_UPPER, ++ AUFS_MVDOWN_LOWER, ++ AUFS_MVDOWN_NARRAY ++}; ++ ++/* ++ * additional info of move-down ++ * number of free blocks and inodes. ++ * subset of struct kstatfs, but smaller and always 64bit. ++ */ ++struct aufs_stfs { ++ uint64_t f_blocks; ++ uint64_t f_bavail; ++ uint64_t f_files; ++ uint64_t f_ffree; ++}; ++ ++struct aufs_stbr { ++ int16_t brid; /* optional input */ ++ int16_t bindex; /* output */ ++ struct aufs_stfs stfs; /* output when AUFS_MVDOWN_STFS set */ ++} __aligned(8); ++ ++struct aufs_mvdown { ++ uint32_t flags; /* input/output */ ++ struct aufs_stbr stbr[AUFS_MVDOWN_NARRAY]; /* input/output */ ++ int8_t au_errno; /* output */ ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++union aufs_brinfo { ++ /* PATH_MAX may differ between kernel-space and user-space */ ++ char _spacer[4096]; ++ struct { ++ int16_t id; ++ int perm; ++ char path[0]; ++ }; ++} __aligned(8); ++ ++/* ---------------------------------------------------------------------- */ ++ ++#define AuCtlType 'A' ++#define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu) ++#define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu) ++#define AUFS_CTL_WBR_FD _IOW(AuCtlType, AuCtl_WBR_FD, \ ++ struct aufs_wbr_fd) ++#define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy) ++#define AUFS_CTL_MVDOWN _IOWR(AuCtlType, AuCtl_MVDOWN, \ ++ struct aufs_mvdown) ++#define AUFS_CTL_BRINFO _IOW(AuCtlType, AuCtl_BR, union aufs_brinfo) ++#define AUFS_CTL_FHSM_FD _IOW(AuCtlType, AuCtl_FHSM_FD, int) ++ ++#endif /* __AUFS_TYPE_H__ */ diff --git a/talimatname/genel/k/kernel/config b/talimatname/genel/k/kernel/config new file mode 100644 index 000000000..b838acbb2 --- /dev/null +++ b/talimatname/genel/k/kernel/config @@ -0,0 +1,8658 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86 4.15.4-1 Kernel Configuration +# +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_ZONE_DMA32=y +CONFIG_AUDIT_ARCH=y +CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_HAVE_INTEL_TXT=y +CONFIG_X86_64_SMP=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_CROSS_COMPILE="" +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="-milis" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +# CONFIG_KERNEL_XZ is not set +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +CONFIG_DEFAULT_HOSTNAME="milis" +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_USELIB is not set +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y +CONFIG_AUDIT_WATCH=y +CONFIG_AUDIT_TREE=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +# CONFIG_IRQ_DOMAIN_DEBUG is not set +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_DATA=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +CONFIG_BUILD_BIN2C=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=19 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=12 +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_NUMA_BALANCING=y +CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_MEMCG_SWAP_ENABLED=y +CONFIG_BLK_CGROUP=y +# CONFIG_DEBUG_BLK_CGROUP is not set +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_CGROUP_PIDS=y +# CONFIG_CGROUP_RDMA is not set +CONFIG_CGROUP_FREEZER=y +# CONFIG_CGROUP_HUGETLB is not set +CONFIG_CPUSETS=y +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_IPC_NS=y +# CONFIG_USER_NS is not set +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_SCHED_AUTOGROUP=y +# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_BPF=y +# CONFIG_EXPERT is not set +CONFIG_UID16=y +CONFIG_MULTIUSER=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_SYSFS_SYSCALL=y +# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_PCSPKR_PLATFORM=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +# CONFIG_CHECKPOINT_RESTORE is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y +CONFIG_KALLSYMS_BASE_RELATIVE=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_USERFAULTFD=y +# CONFIG_EMBEDDED is not set +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLUB_DEBUG=y +# CONFIG_SLUB_MEMCG_SYSFS_ON is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +CONFIG_SLAB_MERGE_DEFAULT=y +CONFIG_SLAB_FREELIST_RANDOM=y +CONFIG_SLAB_FREELIST_HARDENED=y +CONFIG_SLUB_CPU_PARTIAL=y +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y +CONFIG_OPROFILE=m +# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set +CONFIG_HAVE_OPROFILE=y +CONFIG_OPROFILE_NMI_TIMER=y +CONFIG_KPROBES=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +CONFIG_OPTPROBES=y +CONFIG_KPROBES_ON_FTRACE=y +# CONFIG_UPROBES is not set +# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_KRETPROBES=y +CONFIG_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_DMA_API_DEBUG=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_RCU_TABLE_FREE=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_GCC_PLUGINS=y +# CONFIG_GCC_PLUGINS is not set +CONFIG_HAVE_CC_STACKPROTECTOR=y +CONFIG_CC_STACKPROTECTOR=y +# CONFIG_CC_STACKPROTECTOR_NONE is not set +CONFIG_CC_STACKPROTECTOR_REGULAR=y +# CONFIG_CC_STACKPROTECTOR_STRONG is not set +CONFIG_THIN_ARCHIVES=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 +CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y +CONFIG_HAVE_COPY_THREAD_TLS=y +CONFIG_HAVE_STACK_VALIDATION=y +# CONFIG_HAVE_ARCH_HASH is not set +# CONFIG_ISA_BUS_API is not set +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +# CONFIG_CPU_NO_EFFICIENT_FFS is not set +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +# CONFIG_ARCH_OPTIONAL_KERNEL_RWX is not set +# CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_ARCH_HAS_REFCOUNT=y +# CONFIG_REFCOUNT_FULL is not set + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_COMPRESS=y +CONFIG_MODULE_COMPRESS_GZIP=y +# CONFIG_MODULE_COMPRESS_XZ is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_ZONED=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLK_DEV_THROTTLING_LOW=y +# CONFIG_BLK_CMDLINE_PARSER is not set +CONFIG_BLK_WBT=y +CONFIG_BLK_WBT_SQ=y +CONFIG_BLK_WBT_MQ=y +CONFIG_BLK_DEBUG_FS=y +CONFIG_BLK_SED_OPAL=y + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_AIX_PARTITION=y +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +# CONFIG_UNIXWARE_DISKLABEL is not set +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +# CONFIG_CMDLINE_PARTITION is not set +CONFIG_BLOCK_COMPAT=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_MQ_VIRTIO=y +CONFIG_BLK_MQ_RDMA=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_CFQ_GROUP_IOSCHED=y +# CONFIG_DEFAULT_DEADLINE is not set +CONFIG_DEFAULT_CFQ=y +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="cfq" +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_IOSCHED_BFQ=m +CONFIG_BFQ_GROUP_IOSCHED=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_FREEZER=y + +# +# Processor type and features +# +CONFIG_ZONE_DMA=y +CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y +CONFIG_X86_FAST_FEATURE_TESTS=y +CONFIG_X86_X2APIC=y +CONFIG_X86_MPPARSE=y +# CONFIG_GOLDFISH is not set +CONFIG_RETPOLINE=y +CONFIG_INTEL_RDT=y +# CONFIG_X86_EXTENDED_PLATFORM is not set +CONFIG_X86_INTEL_LPSS=y +CONFIG_X86_AMD_PLATFORM_DEVICE=y +CONFIG_IOSF_MBI=y +# CONFIG_IOSF_MBI_DEBUG is not set +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_PARAVIRT=y +# CONFIG_PARAVIRT_DEBUG is not set +# CONFIG_PARAVIRT_SPINLOCKS is not set +CONFIG_XEN=y +CONFIG_XEN_PV=y +CONFIG_XEN_PV_SMP=y +CONFIG_XEN_DOM0=y +CONFIG_XEN_PVHVM=y +CONFIG_XEN_PVHVM_SMP=y +CONFIG_XEN_512GB=y +CONFIG_XEN_SAVE_RESTORE=y +# CONFIG_XEN_DEBUG_FS is not set +# CONFIG_XEN_PVH is not set +CONFIG_KVM_GUEST=y +# CONFIG_KVM_DEBUG_FS is not set +CONFIG_PARAVIRT_TIME_ACCOUNTING=y +CONFIG_PARAVIRT_CLOCK=y +CONFIG_NO_BOOTMEM=y +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +# CONFIG_MCORE2 is not set +# CONFIG_MATOM is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_CPU_SUP_INTEL=y +CONFIG_CPU_SUP_AMD=y +CONFIG_CPU_SUP_CENTAUR=y +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_DMI=y +CONFIG_GART_IOMMU=y +CONFIG_CALGARY_IOMMU=y +CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y +CONFIG_SWIOTLB=y +CONFIG_IOMMU_HELPER=y +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS=128 +CONFIG_SCHED_SMT=y +CONFIG_SCHED_MC=y +CONFIG_SCHED_MC_PRIO=y +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_AMD=y +CONFIG_X86_MCE_THRESHOLD=y +# CONFIG_X86_MCE_INJECT is not set +CONFIG_X86_THERMAL_VECTOR=y + +# +# Performance monitoring +# +CONFIG_PERF_EVENTS_INTEL_UNCORE=y +CONFIG_PERF_EVENTS_INTEL_RAPL=m +CONFIG_PERF_EVENTS_INTEL_CSTATE=m +CONFIG_PERF_EVENTS_AMD_POWER=m +# CONFIG_VM86 is not set +CONFIG_X86_16BIT=y +CONFIG_X86_ESPFIX64=y +CONFIG_X86_VSYSCALL_EMULATION=y +CONFIG_I8K=m +CONFIG_MICROCODE=y +CONFIG_MICROCODE_INTEL=y +CONFIG_MICROCODE_AMD=y +CONFIG_MICROCODE_OLD_INTERFACE=y +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +# CONFIG_X86_5LEVEL is not set +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_X86_DIRECT_GBPAGES=y +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +# CONFIG_AMD_MEM_ENCRYPT is not set +CONFIG_NUMA=y +CONFIG_AMD_NUMA=y +CONFIG_X86_64_ACPI_NUMA=y +CONFIG_NODES_SPAN_OTHER_NODES=y +# CONFIG_NUMA_EMU is not set +CONFIG_NODES_SHIFT=6 +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_MEMORY_PROBE=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_NEED_MULTIPLE_NODES=y +CONFIG_HAVE_MEMORY_PRESENT=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_MEMBLOCK=y +CONFIG_HAVE_MEMBLOCK_NODE_MAP=y +CONFIG_HAVE_GENERIC_GUP=y +CONFIG_ARCH_DISCARD_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_HAVE_BOOTMEM_INFO_NODE=y +CONFIG_MEMORY_HOTPLUG=y +CONFIG_MEMORY_HOTPLUG_SPARSE=y +CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y +CONFIG_MEMORY_HOTREMOVE=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_MEMORY_BALLOON=y +CONFIG_BALLOON_COMPACTION=y +CONFIG_COMPACTION=y +CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +CONFIG_MMU_NOTIFIER=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +CONFIG_MEMORY_FAILURE=y +CONFIG_HWPOISON_INJECT=m +CONFIG_TRANSPARENT_HUGEPAGE=y +CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y +# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set +CONFIG_ARCH_WANTS_THP_SWAP=y +CONFIG_THP_SWAP=y +CONFIG_TRANSPARENT_HUGE_PAGECACHE=y +CONFIG_CLEANCACHE=y +CONFIG_FRONTSWAP=y +# CONFIG_CMA is not set +CONFIG_ZSWAP=y +CONFIG_ZPOOL=y +CONFIG_ZBUD=y +CONFIG_Z3FOLD=y +CONFIG_ZSMALLOC=y +# CONFIG_PGTABLE_MAPPING is not set +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_ZONE_DEVICE=y +CONFIG_ZONE_DEVICE=y +CONFIG_ARCH_HAS_HMM=y +CONFIG_MIGRATE_VMA_HELPER=y +CONFIG_HMM=y +CONFIG_HMM_MIRROR=y +CONFIG_DEVICE_PRIVATE=y +CONFIG_DEVICE_PUBLIC=y +CONFIG_FRAME_VECTOR=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_HAS_PKEYS=y +# CONFIG_PERCPU_STATS is not set +CONFIG_GUP_BENCHMARK=y +# CONFIG_X86_PMEM_LEGACY is not set +CONFIG_X86_CHECK_BIOS_CORRUPTION=y +CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y +CONFIG_X86_RESERVE_LOW=64 +CONFIG_MTRR=y +CONFIG_MTRR_SANITIZER=y +CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 +CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 +CONFIG_X86_PAT=y +CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_RANDOM=y +CONFIG_X86_SMAP=y +CONFIG_X86_INTEL_UMIP=y +CONFIG_X86_INTEL_MPX=y +CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y +CONFIG_EFI=y +CONFIG_EFI_STUB=y +CONFIG_EFI_MIXED=y +CONFIG_SECCOMP=y +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 +CONFIG_SCHED_HRTICK=y +CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y +# CONFIG_KEXEC_VERIFY_SIG is not set +CONFIG_CRASH_DUMP=y +CONFIG_KEXEC_JUMP=y +CONFIG_PHYSICAL_START=0x1000000 +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa +CONFIG_HOTPLUG_CPU=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +# CONFIG_COMPAT_VDSO is not set +# CONFIG_LEGACY_VSYSCALL_NATIVE is not set +CONFIG_LEGACY_VSYSCALL_EMULATE=y +# CONFIG_LEGACY_VSYSCALL_NONE is not set +# CONFIG_CMDLINE_BOOL is not set +CONFIG_MODIFY_LDT_SYSCALL=y +CONFIG_HAVE_LIVEPATCH=y +CONFIG_ARCH_HAS_ADD_PAGES=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +CONFIG_USE_PERCPU_NUMA_NODE_ID=y + +# +# Power management and ACPI options +# +CONFIG_ARCH_HIBERNATION_HEADER=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_HIBERNATE_CALLBACKS=y +CONFIG_HIBERNATION=y +CONFIG_PM_STD_PARTITION="" +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=100 +CONFIG_PM_WAKELOCKS_GC=y +CONFIG_PM=y +CONFIG_PM_DEBUG=y +CONFIG_PM_ADVANCED_DEBUG=y +# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_PM_SLEEP_DEBUG=y +CONFIG_PM_TRACE=y +CONFIG_PM_TRACE_RTC=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +CONFIG_ACPI_LPIT=y +CONFIG_ACPI_SLEEP=y +# CONFIG_ACPI_PROCFS_POWER is not set +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +CONFIG_ACPI_EC_DEBUGFS=m +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_VIDEO=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_CPU_FREQ_PSS=y +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_CPPC_LIB=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_IPMI=m +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_PROCESSOR_AGGREGATOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_NUMA=y +# CONFIG_ACPI_CUSTOM_DSDT is not set +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_PCI_SLOT=y +CONFIG_X86_PM_TIMER=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_MEMORY=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +CONFIG_ACPI_SBS=m +CONFIG_ACPI_HED=y +CONFIG_ACPI_CUSTOM_METHOD=m +CONFIG_ACPI_BGRT=y +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +CONFIG_ACPI_NFIT=m +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +CONFIG_ACPI_APEI=y +CONFIG_ACPI_APEI_GHES=y +CONFIG_ACPI_APEI_PCIEAER=y +CONFIG_ACPI_APEI_MEMORY_FAILURE=y +CONFIG_ACPI_APEI_EINJ=m +CONFIG_ACPI_APEI_ERST_DEBUG=m +CONFIG_DPTF_POWER=m +CONFIG_ACPI_EXTLOG=m +CONFIG_PMIC_OPREGION=y +# CONFIG_CRC_PMIC_OPREGION is not set +# CONFIG_XPOWER_PMIC_OPREGION is not set +# CONFIG_BXT_WC_PMIC_OPREGION is not set +CONFIG_CHT_DC_TI_PMIC_OPREGION=y +CONFIG_ACPI_CONFIGFS=m +CONFIG_TPS68470_PMIC_OPREGION=y +CONFIG_SFI=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m +# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set + +# +# CPU frequency scaling drivers +# +CONFIG_X86_INTEL_PSTATE=y +CONFIG_X86_PCC_CPUFREQ=m +CONFIG_X86_ACPI_CPUFREQ=m +CONFIG_X86_ACPI_CPUFREQ_CPB=y +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_AMD_FREQ_SENSITIVITY=m +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +CONFIG_X86_P4_CLOCKMOD=m + +# +# shared options +# +CONFIG_X86_SPEEDSTEP_LIB=m + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set +CONFIG_INTEL_IDLE=y + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_XEN=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_PCIEAER=y +# CONFIG_PCIE_ECRC is not set +# CONFIG_PCIEAER_INJECT is not set +CONFIG_PCIEASPM=y +# CONFIG_PCIEASPM_DEBUG is not set +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +CONFIG_PCIE_PME=y +CONFIG_PCIE_DPC=y +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_BUS_ADDR_T_64BIT=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +CONFIG_PCI_REALLOC_ENABLE_AUTO=y +CONFIG_PCI_STUB=m +CONFIG_XEN_PCIDEV_FRONTEND=m +CONFIG_PCI_ATS=y +CONFIG_PCI_LOCKLESS_CONFIG=y +CONFIG_PCI_IOV=y +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +CONFIG_PCI_LABEL=y +CONFIG_PCI_HYPERV=m +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_SHPC=m + +# +# DesignWare PCI Core Support +# +# CONFIG_PCIE_DW_PLAT is not set + +# +# PCI host controller drivers +# +CONFIG_VMD=m + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set + +# +# PCI switch controller drivers +# +CONFIG_PCI_SW_SWITCHTEC=m +CONFIG_ISA_DMA_API=y +CONFIG_AMD_NB=y +CONFIG_PCCARD=m +CONFIG_PCMCIA=m +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=m +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_PCCARD_NONSTATIC=y +CONFIG_RAPIDIO=m +CONFIG_RAPIDIO_TSI721=m +CONFIG_RAPIDIO_DISC_TIMEOUT=30 +# CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not set +CONFIG_RAPIDIO_DMA_ENGINE=y +CONFIG_RAPIDIO_DEBUG=y +CONFIG_RAPIDIO_ENUM_BASIC=m +CONFIG_RAPIDIO_CHMAN=m +CONFIG_RAPIDIO_MPORT_CDEV=m + +# +# RapidIO Switch drivers +# +CONFIG_RAPIDIO_TSI57X=m +CONFIG_RAPIDIO_CPS_XX=m +CONFIG_RAPIDIO_TSI568=m +CONFIG_RAPIDIO_CPS_GEN2=m +CONFIG_RAPIDIO_RXS_GEN3=m +# CONFIG_X86_SYSFB is not set + +# +# Executable file formats / Emulations +# +CONFIG_BINFMT_ELF=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_HAVE_AOUT is not set +CONFIG_BINFMT_MISC=y +CONFIG_COREDUMP=y +CONFIG_IA32_EMULATION=y +# CONFIG_IA32_AOUT is not set +# CONFIG_X86_X32 is not set +CONFIG_COMPAT_32=y +CONFIG_COMPAT=y +CONFIG_COMPAT_FOR_U64_ALIGNMENT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_X86_DEV_DMA_OPS=y +CONFIG_NET=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m +CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +# CONFIG_TLS is not set +CONFIG_XFRM=y +CONFIG_XFRM_OFFLOAD=y +CONFIG_XFRM_ALGO=m +CONFIG_XFRM_USER=m +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=m +CONFIG_NET_KEY=m +# CONFIG_NET_KEY_MIGRATE is not set +# CONFIG_SMC is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_FIB_TRIE_STATS=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_ROUTE_CLASSID=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IP_TUNNEL=m +CONFIG_NET_IPGRE=m +# CONFIG_NET_IPGRE_BROADCAST is not set +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m +CONFIG_NET_UDP_TUNNEL=m +CONFIG_NET_FOU=m +CONFIG_NET_FOU_IP_TUNNELS=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_ESP_OFFLOAD=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_INET_UDP_DIAG=m +CONFIG_INET_RAW_DIAG=m +CONFIG_INET_DIAG_DESTROY=y +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=m +CONFIG_TCP_CONG_CUBIC=y +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_NV=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_CONG_BBR=y +CONFIG_DEFAULT_CUBIC=y +# CONFIG_DEFAULT_BBR is not set +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +CONFIG_TCP_MD5SIG=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +# CONFIG_INET6_ESP_OFFLOAD is not set +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=m +CONFIG_IPV6_ILA=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m +CONFIG_IPV6_VTI=m +CONFIG_IPV6_SIT=m +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m +CONFIG_IPV6_FOU=m +CONFIG_IPV6_FOU_TUNNEL=m +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y +CONFIG_IPV6_PIMSM_V2=y +CONFIG_IPV6_SEG6_LWTUNNEL=y +CONFIG_IPV6_SEG6_HMAC=y +CONFIG_NETLABEL=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_ACCT=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_COMMON=m +CONFIG_NF_LOG_NETDEV=m +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_ZONES=y +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_LABELS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_GRE=m +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_BROADCAST=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_CT_NETLINK_HELPER=m +CONFIG_NETFILTER_NETLINK_GLUE_CT=y +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_NAT_PROTO_DCCP=y +CONFIG_NF_NAT_PROTO_UDPLITE=y +CONFIG_NF_NAT_PROTO_SCTP=y +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_REDIRECT=m +CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=m +CONFIG_NF_TABLES_NETDEV=m +CONFIG_NFT_EXTHDR=m +CONFIG_NFT_META=m +CONFIG_NFT_RT=m +# CONFIG_NFT_NUMGEN is not set +CONFIG_NFT_CT=m +# CONFIG_NFT_SET_RBTREE is not set +# CONFIG_NFT_SET_HASH is not set +# CONFIG_NFT_SET_BITMAP is not set +CONFIG_NFT_COUNTER=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_NAT=m +CONFIG_NFT_OBJREF=m +CONFIG_NFT_QUEUE=m +# CONFIG_NFT_QUOTA is not set +CONFIG_NFT_REJECT=m +CONFIG_NFT_REJECT_INET=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NF_DUP_NETDEV=m +CONFIG_NFT_DUP_NETDEV=m +CONFIG_NFT_FWD_NETDEV=m +CONFIG_NETFILTER_XTABLES=m + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m +CONFIG_NETFILTER_XT_SET=m + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_HL=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_MAX=256 +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_IPMAC=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_IPV6=y +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_AH_ESP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PE_SIP=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_NF_SOCKET_IPV4=m +CONFIG_NF_TABLES_IPV4=m +CONFIG_NFT_CHAIN_ROUTE_IPV4=m +CONFIG_NFT_REJECT_IPV4=m +CONFIG_NFT_DUP_IPV4=m +# CONFIG_NFT_FIB_IPV4 is not set +CONFIG_NF_TABLES_ARP=m +CONFIG_NF_DUP_IPV4=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_REJECT_IPV4=m +CONFIG_NF_NAT_IPV4=m +CONFIG_NFT_CHAIN_NAT_IPV4=m +CONFIG_NF_NAT_MASQUERADE_IPV4=m +CONFIG_NFT_MASQ_IPV4=m +CONFIG_NFT_REDIR_IPV4=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PROTO_GRE=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV6=m +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_NF_SOCKET_IPV6=m +CONFIG_NF_TABLES_IPV6=m +CONFIG_NFT_CHAIN_ROUTE_IPV6=m +CONFIG_NFT_REJECT_IPV6=m +CONFIG_NFT_DUP_IPV6=m +# CONFIG_NFT_FIB_IPV6 is not set +CONFIG_NF_DUP_IPV6=m +CONFIG_NF_REJECT_IPV6=m +CONFIG_NF_LOG_IPV6=m +CONFIG_NF_NAT_IPV6=m +CONFIG_NFT_CHAIN_NAT_IPV6=m +CONFIG_NF_NAT_MASQUERADE_IPV6=m +CONFIG_NFT_MASQ_IPV6=m +CONFIG_NFT_REDIR_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +CONFIG_IP6_NF_SECURITY=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_NFT_BRIDGE_REJECT=m +CONFIG_NF_LOG_BRIDGE=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m + +# +# DCCP CCIDs Configuration +# +# CONFIG_IP_DCCP_CCID2_DEBUG is not set +CONFIG_IP_DCCP_CCID3=y +# CONFIG_IP_DCCP_CCID3_DEBUG is not set +CONFIG_IP_DCCP_TFRC_LIB=y + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set +CONFIG_NET_DCCPPROBE=m +CONFIG_IP_SCTP=m +CONFIG_NET_SCTPPROBE=m +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set +CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set +CONFIG_SCTP_COOKIE_HMAC_MD5=y +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_INET_SCTP_DIAG=m +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_L2TP=m +# CONFIG_L2TP_DEBUGFS is not set +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m +CONFIG_STP=m +CONFIG_MRP=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_HAVE_NET_DSA=y +CONFIG_NET_DSA=m +CONFIG_NET_DSA_TAG_BRCM=y +CONFIG_NET_DSA_TAG_BRCM_PREPEND=y +CONFIG_NET_DSA_TAG_DSA=y +CONFIG_NET_DSA_TAG_EDSA=y +CONFIG_NET_DSA_TAG_LAN9303=y +CONFIG_NET_DSA_TAG_MTK=y +CONFIG_NET_DSA_TAG_TRAILER=y +CONFIG_NET_DSA_TAG_QCA=y +CONFIG_VLAN_8021Q=m +# CONFIG_VLAN_8021Q_GVRP is not set +CONFIG_VLAN_8021Q_MVRP=y +# CONFIG_DECNET is not set +CONFIG_LLC=m +CONFIG_LLC2=m +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +CONFIG_PHONET=m +CONFIG_6LOWPAN=m +# CONFIG_6LOWPAN_DEBUGFS is not set +CONFIG_6LOWPAN_NHC=m +CONFIG_6LOWPAN_NHC_DEST=m +CONFIG_6LOWPAN_NHC_FRAGMENT=m +CONFIG_6LOWPAN_NHC_HOP=m +CONFIG_6LOWPAN_NHC_IPV6=m +CONFIG_6LOWPAN_NHC_MOBILITY=m +CONFIG_6LOWPAN_NHC_ROUTING=m +CONFIG_6LOWPAN_NHC_UDP=m +CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m +CONFIG_6LOWPAN_GHC_UDP=m +CONFIG_6LOWPAN_GHC_ICMPV6=m +CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m +CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m +CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m +CONFIG_IEEE802154=m +# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set +CONFIG_IEEE802154_SOCKET=m +CONFIG_IEEE802154_6LOWPAN=m +CONFIG_MAC802154=m +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_MULTIQ=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFB=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_CBS=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_DRR=m +CONFIG_NET_SCH_MQPRIO=m +CONFIG_NET_SCH_CHOKE=m +CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_FQ_CODEL=m +CONFIG_NET_SCH_FQ=m +CONFIG_NET_SCH_HHF=m +CONFIG_NET_SCH_PIE=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_PLUG=m +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_CLS_U32_MARK is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_FLOW=m +CONFIG_NET_CLS_CGROUP=m +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_FLOWER=m +CONFIG_NET_CLS_MATCHALL=m +# CONFIG_NET_EMATCH is not set +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_SAMPLE=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_ACT_SKBEDIT=m +CONFIG_NET_ACT_CSUM=m +CONFIG_NET_ACT_VLAN=m +CONFIG_NET_ACT_BPF=m +CONFIG_NET_ACT_CONNMARK=m +# CONFIG_NET_ACT_SKBMOD is not set +CONFIG_NET_ACT_IFE=m +# CONFIG_NET_ACT_TUNNEL_KEY is not set +CONFIG_NET_IFE_SKBMARK=m +CONFIG_NET_IFE_SKBPRIO=m +# CONFIG_NET_IFE_SKBTCINDEX is not set +CONFIG_NET_CLS_IND=y +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +CONFIG_DNS_RESOLVER=m +CONFIG_BATMAN_ADV=m +# CONFIG_BATMAN_ADV_BATMAN_V is not set +CONFIG_BATMAN_ADV_BLA=y +CONFIG_BATMAN_ADV_DAT=y +CONFIG_BATMAN_ADV_NC=y +CONFIG_BATMAN_ADV_MCAST=y +CONFIG_BATMAN_ADV_DEBUGFS=y +# CONFIG_BATMAN_ADV_DEBUG is not set +CONFIG_OPENVSWITCH=m +CONFIG_OPENVSWITCH_GRE=m +CONFIG_OPENVSWITCH_VXLAN=m +CONFIG_OPENVSWITCH_GENEVE=m +CONFIG_VSOCKETS=m +CONFIG_VSOCKETS_DIAG=m +CONFIG_VMWARE_VMCI_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS_COMMON=m +CONFIG_HYPERV_VSOCKETS=m +CONFIG_NETLINK_DIAG=m +CONFIG_MPLS=y +CONFIG_NET_MPLS_GSO=m +CONFIG_MPLS_ROUTING=m +CONFIG_MPLS_IPTUNNEL=m +CONFIG_NET_NSH=m +CONFIG_HSR=m +CONFIG_NET_SWITCHDEV=y +CONFIG_NET_L3_MASTER_DEV=y +CONFIG_NET_NCSI=y +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_STREAM_PARSER=y +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NET_TCPPROBE=m +CONFIG_NET_DROP_MONITOR=m +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_YAM=m +CONFIG_CAN=m +CONFIG_CAN_RAW=m +CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m + +# +# CAN Device Drivers +# +CONFIG_CAN_VCAN=m +CONFIG_CAN_VXCAN=m +CONFIG_CAN_SLCAN=m +CONFIG_CAN_DEV=m +CONFIG_CAN_CALC_BITTIMING=y +CONFIG_CAN_LEDS=y +CONFIG_CAN_C_CAN=m +CONFIG_CAN_C_CAN_PLATFORM=m +CONFIG_CAN_C_CAN_PCI=m +CONFIG_CAN_CC770=m +# CONFIG_CAN_CC770_ISA is not set +CONFIG_CAN_CC770_PLATFORM=m +CONFIG_CAN_IFI_CANFD=m +CONFIG_CAN_M_CAN=m +CONFIG_CAN_PEAK_PCIEFD=m +CONFIG_CAN_SJA1000=m +# CONFIG_CAN_SJA1000_ISA is not set +CONFIG_CAN_SJA1000_PLATFORM=m +# CONFIG_CAN_EMS_PCMCIA is not set +CONFIG_CAN_EMS_PCI=m +# CONFIG_CAN_PEAK_PCMCIA is not set +CONFIG_CAN_PEAK_PCI=m +CONFIG_CAN_PEAK_PCIEC=y +CONFIG_CAN_KVASER_PCI=m +CONFIG_CAN_PLX_PCI=m +CONFIG_CAN_SOFTING=m +# CONFIG_CAN_SOFTING_CS is not set + +# +# CAN SPI interfaces +# +# CONFIG_CAN_HI311X is not set +# CONFIG_CAN_MCP251X is not set + +# +# CAN USB interfaces +# +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_ESD_USB2=m +CONFIG_CAN_GS_USB=m +CONFIG_CAN_KVASER_USB=m +CONFIG_CAN_PEAK_USB=m +CONFIG_CAN_8DEV_USB=m +CONFIG_CAN_MCBA_USB=m +# CONFIG_CAN_DEBUG_DEVICES is not set +CONFIG_BT=m +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m +CONFIG_BT_HS=y +CONFIG_BT_LE=y +CONFIG_BT_6LOWPAN=m +CONFIG_BT_LEDS=y +# CONFIG_BT_SELFTEST is not set +CONFIG_BT_DEBUGFS=y + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=m +CONFIG_BT_BCM=m +CONFIG_BT_RTL=m +CONFIG_BT_QCA=m +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB_BCM=y +CONFIG_BT_HCIBTUSB_RTL=y +CONFIG_BT_HCIBTSDIO=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_3WIRE=y +CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_QCA=y +CONFIG_BT_HCIUART_AG6XX=y +CONFIG_BT_HCIUART_MRVL=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_BT_ATH3K=m +CONFIG_BT_WILINK=m +CONFIG_AF_RXRPC=m +CONFIG_AF_RXRPC_IPV6=y +CONFIG_AF_RXRPC_INJECT_LOSS=y +# CONFIG_AF_RXRPC_DEBUG is not set +# CONFIG_RXKAD is not set +CONFIG_AF_KCM=m +CONFIG_STREAM_PARSER=y +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_SPY=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=m +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +# CONFIG_CFG80211_DEBUGFS is not set +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +CONFIG_CFG80211_WEXT_EXPORT=y +CONFIG_LIB80211=m +CONFIG_LIB80211_CRYPT_WEP=m +CONFIG_LIB80211_CRYPT_CCMP=m +CONFIG_LIB80211_CRYPT_TKIP=m +# CONFIG_LIB80211_DEBUG is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_MINSTREL_HT=y +# CONFIG_MAC80211_RC_MINSTREL_VHT is not set +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +CONFIG_MAC80211_MESH=y +CONFIG_MAC80211_LEDS=y +CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_WIMAX=m +CONFIG_WIMAX_DEBUG_LEVEL=8 +CONFIG_RFKILL=m +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +CONFIG_NET_9P=m +CONFIG_NET_9P_VIRTIO=m +CONFIG_NET_9P_XEN=m +# CONFIG_NET_9P_RDMA is not set +# CONFIG_NET_9P_DEBUG is not set +CONFIG_CAIF=m +# CONFIG_CAIF_DEBUG is not set +CONFIG_CAIF_NETDEV=m +CONFIG_CAIF_USB=m +CONFIG_CEPH_LIB=m +# CONFIG_CEPH_LIB_PRETTYDEBUG is not set +# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set +CONFIG_NFC=m +CONFIG_NFC_DIGITAL=m +CONFIG_NFC_NCI=m +# CONFIG_NFC_NCI_SPI is not set +# CONFIG_NFC_NCI_UART is not set +CONFIG_NFC_HCI=m +# CONFIG_NFC_SHDLC is not set + +# +# Near Field Communication (NFC) devices +# +CONFIG_NFC_TRF7970A=m +CONFIG_NFC_MEI_PHY=m +CONFIG_NFC_SIM=m +CONFIG_NFC_PORT100=m +CONFIG_NFC_FDP=m +CONFIG_NFC_FDP_I2C=m +CONFIG_NFC_PN544=m +CONFIG_NFC_PN544_MEI=m +CONFIG_NFC_PN533=m +CONFIG_NFC_PN533_USB=m +CONFIG_NFC_PN533_I2C=m +CONFIG_NFC_MICROREAD=m +CONFIG_NFC_MICROREAD_MEI=m +CONFIG_NFC_MRVL=m +CONFIG_NFC_MRVL_USB=m +CONFIG_NFC_MRVL_I2C=m +CONFIG_NFC_ST_NCI=m +CONFIG_NFC_ST_NCI_I2C=m +# CONFIG_NFC_ST_NCI_SPI is not set +# CONFIG_NFC_NXP_NCI is not set +# CONFIG_NFC_S3FWRN5_I2C is not set +CONFIG_NFC_ST95HF=m +CONFIG_PSAMPLE=m +CONFIG_NET_IFE=m +CONFIG_LWTUNNEL=y +CONFIG_LWTUNNEL_BPF=y +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_DEVLINK=m +CONFIG_MAY_USE_DEVLINK=m +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +# CONFIG_DEVTMPFS_MOUNT is not set +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="amd-ucode/microcode_amd.bin amd-ucode/microcode_amd_fam15h.bin amd-ucode/microcode_amd_fam16h.bin amd-ucode/microcode_amd_fam17h.bin intel-ucode/06-03-02 intel-ucode/06-06-05 intel-ucode/06-7a-01 intel-ucode/06-08-01 intel-ucode/06-0a-01 intel-ucode/06-0f-02 intel-ucode/06-16-01 intel-ucode/06-1c-02 intel-ucode/06-25-05 intel-ucode/06-3a-09 intel-ucode/06-3f-02 intel-ucode/0f-00-0a intel-ucode/0f-02-09 intel-ucode/0f-04-04 intel-ucode/0f-06-04 intel-ucode/06-05-00 intel-ucode/06-06-0a intel-ucode/06-08-03 intel-ucode/06-0b-01 intel-ucode/06-0f-06 intel-ucode/06-17-06 intel-ucode/06-1c-0a intel-ucode/06-26-01 intel-ucode/06-3c-03 intel-ucode/06-3f-04 intel-ucode/0f-01-02 intel-ucode/0f-03-02 intel-ucode/0f-04-07 intel-ucode/0f-06-05 intel-ucode/06-05-01 intel-ucode/06-06-0d intel-ucode/06-08-06 intel-ucode/06-0b-04 intel-ucode/06-0f-07 intel-ucode/06-17-07 intel-ucode/06-1d-01 intel-ucode/06-2a-07 intel-ucode/06-3d-04 intel-ucode/06-45-01 intel-ucode/0f-02-04 intel-ucode/0f-03-03 intel-ucode/0f-04-08 intel-ucode/0f-06-08 intel-ucode/06-8e-0a intel-ucode/06-8e-09 intel-ucode/06-9e-09 intel-ucode/06-05-02 intel-ucode/06-07-01 intel-ucode/06-08-0a intel-ucode/06-0d-06 intel-ucode/06-0f-0a intel-ucode/06-17-0a intel-ucode/06-2d-06 intel-ucode/06-3e-04 intel-ucode/06-46-01 intel-ucode/0f-02-05 intel-ucode/0f-03-04 intel-ucode/0f-04-09 intel-ucode/06-05-03 intel-ucode/06-07-02 intel-ucode/06-09-05 intel-ucode/06-9e-0a intel-ucode/06-9e-0b intel-ucode/06-0e-08 intel-ucode/06-0f-0b intel-ucode/06-1a-04 intel-ucode/06-1e-05 intel-ucode/06-2d-07 intel-ucode/06-3e-06 intel-ucode/06-47-01 intel-ucode/06-55-04 intel-ucode/06-56-02 intel-ucode/06-56-03 intel-ucode/06-56-04 intel-ucode/0f-02-06 intel-ucode/0f-04-01 intel-ucode/0f-04-0a intel-ucode/06-5c-09 intel-ucode/06-5e-03 intel-ucode/06-06-00 intel-ucode/06-07-03 intel-ucode/06-0a-00 intel-ucode/06-0e-0c intel-ucode/06-0f-0d intel-ucode/06-1a-05 intel-ucode/06-25-02 intel-ucode/06-2f-02 intel-ucode/06-3e-07 intel-ucode/0f-00-07 intel-ucode/0f-02-07 intel-ucode/0f-04-03 intel-ucode/0f-06-02" +CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware" +CONFIG_FW_LOADER_USER_HELPER=y +# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_SYS_HYPERVISOR=y +# CONFIG_GENERIC_CPU_DEVICES is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set + +# +# Bus devices +# +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y +CONFIG_MTD=m +CONFIG_MTD_TESTS=m +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +CONFIG_MTD_CMDLINE_PARTS=m +CONFIG_MTD_AR7_PARTS=m + +# +# Partition parsers +# + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m +CONFIG_RFD_FTL=m +CONFIG_SSFDC=m +# CONFIG_SM_FTL is not set +CONFIG_MTD_OOPS=m +CONFIG_MTD_SWAP=m +# CONFIG_MTD_PARTITIONED_MASTER is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_ESB2ROM is not set +# CONFIG_MTD_CK804XROM is not set +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set +# CONFIG_MTD_GPIO_ADDR is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +CONFIG_MTD_PLATRAM=m +# CONFIG_MTD_LATCH_ADDR is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_SST25L is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLOCK2MTD=m + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOCG3 is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR & LPDDR2 PCM memory drivers +# +CONFIG_MTD_LPDDR=m +CONFIG_MTD_QINFO_PROBE=m +# CONFIG_MTD_SPI_NOR is not set +CONFIG_MTD_UBI=m +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_LIMIT=20 +# CONFIG_MTD_UBI_FASTMAP is not set +# CONFIG_MTD_UBI_GLUEBI is not set +# CONFIG_MTD_UBI_BLOCK is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_GSC is not set +CONFIG_PARPORT_AX88796=m +CONFIG_PARPORT_1284=y +CONFIG_PARPORT_NOT_PC=y +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_BLK_DEV_FD=m +CONFIG_CDROM=m +# CONFIG_PARIDE is not set +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m +CONFIG_ZRAM=m +CONFIG_ZRAM_WRITEBACK=y +CONFIG_BLK_DEV_DAC960=m +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SKD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_VIRTIO_BLK=m +# CONFIG_VIRTIO_BLK_SCSI is not set +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_RSXX=m + +# +# NVME Support +# +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_FABRICS=m +CONFIG_NVME_RDMA=m +CONFIG_NVME_FC=m +CONFIG_NVME_TARGET=m +CONFIG_NVME_TARGET_LOOP=m +CONFIG_NVME_TARGET_RDMA=m +CONFIG_NVME_TARGET_FC=m +CONFIG_NVME_TARGET_FCLOOP=m + +# +# Misc devices +# +CONFIG_SENSORS_LIS3LV02D=m +CONFIG_AD525X_DPOT=m +CONFIG_AD525X_DPOT_I2C=m +# CONFIG_AD525X_DPOT_SPI is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_IBM_ASM is not set +CONFIG_PHANTOM=m +CONFIG_SGI_IOC4=m +CONFIG_TIFM_CORE=m +CONFIG_TIFM_7XX1=m +CONFIG_ICS932S401=m +CONFIG_ENCLOSURE_SERVICES=m +CONFIG_HP_ILO=m +CONFIG_APDS9802ALS=m +CONFIG_ISL29003=m +CONFIG_ISL29020=m +CONFIG_SENSORS_TSL2550=m +CONFIG_SENSORS_BH1770=m +CONFIG_SENSORS_APDS990X=m +CONFIG_HMC6352=m +CONFIG_DS1682=m +CONFIG_VMWARE_BALLOON=m +CONFIG_USB_SWITCH_FSA9480=m +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +CONFIG_PCI_ENDPOINT_TEST=m +CONFIG_C2PORT=m +CONFIG_C2PORT_DURAMAR_2150=m + +# +# EEPROM support +# +CONFIG_EEPROM_AT24=m +# CONFIG_EEPROM_AT25 is not set +CONFIG_EEPROM_LEGACY=m +CONFIG_EEPROM_MAX6875=m +CONFIG_EEPROM_93CX6=m +# CONFIG_EEPROM_93XX46 is not set +CONFIG_EEPROM_IDT_89HPESX=m +CONFIG_CB710_CORE=m +# CONFIG_CB710_DEBUG is not set +CONFIG_CB710_DEBUG_ASSUMPTIONS=y + +# +# Texas Instruments shared transport line discipline +# +CONFIG_TI_ST=m +CONFIG_SENSORS_LIS3_I2C=m +CONFIG_ALTERA_STAPL=m +CONFIG_INTEL_MEI=m +CONFIG_INTEL_MEI_ME=m +CONFIG_INTEL_MEI_TXE=m +CONFIG_VMWARE_VMCI=m + +# +# Intel MIC & related support +# + +# +# Intel MIC Bus Driver +# +CONFIG_INTEL_MIC_BUS=m + +# +# SCIF Bus Driver +# +CONFIG_SCIF_BUS=m + +# +# VOP Bus Driver +# +CONFIG_VOP_BUS=m + +# +# Intel MIC Host Driver +# +CONFIG_INTEL_MIC_HOST=m + +# +# Intel MIC Card Driver +# +CONFIG_INTEL_MIC_CARD=m + +# +# SCIF Driver +# +CONFIG_SCIF=m + +# +# Intel MIC Coprocessor State Management (COSM) Drivers +# +CONFIG_MIC_COSM=m + +# +# VOP Driver +# +CONFIG_VOP=m +CONFIG_VHOST_RING=m +CONFIG_GENWQE=m +CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0 +CONFIG_ECHO=m +# CONFIG_CXL_BASE is not set +# CONFIG_CXL_AFU_DRIVER_OPS is not set +# CONFIG_CXL_LIB is not set +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=m +CONFIG_RAID_ATTRS=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +# CONFIG_SCSI_MQ_DEFAULT is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m +CONFIG_SCSI_ENCLOSURE=m +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SRP_ATTRS=m +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m +CONFIG_SCSI_CXGB3_ISCSI=m +CONFIG_SCSI_CXGB4_ISCSI=m +CONFIG_SCSI_BNX2_ISCSI=m +CONFIG_SCSI_BNX2X_FCOE=m +CONFIG_BE2ISCSI=m +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_HPSA=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_3W_SAS=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_DEBUG_ENABLE is not set +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +CONFIG_SCSI_MVSAS=m +# CONFIG_SCSI_MVSAS_DEBUG is not set +CONFIG_SCSI_MVSAS_TASKLET=y +CONFIG_SCSI_MVUMI=m +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_ARCMSR=m +CONFIG_SCSI_ESAS2R=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT3SAS=m +CONFIG_SCSI_MPT2SAS_MAX_SGE=128 +CONFIG_SCSI_MPT3SAS_MAX_SGE=128 +CONFIG_SCSI_MPT2SAS=m +CONFIG_SCSI_SMARTPQI=m +CONFIG_SCSI_UFSHCD=m +CONFIG_SCSI_UFSHCD_PCI=m +CONFIG_SCSI_UFS_DWC_TC_PCI=m +CONFIG_SCSI_UFSHCD_PLATFORM=m +CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m +CONFIG_SCSI_HPTIOP=m +CONFIG_SCSI_BUSLOGIC=m +CONFIG_SCSI_FLASHPOINT=y +CONFIG_VMWARE_PVSCSI=m +# CONFIG_XEN_SCSI_FRONTEND is not set +CONFIG_HYPERV_STORAGE=m +CONFIG_LIBFC=m +CONFIG_LIBFCOE=m +CONFIG_FCOE=m +CONFIG_FCOE_FNIC=m +CONFIG_SCSI_SNIC=m +# CONFIG_SCSI_SNIC_DEBUG_FS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_ISCI=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INITIO=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_STEX=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +CONFIG_SCSI_SYM53C8XX_MMIO=y +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_TCM_QLA2XXX=m +# CONFIG_TCM_QLA2XXX_DEBUG is not set +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_QEDI=m +CONFIG_QEDF=m +CONFIG_SCSI_LPFC=m +# CONFIG_SCSI_LPFC_DEBUG_FS is not set +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_AM53C974=m +CONFIG_SCSI_WD719X=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_PMCRAID=m +CONFIG_SCSI_PM8001=m +CONFIG_SCSI_BFA_FC=m +CONFIG_SCSI_VIRTIO=m +CONFIG_SCSI_CHELSIO_FCOE=m +CONFIG_SCSI_LOWLEVEL_PCMCIA=y +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m +CONFIG_SCSI_DH=y +CONFIG_SCSI_DH_RDAC=m +CONFIG_SCSI_DH_HP_SW=m +CONFIG_SCSI_DH_EMC=m +CONFIG_SCSI_DH_ALUA=m +CONFIG_SCSI_OSD_INITIATOR=m +CONFIG_SCSI_OSD_ULD=m +CONFIG_SCSI_OSD_DPRINT_SENSE=0 +# CONFIG_SCSI_OSD_DEBUG is not set +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_ACPI=y +CONFIG_SATA_ZPODD=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=m +CONFIG_SATA_AHCI_PLATFORM=m +CONFIG_SATA_INIC162X=m +CONFIG_SATA_ACARD_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_SX4=m +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +CONFIG_ATA_PIIX=m +CONFIG_SATA_DWC=m +# CONFIG_SATA_DWC_OLD_DMA is not set +# CONFIG_SATA_DWC_DEBUG is not set +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_SVW=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m + +# +# PATA SFF controllers with BMDMA +# +CONFIG_PATA_ALI=m +CONFIG_PATA_AMD=m +CONFIG_PATA_ARTOP=m +CONFIG_PATA_ATIIXP=m +CONFIG_PATA_ATP867X=m +CONFIG_PATA_CMD64X=m +CONFIG_PATA_CYPRESS=m +CONFIG_PATA_EFAR=m +CONFIG_PATA_HPT366=m +CONFIG_PATA_HPT37X=m +CONFIG_PATA_HPT3X2N=m +CONFIG_PATA_HPT3X3=m +# CONFIG_PATA_HPT3X3_DMA is not set +CONFIG_PATA_IT8213=m +CONFIG_PATA_IT821X=m +CONFIG_PATA_JMICRON=m +CONFIG_PATA_MARVELL=m +CONFIG_PATA_NETCELL=m +CONFIG_PATA_NINJA32=m +CONFIG_PATA_NS87415=m +CONFIG_PATA_OLDPIIX=m +CONFIG_PATA_OPTIDMA=m +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_PDC_OLD=m +CONFIG_PATA_RADISYS=m +CONFIG_PATA_RDC=m +CONFIG_PATA_SCH=m +CONFIG_PATA_SERVERWORKS=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +CONFIG_PATA_TOSHIBA=m +CONFIG_PATA_TRIFLEX=m +CONFIG_PATA_VIA=m +CONFIG_PATA_WINBOND=m + +# +# PIO-only SFF controllers +# +CONFIG_PATA_CMD640_PCI=m +CONFIG_PATA_MPIIX=m +CONFIG_PATA_NS87410=m +CONFIG_PATA_OPTI=m +CONFIG_PATA_PCMCIA=m +CONFIG_PATA_RZ1000=m + +# +# Generic fallback / legacy drivers +# +CONFIG_PATA_ACPI=m +CONFIG_ATA_GENERIC=m +CONFIG_PATA_LEGACY=m +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +# CONFIG_MD_CLUSTER is not set +CONFIG_BCACHE=m +# CONFIG_BCACHE_DEBUG is not set +# CONFIG_BCACHE_CLOSURES_DEBUG is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_MQ_DEFAULT is not set +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m +CONFIG_DM_CACHE_SMQ=m +CONFIG_DM_ERA=m +CONFIG_DM_MIRROR=m +CONFIG_DM_LOG_USERSPACE=m +CONFIG_DM_RAID=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_QL=m +CONFIG_DM_MULTIPATH_ST=m +CONFIG_DM_DELAY=m +CONFIG_DM_UEVENT=y +CONFIG_DM_FLAKEY=m +CONFIG_DM_VERITY=m +CONFIG_DM_VERITY_FEC=y +CONFIG_DM_SWITCH=m +CONFIG_DM_LOG_WRITES=m +CONFIG_DM_INTEGRITY=m +# CONFIG_DM_ZONED is not set +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m +CONFIG_TCM_USER2=m +CONFIG_LOOPBACK_TARGET=m +CONFIG_TCM_FC=m +CONFIG_ISCSI_TARGET=m +CONFIG_ISCSI_TARGET_CXGB4=m +CONFIG_SBP_TARGET=m +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LOGGING is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_SBP2=m +CONFIG_FIREWIRE_NET=m +CONFIG_FIREWIRE_NOSY=m +CONFIG_MACINTOSH_DRIVERS=y +CONFIG_MAC_EMUMOUSEBTN=m +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +CONFIG_BONDING=m +CONFIG_DUMMY=m +CONFIG_EQUALIZER=m +# CONFIG_NET_FC is not set +CONFIG_IFB=m +CONFIG_NET_TEAM=m +CONFIG_NET_TEAM_MODE_BROADCAST=m +CONFIG_NET_TEAM_MODE_ROUNDROBIN=m +CONFIG_NET_TEAM_MODE_RANDOM=m +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m +CONFIG_NET_TEAM_MODE_LOADBALANCE=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN=m +CONFIG_IPVTAP=m +CONFIG_VXLAN=m +CONFIG_GENEVE=m +CONFIG_GTP=m +CONFIG_MACSEC=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_NETPOLL=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_RIONET=m +CONFIG_RIONET_TX_SIZE=128 +CONFIG_RIONET_RX_SIZE=128 +CONFIG_TUN=m +CONFIG_TAP=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=m +CONFIG_VIRTIO_NET=m +CONFIG_NLMON=m +CONFIG_NET_VRF=m +CONFIG_VSOCKMON=m +CONFIG_SUNGEM_PHY=m +# CONFIG_ARCNET is not set +CONFIG_ATM_DRIVERS=y +# CONFIG_ATM_DUMMY is not set +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E=m +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_ATM_SOLOS=m + +# +# CAIF transport drivers +# +CONFIG_CAIF_TTY=m +CONFIG_CAIF_SPI_SLAVE=m +CONFIG_CAIF_SPI_SYNC=y +CONFIG_CAIF_HSI=m +CONFIG_CAIF_VIRTIO=m + +# +# Distributed Switch Architecture drivers +# +CONFIG_B53=m +CONFIG_B53_SPI_DRIVER=m +CONFIG_B53_MDIO_DRIVER=m +CONFIG_B53_MMAP_DRIVER=m +CONFIG_B53_SRAB_DRIVER=m +CONFIG_NET_DSA_LOOP=m +CONFIG_NET_DSA_MT7530=m +CONFIG_NET_DSA_MV88E6060=m +# CONFIG_MICROCHIP_KSZ is not set +CONFIG_NET_DSA_MV88E6XXX=m +CONFIG_NET_DSA_MV88E6XXX_GLOBAL2=y +CONFIG_NET_DSA_QCA8K=m +CONFIG_NET_DSA_SMSC_LAN9303=m +CONFIG_NET_DSA_SMSC_LAN9303_I2C=m +CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m +CONFIG_ETHERNET=y +CONFIG_MDIO=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_3C589=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_NET_VENDOR_ADAPTEC=y +CONFIG_ADAPTEC_STARFIRE=m +CONFIG_NET_VENDOR_AGERE=y +CONFIG_ET131X=m +CONFIG_NET_VENDOR_ALACRITECH=y +CONFIG_SLICOSS=m +CONFIG_NET_VENDOR_ALTEON=y +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_ALTERA_TSE=m +CONFIG_NET_VENDOR_AMAZON=y +CONFIG_ENA_ETHERNET=m +CONFIG_NET_VENDOR_AMD=y +CONFIG_AMD8111_ETH=m +CONFIG_PCNET32=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_AMD_XGBE=m +CONFIG_AMD_XGBE_HAVE_ECC=y +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_AQTION=m +CONFIG_NET_VENDOR_ARC=y +CONFIG_NET_VENDOR_ATHEROS=y +CONFIG_ATL2=m +CONFIG_ATL1=m +CONFIG_ATL1E=m +CONFIG_ATL1C=m +CONFIG_ALX=m +CONFIG_NET_VENDOR_AURORA=y +CONFIG_AURORA_NB8800=m +CONFIG_NET_CADENCE=y +CONFIG_MACB=m +CONFIG_MACB_USE_HWSTAMP=y +CONFIG_MACB_PCI=m +CONFIG_NET_VENDOR_BROADCOM=y +CONFIG_B44=m +CONFIG_B44_PCI_AUTOSELECT=y +CONFIG_B44_PCICORE_AUTOSELECT=y +CONFIG_B44_PCI=y +CONFIG_BNX2=m +CONFIG_CNIC=m +CONFIG_TIGON3=m +CONFIG_TIGON3_HWMON=y +CONFIG_BNX2X=m +CONFIG_BNX2X_SRIOV=y +CONFIG_BNXT=m +CONFIG_BNXT_SRIOV=y +CONFIG_BNXT_FLOWER_OFFLOAD=y +CONFIG_NET_VENDOR_BROCADE=y +CONFIG_BNA=m +# CONFIG_NET_VENDOR_CAVIUM is not set +CONFIG_NET_VENDOR_CHELSIO=y +CONFIG_CHELSIO_T1=m +CONFIG_CHELSIO_T1_1G=y +CONFIG_CHELSIO_T3=m +CONFIG_CHELSIO_T4=m +CONFIG_CHELSIO_T4VF=m +CONFIG_CHELSIO_LIB=m +CONFIG_NET_VENDOR_CISCO=y +CONFIG_ENIC=m +CONFIG_CX_ECAT=m +CONFIG_DNET=m +CONFIG_NET_VENDOR_DEC=y +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_DE2104X_DSL=0 +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_NET_VENDOR_DLINK=y +CONFIG_DL2K=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_NET_VENDOR_EMULEX=y +CONFIG_BE2NET=m +CONFIG_BE2NET_HWMON=y +# CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_EXAR=y +CONFIG_S2IO=m +CONFIG_VXGE=m +# CONFIG_VXGE_DEBUG_TRACE_ALL is not set +CONFIG_NET_VENDOR_FUJITSU=y +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_NET_VENDOR_HP=y +CONFIG_HP100=m +CONFIG_NET_VENDOR_HUAWEI=y +CONFIG_HINIC=m +CONFIG_NET_VENDOR_INTEL=y +CONFIG_E100=m +CONFIG_E1000=m +CONFIG_E1000E=m +CONFIG_E1000E_HWTS=y +CONFIG_IGB=m +CONFIG_IGB_HWMON=y +CONFIG_IGB_DCA=y +CONFIG_IGBVF=m +CONFIG_IXGB=m +CONFIG_IXGBE=m +CONFIG_IXGBE_HWMON=y +CONFIG_IXGBE_DCA=y +CONFIG_IXGBEVF=m +CONFIG_I40E=m +CONFIG_I40EVF=m +CONFIG_FM10K=m +CONFIG_NET_VENDOR_I825XX=y +CONFIG_JME=m +CONFIG_NET_VENDOR_MARVELL=y +CONFIG_MVMDIO=m +CONFIG_SKGE=m +# CONFIG_SKGE_DEBUG is not set +CONFIG_SKGE_GENESIS=y +CONFIG_SKY2=m +# CONFIG_SKY2_DEBUG is not set +CONFIG_NET_VENDOR_MELLANOX=y +CONFIG_MLX4_EN=m +CONFIG_MLX4_CORE=m +CONFIG_MLX4_DEBUG=y +CONFIG_MLX4_CORE_GEN2=y +CONFIG_MLX5_CORE=m +# CONFIG_MLX5_FPGA is not set +CONFIG_MLX5_CORE_EN=y +CONFIG_MLX5_MPFS=y +CONFIG_MLX5_ESWITCH=y +# CONFIG_MLX5_CORE_IPOIB is not set +CONFIG_MLXSW_CORE=m +CONFIG_MLXSW_CORE_HWMON=y +CONFIG_MLXSW_CORE_THERMAL=y +CONFIG_MLXSW_PCI=m +CONFIG_MLXSW_I2C=m +CONFIG_MLXSW_SWITCHIB=m +CONFIG_MLXSW_SWITCHX2=m +CONFIG_MLXSW_SPECTRUM=m +CONFIG_MLXSW_MINIMAL=m +CONFIG_MLXFW=m +CONFIG_NET_VENDOR_MICREL=y +CONFIG_KS8842=m +CONFIG_KS8851=m +CONFIG_KS8851_MLL=m +CONFIG_KSZ884X_PCI=m +CONFIG_NET_VENDOR_MICROCHIP=y +CONFIG_ENC28J60=m +# CONFIG_ENC28J60_WRITEVERIFY is not set +CONFIG_ENCX24J600=m +CONFIG_NET_VENDOR_MYRI=y +CONFIG_MYRI10GE=m +CONFIG_MYRI10GE_DCA=y +CONFIG_FEALNX=m +CONFIG_NET_VENDOR_NATSEMI=y +CONFIG_NATSEMI=m +CONFIG_NS83820=m +CONFIG_NET_VENDOR_NETRONOME=y +CONFIG_NFP=m +# CONFIG_NFP_APP_FLOWER is not set +# CONFIG_NFP_DEBUG is not set +CONFIG_NET_VENDOR_8390=y +CONFIG_PCMCIA_AXNET=m +CONFIG_NE2K_PCI=m +CONFIG_PCMCIA_PCNET=m +CONFIG_NET_VENDOR_NVIDIA=y +CONFIG_FORCEDETH=m +CONFIG_NET_VENDOR_OKI=y +CONFIG_ETHOC=m +CONFIG_NET_PACKET_ENGINE=y +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_NET_VENDOR_QLOGIC=y +CONFIG_QLA3XXX=m +CONFIG_QLCNIC=m +CONFIG_QLCNIC_SRIOV=y +CONFIG_QLCNIC_HWMON=y +CONFIG_QLGE=m +CONFIG_NETXEN_NIC=m +CONFIG_QED=m +CONFIG_QED_LL2=y +CONFIG_QED_SRIOV=y +CONFIG_QEDE=m +CONFIG_QED_RDMA=y +CONFIG_QED_ISCSI=y +CONFIG_QED_FCOE=y +CONFIG_QED_OOO=y +CONFIG_NET_VENDOR_QUALCOMM=y +CONFIG_QCOM_EMAC=m +CONFIG_RMNET=m +CONFIG_NET_VENDOR_REALTEK=y +CONFIG_ATP=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_R8169=m +# CONFIG_NET_VENDOR_RENESAS is not set +CONFIG_NET_VENDOR_RDC=y +CONFIG_R6040=m +CONFIG_NET_VENDOR_ROCKER=y +CONFIG_ROCKER=m +CONFIG_NET_VENDOR_SAMSUNG=y +CONFIG_SXGBE_ETH=m +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_NET_VENDOR_SILAN=y +CONFIG_SC92031=m +CONFIG_NET_VENDOR_SIS=y +CONFIG_SIS900=m +CONFIG_SIS190=m +CONFIG_NET_VENDOR_SOLARFLARE=y +CONFIG_SFC=m +CONFIG_SFC_MTD=y +CONFIG_SFC_MCDI_MON=y +CONFIG_SFC_SRIOV=y +CONFIG_SFC_MCDI_LOGGING=y +CONFIG_SFC_FALCON=m +CONFIG_SFC_FALCON_MTD=y +CONFIG_NET_VENDOR_SMSC=y +CONFIG_PCMCIA_SMC91C92=m +CONFIG_EPIC100=m +CONFIG_SMSC911X=m +# CONFIG_SMSC911X_ARCH_HOOKS is not set +CONFIG_SMSC9420=m +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=m +# CONFIG_STMMAC_PLATFORM is not set +CONFIG_STMMAC_PCI=m +CONFIG_NET_VENDOR_SUN=y +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NIU=m +CONFIG_NET_VENDOR_TEHUTI=y +CONFIG_TEHUTI=m +CONFIG_NET_VENDOR_TI=y +CONFIG_TI_CPSW_ALE=m +CONFIG_TLAN=m +CONFIG_NET_VENDOR_VIA=y +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_VENDOR_WIZNET=y +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5300=m +# CONFIG_WIZNET_BUS_DIRECT is not set +# CONFIG_WIZNET_BUS_INDIRECT is not set +CONFIG_WIZNET_BUS_ANY=y +CONFIG_WIZNET_W5100_SPI=m +CONFIG_NET_VENDOR_XIRCOM=y +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_NET_VENDOR_SYNOPSYS=y +CONFIG_DWC_XLGMAC=m +CONFIG_DWC_XLGMAC_PCI=m +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_NET_SB1000=m +CONFIG_MDIO_DEVICE=m +CONFIG_MDIO_BUS=m +CONFIG_MDIO_BITBANG=m +CONFIG_MDIO_CAVIUM=m +# CONFIG_MDIO_GPIO is not set +CONFIG_MDIO_THUNDER=m +CONFIG_PHYLIB=m +CONFIG_SWPHY=y +# CONFIG_LED_TRIGGER_PHY is not set + +# +# MII PHY device drivers +# +CONFIG_AMD_PHY=m +CONFIG_AQUANTIA_PHY=m +CONFIG_AT803X_PHY=m +CONFIG_BCM7XXX_PHY=m +CONFIG_BCM87XX_PHY=m +CONFIG_BCM_NET_PHYLIB=m +CONFIG_BROADCOM_PHY=m +CONFIG_CICADA_PHY=m +# CONFIG_CORTINA_PHY is not set +CONFIG_DAVICOM_PHY=m +CONFIG_DP83822_PHY=m +CONFIG_DP83848_PHY=m +CONFIG_DP83867_PHY=m +CONFIG_FIXED_PHY=m +CONFIG_ICPLUS_PHY=m +CONFIG_INTEL_XWAY_PHY=m +CONFIG_LSI_ET1011C_PHY=m +CONFIG_LXT_PHY=m +CONFIG_MARVELL_PHY=m +# CONFIG_MARVELL_10G_PHY is not set +CONFIG_MICREL_PHY=m +CONFIG_MICROCHIP_PHY=m +CONFIG_MICROSEMI_PHY=m +CONFIG_NATIONAL_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_REALTEK_PHY=m +CONFIG_RENESAS_PHY=m +CONFIG_ROCKCHIP_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_STE10XP=m +CONFIG_TERANETICS_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_XILINX_GMII2RGMII=m +# CONFIG_MICREL_KS8995MA is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOATM=m +CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_SLIP=m +CONFIG_SLHC=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set + +# +# Host-side USB support is needed for USB Network Adapter support +# +CONFIG_USB_NET_DRIVERS=m +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_LAN78XX=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_AX88179_178A=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +CONFIG_USB_NET_HUAWEI_CDC_NCM=m +CONFIG_USB_NET_CDC_MBIM=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SR9700=m +CONFIG_USB_NET_SR9800=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET_ENABLE=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_QMI_WWAN=m +CONFIG_USB_HSO=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_CDC_PHONET=m +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m +CONFIG_USB_NET_CH9200=m +CONFIG_WLAN=y +CONFIG_WLAN_VENDOR_ADMTEK=y +CONFIG_ADM8211=m +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +# CONFIG_ATH5K_TRACER is not set +CONFIG_ATH5K_PCI=y +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_COMMON_DEBUG=y +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=m +CONFIG_ATH9K_PCI=y +CONFIG_ATH9K_AHB=y +CONFIG_ATH9K_DEBUGFS=y +CONFIG_ATH9K_STATION_STATISTICS=y +# CONFIG_ATH9K_DYNACK is not set +CONFIG_ATH9K_WOW=y +CONFIG_ATH9K_RFKILL=y +# CONFIG_ATH9K_CHANNEL_CONTEXT is not set +CONFIG_ATH9K_PCOEM=y +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set +CONFIG_ATH9K_HWRNG=y +CONFIG_CARL9170=m +CONFIG_CARL9170_LEDS=y +# CONFIG_CARL9170_DEBUGFS is not set +CONFIG_CARL9170_WPC=y +# CONFIG_CARL9170_HWRNG is not set +CONFIG_ATH6KL=m +CONFIG_ATH6KL_SDIO=m +CONFIG_ATH6KL_USB=m +# CONFIG_ATH6KL_DEBUG is not set +# CONFIG_ATH6KL_TRACING is not set +CONFIG_AR5523=m +CONFIG_WIL6210=m +CONFIG_WIL6210_ISR_COR=y +# CONFIG_WIL6210_TRACING is not set +CONFIG_WIL6210_DEBUGFS=y +CONFIG_ATH10K=m +CONFIG_ATH10K_PCI=m +# CONFIG_ATH10K_SDIO is not set +# CONFIG_ATH10K_USB is not set +# CONFIG_ATH10K_DEBUG is not set +CONFIG_ATH10K_DEBUGFS=y +# CONFIG_ATH10K_TRACING is not set +CONFIG_WCN36XX=m +# CONFIG_WCN36XX_DEBUGFS is not set +CONFIG_WLAN_VENDOR_ATMEL=y +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_AT76C50X_USB=m +CONFIG_WLAN_VENDOR_BROADCOM=y +CONFIG_B43=m +CONFIG_B43_BCMA=y +CONFIG_B43_SSB=y +CONFIG_B43_BUSES_BCMA_AND_SSB=y +# CONFIG_B43_BUSES_BCMA is not set +# CONFIG_B43_BUSES_SSB is not set +CONFIG_B43_PCI_AUTOSELECT=y +CONFIG_B43_PCICORE_AUTOSELECT=y +CONFIG_B43_SDIO=y +CONFIG_B43_BCMA_PIO=y +CONFIG_B43_PIO=y +CONFIG_B43_PHY_G=y +CONFIG_B43_PHY_N=y +CONFIG_B43_PHY_LP=y +CONFIG_B43_PHY_HT=y +CONFIG_B43_LEDS=y +CONFIG_B43_HWRNG=y +# CONFIG_B43_DEBUG is not set +CONFIG_B43LEGACY=m +CONFIG_B43LEGACY_PCI_AUTOSELECT=y +CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y +CONFIG_B43LEGACY_LEDS=y +CONFIG_B43LEGACY_HWRNG=y +# CONFIG_B43LEGACY_DEBUG is not set +CONFIG_B43LEGACY_DMA=y +CONFIG_B43LEGACY_PIO=y +CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y +# CONFIG_B43LEGACY_DMA_MODE is not set +# CONFIG_B43LEGACY_PIO_MODE is not set +CONFIG_BRCMUTIL=m +CONFIG_BRCMSMAC=m +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_PROTO_MSGBUF=y +CONFIG_BRCMFMAC_SDIO=y +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +CONFIG_WLAN_VENDOR_CISCO=y +CONFIG_AIRO=m +CONFIG_AIRO_CS=m +CONFIG_WLAN_VENDOR_INTEL=y +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_LIBIPW=m +# CONFIG_LIBIPW_DEBUG is not set +CONFIG_IWLEGACY=m +CONFIG_IWL4965=m +CONFIG_IWL3945=m + +# +# iwl3945 / iwl4965 Debugging Options +# +# CONFIG_IWLEGACY_DEBUG is not set +# CONFIG_IWLEGACY_DEBUGFS is not set +CONFIG_IWLWIFI=m +CONFIG_IWLWIFI_LEDS=y +CONFIG_IWLDVM=m +CONFIG_IWLMVM=m +CONFIG_IWLWIFI_OPMODE_MODULAR=y +# CONFIG_IWLWIFI_BCAST_FILTERING is not set + +# +# Debugging Options +# +# CONFIG_IWLWIFI_DEBUG is not set +# CONFIG_IWLWIFI_DEBUGFS is not set +CONFIG_IWLWIFI_DEVICE_TRACING=y +CONFIG_WLAN_VENDOR_INTERSIL=y +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m +CONFIG_HERMES=m +CONFIG_HERMES_PRISM=y +CONFIG_HERMES_CACHE_FW_ON_INIT=y +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_ORINOCO_USB=m +CONFIG_P54_COMMON=m +CONFIG_P54_USB=m +CONFIG_P54_PCI=m +CONFIG_P54_SPI=m +# CONFIG_P54_SPI_DEFAULT_EEPROM is not set +CONFIG_P54_LEDS=y +CONFIG_PRISM54=m +CONFIG_WLAN_VENDOR_MARVELL=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_CS=m +CONFIG_LIBERTAS_SDIO=m +CONFIG_LIBERTAS_SPI=m +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_LIBERTAS_MESH=y +CONFIG_LIBERTAS_THINFIRM=m +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_PCIE=m +CONFIG_MWIFIEX_USB=m +CONFIG_MWL8K=m +CONFIG_WLAN_VENDOR_MEDIATEK=y +CONFIG_MT7601U=m +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=m +CONFIG_RT2400PCI=m +CONFIG_RT2500PCI=m +CONFIG_RT61PCI=m +CONFIG_RT2800PCI=m +CONFIG_RT2800PCI_RT33XX=y +CONFIG_RT2800PCI_RT35XX=y +CONFIG_RT2800PCI_RT53XX=y +CONFIG_RT2800PCI_RT3290=y +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=m +CONFIG_RT2800_LIB_MMIO=m +CONFIG_RT2X00_LIB_MMIO=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_LIB_DEBUGFS is not set +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8187_LEDS=y +CONFIG_RTL_CARDS=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8192CU=m +CONFIG_RTLWIFI=m +CONFIG_RTLWIFI_PCI=m +CONFIG_RTLWIFI_USB=m +# CONFIG_RTLWIFI_DEBUG is not set +CONFIG_RTL8192C_COMMON=m +CONFIG_RTL8723_COMMON=m +CONFIG_RTLBTCOEXIST=m +CONFIG_RTL8XXXU=m +# CONFIG_RTL8XXXU_UNTESTED is not set +CONFIG_WLAN_VENDOR_RSI=y +CONFIG_RSI_91X=m +# CONFIG_RSI_DEBUGFS is not set +CONFIG_RSI_SDIO=m +CONFIG_RSI_USB=m +CONFIG_WLAN_VENDOR_ST=y +CONFIG_CW1200=m +CONFIG_CW1200_WLAN_SDIO=m +CONFIG_CW1200_WLAN_SPI=m +CONFIG_WLAN_VENDOR_TI=y +CONFIG_WL1251=m +# CONFIG_WL1251_SPI is not set +CONFIG_WL1251_SDIO=m +CONFIG_WL12XX=m +CONFIG_WL18XX=m +CONFIG_WLCORE=m +CONFIG_WLCORE_SDIO=m +CONFIG_WILINK_PLATFORM_DATA=y +CONFIG_WLAN_VENDOR_ZYDAS=y +CONFIG_USB_ZD1201=m +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_QTNFMAC_PEARL_PCIE is not set +CONFIG_PCMCIA_RAYCS=m +CONFIG_PCMCIA_WL3501=m +CONFIG_MAC80211_HWSIM=m +CONFIG_USB_NET_RNDIS_WLAN=m + +# +# WiMAX Wireless Broadband devices +# +CONFIG_WIMAX_I2400M=m +CONFIG_WIMAX_I2400M_USB=m +CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8 +# CONFIG_WAN is not set +CONFIG_IEEE802154_DRIVERS=m +CONFIG_IEEE802154_FAKELB=m +CONFIG_IEEE802154_AT86RF230=m +# CONFIG_IEEE802154_AT86RF230_DEBUGFS is not set +# CONFIG_IEEE802154_MRF24J40 is not set +# CONFIG_IEEE802154_CC2520 is not set +CONFIG_IEEE802154_ATUSB=m +CONFIG_IEEE802154_ADF7242=m +CONFIG_IEEE802154_CA8210=m +# CONFIG_IEEE802154_CA8210_DEBUGFS is not set +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_NETDEV_BACKEND=m +CONFIG_VMXNET3=m +CONFIG_FUJITSU_ES=m +CONFIG_THUNDERBOLT_NET=m +CONFIG_HYPERV_NET=m +CONFIG_ISDN=y +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_ISDN_CAPI=m +CONFIG_CAPI_TRACE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPIDRV=m +# CONFIG_ISDN_CAPI_CAPIDRV_VERBOSE is not set + +# +# CAPI hardware drivers +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_CAPI=y +# CONFIG_GIGASET_I4L is not set +# CONFIG_GIGASET_DUMMYLL is not set +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +CONFIG_GIGASET_M101=m +# CONFIG_GIGASET_DEBUG is not set +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y +CONFIG_MISDN=m +CONFIG_MISDN_DSP=m +CONFIG_MISDN_L1OIP=m + +# +# mISDN hardware drivers +# +CONFIG_MISDN_HFCPCI=m +CONFIG_MISDN_HFCMULTI=m +CONFIG_MISDN_HFCUSB=m +CONFIG_MISDN_AVMFRITZ=m +CONFIG_MISDN_SPEEDFAX=m +CONFIG_MISDN_INFINEON=m +CONFIG_MISDN_W6692=m +CONFIG_MISDN_NETJET=m +CONFIG_MISDN_IPAC=m +CONFIG_MISDN_ISAR=m +CONFIG_ISDN_HDLC=m +CONFIG_NVM=y +# CONFIG_NVM_DEBUG is not set +CONFIG_NVM_RRPC=m +CONFIG_NVM_PBLK=m + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=m +CONFIG_INPUT_FF_MEMLESS=m +CONFIG_INPUT_POLLDEV=m +CONFIG_INPUT_SPARSEKMAP=m +CONFIG_INPUT_MATRIXKMAP=m + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_EVDEV=m +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ADC=m +CONFIG_KEYBOARD_ADP5588=m +CONFIG_KEYBOARD_ADP5589=m +CONFIG_KEYBOARD_ATKBD=m +CONFIG_KEYBOARD_QT1070=m +CONFIG_KEYBOARD_QT2160=m +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_KEYBOARD_GPIO_POLLED is not set +CONFIG_KEYBOARD_TCA6416=m +CONFIG_KEYBOARD_TCA8418=m +CONFIG_KEYBOARD_MATRIX=m +# CONFIG_KEYBOARD_LM8323 is not set +CONFIG_KEYBOARD_LM8333=m +# CONFIG_KEYBOARD_MAX7359 is not set +CONFIG_KEYBOARD_MCS=m +CONFIG_KEYBOARD_MPR121=m +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CROS_EC is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_BYD=y +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +CONFIG_MOUSE_PS2_CYPRESS=y +CONFIG_MOUSE_PS2_LIFEBOOK=y +CONFIG_MOUSE_PS2_TRACKPOINT=y +CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_MOUSE_PS2_SENTELIC=y +CONFIG_MOUSE_PS2_TOUCHKIT=y +CONFIG_MOUSE_PS2_FOCALTECH=y +CONFIG_MOUSE_PS2_VMMOUSE=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_APPLETOUCH=m +CONFIG_MOUSE_BCM5974=m +CONFIG_MOUSE_CYAPA=m +CONFIG_MOUSE_ELAN_I2C=m +CONFIG_MOUSE_ELAN_I2C_I2C=y +CONFIG_MOUSE_ELAN_I2C_SMBUS=y +CONFIG_MOUSE_VSXXXAA=m +CONFIG_MOUSE_GPIO=m +CONFIG_MOUSE_SYNAPTICS_I2C=m +CONFIG_MOUSE_SYNAPTICS_USB=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDJOY=m +CONFIG_JOYSTICK_ZHENHUA=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_JOYSTICK_AS5011=m +CONFIG_JOYSTICK_JOYDUMP=m +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +CONFIG_JOYSTICK_WALKERA0701=m +CONFIG_JOYSTICK_PSXPAD_SPI=m +# CONFIG_JOYSTICK_PSXPAD_SPI_FF is not set +CONFIG_INPUT_TABLET=y +CONFIG_TABLET_USB_ACECAD=m +CONFIG_TABLET_USB_AIPTEK=m +CONFIG_TABLET_USB_GTCO=m +CONFIG_TABLET_USB_HANWANG=m +CONFIG_TABLET_USB_KBTAB=m +CONFIG_TABLET_USB_PEGASUS=m +CONFIG_TABLET_SERIAL_WACOM4=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_PROPERTIES=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +CONFIG_TOUCHSCREEN_AD7879=m +CONFIG_TOUCHSCREEN_AD7879_I2C=m +# CONFIG_TOUCHSCREEN_AD7879_SPI is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=m +CONFIG_TOUCHSCREEN_ATMEL_MXT_T37=y +CONFIG_TOUCHSCREEN_AUO_PIXCIR=m +CONFIG_TOUCHSCREEN_BU21013=m +CONFIG_TOUCHSCREEN_CY8CTMG110=m +CONFIG_TOUCHSCREEN_CYTTSP_CORE=m +CONFIG_TOUCHSCREEN_CYTTSP_I2C=m +# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set +CONFIG_TOUCHSCREEN_CYTTSP4_CORE=m +CONFIG_TOUCHSCREEN_CYTTSP4_I2C=m +CONFIG_TOUCHSCREEN_CYTTSP4_SPI=m +CONFIG_TOUCHSCREEN_DYNAPRO=m +CONFIG_TOUCHSCREEN_HAMPSHIRE=m +CONFIG_TOUCHSCREEN_EETI=m +CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m +CONFIG_TOUCHSCREEN_EXC3000=m +CONFIG_TOUCHSCREEN_FUJITSU=m +CONFIG_TOUCHSCREEN_GOODIX=m +CONFIG_TOUCHSCREEN_HIDEEP=m +CONFIG_TOUCHSCREEN_ILI210X=m +CONFIG_TOUCHSCREEN_S6SY761=m +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_TOUCHSCREEN_EKTF2127=y +CONFIG_TOUCHSCREEN_ELAN=m +CONFIG_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_WACOM_W8001=m +CONFIG_TOUCHSCREEN_WACOM_I2C=m +CONFIG_TOUCHSCREEN_MAX11801=m +CONFIG_TOUCHSCREEN_MCS5000=m +CONFIG_TOUCHSCREEN_MMS114=m +CONFIG_TOUCHSCREEN_MELFAS_MIP4=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_INEXIO=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_TOUCHSCREEN_PENMOUNT=m +CONFIG_TOUCHSCREEN_EDT_FT5X06=m +CONFIG_TOUCHSCREEN_TOUCHRIGHT=m +CONFIG_TOUCHSCREEN_TOUCHWIN=m +CONFIG_TOUCHSCREEN_TI_AM335X_TSC=m +CONFIG_TOUCHSCREEN_UCB1400=m +CONFIG_TOUCHSCREEN_PIXCIR=m +CONFIG_TOUCHSCREEN_WDT87XX_I2C=m +CONFIG_TOUCHSCREEN_WM97XX=m +CONFIG_TOUCHSCREEN_WM9705=y +CONFIG_TOUCHSCREEN_WM9712=y +CONFIG_TOUCHSCREEN_WM9713=y +CONFIG_TOUCHSCREEN_USB_COMPOSITE=m +CONFIG_TOUCHSCREEN_MC13783=m +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_TOUCHSCREEN_USB_IRTOUCH=y +CONFIG_TOUCHSCREEN_USB_IDEALTEK=y +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y +CONFIG_TOUCHSCREEN_USB_GOTOP=y +CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y +CONFIG_TOUCHSCREEN_USB_E2I=y +CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y +CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y +CONFIG_TOUCHSCREEN_TOUCHIT213=m +CONFIG_TOUCHSCREEN_TSC_SERIO=m +CONFIG_TOUCHSCREEN_TSC200X_CORE=m +CONFIG_TOUCHSCREEN_TSC2004=m +# CONFIG_TOUCHSCREEN_TSC2005 is not set +CONFIG_TOUCHSCREEN_TSC2007=m +# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set +CONFIG_TOUCHSCREEN_RM_TS=m +CONFIG_TOUCHSCREEN_SILEAD=m +CONFIG_TOUCHSCREEN_SIS_I2C=m +CONFIG_TOUCHSCREEN_ST1232=m +# CONFIG_TOUCHSCREEN_STMFTS is not set +CONFIG_TOUCHSCREEN_SUR40=m +CONFIG_TOUCHSCREEN_SURFACE3_SPI=m +CONFIG_TOUCHSCREEN_SX8654=m +CONFIG_TOUCHSCREEN_TPS6507X=m +CONFIG_TOUCHSCREEN_ZET6223=m +CONFIG_TOUCHSCREEN_ZFORCE=m +CONFIG_TOUCHSCREEN_ROHM_BU21023=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_AD714X=m +CONFIG_INPUT_AD714X_I2C=m +CONFIG_INPUT_AD714X_SPI=m +CONFIG_INPUT_ARIZONA_HAPTICS=m +CONFIG_INPUT_BMA150=m +CONFIG_INPUT_E3X0_BUTTON=m +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_MC13783_PWRBUTTON=m +CONFIG_INPUT_MMA8450=m +CONFIG_INPUT_APANEL=m +CONFIG_INPUT_GP2A=m +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_TILT_POLLED is not set +CONFIG_INPUT_GPIO_DECODER=m +CONFIG_INPUT_ATLAS_BTNS=m +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_KXTJ9=m +# CONFIG_INPUT_KXTJ9_POLLED_MODE is not set +CONFIG_INPUT_POWERMATE=m +CONFIG_INPUT_YEALINK=m +CONFIG_INPUT_CM109=m +CONFIG_INPUT_RETU_PWRBUTTON=m +CONFIG_INPUT_AXP20X_PEK=m +CONFIG_INPUT_UINPUT=m +CONFIG_INPUT_PCF50633_PMU=m +CONFIG_INPUT_PCF8574=m +CONFIG_INPUT_GPIO_ROTARY_ENCODER=m +CONFIG_INPUT_ADXL34X=m +CONFIG_INPUT_ADXL34X_I2C=m +CONFIG_INPUT_ADXL34X_SPI=m +# CONFIG_INPUT_IMS_PCU is not set +CONFIG_INPUT_CMA3000=m +CONFIG_INPUT_CMA3000_I2C=m +CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m +CONFIG_INPUT_IDEAPAD_SLIDEBAR=m +# CONFIG_INPUT_DRV260X_HAPTICS is not set +CONFIG_INPUT_DRV2665_HAPTICS=m +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_RMI4_CORE=m +CONFIG_RMI4_I2C=m +CONFIG_RMI4_SPI=m +CONFIG_RMI4_SMB=m +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=m +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +CONFIG_RMI4_F34=y +# CONFIG_RMI4_F54 is not set +CONFIG_RMI4_F55=y + +# +# Hardware I/O ports +# +CONFIG_SERIO=m +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m +CONFIG_SERIO_LIBPS2=m +CONFIG_SERIO_RAW=m +CONFIG_SERIO_ALTERA_PS2=m +CONFIG_SERIO_PS2MULT=m +CONFIG_SERIO_ARC_PS2=m +CONFIG_HYPERV_KEYBOARD=m +CONFIG_SERIO_GPIO_PS2=m +# CONFIG_USERIO is not set +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +# CONFIG_SYNCLINK_GT is not set +CONFIG_NOZOMI=m +# CONFIG_ISI is not set +CONFIG_N_HDLC=m +CONFIG_N_GSM=m +CONFIG_TRACE_ROUTER=m +CONFIG_TRACE_SINK=m +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_PNP=y +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_FSL is not set +CONFIG_SERIAL_8250_DW=m +CONFIG_SERIAL_8250_RT288X=y +CONFIG_SERIAL_8250_LPSS=y +CONFIG_SERIAL_8250_MID=y +CONFIG_SERIAL_8250_MOXA=m + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_JSM=m +CONFIG_SERIAL_SCCNXP=m +CONFIG_SERIAL_SC16IS7XX_CORE=m +CONFIG_SERIAL_SC16IS7XX=m +CONFIG_SERIAL_SC16IS7XX_I2C=y +# CONFIG_SERIAL_SC16IS7XX_SPI is not set +CONFIG_SERIAL_ALTERA_JTAGUART=m +CONFIG_SERIAL_ALTERA_UART=m +CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4 +CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200 +# CONFIG_SERIAL_IFX6X60 is not set +CONFIG_SERIAL_ARC=m +CONFIG_SERIAL_ARC_NR_PORTS=1 +CONFIG_SERIAL_RP2=m +CONFIG_SERIAL_RP2_NR_UARTS=32 +CONFIG_SERIAL_FSL_LPUART=m +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_HVC_DRIVER=y +CONFIG_HVC_IRQ=y +CONFIG_HVC_XEN=y +CONFIG_HVC_XEN_FRONTEND=y +CONFIG_VIRTIO_CONSOLE=m +CONFIG_IPMI_HANDLER=m +CONFIG_IPMI_DMI_DECODE=y +# CONFIG_IPMI_PROC_INTERFACE is not set +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_SSIF=m +CONFIG_IPMI_WATCHDOG=m +CONFIG_IPMI_POWEROFF=m +CONFIG_HW_RANDOM=m +CONFIG_HW_RANDOM_TIMERIOMEM=m +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +CONFIG_HW_RANDOM_VIA=m +CONFIG_HW_RANDOM_VIRTIO=m +CONFIG_HW_RANDOM_TPM=m +CONFIG_NVRAM=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +# CONFIG_SCR24X is not set +CONFIG_IPWIRELESS=m +CONFIG_MWAVE=m +CONFIG_RAW_DRIVER=m +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HPET=y +CONFIG_HPET_MMAP=y +CONFIG_HPET_MMAP_DEFAULT=y +CONFIG_HANGCHECK_TIMER=m +CONFIG_TCG_TPM=m +CONFIG_TCG_TIS_CORE=m +CONFIG_TCG_TIS=m +CONFIG_TCG_TIS_SPI=m +CONFIG_TCG_TIS_I2C_ATMEL=m +CONFIG_TCG_TIS_I2C_INFINEON=m +CONFIG_TCG_TIS_I2C_NUVOTON=m +CONFIG_TCG_NSC=m +CONFIG_TCG_ATMEL=m +CONFIG_TCG_INFINEON=m +CONFIG_TCG_XEN=m +CONFIG_TCG_CRB=m +CONFIG_TCG_VTPM_PROXY=m +CONFIG_TCG_TIS_ST33ZP24=m +CONFIG_TCG_TIS_ST33ZP24_I2C=m +CONFIG_TCG_TIS_ST33ZP24_SPI=m +CONFIG_TELCLOCK=m +CONFIG_DEVPORT=y +# CONFIG_XILLYBUS is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_ACPI_I2C_OPREGION=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_MUX=m + +# +# Multiplexer I2C Chip support +# +# CONFIG_I2C_MUX_GPIO is not set +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=m +CONFIG_I2C_MUX_PCA954x=m +# CONFIG_I2C_MUX_REG is not set +# CONFIG_I2C_MUX_MLXCPLD is not set +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_SMBUS=m +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCA=m + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_ISCH=m +CONFIG_I2C_ISMT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_NFORCE2_S4985=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m + +# +# ACPI drivers +# +CONFIG_I2C_SCMI=m + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CBUS_GPIO is not set +CONFIG_I2C_DESIGNWARE_CORE=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +# CONFIG_I2C_DESIGNWARE_SLAVE is not set +CONFIG_I2C_DESIGNWARE_PCI=m +CONFIG_I2C_DESIGNWARE_BAYTRAIL=y +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +CONFIG_I2C_OCORES=m +CONFIG_I2C_PCA_PLATFORM=m +# CONFIG_I2C_PXA_PCI is not set +CONFIG_I2C_SIMTEC=m +CONFIG_I2C_XILINX=m + +# +# External I2C/SMBus adapter drivers +# +CONFIG_I2C_DIOLAN_U2C=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_ROBOTFUZZ_OSIF=m +CONFIG_I2C_TAOS_EVM=m +CONFIG_I2C_TINY_USB=m +CONFIG_I2C_VIPERBOARD=m + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_MLXCPLD is not set +# CONFIG_I2C_CROS_EC_TUNNEL is not set +# CONFIG_I2C_STUB is not set +CONFIG_I2C_SLAVE=y +CONFIG_I2C_SLAVE_EEPROM=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ALTERA=m +CONFIG_SPI_AXI_SPI_ENGINE=m +CONFIG_SPI_BITBANG=m +CONFIG_SPI_BUTTERFLY=m +# CONFIG_SPI_CADENCE is not set +CONFIG_SPI_DESIGNWARE=m +CONFIG_SPI_DW_PCI=m +# CONFIG_SPI_DW_MID_DMA is not set +CONFIG_SPI_DW_MMIO=m +CONFIG_SPI_GPIO=m +CONFIG_SPI_LM70_LLP=m +CONFIG_SPI_OC_TINY=m +CONFIG_SPI_PXA2XX=m +CONFIG_SPI_PXA2XX_PCI=m +CONFIG_SPI_ROCKCHIP=m +CONFIG_SPI_SC18IS602=m +CONFIG_SPI_XCOMM=m +CONFIG_SPI_XILINX=m +CONFIG_SPI_ZYNQMP_GQSPI=m + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=m +CONFIG_SPI_LOOPBACK_TEST=m +CONFIG_SPI_TLE62X0=m +# CONFIG_SPI_SLAVE is not set +CONFIG_SPMI=m +# CONFIG_HSI is not set +CONFIG_PPS=m +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +CONFIG_PPS_CLIENT_KTIMER=m +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PPS_CLIENT_GPIO=m + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=m +CONFIG_DP83640_PHY=m +CONFIG_PTP_1588_CLOCK_KVM=m +CONFIG_PINCTRL=y +CONFIG_PINMUX=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_AMD is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_SX150X is not set +CONFIG_PINCTRL_BAYTRAIL=y +CONFIG_PINCTRL_CHERRYVIEW=m +CONFIG_PINCTRL_INTEL=m +CONFIG_PINCTRL_BROXTON=m +# CONFIG_PINCTRL_CANNONLAKE is not set +# CONFIG_PINCTRL_CEDARFORK is not set +# CONFIG_PINCTRL_DENVERTON is not set +CONFIG_PINCTRL_GEMINILAKE=m +CONFIG_PINCTRL_LEWISBURG=m +CONFIG_PINCTRL_SUNRISEPOINT=m +CONFIG_GPIOLIB=y +CONFIG_GPIO_ACPI=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_GENERIC=m + +# +# Memory mapped GPIO drivers +# +CONFIG_GPIO_AMDPT=m +CONFIG_GPIO_AXP209=m +# CONFIG_GPIO_DWAPB is not set +CONFIG_GPIO_EXAR=m +# CONFIG_GPIO_GENERIC_PLATFORM is not set +CONFIG_GPIO_ICH=m +CONFIG_GPIO_LYNXPOINT=y +CONFIG_GPIO_MB86S7X=m +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_VX855 is not set + +# +# Port-mapped I/O GPIO drivers +# +# CONFIG_GPIO_F7188X is not set +# CONFIG_GPIO_IT87 is not set +CONFIG_GPIO_SCH=m +CONFIG_GPIO_SCH311X=m + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADP5588 is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set + +# +# MFD GPIO expanders +# +# CONFIG_GPIO_ARIZONA is not set +# CONFIG_GPIO_BD9571MWV is not set +CONFIG_GPIO_CRYSTAL_COVE=y +# CONFIG_GPIO_LP3943 is not set +# CONFIG_GPIO_LP873X is not set +# CONFIG_GPIO_TPS68470 is not set +# CONFIG_GPIO_UCB1400 is not set +CONFIG_GPIO_WHISKEY_COVE=m + +# +# PCI GPIO expanders +# +CONFIG_GPIO_AMD8111=m +# CONFIG_GPIO_ML_IOH is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_RDC321X is not set + +# +# SPI GPIO expanders +# +CONFIG_GPIO_MAX3191X=m +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set + +# +# USB GPIO expanders +# +CONFIG_GPIO_VIPERBOARD=m +# CONFIG_W1 is not set +CONFIG_POWER_AVS=y +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_RESTART is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_PDA_POWER=m +CONFIG_GENERIC_ADC_BATTERY=m +CONFIG_TEST_POWER=m +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +CONFIG_BATTERY_SBS=m +CONFIG_CHARGER_SBS=m +CONFIG_MANAGER_SBS=m +CONFIG_BATTERY_BQ27XXX=m +CONFIG_BATTERY_BQ27XXX_I2C=m +# CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set +CONFIG_CHARGER_AXP20X=m +CONFIG_BATTERY_AXP20X=m +CONFIG_AXP20X_POWER=m +CONFIG_AXP288_FUEL_GAUGE=m +CONFIG_BATTERY_MAX17040=m +CONFIG_BATTERY_MAX17042=m +# CONFIG_CHARGER_PCF50633 is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +CONFIG_CHARGER_GPIO=m +# CONFIG_CHARGER_LTC3651 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +CONFIG_CHARGER_BQ24735=m +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_CHARGER_RT9455 is not set +CONFIG_HWMON=y +CONFIG_HWMON_VID=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ABITUGURU3=m +CONFIG_SENSORS_AD7314=m +CONFIG_SENSORS_AD7414=m +CONFIG_SENSORS_AD7418=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1029=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_ADT7X10=m +CONFIG_SENSORS_ADT7310=m +CONFIG_SENSORS_ADT7410=m +CONFIG_SENSORS_ADT7411=m +CONFIG_SENSORS_ADT7462=m +CONFIG_SENSORS_ADT7470=m +CONFIG_SENSORS_ADT7475=m +CONFIG_SENSORS_ASC7621=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_K10TEMP=m +CONFIG_SENSORS_FAM15H_POWER=m +CONFIG_SENSORS_APPLESMC=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_ASPEED=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS620=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_DELL_SMM=m +CONFIG_SENSORS_I5K_AMB=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_F71882FG=m +CONFIG_SENSORS_F75375S=m +CONFIG_SENSORS_MC13783_ADC=m +CONFIG_SENSORS_FSCHMD=m +CONFIG_SENSORS_FTSTEUTATES=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_G760A=m +CONFIG_SENSORS_G762=m +CONFIG_SENSORS_HIH6130=m +CONFIG_SENSORS_IBMAEM=m +CONFIG_SENSORS_IBMPEX=m +# CONFIG_SENSORS_IIO_HWMON is not set +CONFIG_SENSORS_I5500=m +CONFIG_SENSORS_CORETEMP=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_JC42=m +CONFIG_SENSORS_POWR1220=m +CONFIG_SENSORS_LINEAGE=m +CONFIG_SENSORS_LTC2945=m +# CONFIG_SENSORS_LTC2990 is not set +CONFIG_SENSORS_LTC4151=m +CONFIG_SENSORS_LTC4215=m +CONFIG_SENSORS_LTC4222=m +CONFIG_SENSORS_LTC4245=m +CONFIG_SENSORS_LTC4260=m +CONFIG_SENSORS_LTC4261=m +CONFIG_SENSORS_MAX1111=m +CONFIG_SENSORS_MAX16065=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_MAX1668=m +CONFIG_SENSORS_MAX197=m +CONFIG_SENSORS_MAX31722=m +CONFIG_SENSORS_MAX6621=m +CONFIG_SENSORS_MAX6639=m +CONFIG_SENSORS_MAX6642=m +CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_MAX6697=m +CONFIG_SENSORS_MAX31790=m +CONFIG_SENSORS_MCP3021=m +CONFIG_SENSORS_TC654=m +CONFIG_SENSORS_ADCXX=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m +CONFIG_SENSORS_LM73=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_LM93=m +CONFIG_SENSORS_LM95234=m +CONFIG_SENSORS_LM95241=m +CONFIG_SENSORS_LM95245=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_PC87427=m +CONFIG_SENSORS_NTC_THERMISTOR=m +CONFIG_SENSORS_NCT6683=m +CONFIG_SENSORS_NCT6775=m +CONFIG_SENSORS_NCT7802=m +# CONFIG_SENSORS_NCT7904 is not set +CONFIG_SENSORS_PCF8591=m +CONFIG_PMBUS=m +CONFIG_SENSORS_PMBUS=m +CONFIG_SENSORS_ADM1275=m +CONFIG_SENSORS_IBM_CFFPS=m +# CONFIG_SENSORS_IR35221 is not set +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_LTC2978=m +CONFIG_SENSORS_LTC3815=m +CONFIG_SENSORS_MAX16064=m +CONFIG_SENSORS_MAX20751=m +CONFIG_SENSORS_MAX31785=m +CONFIG_SENSORS_MAX34440=m +CONFIG_SENSORS_MAX8688=m +CONFIG_SENSORS_TPS40422=m +CONFIG_SENSORS_TPS53679=m +CONFIG_SENSORS_UCD9000=m +CONFIG_SENSORS_UCD9200=m +CONFIG_SENSORS_ZL6100=m +CONFIG_SENSORS_SHT15=m +CONFIG_SENSORS_SHT21=m +CONFIG_SENSORS_SHT3x=m +CONFIG_SENSORS_SHTC1=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_DME1737=m +CONFIG_SENSORS_EMC1403=m +CONFIG_SENSORS_EMC2103=m +CONFIG_SENSORS_EMC6W201=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_SCH56XX_COMMON=m +CONFIG_SENSORS_SCH5627=m +CONFIG_SENSORS_SCH5636=m +CONFIG_SENSORS_STTS751=m +CONFIG_SENSORS_SMM665=m +CONFIG_SENSORS_ADC128D818=m +CONFIG_SENSORS_ADS1015=m +CONFIG_SENSORS_ADS7828=m +CONFIG_SENSORS_ADS7871=m +CONFIG_SENSORS_AMC6821=m +CONFIG_SENSORS_INA209=m +CONFIG_SENSORS_INA2XX=m +CONFIG_SENSORS_INA3221=m +CONFIG_SENSORS_TC74=m +CONFIG_SENSORS_THMC50=m +CONFIG_SENSORS_TMP102=m +CONFIG_SENSORS_TMP103=m +CONFIG_SENSORS_TMP108=m +CONFIG_SENSORS_TMP401=m +CONFIG_SENSORS_TMP421=m +CONFIG_SENSORS_VIA_CPUTEMP=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT1211=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83793=m +CONFIG_SENSORS_W83795=m +# CONFIG_SENSORS_W83795_FANCTRL is not set +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83L786NG=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_XGENE=m + +# +# ACPI drivers +# +CONFIG_SENSORS_ACPI_POWER=m +CONFIG_SENSORS_ATK0110=m +CONFIG_THERMAL=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set +# CONFIG_CLOCK_THERMAL is not set +# CONFIG_DEVFREQ_THERMAL is not set +# CONFIG_THERMAL_EMULATION is not set +CONFIG_INTEL_POWERCLAMP=m +CONFIG_X86_PKG_TEMP_THERMAL=m +CONFIG_INTEL_SOC_DTS_IOSF_CORE=m +CONFIG_INTEL_SOC_DTS_THERMAL=m + +# +# ACPI INT340X thermal drivers +# +CONFIG_INT340X_THERMAL=m +CONFIG_ACPI_THERMAL_REL=m +CONFIG_INT3406_THERMAL=m +CONFIG_INTEL_BXT_PMIC_THERMAL=m +CONFIG_INTEL_PCH_THERMAL=m +CONFIG_GENERIC_ADC_THERMAL=m +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +# CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED is not set +# CONFIG_WATCHDOG_SYSFS is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +# CONFIG_WDAT_WDT is not set +CONFIG_XILINX_WATCHDOG=m +CONFIG_ZIIRAVE_WATCHDOG=m +# CONFIG_CADENCE_WATCHDOG is not set +CONFIG_DW_WATCHDOG=m +# CONFIG_MAX63XX_WATCHDOG is not set +CONFIG_RETU_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_F71808E_WDT=m +# CONFIG_SP5100_TCO is not set +CONFIG_SBC_FITPC2_WATCHDOG=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_IBMASR=m +CONFIG_WAFER_WDT=m +CONFIG_I6300ESB_WDT=m +CONFIG_IE6XX_WDT=m +CONFIG_ITCO_WDT=m +CONFIG_ITCO_VENDOR_SUPPORT=y +CONFIG_IT8712F_WDT=m +CONFIG_IT87_WDT=m +CONFIG_HP_WATCHDOG=m +CONFIG_HPWDT_NMI_DECODING=y +CONFIG_SC1200_WDT=m +CONFIG_PC87413_WDT=m +CONFIG_NV_TCO=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_SMSC_SCH311X_WDT=m +CONFIG_SMSC37B787_WDT=m +CONFIG_VIA_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +CONFIG_SBC_EPX_C3_WATCHDOG=m +# CONFIG_INTEL_MEI_WDT is not set +# CONFIG_NI903X_WDT is not set +# CONFIG_NIC7018_WDT is not set +CONFIG_MEN_A21_WDT=m +CONFIG_XEN_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +CONFIG_SSB=m +CONFIG_SSB_SPROM=y +CONFIG_SSB_BLOCKIO=y +CONFIG_SSB_PCIHOST_POSSIBLE=y +CONFIG_SSB_PCIHOST=y +CONFIG_SSB_B43_PCI_BRIDGE=y +CONFIG_SSB_PCMCIAHOST_POSSIBLE=y +CONFIG_SSB_PCMCIAHOST=y +CONFIG_SSB_SDIOHOST_POSSIBLE=y +CONFIG_SSB_SDIOHOST=y +# CONFIG_SSB_DEBUG is not set +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y +CONFIG_SSB_DRIVER_PCICORE=y +CONFIG_SSB_DRIVER_GPIO=y +CONFIG_BCMA_POSSIBLE=y +CONFIG_BCMA=m +CONFIG_BCMA_BLOCKIO=y +CONFIG_BCMA_HOST_PCI_POSSIBLE=y +CONFIG_BCMA_HOST_PCI=y +# CONFIG_BCMA_HOST_SOC is not set +CONFIG_BCMA_DRIVER_PCI=y +CONFIG_BCMA_DRIVER_GMAC_CMN=y +CONFIG_BCMA_DRIVER_GPIO=y +# CONFIG_BCMA_DEBUG is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +CONFIG_MFD_BCM590XX=m +CONFIG_MFD_BD9571MWV=m +CONFIG_MFD_AXP20X=m +CONFIG_MFD_AXP20X_I2C=m +CONFIG_MFD_CROS_EC=m +CONFIG_MFD_CROS_EC_I2C=m +CONFIG_MFD_CROS_EC_SPI=m +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +CONFIG_MFD_MC13XXX=m +# CONFIG_MFD_MC13XXX_SPI is not set +CONFIG_MFD_MC13XXX_I2C=m +CONFIG_HTC_PASIC3=m +# CONFIG_HTC_I2CPLD is not set +CONFIG_MFD_INTEL_QUARK_I2C_GPIO=m +CONFIG_LPC_ICH=m +CONFIG_LPC_SCH=m +CONFIG_INTEL_SOC_PMIC=y +CONFIG_INTEL_SOC_PMIC_BXTWC=m +# CONFIG_INTEL_SOC_PMIC_CHTWC is not set +CONFIG_INTEL_SOC_PMIC_CHTDC_TI=y +CONFIG_MFD_INTEL_LPSS=m +CONFIG_MFD_INTEL_LPSS_ACPI=m +CONFIG_MFD_INTEL_LPSS_PCI=m +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_EZX_PCAP is not set +CONFIG_MFD_VIPERBOARD=m +CONFIG_MFD_RETU=m +CONFIG_MFD_PCF50633=m +CONFIG_PCF50633_ADC=m +CONFIG_PCF50633_GPIO=m +CONFIG_UCB1400_CORE=m +CONFIG_MFD_RDC321X=m +CONFIG_MFD_RTSX_PCI=m +CONFIG_MFD_RT5033=m +CONFIG_MFD_RTSX_USB=m +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_SEC_CORE is not set +CONFIG_MFD_SI476X_CORE=m +CONFIG_MFD_SM501=m +CONFIG_MFD_SM501_GPIO=y +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_SMSC is not set +CONFIG_ABX500_CORE=y +# CONFIG_AB3100_CORE is not set +CONFIG_MFD_SYSCON=y +CONFIG_MFD_TI_AM335X_TSCADC=m +CONFIG_MFD_LP3943=m +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +CONFIG_TPS65010=m +CONFIG_TPS6507X=m +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +CONFIG_MFD_TPS68470=y +CONFIG_MFD_TI_LP873X=m +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +CONFIG_MFD_WL1273_CORE=m +CONFIG_MFD_LM3533=m +# CONFIG_MFD_TMIO is not set +CONFIG_MFD_VX855=m +CONFIG_MFD_ARIZONA=y +CONFIG_MFD_ARIZONA_I2C=m +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_CS47L24 is not set +CONFIG_MFD_WM5102=y +CONFIG_MFD_WM5110=y +# CONFIG_MFD_WM8997 is not set +# CONFIG_MFD_WM8998 is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_REGULATOR is not set +CONFIG_CEC_CORE=m +CONFIG_CEC_PIN=y +CONFIG_RC_CORE=m +CONFIG_RC_MAP=m +CONFIG_RC_DECODERS=y +CONFIG_LIRC=m +CONFIG_IR_LIRC_CODEC=m +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_SANYO_DECODER=m +CONFIG_IR_SHARP_DECODER=m +CONFIG_IR_MCE_KBD_DECODER=m +CONFIG_IR_XMP_DECODER=m +CONFIG_RC_DEVICES=y +CONFIG_RC_ATI_REMOTE=m +CONFIG_IR_ENE=m +CONFIG_IR_IMON=m +CONFIG_IR_MCEUSB=m +CONFIG_IR_ITE_CIR=m +CONFIG_IR_FINTEK=m +CONFIG_IR_NUVOTON=m +CONFIG_IR_REDRAT3=m +CONFIG_IR_STREAMZAP=m +CONFIG_IR_WINBOND_CIR=m +CONFIG_IR_IGORPLUGUSB=m +CONFIG_IR_IGUANA=m +CONFIG_IR_TTUSBIR=m +CONFIG_RC_LOOPBACK=m +CONFIG_IR_SERIAL=m +CONFIG_IR_SERIAL_TRANSMITTER=y +CONFIG_IR_SIR=m +CONFIG_MEDIA_SUPPORT=m + +# +# Multimedia core support +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CONTROLLER=y +# CONFIG_MEDIA_CONTROLLER_DVB is not set +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_VIDEO_V4L2=m +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_PCI_SKELETON=m +CONFIG_VIDEO_TUNER=m +CONFIG_V4L2_MEM2MEM_DEV=m +# CONFIG_V4L2_FLASH_LED_CLASS is not set +CONFIG_V4L2_FWNODE=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_DMA_SG=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_VIDEOBUF_DVB=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +CONFIG_VIDEOBUF2_DVB=m +CONFIG_DVB_CORE=m +CONFIG_DVB_NET=y +CONFIG_TTPCI_EEPROM=m +CONFIG_DVB_MAX_ADAPTERS=16 +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_USB_M5602=m +CONFIG_USB_STV06XX=m +CONFIG_USB_GL860=m +CONFIG_USB_GSPCA_BENQ=m +CONFIG_USB_GSPCA_CONEX=m +CONFIG_USB_GSPCA_CPIA1=m +CONFIG_USB_GSPCA_DTCS033=m +CONFIG_USB_GSPCA_ETOMS=m +CONFIG_USB_GSPCA_FINEPIX=m +CONFIG_USB_GSPCA_JEILINJ=m +CONFIG_USB_GSPCA_JL2005BCD=m +CONFIG_USB_GSPCA_KINECT=m +CONFIG_USB_GSPCA_KONICA=m +CONFIG_USB_GSPCA_MARS=m +CONFIG_USB_GSPCA_MR97310A=m +CONFIG_USB_GSPCA_NW80X=m +CONFIG_USB_GSPCA_OV519=m +CONFIG_USB_GSPCA_OV534=m +CONFIG_USB_GSPCA_OV534_9=m +CONFIG_USB_GSPCA_PAC207=m +CONFIG_USB_GSPCA_PAC7302=m +CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SE401=m +CONFIG_USB_GSPCA_SN9C2028=m +CONFIG_USB_GSPCA_SN9C20X=m +CONFIG_USB_GSPCA_SONIXB=m +CONFIG_USB_GSPCA_SONIXJ=m +CONFIG_USB_GSPCA_SPCA500=m +CONFIG_USB_GSPCA_SPCA501=m +CONFIG_USB_GSPCA_SPCA505=m +CONFIG_USB_GSPCA_SPCA506=m +CONFIG_USB_GSPCA_SPCA508=m +CONFIG_USB_GSPCA_SPCA561=m +CONFIG_USB_GSPCA_SPCA1528=m +CONFIG_USB_GSPCA_SQ905=m +CONFIG_USB_GSPCA_SQ905C=m +CONFIG_USB_GSPCA_SQ930X=m +CONFIG_USB_GSPCA_STK014=m +CONFIG_USB_GSPCA_STK1135=m +CONFIG_USB_GSPCA_STV0680=m +CONFIG_USB_GSPCA_SUNPLUS=m +CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TOPRO=m +CONFIG_USB_GSPCA_TOUPTEK=m +CONFIG_USB_GSPCA_TV8532=m +CONFIG_USB_GSPCA_VC032X=m +CONFIG_USB_GSPCA_VICAM=m +CONFIG_USB_GSPCA_XIRLINK_CIT=m +CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +CONFIG_VIDEO_CPIA2=m +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +CONFIG_VIDEO_USBTV=m + +# +# Analog TV USB devices +# +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +CONFIG_VIDEO_PVRUSB2_DVB=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_HDPVR=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_STK1160_COMMON=m +CONFIG_VIDEO_STK1160=m +CONFIG_VIDEO_GO7007=m +CONFIG_VIDEO_GO7007_USB=m +CONFIG_VIDEO_GO7007_LOADER=m +# CONFIG_VIDEO_GO7007_USB_S2250_BOARD is not set + +# +# Analog/digital TV USB devices +# +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_AU0828_V4L2=y +CONFIG_VIDEO_AU0828_RC=y +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_RC=y +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_VIDEO_TM6000=m +CONFIG_VIDEO_TM6000_ALSA=m +CONFIG_VIDEO_TM6000_DVB=m + +# +# Digital TV USB devices +# +CONFIG_DVB_USB=m +# CONFIG_DVB_USB_DEBUG is not set +CONFIG_DVB_USB_DIB3000MC=m +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_FRIIO=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_ZD1301=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_SMS_USB_DRV=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set +CONFIG_DVB_AS102=m + +# +# Webcam, TV (analog/digital) USB devices +# +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m + +# +# Software defined radio USB devices +# +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m + +# +# USB HDMI CEC adapters +# +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m +CONFIG_MEDIA_PCI_SUPPORT=y + +# +# Media capture support +# +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SOLO6X10=m +CONFIG_VIDEO_TW5864=m +CONFIG_VIDEO_TW68=m +CONFIG_VIDEO_TW686X=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_ZR36060=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_ZORAN_AVS6EYES=m + +# +# Media capture/analog TV support +# +CONFIG_VIDEO_IVTV=m +# CONFIG_VIDEO_IVTV_DEPRECATED_IOCTLS is not set +CONFIG_VIDEO_IVTV_ALSA=m +CONFIG_VIDEO_FB_IVTV=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DT3155=m + +# +# Media capture/analog/hybrid TV support +# +CONFIG_VIDEO_CX18=m +CONFIG_VIDEO_CX18_ALSA=m +CONFIG_VIDEO_CX23885=m +CONFIG_MEDIA_ALTERA_CI=m +CONFIG_VIDEO_CX25821=m +CONFIG_VIDEO_CX25821_ALSA=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_CX88_ALSA=m +CONFIG_VIDEO_CX88_BLACKBIRD=m +CONFIG_VIDEO_CX88_DVB=m +CONFIG_VIDEO_CX88_ENABLE_VP3054=y +CONFIG_VIDEO_CX88_VP3054=m +CONFIG_VIDEO_CX88_MPEG=m +CONFIG_VIDEO_BT848=m +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_SAA7134_ALSA=m +CONFIG_VIDEO_SAA7134_RC=y +CONFIG_VIDEO_SAA7134_DVB=m +CONFIG_VIDEO_SAA7134_GO7007=m +CONFIG_VIDEO_SAA7164=m +CONFIG_VIDEO_COBALT=m + +# +# Media digital TV PCI Adapters +# +CONFIG_DVB_AV7110_IR=y +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET_CORE=m +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m +CONFIG_DVB_B2C2_FLEXCOP_PCI=m +# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set +CONFIG_DVB_PLUTO2=m +CONFIG_DVB_DM1105=m +CONFIG_DVB_PT1=m +CONFIG_DVB_PT3=m +CONFIG_MANTIS_CORE=m +CONFIG_DVB_MANTIS=m +CONFIG_DVB_HOPPER=m +CONFIG_DVB_NGENE=m +CONFIG_DVB_DDBRIDGE=m +# CONFIG_DVB_DDBRIDGE_MSIENABLE is not set +CONFIG_DVB_SMIPCIE=m +CONFIG_DVB_NETUP_UNIDVB=m +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VIDEO_CAFE_CCIC=m +CONFIG_VIDEO_VIA_CAMERA=m +CONFIG_SOC_CAMERA=m +CONFIG_SOC_CAMERA_PLATFORM=m +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m +CONFIG_VIDEO_SH_VEU=m +CONFIG_V4L_TEST_DRIVERS=y +# CONFIG_VIDEO_VIMC is not set +# CONFIG_VIDEO_VIVID is not set +# CONFIG_VIDEO_VIM2M is not set +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_CEC_PLATFORM_DRIVERS=y +CONFIG_CEC_GPIO=m +# CONFIG_SDR_PLATFORM_DRIVERS is not set + +# +# Supported MMC/SDIO adapters +# +CONFIG_SMS_SDIO_DRV=m +CONFIG_RADIO_ADAPTERS=y +CONFIG_RADIO_TEA575X=m +CONFIG_RADIO_SI470X=y +CONFIG_USB_SI470X=m +CONFIG_I2C_SI470X=m +CONFIG_RADIO_SI4713=m +CONFIG_USB_SI4713=m +CONFIG_PLATFORM_SI4713=m +CONFIG_I2C_SI4713=m +CONFIG_RADIO_SI476X=m +CONFIG_USB_MR800=m +CONFIG_USB_DSBR=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_USB_KEENE=m +CONFIG_USB_RAREMONO=m +CONFIG_USB_MA901=m +CONFIG_RADIO_TEA5764=m +CONFIG_RADIO_SAA7706H=m +CONFIG_RADIO_TEF6862=m +CONFIG_RADIO_WL1273=m + +# +# Texas Instruments WL128x FM driver (ST based) +# +CONFIG_RADIO_WL128X=m + +# +# Supported FireWire (IEEE 1394) Adapters +# +CONFIG_DVB_FIREDTV=m +CONFIG_DVB_FIREDTV_INPUT=y +CONFIG_MEDIA_COMMON_OPTIONS=y + +# +# common driver options +# +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_CYPRESS_FIRMWARE=m +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_SMS_SIANO_MDTV=m +CONFIG_SMS_SIANO_RC=y +# CONFIG_SMS_SIANO_DEBUGFS is not set + +# +# Media ancillary drivers (tuners, sensors, i2c, spi, frontends) +# +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y +CONFIG_MEDIA_ATTACH=y +CONFIG_VIDEO_IR_I2C=m + +# +# Audio decoders, processors and mixers +# +CONFIG_VIDEO_TVAUDIO=m +CONFIG_VIDEO_TDA7432=m +CONFIG_VIDEO_TDA9840=m +CONFIG_VIDEO_TEA6415C=m +CONFIG_VIDEO_TEA6420=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS3308=m +CONFIG_VIDEO_CS5345=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_UDA1342=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_VP27SMPX=m +CONFIG_VIDEO_SONY_BTF_MPX=m + +# +# RDS decoders +# +CONFIG_VIDEO_SAA6588=m + +# +# Video decoders +# +CONFIG_VIDEO_ADV7604=m +CONFIG_VIDEO_ADV7842=m +CONFIG_VIDEO_BT819=m +CONFIG_VIDEO_BT856=m +CONFIG_VIDEO_BT866=m +CONFIG_VIDEO_KS0127=m +CONFIG_VIDEO_SAA7110=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_TW2804=m +CONFIG_VIDEO_TW9903=m +CONFIG_VIDEO_TW9906=m +CONFIG_VIDEO_VPX3220=m + +# +# Video and audio decoders +# +CONFIG_VIDEO_SAA717X=m +CONFIG_VIDEO_CX25840=m + +# +# Video encoders +# +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_SAA7185=m +CONFIG_VIDEO_ADV7170=m +CONFIG_VIDEO_ADV7175=m +CONFIG_VIDEO_ADV7511=m + +# +# Camera sensor devices +# +CONFIG_VIDEO_OV2640=m +CONFIG_VIDEO_OV7640=m +CONFIG_VIDEO_OV7670=m +CONFIG_VIDEO_MT9M111=m +CONFIG_VIDEO_MT9V011=m + +# +# Flash devices +# + +# +# Video improvement chips +# +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# Audio/Video compression chips +# +CONFIG_VIDEO_SAA6752HS=m + +# +# SDR tuner chips +# + +# +# Miscellaneous helper chips +# +CONFIG_VIDEO_M52790=m + +# +# Sensors used on soc_camera driver +# + +# +# soc_camera sensor drivers +# +CONFIG_SOC_CAMERA_IMX074=m +CONFIG_SOC_CAMERA_MT9M001=m +CONFIG_SOC_CAMERA_MT9M111=m +CONFIG_SOC_CAMERA_MT9T031=m +CONFIG_SOC_CAMERA_MT9T112=m +CONFIG_SOC_CAMERA_MT9V022=m +CONFIG_SOC_CAMERA_OV5642=m +CONFIG_SOC_CAMERA_OV772X=m +CONFIG_SOC_CAMERA_OV9640=m +CONFIG_SOC_CAMERA_OV9740=m +CONFIG_SOC_CAMERA_RJ54N1=m +CONFIG_SOC_CAMERA_TW9910=m +CONFIG_MEDIA_TUNER=m +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA827X=m +CONFIG_MEDIA_TUNER_TDA18271=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MSI001=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT2266=m +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_MEDIA_TUNER_XC4000=m +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +CONFIG_MEDIA_TUNER_MC44S803=m +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_M88RS6000T=m +CONFIG_MEDIA_TUNER_TUA9001=m +CONFIG_MEDIA_TUNER_SI2157=m +CONFIG_MEDIA_TUNER_IT913X=m +CONFIG_MEDIA_TUNER_R820T=m +CONFIG_MEDIA_TUNER_MXL301RF=m +CONFIG_MEDIA_TUNER_QM1D1C0042=m + +# +# Multistandard (satellite) frontends +# +CONFIG_DVB_STB0899=m +CONFIG_DVB_STB6100=m +CONFIG_DVB_STV090x=m +CONFIG_DVB_STV0910=m +CONFIG_DVB_STV6110x=m +CONFIG_DVB_STV6111=m +CONFIG_DVB_MXL5XX=m +CONFIG_DVB_M88DS3103=m + +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_TDA18271C2DD=m +CONFIG_DVB_SI2165=m +CONFIG_DVB_MN88472=m +CONFIG_DVB_MN88473=m + +# +# DVB-S (satellite) frontends +# +CONFIG_DVB_CX24110=m +CONFIG_DVB_CX24123=m +CONFIG_DVB_MT312=m +CONFIG_DVB_ZL10036=m +CONFIG_DVB_ZL10039=m +CONFIG_DVB_S5H1420=m +CONFIG_DVB_STV0288=m +CONFIG_DVB_STB6000=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_STV6110=m +CONFIG_DVB_STV0900=m +CONFIG_DVB_TDA8083=m +CONFIG_DVB_TDA10086=m +CONFIG_DVB_TDA8261=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TUNER_ITD1000=m +CONFIG_DVB_TUNER_CX24113=m +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TUA6100=m +CONFIG_DVB_CX24116=m +CONFIG_DVB_CX24117=m +CONFIG_DVB_CX24120=m +CONFIG_DVB_SI21XX=m +CONFIG_DVB_TS2020=m +CONFIG_DVB_DS3000=m +CONFIG_DVB_MB86A16=m +CONFIG_DVB_TDA10071=m + +# +# DVB-T (terrestrial) frontends +# +CONFIG_DVB_SP8870=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_CX22700=m +CONFIG_DVB_CX22702=m +CONFIG_DVB_DRXD=m +CONFIG_DVB_L64781=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_NXT6000=m +CONFIG_DVB_MT352=m +CONFIG_DVB_ZL10353=m +CONFIG_DVB_DIB3000MB=m +CONFIG_DVB_DIB3000MC=m +CONFIG_DVB_DIB7000M=m +CONFIG_DVB_DIB7000P=m +CONFIG_DVB_TDA10048=m +CONFIG_DVB_AF9013=m +CONFIG_DVB_EC100=m +CONFIG_DVB_STV0367=m +CONFIG_DVB_CXD2820R=m +CONFIG_DVB_CXD2841ER=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m +CONFIG_DVB_RTL2832_SDR=m +CONFIG_DVB_SI2168=m +CONFIG_DVB_AS102_FE=m +CONFIG_DVB_ZD1301_DEMOD=m +CONFIG_DVB_GP8PSK_FE=m + +# +# DVB-C (cable) frontends +# +CONFIG_DVB_VES1820=m +CONFIG_DVB_TDA10021=m +CONFIG_DVB_TDA10023=m +CONFIG_DVB_STV0297=m + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +CONFIG_DVB_NXT200X=m +CONFIG_DVB_OR51211=m +CONFIG_DVB_OR51132=m +CONFIG_DVB_BCM3510=m +CONFIG_DVB_LGDT330X=m +CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LGDT3306A=m +CONFIG_DVB_LG2160=m +CONFIG_DVB_S5H1409=m +CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m +CONFIG_DVB_S5H1411=m + +# +# ISDB-T (terrestrial) frontends +# +CONFIG_DVB_S921=m +CONFIG_DVB_DIB8000=m +CONFIG_DVB_MB86A20S=m + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +CONFIG_DVB_TC90522=m + +# +# Digital terrestrial only tuners/PLL +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m + +# +# SEC control devices for DVB-S +# +CONFIG_DVB_DRX39XYJ=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m +CONFIG_DVB_A8293=m +CONFIG_DVB_SP2=m +CONFIG_DVB_LGS8GXX=m +CONFIG_DVB_ATBM8830=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_IX2505V=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_AF9033=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set + +# +# Graphics support +# +CONFIG_AGP=y +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_SIS=m +CONFIG_AGP_VIA=m +CONFIG_INTEL_GTT=m +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +CONFIG_VGA_SWITCHEROO=y +CONFIG_DRM=m +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_DP_AUX_CHARDEV=y +# CONFIG_DRM_DEBUG_MM_SELFTEST is not set +CONFIG_DRM_KMS_HELPER=m +CONFIG_DRM_KMS_FB_HELPER=y +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_TTM=m +CONFIG_DRM_GEM_CMA_HELPER=y +CONFIG_DRM_KMS_CMA_HELPER=y +CONFIG_DRM_VM=y + +# +# I2C encoder or helper chips +# +CONFIG_DRM_I2C_CH7006=m +CONFIG_DRM_I2C_SIL164=m +CONFIG_DRM_I2C_NXP_TDA998X=m +CONFIG_DRM_RADEON=m +# CONFIG_DRM_RADEON_USERPTR is not set +CONFIG_DRM_AMDGPU=m +CONFIG_DRM_AMDGPU_SI=y +CONFIG_DRM_AMDGPU_CIK=y +CONFIG_DRM_AMDGPU_USERPTR=y +# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set + +# +# ACP (Audio CoProcessor) Configuration +# +CONFIG_DRM_AMD_ACP=y + +# +# Display Engine Configuration +# +CONFIG_DRM_AMD_DC=y +CONFIG_DRM_AMD_DC_PRE_VEGA=y +CONFIG_DRM_AMD_DC_FBC=y +CONFIG_DRM_AMD_DC_DCN1_0=y +# CONFIG_DEBUG_KERNEL_DC is not set + +# +# AMD Library routines +# +CONFIG_CHASH=m +CONFIG_CHASH_STATS=y +# CONFIG_CHASH_SELFTEST is not set +CONFIG_DRM_NOUVEAU=m +CONFIG_NOUVEAU_DEBUG=5 +CONFIG_NOUVEAU_DEBUG_DEFAULT=3 +# CONFIG_NOUVEAU_DEBUG_MMU is not set +CONFIG_DRM_NOUVEAU_BACKLIGHT=y +CONFIG_DRM_I915=m +CONFIG_DRM_I915_ALPHA_SUPPORT=y +CONFIG_DRM_I915_CAPTURE_ERROR=y +CONFIG_DRM_I915_COMPRESS_ERROR=y +CONFIG_DRM_I915_USERPTR=y +CONFIG_DRM_I915_GVT=y +CONFIG_DRM_VGEM=m +CONFIG_DRM_VMWGFX=m +CONFIG_DRM_VMWGFX_FBCON=y +CONFIG_DRM_GMA500=m +CONFIG_DRM_GMA600=y +CONFIG_DRM_GMA3600=y +CONFIG_DRM_UDL=m +CONFIG_DRM_AST=m +CONFIG_DRM_MGAG200=m +CONFIG_DRM_CIRRUS_QEMU=m +CONFIG_DRM_QXL=m +CONFIG_DRM_BOCHS=m +CONFIG_DRM_VIRTIO_GPU=m +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +CONFIG_DRM_ANALOGIX_ANX78XX=m +CONFIG_HSA_AMD=m +CONFIG_DRM_HISI_HIBMC=m +CONFIG_DRM_TINYDRM=m +CONFIG_TINYDRM_MIPI_DBI=m +CONFIG_TINYDRM_MI0283QT=m +CONFIG_TINYDRM_REPAPER=m +CONFIG_TINYDRM_ST7586=m +# CONFIG_DRM_LEGACY is not set +# CONFIG_DRM_LIB_RANDOM is not set + +# +# Frame buffer Devices +# +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +# CONFIG_FB_DDC is not set +CONFIG_FB_BOOT_VESA_SUPPORT=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +CONFIG_FB_SYS_FILLRECT=m +CONFIG_FB_SYS_COPYAREA=m +CONFIG_FB_SYS_IMAGEBLIT=m +# CONFIG_FB_PROVIDE_GET_FB_UNMAPPED_AREA is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=m +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +CONFIG_FB_BACKLIGHT=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_UVESA=m +CONFIG_FB_VESA=y +CONFIG_FB_EFI=y +# CONFIG_FB_N411 is not set +# CONFIG_FB_HGA is not set +CONFIG_FB_OPENCORES=m +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_LE80578 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +CONFIG_FB_VIA=m +CONFIG_FB_VIA_DIRECT_PROCFS=y +CONFIG_FB_VIA_X_COMPATIBILITY=y +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +CONFIG_FB_VOODOO1=m +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SM501 is not set +# CONFIG_FB_SMSCUFX is not set +CONFIG_FB_UDL=m +CONFIG_FB_IBM_GXT4500=m +CONFIG_FB_VIRTUAL=m +CONFIG_XEN_FBDEV_FRONTEND=m +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_AUO_K190X is not set +CONFIG_FB_HYPERV=m +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SM712 is not set +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=m +# CONFIG_LCD_L4F00242T03 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI922X is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +CONFIG_LCD_PLATFORM=m +# CONFIG_LCD_S6E63M0 is not set +# CONFIG_LCD_LD9040 is not set +# CONFIG_LCD_AMS369FG06 is not set +# CONFIG_LCD_LMS501KF03 is not set +# CONFIG_LCD_HX8357 is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_GENERIC is not set +CONFIG_BACKLIGHT_LM3533=m +CONFIG_BACKLIGHT_APPLE=m +# CONFIG_BACKLIGHT_PM8941_WLED is not set +# CONFIG_BACKLIGHT_SAHARA is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +CONFIG_BACKLIGHT_PCF50633=m +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +CONFIG_VGASTATE=m +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_VGACON_SOFT_SCROLLBACK is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_LOGO is not set +CONFIG_SOUND=m +CONFIG_SOUND_OSS_CORE=y +# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_DMAENGINE_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_SEQ_DEVICE=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_COMPRESS_OFFLOAD=m +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=m +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y +CONFIG_SND_DMA_SGBUF=y +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SEQUENCER_OSS=m +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=m +CONFIG_SND_SEQ_MIDI=m +CONFIG_SND_SEQ_MIDI_EMUL=m +CONFIG_SND_SEQ_VIRMIDI=m +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL3_LIB_SEQ=m +# CONFIG_SND_OPL4_LIB_SEQ is not set +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DRIVERS=y +# CONFIG_SND_PCSP is not set +CONFIG_SND_DUMMY=m +CONFIG_SND_ALOOP=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_MTS64=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m +CONFIG_SND_PORTMAN2X4=m +CONFIG_SND_AC97_POWER_SAVE=y +CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0 +CONFIG_SND_SB_COMMON=m +CONFIG_SND_PCI=y +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ASIHPI=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_ATIIXP_MODEM=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AW2=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +# CONFIG_SND_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_OXYGEN_LIB=m +CONFIG_SND_OXYGEN=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CTXFI=m +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_INDIGOIOX=m +CONFIG_SND_INDIGODJX=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1_SEQ=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_ES1968_INPUT=y +CONFIG_SND_ES1968_RADIO=y +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_LOLA=m +CONFIG_SND_LX6464ES=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MAESTRO3_INPUT=y +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VIRTUOSO=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m + +# +# HD-Audio +# +CONFIG_SND_HDA=m +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDA_HWDEP=y +CONFIG_SND_HDA_RECONFIG=y +CONFIG_SND_HDA_INPUT_BEEP=y +CONFIG_SND_HDA_INPUT_BEEP_MODE=1 +CONFIG_SND_HDA_PATCH_LOADER=y +CONFIG_SND_HDA_CODEC_REALTEK=m +CONFIG_SND_HDA_CODEC_ANALOG=m +CONFIG_SND_HDA_CODEC_SIGMATEL=m +CONFIG_SND_HDA_CODEC_VIA=m +CONFIG_SND_HDA_CODEC_HDMI=m +CONFIG_SND_HDA_CODEC_CIRRUS=m +CONFIG_SND_HDA_CODEC_CONEXANT=m +CONFIG_SND_HDA_CODEC_CA0110=m +CONFIG_SND_HDA_CODEC_CA0132=m +CONFIG_SND_HDA_CODEC_CA0132_DSP=y +CONFIG_SND_HDA_CODEC_CMEDIA=m +CONFIG_SND_HDA_CODEC_SI3054=m +CONFIG_SND_HDA_GENERIC=m +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_CORE=m +CONFIG_SND_HDA_DSP_LOADER=y +CONFIG_SND_HDA_I915=y +CONFIG_SND_HDA_EXT_CORE=m +CONFIG_SND_HDA_PREALLOC_SIZE=4096 +CONFIG_SND_SPI=y +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_UA101=m +CONFIG_SND_USB_USX2Y=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_US122L=m +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m +CONFIG_SND_BCD2000=m +CONFIG_SND_USB_LINE6=m +CONFIG_SND_USB_POD=m +CONFIG_SND_USB_PODHD=m +CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_USB_VARIAX=m +CONFIG_SND_FIREWIRE=y +CONFIG_SND_FIREWIRE_LIB=m +CONFIG_SND_DICE=m +CONFIG_SND_OXFW=m +CONFIG_SND_ISIGHT=m +CONFIG_SND_FIREWORKS=m +CONFIG_SND_BEBOB=m +CONFIG_SND_FIREWIRE_DIGI00X=m +CONFIG_SND_FIREWIRE_TASCAM=m +CONFIG_SND_FIREWIRE_MOTU=m +CONFIG_SND_FIREFACE=m +CONFIG_SND_PCMCIA=y +CONFIG_SND_VXPOCKET=m +CONFIG_SND_PDAUDIOCF=m +CONFIG_SND_SOC=m +CONFIG_SND_SOC_AC97_BUS=y +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +CONFIG_SND_SOC_COMPRESS=y +CONFIG_SND_SOC_TOPOLOGY=y +CONFIG_SND_SOC_ACPI=m +CONFIG_SND_SOC_AMD_ACP=m +CONFIG_SND_SOC_AMD_CZ_RT5645_MACH=m +CONFIG_SND_ATMEL_SOC=m +CONFIG_SND_DESIGNWARE_I2S=m +CONFIG_SND_DESIGNWARE_PCM=y + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +# CONFIG_SND_SOC_FSL_SAI is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_IMX_AUDMUX is not set +CONFIG_SND_I2S_HI6210_I2S=m +CONFIG_SND_SOC_IMG=y +CONFIG_SND_SOC_IMG_I2S_IN=m +CONFIG_SND_SOC_IMG_I2S_OUT=m +CONFIG_SND_SOC_IMG_PARALLEL_OUT=m +CONFIG_SND_SOC_IMG_SPDIF_IN=m +CONFIG_SND_SOC_IMG_SPDIF_OUT=m +CONFIG_SND_SOC_IMG_PISTACHIO_INTERNAL_DAC=m +CONFIG_SND_SST_IPC=m +CONFIG_SND_SST_IPC_ACPI=m +CONFIG_SND_SOC_INTEL_COMMON=m +CONFIG_SND_SOC_INTEL_SST=m +CONFIG_SND_SOC_INTEL_SST_FIRMWARE=m +CONFIG_SND_SOC_INTEL_SST_ACPI=m +CONFIG_SND_SOC_ACPI_INTEL_MATCH=m +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=m +CONFIG_SND_SOC_INTEL_HASWELL=m +CONFIG_SND_SOC_INTEL_BAYTRAIL=m +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM=m +CONFIG_SND_SOC_INTEL_SKYLAKE=m +CONFIG_SND_SOC_INTEL_MACH=m +CONFIG_SND_SOC_INTEL_HASWELL_MACH=m +CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH=m +CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m +CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=m +CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH=m +CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH=m +CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH=m +CONFIG_SND_SOC_INTEL_SKL_RT286_MACH=m +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH=m +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH=m +CONFIG_SND_SOC_INTEL_BXT_RT298_MACH=m +CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH=m +CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH=m + +# +# STMicroelectronics STM32 SOC audio support +# +CONFIG_SND_SOC_XTFPGA_I2S=m +CONFIG_ZX_TDM=m +CONFIG_SND_SOC_I2C_AND_SPI=m + +# +# CODEC drivers +# +CONFIG_SND_SOC_AC97_CODEC=m +CONFIG_SND_SOC_ADAU_UTILS=m +CONFIG_SND_SOC_ADAU1701=m +CONFIG_SND_SOC_ADAU17X1=m +CONFIG_SND_SOC_ADAU1761=m +CONFIG_SND_SOC_ADAU1761_I2C=m +CONFIG_SND_SOC_ADAU1761_SPI=m +CONFIG_SND_SOC_ADAU7002=m +CONFIG_SND_SOC_AK4104=m +CONFIG_SND_SOC_AK4554=m +CONFIG_SND_SOC_AK4613=m +CONFIG_SND_SOC_AK4642=m +CONFIG_SND_SOC_AK5386=m +CONFIG_SND_SOC_ALC5623=m +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +CONFIG_SND_SOC_DA7213=m +CONFIG_SND_SOC_DA7219=m +# CONFIG_SND_SOC_DIO2125 is not set +CONFIG_SND_SOC_DMIC=m +CONFIG_SND_SOC_HDMI_CODEC=m +# CONFIG_SND_SOC_ES7134 is not set +CONFIG_SND_SOC_ES8316=m +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +CONFIG_SND_SOC_GTM601=m +CONFIG_SND_SOC_HDAC_HDMI=m +CONFIG_SND_SOC_INNO_RK3036=m +CONFIG_SND_SOC_MAX98090=m +CONFIG_SND_SOC_MAX98357A=m +CONFIG_SND_SOC_MAX98504=m +CONFIG_SND_SOC_MAX98927=m +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +CONFIG_SND_SOC_RL6231=m +CONFIG_SND_SOC_RL6347A=m +CONFIG_SND_SOC_RT286=m +CONFIG_SND_SOC_RT298=m +CONFIG_SND_SOC_RT5514=m +CONFIG_SND_SOC_RT5514_SPI=m +# CONFIG_SND_SOC_RT5514_SPI_BUILTIN is not set +CONFIG_SND_SOC_RT5616=m +CONFIG_SND_SOC_RT5631=m +CONFIG_SND_SOC_RT5640=m +CONFIG_SND_SOC_RT5645=m +CONFIG_SND_SOC_RT5651=m +CONFIG_SND_SOC_RT5663=m +CONFIG_SND_SOC_RT5670=m +CONFIG_SND_SOC_RT5677=m +CONFIG_SND_SOC_RT5677_SPI=m +# CONFIG_SND_SOC_SGTL5000 is not set +CONFIG_SND_SOC_SI476X=m +CONFIG_SND_SOC_SIGMADSP=m +CONFIG_SND_SOC_SIGMADSP_I2C=m +CONFIG_SND_SOC_SIGMADSP_REGMAP=m +# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +CONFIG_SND_SOC_SPDIF=m +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +CONFIG_SND_SOC_SSM4567=m +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC3X is not set +CONFIG_SND_SOC_TS3A227E=m +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731 is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +CONFIG_SND_SOC_ZX_AUD96P22=m +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8824 is not set +CONFIG_SND_SOC_NAU8825=m +# CONFIG_SND_SOC_TPA6130A2 is not set +CONFIG_SND_SIMPLE_CARD_UTILS=m +CONFIG_SND_SIMPLE_CARD=m +CONFIG_SND_X86=y +# CONFIG_HDMI_LPE_AUDIO is not set +CONFIG_SND_SYNTH_EMUX=m +CONFIG_AC97_BUS=m + +# +# HID support +# +CONFIG_HID=m +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_GENERIC=m + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=m +CONFIG_HID_ACCUTOUCH=m +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +CONFIG_HID_ASUS=m +CONFIG_HID_AUREAL=m +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_PRODIKEYS=m +# CONFIG_HID_CMEDIA is not set +CONFIG_HID_CP2112=m +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=m +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +CONFIG_HID_EZKEY=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_HOLTEK=m +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=m +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +CONFIG_HID_UCLOGIC=m +CONFIG_HID_WALTOP=m +CONFIG_HID_GYRATION=m +CONFIG_HID_ICADE=m +CONFIG_HID_ITE=m +CONFIG_HID_TWINHAN=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LED=m +CONFIG_HID_LENOVO=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_LOGITECH_HIDPP=m +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=m +# CONFIG_HID_MAYFLASH is not set +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NTI=m +CONFIG_HID_NTRIG=m +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PICOLCD_CIR=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PRIMAX=m +# CONFIG_HID_RETRODE is not set +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=m +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +CONFIG_HID_RMI=m +CONFIG_HID_GREENASIA=m +CONFIG_GREENASIA_FF=y +CONFIG_HID_HYPERV_MOUSE=m +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_THRUSTMASTER_FF=y +# CONFIG_HID_UDRAW_PS3 is not set +CONFIG_HID_WACOM=m +CONFIG_HID_WIIMOTE=m +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=m +CONFIG_HID_SENSOR_HUB=m +# CONFIG_HID_SENSOR_CUSTOM_SENSOR is not set +CONFIG_HID_ALPS=m + +# +# USB HID support +# +CONFIG_USB_HID=m +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y + +# +# I2C HID support +# +CONFIG_I2C_HID=m + +# +# Intel ISH HID support +# +# CONFIG_INTEL_ISH_HID is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=m +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=m +CONFIG_USB_PCI=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +CONFIG_USB_DYNAMIC_MINORS=y +# CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_MON=m +CONFIG_USB_WUSB=m +CONFIG_USB_WUSB_CBAF=m +# CONFIG_USB_WUSB_CBAF_DEBUG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_C67X00_HCD=m +CONFIG_USB_XHCI_HCD=m +CONFIG_USB_XHCI_PCI=m +# CONFIG_USB_XHCI_PLATFORM is not set +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=m +# CONFIG_USB_EHCI_HCD_PLATFORM is not set +CONFIG_USB_OXU210HP_HCD=m +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_ISP1362_HCD=m +# CONFIG_USB_FOTG210_HCD is not set +CONFIG_USB_MAX3421_HCD=m +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_OHCI_HCD_PCI=m +# CONFIG_USB_OHCI_HCD_SSB is not set +# CONFIG_USB_OHCI_HCD_PLATFORM is not set +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_U132_HCD=m +CONFIG_USB_SL811_HCD=m +# CONFIG_USB_SL811_HCD_ISO is not set +CONFIG_USB_SL811_CS=m +CONFIG_USB_R8A66597_HCD=m +CONFIG_USB_WHCI_HCD=m +CONFIG_USB_HWA_HCD=m +# CONFIG_USB_HCD_BCMA is not set +# CONFIG_USB_HCD_SSB is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_WDM=m +CONFIG_USB_TMC=m + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_REALTEK=m +CONFIG_REALTEK_AUTOPM=y +CONFIG_USB_STORAGE_DATAFAB=m +CONFIG_USB_STORAGE_FREECOM=m +CONFIG_USB_STORAGE_ISD200=m +CONFIG_USB_STORAGE_USBAT=m +CONFIG_USB_STORAGE_SDDR09=m +CONFIG_USB_STORAGE_SDDR55=m +CONFIG_USB_STORAGE_JUMPSHOT=m +CONFIG_USB_STORAGE_ALAUDA=m +CONFIG_USB_STORAGE_ONETOUCH=m +CONFIG_USB_STORAGE_KARMA=m +CONFIG_USB_STORAGE_CYPRESS_ATACB=m +CONFIG_USB_STORAGE_ENE_UB6250=m +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USBIP_CORE=m +CONFIG_USBIP_VHCI_HCD=m +CONFIG_USBIP_VHCI_HC_PORTS=8 +CONFIG_USBIP_VHCI_NR_HCS=1 +CONFIG_USBIP_HOST=m +CONFIG_USBIP_VUDC=m +# CONFIG_USBIP_DEBUG is not set +CONFIG_USB_MUSB_HDRC=m +# CONFIG_USB_MUSB_HOST is not set +# CONFIG_USB_MUSB_GADGET is not set +CONFIG_USB_MUSB_DUAL_ROLE=y + +# +# Platform Glue Layer +# + +# +# MUSB DMA mode +# +CONFIG_MUSB_PIO_ONLY=y +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +CONFIG_USB_USS720=m +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_SIMPLE=m +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_F81232=m +CONFIG_USB_SERIAL_F8153X=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_IUU=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_METRO=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7715_PARPORT=y +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_MXUPORT=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_QCAUX=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SPCP8X5=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_SYMBOL=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_OPTICON=m +CONFIG_USB_SERIAL_XSENS_MT=m +CONFIG_USB_SERIAL_WISHBONE=m +CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_QT2=m +CONFIG_USB_SERIAL_UPD78F0730=m +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_ADUTUX=m +CONFIG_USB_SEVSEG=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_CYPRESS_CY7C63=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_FTDI_ELAN=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_SISUSBVGA=m +# CONFIG_USB_SISUSBVGA_CON is not set +CONFIG_USB_LD=m +CONFIG_USB_TRANCEVIBRATOR=m +CONFIG_USB_IOWARRIOR=m +CONFIG_USB_TEST=m +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +CONFIG_USB_ISIGHTFW=m +CONFIG_USB_YUREX=m +CONFIG_USB_EZUSB_FX2=m +CONFIG_USB_HUB_USB251XB=m +CONFIG_USB_HSIC_USB3503=m +CONFIG_USB_HSIC_USB4604=m +CONFIG_USB_LINK_LAYER_TEST=m +CONFIG_USB_CHAOSKEY=m +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=m +# CONFIG_USB_GPIO_VBUS is not set +CONFIG_TAHVO_USB=m +# CONFIG_TAHVO_USB_HOST_BY_DEFAULT is not set +CONFIG_USB_ISP1301=m +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_U_SERIAL_CONSOLE=y + +# +# USB Peripheral Controller +# +# CONFIG_USB_FOTG210_UDC is not set +CONFIG_USB_GR_UDC=m +CONFIG_USB_R8A66597=m +CONFIG_USB_PXA27X=m +CONFIG_USB_MV_UDC=m +CONFIG_USB_MV_U3D=m +CONFIG_USB_SNP_CORE=m +CONFIG_USB_M66592=m +CONFIG_USB_BDC_UDC=m + +# +# Platform Support +# +CONFIG_USB_BDC_PCI=m +CONFIG_USB_AMD5536UDC=m +CONFIG_USB_NET2272=m +CONFIG_USB_NET2272_DMA=y +CONFIG_USB_NET2280=m +CONFIG_USB_GOKU=m +CONFIG_USB_EG20T=m +CONFIG_USB_DUMMY_HCD=m +CONFIG_USB_LIBCOMPOSITE=m +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_U_ETHER=m +CONFIG_USB_U_AUDIO=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_NCM=m +CONFIG_USB_F_ECM=m +CONFIG_USB_F_SUBSET=m +CONFIG_USB_F_RNDIS=m +CONFIG_USB_F_MASS_STORAGE=m +CONFIG_USB_F_FS=m +CONFIG_USB_F_UAC2=m +CONFIG_USB_F_UVC=m +CONFIG_USB_F_MIDI=m +CONFIG_USB_F_HID=m +CONFIG_USB_F_PRINTER=m +CONFIG_USB_F_TCM=m +# CONFIG_USB_CONFIGFS is not set +# CONFIG_USB_ZERO is not set +CONFIG_USB_AUDIO=m +# CONFIG_GADGET_UAC1 is not set +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +# CONFIG_USB_ETH_EEM is not set +CONFIG_USB_G_NCM=m +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_FUNCTIONFS_ETH=y +CONFIG_USB_FUNCTIONFS_RNDIS=y +CONFIG_USB_FUNCTIONFS_GENERIC=y +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_GADGET_TARGET=m +CONFIG_USB_G_SERIAL=m +CONFIG_USB_MIDI_GADGET=m +CONFIG_USB_G_PRINTER=m +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_NOKIA is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +CONFIG_USB_G_HID=m +CONFIG_USB_G_DBGP=m +# CONFIG_USB_G_DBGP_PRINTK is not set +CONFIG_USB_G_DBGP_SERIAL=y +CONFIG_USB_G_WEBCAM=m +CONFIG_TYPEC=m +CONFIG_TYPEC_TCPM=m +CONFIG_TYPEC_FUSB302=m +# CONFIG_TYPEC_UCSI is not set +CONFIG_TYPEC_TPS6598X=m +CONFIG_USB_LED_TRIG=y +# CONFIG_USB_ULPI_BUS is not set +CONFIG_UWB=m +CONFIG_UWB_HWA=m +CONFIG_UWB_WHCI=m +CONFIG_UWB_I1480U=m +CONFIG_MMC=m +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_MINORS=8 +CONFIG_SDIO_UART=m +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_SDHCI=m +CONFIG_MMC_SDHCI_PCI=m +CONFIG_MMC_RICOH_MMC=y +CONFIG_MMC_SDHCI_ACPI=m +CONFIG_MMC_SDHCI_PLTFM=m +CONFIG_MMC_WBSD=m +CONFIG_MMC_TIFM_SD=m +CONFIG_MMC_SPI=m +CONFIG_MMC_SDRICOH_CS=m +CONFIG_MMC_CB710=m +CONFIG_MMC_VIA_SDMMC=m +CONFIG_MMC_VUB300=m +CONFIG_MMC_USHC=m +CONFIG_MMC_USDHI6ROL0=m +CONFIG_MMC_REALTEK_PCI=m +CONFIG_MMC_REALTEK_USB=m +CONFIG_MMC_TOSHIBA_PCI=m +CONFIG_MMC_MTK=m +CONFIG_MMC_SDHCI_XENON=m +CONFIG_MEMSTICK=m +# CONFIG_MEMSTICK_DEBUG is not set + +# +# MemoryStick drivers +# +# CONFIG_MEMSTICK_UNSAFE_RESUME is not set +CONFIG_MSPRO_BLOCK=m +CONFIG_MS_BLOCK=m + +# +# MemoryStick Host Controller Drivers +# +CONFIG_MEMSTICK_TIFM_MS=m +CONFIG_MEMSTICK_JMICRON_38X=m +CONFIG_MEMSTICK_R592=m +CONFIG_MEMSTICK_REALTEK_PCI=m +CONFIG_MEMSTICK_REALTEK_USB=m +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=m +CONFIG_LEDS_CLASS_FLASH=m +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +CONFIG_LEDS_APU=m +# CONFIG_LEDS_AS3645A is not set +CONFIG_LEDS_LM3530=m +CONFIG_LEDS_LM3533=m +CONFIG_LEDS_LM3642=m +CONFIG_LEDS_PCA9532=m +# CONFIG_LEDS_PCA9532_GPIO is not set +CONFIG_LEDS_GPIO=m +CONFIG_LEDS_LP3944=m +CONFIG_LEDS_LP3952=m +# CONFIG_LEDS_LP5521 is not set +# CONFIG_LEDS_LP5523 is not set +# CONFIG_LEDS_LP5562 is not set +# CONFIG_LEDS_LP8501 is not set +CONFIG_LEDS_LP8860=m +CONFIG_LEDS_CLEVO_MAIL=m +CONFIG_LEDS_PCA955X=m +# CONFIG_LEDS_PCA955X_GPIO is not set +CONFIG_LEDS_PCA963X=m +CONFIG_LEDS_DAC124S085=m +CONFIG_LEDS_BD2802=m +CONFIG_LEDS_INTEL_SS4200=m +CONFIG_LEDS_LT3593=m +CONFIG_LEDS_MC13783=m +CONFIG_LEDS_TCA6507=m +CONFIG_LEDS_TLC591XX=m +CONFIG_LEDS_LM355x=m + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +CONFIG_LEDS_BLINKM=m +CONFIG_LEDS_MLXCPLD=m +CONFIG_LEDS_USER=m +CONFIG_LEDS_NIC78BX=m + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_ONESHOT=m +CONFIG_LEDS_TRIGGER_DISK=y +# CONFIG_LEDS_TRIGGER_MTD is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +CONFIG_LEDS_TRIGGER_BACKLIGHT=m +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=m +CONFIG_LEDS_TRIGGER_GPIO=m +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=m +CONFIG_LEDS_TRIGGER_CAMERA=m +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_ACCESSIBILITY=y +CONFIG_A11Y_BRAILLE_CONSOLE=y +CONFIG_INFINIBAND=m +CONFIG_INFINIBAND_USER_MAD=m +CONFIG_INFINIBAND_USER_ACCESS=m +# CONFIG_INFINIBAND_EXP_USER_ACCESS is not set +CONFIG_INFINIBAND_USER_MEM=y +CONFIG_INFINIBAND_ON_DEMAND_PAGING=y +CONFIG_INFINIBAND_ADDR_TRANS=y +CONFIG_INFINIBAND_ADDR_TRANS_CONFIGFS=y +CONFIG_INFINIBAND_MTHCA=m +CONFIG_INFINIBAND_MTHCA_DEBUG=y +CONFIG_INFINIBAND_QIB=m +# CONFIG_INFINIBAND_QIB_DCA is not set +CONFIG_INFINIBAND_CXGB3=m +# CONFIG_INFINIBAND_CXGB3_DEBUG is not set +CONFIG_INFINIBAND_CXGB4=m +# CONFIG_INFINIBAND_I40IW is not set +CONFIG_MLX4_INFINIBAND=m +CONFIG_MLX5_INFINIBAND=m +CONFIG_INFINIBAND_NES=m +# CONFIG_INFINIBAND_NES_DEBUG is not set +CONFIG_INFINIBAND_OCRDMA=m +CONFIG_INFINIBAND_VMWARE_PVRDMA=m +CONFIG_INFINIBAND_USNIC=m +CONFIG_INFINIBAND_IPOIB=m +CONFIG_INFINIBAND_IPOIB_CM=y +CONFIG_INFINIBAND_IPOIB_DEBUG=y +# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set +CONFIG_INFINIBAND_SRP=m +CONFIG_INFINIBAND_SRPT=m +CONFIG_INFINIBAND_ISER=m +CONFIG_INFINIBAND_ISERT=m +CONFIG_INFINIBAND_OPA_VNIC=m +CONFIG_INFINIBAND_RDMAVT=m +CONFIG_RDMA_RXE=m +CONFIG_INFINIBAND_HFI1=m +# CONFIG_HFI1_DEBUG_SDMA_ORDER is not set +# CONFIG_SDMA_VERBOSITY is not set +CONFIG_INFINIBAND_QEDR=m +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EDAC=y +CONFIG_EDAC_LEGACY_SYSFS=y +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_DECODE_MCE=m +CONFIG_EDAC_GHES=y +CONFIG_EDAC_AMD64=m +# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I82975X=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I3200=m +CONFIG_EDAC_IE31200=m +CONFIG_EDAC_X38=m +CONFIG_EDAC_I5400=m +CONFIG_EDAC_I7CORE=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_I5100=m +CONFIG_EDAC_I7300=m +CONFIG_EDAC_SBRIDGE=m +CONFIG_EDAC_SKX=m +CONFIG_EDAC_PND2=m +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +CONFIG_RTC_INTF_DEV_UIE_EMUL=y +CONFIG_RTC_DRV_TEST=m + +# +# I2C RTC drivers +# +CONFIG_RTC_DRV_ABB5ZES3=m +CONFIG_RTC_DRV_ABX80X=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1307_HWMON=y +CONFIG_RTC_DRV_DS1307_CENTURY=y +CONFIG_RTC_DRV_DS1374=m +CONFIG_RTC_DRV_DS1374_WDT=y +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_MAX6900=m +CONFIG_RTC_DRV_RS5C372=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_ISL12022=m +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_PCF8523=m +CONFIG_RTC_DRV_PCF85063=m +CONFIG_RTC_DRV_PCF85363=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_M41T80=m +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_BQ32K=m +CONFIG_RTC_DRV_S35390A=m +CONFIG_RTC_DRV_FM3130=m +CONFIG_RTC_DRV_RX8010=m +CONFIG_RTC_DRV_RX8581=m +CONFIG_RTC_DRV_RX8025=m +CONFIG_RTC_DRV_EM3027=m +CONFIG_RTC_DRV_RV8803=m + +# +# SPI RTC drivers +# +CONFIG_RTC_DRV_M41T93=m +CONFIG_RTC_DRV_M41T94=m +CONFIG_RTC_DRV_DS1302=m +CONFIG_RTC_DRV_DS1305=m +CONFIG_RTC_DRV_DS1343=m +CONFIG_RTC_DRV_DS1347=m +CONFIG_RTC_DRV_DS1390=m +CONFIG_RTC_DRV_MAX6916=m +CONFIG_RTC_DRV_R9701=m +CONFIG_RTC_DRV_RX4581=m +CONFIG_RTC_DRV_RX6110=m +CONFIG_RTC_DRV_RS5C348=m +CONFIG_RTC_DRV_MAX6902=m +CONFIG_RTC_DRV_PCF2123=m +CONFIG_RTC_DRV_MCP795=m +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +CONFIG_RTC_DRV_DS3232=m +CONFIG_RTC_DRV_DS3232_HWMON=y +CONFIG_RTC_DRV_PCF2127=m +CONFIG_RTC_DRV_RV3029C2=m +CONFIG_RTC_DRV_RV3029_HWMON=y + +# +# Platform RTC drivers +# +CONFIG_RTC_DRV_CMOS=y +CONFIG_RTC_DRV_DS1286=m +CONFIG_RTC_DRV_DS1511=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_DS1685_FAMILY=m +CONFIG_RTC_DRV_DS1685=y +# CONFIG_RTC_DRV_DS1689 is not set +# CONFIG_RTC_DRV_DS17285 is not set +# CONFIG_RTC_DRV_DS17485 is not set +# CONFIG_RTC_DRV_DS17885 is not set +CONFIG_RTC_DS1685_PROC_REGS=y +CONFIG_RTC_DS1685_SYSFS_REGS=y +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_DS2404=m +CONFIG_RTC_DRV_STK17TA8=m +CONFIG_RTC_DRV_M48T86=m +CONFIG_RTC_DRV_M48T35=m +CONFIG_RTC_DRV_M48T59=m +CONFIG_RTC_DRV_MSM6242=m +CONFIG_RTC_DRV_BQ4802=m +CONFIG_RTC_DRV_RP5C01=m +CONFIG_RTC_DRV_V3020=m +CONFIG_RTC_DRV_PCF50633=m + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_FTRTC010=m +CONFIG_RTC_DRV_MC13XXX=m + +# +# HID Sensor RTC drivers +# +CONFIG_RTC_DRV_HID_SENSOR_TIME=m +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DMA_ACPI=y +CONFIG_ALTERA_MSGDMA=m +CONFIG_INTEL_IDMA64=m +CONFIG_INTEL_IOATDMA=m +CONFIG_INTEL_MIC_X100_DMA=m +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +CONFIG_DW_DMAC_CORE=y +CONFIG_DW_DMAC=y +CONFIG_DW_DMAC_PCI=y +CONFIG_HSU_DMA=y + +# +# DMA Clients +# +CONFIG_ASYNC_TX_DMA=y +# CONFIG_DMATEST is not set +CONFIG_DMA_ENGINE_RAID=y + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +CONFIG_DCA=m +CONFIG_AUXDISPLAY=y +CONFIG_CHARLCD=m +CONFIG_HD44780=m +CONFIG_KS0108=m +CONFIG_KS0108_PORT=0x378 +CONFIG_KS0108_DELAY=2 +CONFIG_CFAG12864B=m +CONFIG_CFAG12864B_RATE=20 +CONFIG_IMG_ASCII_LCD=m +# CONFIG_PANEL is not set +CONFIG_UIO=m +CONFIG_UIO_CIF=m +CONFIG_UIO_PDRV_GENIRQ=m +# CONFIG_UIO_DMEM_GENIRQ is not set +CONFIG_UIO_AEC=m +CONFIG_UIO_SERCOS3=m +CONFIG_UIO_PCI_GENERIC=m +CONFIG_UIO_NETX=m +CONFIG_UIO_PRUSS=m +# CONFIG_UIO_MF624 is not set +# CONFIG_UIO_HV_GENERIC is not set +CONFIG_VFIO_IOMMU_TYPE1=m +CONFIG_VFIO_VIRQFD=m +CONFIG_VFIO=m +CONFIG_VFIO_NOIOMMU=y +CONFIG_VFIO_PCI=m +CONFIG_VFIO_PCI_VGA=y +CONFIG_VFIO_PCI_MMAP=y +CONFIG_VFIO_PCI_INTX=y +CONFIG_VFIO_PCI_IGD=y +# CONFIG_VFIO_MDEV is not set +CONFIG_IRQ_BYPASS_MANAGER=m +CONFIG_VIRT_DRIVERS=y +CONFIG_VIRTIO=m + +# +# Virtio drivers +# +CONFIG_VIRTIO_PCI=m +CONFIG_VIRTIO_PCI_LEGACY=y +CONFIG_VIRTIO_BALLOON=m +CONFIG_VIRTIO_INPUT=m +CONFIG_VIRTIO_MMIO=m +CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y + +# +# Microsoft Hyper-V guest support +# +CONFIG_HYPERV=m +CONFIG_HYPERV_TSCPAGE=y +CONFIG_HYPERV_UTILS=m +CONFIG_HYPERV_BALLOON=m + +# +# Xen driver support +# +CONFIG_XEN_BALLOON=y +# CONFIG_XEN_SELFBALLOONING is not set +CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y +CONFIG_XEN_BALLOON_MEMORY_HOTPLUG_LIMIT=512 +CONFIG_XEN_SCRUB_PAGES=y +CONFIG_XEN_DEV_EVTCHN=m +CONFIG_XEN_BACKEND=y +CONFIG_XENFS=m +CONFIG_XEN_COMPAT_XENFS=y +CONFIG_XEN_SYS_HYPERVISOR=y +CONFIG_XEN_XENBUS_FRONTEND=y +CONFIG_XEN_GNTDEV=m +CONFIG_XEN_GRANT_DEV_ALLOC=m +CONFIG_SWIOTLB_XEN=y +CONFIG_XEN_TMEM=m +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PVCALLS_FRONTEND=m +# CONFIG_XEN_PVCALLS_BACKEND is not set +# CONFIG_XEN_SCSI_BACKEND is not set +CONFIG_XEN_PRIVCMD=m +CONFIG_XEN_ACPI_PROCESSOR=m +# CONFIG_XEN_MCE_LOG is not set +CONFIG_XEN_HAVE_PVMMU=y +CONFIG_XEN_EFI=y +CONFIG_XEN_AUTO_XLATE=y +CONFIG_XEN_ACPI=y +CONFIG_XEN_SYMS=y +CONFIG_XEN_HAVE_VPMU=y +CONFIG_STAGING=y +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +# CONFIG_IRDA_DEBUG is not set + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_TOIM3232_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m +CONFIG_KINGSUN_DONGLE=m +CONFIG_KSDAZZLE_DONGLE=m +CONFIG_KS959_DONGLE=m + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_MCS_FIR=m +CONFIG_PRISM2_USB=m +CONFIG_COMEDI=m +# CONFIG_COMEDI_DEBUG is not set +CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB=2048 +CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB=20480 +CONFIG_COMEDI_MISC_DRIVERS=y +CONFIG_COMEDI_BOND=m +CONFIG_COMEDI_TEST=m +CONFIG_COMEDI_PARPORT=m +CONFIG_COMEDI_SERIAL2002=m +# CONFIG_COMEDI_ISA_DRIVERS is not set +CONFIG_COMEDI_PCI_DRIVERS=m +CONFIG_COMEDI_8255_PCI=m +CONFIG_COMEDI_ADDI_WATCHDOG=m +CONFIG_COMEDI_ADDI_APCI_1032=m +CONFIG_COMEDI_ADDI_APCI_1500=m +CONFIG_COMEDI_ADDI_APCI_1516=m +CONFIG_COMEDI_ADDI_APCI_1564=m +CONFIG_COMEDI_ADDI_APCI_16XX=m +CONFIG_COMEDI_ADDI_APCI_2032=m +CONFIG_COMEDI_ADDI_APCI_2200=m +CONFIG_COMEDI_ADDI_APCI_3120=m +CONFIG_COMEDI_ADDI_APCI_3501=m +CONFIG_COMEDI_ADDI_APCI_3XXX=m +CONFIG_COMEDI_ADL_PCI6208=m +CONFIG_COMEDI_ADL_PCI7X3X=m +CONFIG_COMEDI_ADL_PCI8164=m +CONFIG_COMEDI_ADL_PCI9111=m +CONFIG_COMEDI_ADL_PCI9118=m +CONFIG_COMEDI_ADV_PCI1710=m +CONFIG_COMEDI_ADV_PCI1720=m +CONFIG_COMEDI_ADV_PCI1723=m +CONFIG_COMEDI_ADV_PCI1724=m +CONFIG_COMEDI_ADV_PCI1760=m +CONFIG_COMEDI_ADV_PCI_DIO=m +CONFIG_COMEDI_AMPLC_DIO200_PCI=m +CONFIG_COMEDI_AMPLC_PC236_PCI=m +CONFIG_COMEDI_AMPLC_PC263_PCI=m +CONFIG_COMEDI_AMPLC_PCI224=m +CONFIG_COMEDI_AMPLC_PCI230=m +CONFIG_COMEDI_CONTEC_PCI_DIO=m +CONFIG_COMEDI_DAS08_PCI=m +CONFIG_COMEDI_DT3000=m +CONFIG_COMEDI_DYNA_PCI10XX=m +CONFIG_COMEDI_GSC_HPDI=m +CONFIG_COMEDI_MF6X4=m +CONFIG_COMEDI_ICP_MULTI=m +CONFIG_COMEDI_DAQBOARD2000=m +CONFIG_COMEDI_JR3_PCI=m +CONFIG_COMEDI_KE_COUNTER=m +CONFIG_COMEDI_CB_PCIDAS64=m +CONFIG_COMEDI_CB_PCIDAS=m +CONFIG_COMEDI_CB_PCIDDA=m +CONFIG_COMEDI_CB_PCIMDAS=m +CONFIG_COMEDI_CB_PCIMDDA=m +CONFIG_COMEDI_ME4000=m +CONFIG_COMEDI_ME_DAQ=m +CONFIG_COMEDI_NI_6527=m +CONFIG_COMEDI_NI_65XX=m +CONFIG_COMEDI_NI_660X=m +CONFIG_COMEDI_NI_670X=m +CONFIG_COMEDI_NI_LABPC_PCI=m +CONFIG_COMEDI_NI_PCIDIO=m +CONFIG_COMEDI_NI_PCIMIO=m +CONFIG_COMEDI_RTD520=m +CONFIG_COMEDI_S626=m +CONFIG_COMEDI_MITE=m +CONFIG_COMEDI_NI_TIOCMD=m +CONFIG_COMEDI_PCMCIA_DRIVERS=m +CONFIG_COMEDI_CB_DAS16_CS=m +CONFIG_COMEDI_DAS08_CS=m +CONFIG_COMEDI_NI_DAQ_700_CS=m +CONFIG_COMEDI_NI_DAQ_DIO24_CS=m +CONFIG_COMEDI_NI_LABPC_CS=m +CONFIG_COMEDI_NI_MIO_CS=m +CONFIG_COMEDI_QUATECH_DAQP_CS=m +CONFIG_COMEDI_USB_DRIVERS=m +CONFIG_COMEDI_DT9812=m +CONFIG_COMEDI_NI_USB6501=m +CONFIG_COMEDI_USBDUX=m +CONFIG_COMEDI_USBDUXFAST=m +CONFIG_COMEDI_USBDUXSIGMA=m +CONFIG_COMEDI_VMK80XX=m +CONFIG_COMEDI_8254=m +CONFIG_COMEDI_8255=m +CONFIG_COMEDI_8255_SA=m +CONFIG_COMEDI_KCOMEDILIB=m +CONFIG_COMEDI_AMPLC_DIO200=m +CONFIG_COMEDI_AMPLC_PC236=m +CONFIG_COMEDI_DAS08=m +CONFIG_COMEDI_NI_LABPC=m +CONFIG_COMEDI_NI_TIO=m +CONFIG_RTL8192U=m +CONFIG_RTLLIB=m +CONFIG_RTLLIB_CRYPTO_CCMP=m +CONFIG_RTLLIB_CRYPTO_TKIP=m +CONFIG_RTLLIB_CRYPTO_WEP=m +CONFIG_RTL8192E=m +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_R8188EU=m +CONFIG_88EU_AP_MODE=y +CONFIG_R8822BE=m +CONFIG_RTLHALMAC_ST=m +CONFIG_RTLPHYDM_ST=m +CONFIG_RTLWIFI_DEBUG_ST=y +CONFIG_RTS5208=m +CONFIG_VT6655=m +CONFIG_VT6656=m + +# +# IIO staging drivers +# + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16203 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADIS16240 is not set + +# +# Analog to digital converters +# +# CONFIG_AD7606 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7816 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7280 is not set + +# +# Analog digital bi-direction converters +# +# CONFIG_ADT7316 is not set + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7152 is not set +# CONFIG_AD7746 is not set + +# +# Direct Digital Synthesis +# +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16060 is not set + +# +# Network Analyzer, Impedance Converters +# +# CONFIG_AD5933 is not set + +# +# Light sensors +# +# CONFIG_TSL2x7x is not set + +# +# Active energy metering IC +# +# CONFIG_ADE7753 is not set +# CONFIG_ADE7754 is not set +# CONFIG_ADE7758 is not set +# CONFIG_ADE7759 is not set +# CONFIG_ADE7854 is not set + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set + +# +# Triggers - standalone +# +# CONFIG_FB_SM750 is not set +CONFIG_FB_XGI=m + +# +# Speakup console speech +# +CONFIG_SPEAKUP=m +CONFIG_SPEAKUP_SYNTH_ACNTSA=m +CONFIG_SPEAKUP_SYNTH_APOLLO=m +CONFIG_SPEAKUP_SYNTH_AUDPTR=m +CONFIG_SPEAKUP_SYNTH_BNS=m +CONFIG_SPEAKUP_SYNTH_DECTLK=m +CONFIG_SPEAKUP_SYNTH_DECEXT=m +CONFIG_SPEAKUP_SYNTH_LTLK=m +CONFIG_SPEAKUP_SYNTH_SOFT=m +CONFIG_SPEAKUP_SYNTH_SPKOUT=m +CONFIG_SPEAKUP_SYNTH_TXPRT=m +CONFIG_SPEAKUP_SYNTH_DUMMY=m +CONFIG_STAGING_MEDIA=y +CONFIG_INTEL_ATOMISP=y +# CONFIG_VIDEO_ATOMISP is not set +# CONFIG_VIDEO_ATOMISP_OV5693 is not set +# CONFIG_VIDEO_ATOMISP_OV2722 is not set +# CONFIG_VIDEO_ATOMISP_GC2235 is not set +# CONFIG_VIDEO_ATOMISP_MSRLIST_HELPER is not set +# CONFIG_VIDEO_ATOMISP_MT9M114 is not set +# CONFIG_VIDEO_ATOMISP_GC0310 is not set +# CONFIG_VIDEO_ATOMISP_OV2680 is not set +# CONFIG_VIDEO_ATOMISP_LM3554 is not set +CONFIG_I2C_BCM2048=m +CONFIG_DVB_CXD2099=m +CONFIG_LIRC_STAGING=y +CONFIG_LIRC_ZILOG=m + +# +# Android +# +CONFIG_LTE_GDM724X=m +CONFIG_FIREWIRE_SERIAL=m +CONFIG_FWTTY_MAX_TOTAL_PORTS=64 +CONFIG_FWTTY_MAX_CARD_PORTS=32 +CONFIG_LNET=m +CONFIG_LNET_MAX_PAYLOAD=1048576 +CONFIG_LNET_SELFTEST=m +CONFIG_LNET_XPRT_IB=m +CONFIG_LUSTRE_FS=m +# CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK is not set +CONFIG_DGNC=m +CONFIG_GS_FPGABOOT=m +CONFIG_CRYPTO_SKEIN=y +# CONFIG_UNISYSSPAR is not set +# CONFIG_FB_TFT is not set +CONFIG_WILC1000=m +CONFIG_WILC1000_SDIO=m +# CONFIG_WILC1000_SPI is not set +# CONFIG_WILC1000_HW_OOB_INTR is not set +# CONFIG_MOST is not set +# CONFIG_KS7010 is not set +# CONFIG_GREYBUS is not set + +# +# USB Power Delivery and Type-C drivers +# +CONFIG_TYPEC_TCPCI=m +# CONFIG_DRM_VBOXVIDEO is not set +# CONFIG_PI433 is not set +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_ACER_WMI=m +CONFIG_ACERHDF=m +CONFIG_ALIENWARE_WMI=m +CONFIG_ASUS_LAPTOP=m +CONFIG_DELL_SMBIOS=m +CONFIG_DELL_SMBIOS_WMI=m +CONFIG_DELL_SMBIOS_SMM=m +CONFIG_DELL_LAPTOP=m +CONFIG_DELL_WMI=m +CONFIG_DELL_WMI_DESCRIPTOR=m +CONFIG_DELL_WMI_AIO=m +CONFIG_DELL_WMI_LED=m +CONFIG_DELL_SMO8800=m +CONFIG_DELL_RBTN=m +CONFIG_FUJITSU_LAPTOP=m +CONFIG_FUJITSU_TABLET=m +CONFIG_AMILO_RFKILL=m +CONFIG_HP_ACCEL=m +CONFIG_HP_WIRELESS=m +CONFIG_HP_WMI=m +CONFIG_MSI_LAPTOP=m +CONFIG_PANASONIC_LAPTOP=m +CONFIG_COMPAL_LAPTOP=m +CONFIG_SONY_LAPTOP=m +# CONFIG_SONYPI_COMPAT is not set +CONFIG_IDEAPAD_LAPTOP=m +CONFIG_SURFACE3_WMI=m +CONFIG_THINKPAD_ACPI=m +CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y +# CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set +# CONFIG_THINKPAD_ACPI_DEBUG is not set +# CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y +CONFIG_SENSORS_HDAPS=m +CONFIG_INTEL_MENLOW=m +CONFIG_EEEPC_LAPTOP=m +CONFIG_ASUS_WMI=m +CONFIG_ASUS_NB_WMI=m +CONFIG_EEEPC_WMI=m +CONFIG_ASUS_WIRELESS=m +CONFIG_ACPI_WMI=m +CONFIG_WMI_BMOF=m +CONFIG_INTEL_WMI_THUNDERBOLT=m +CONFIG_MSI_WMI=m +# CONFIG_PEAQ_WMI is not set +CONFIG_TOPSTAR_LAPTOP=m +CONFIG_ACPI_TOSHIBA=m +CONFIG_TOSHIBA_BT_RFKILL=m +CONFIG_TOSHIBA_HAPS=m +CONFIG_TOSHIBA_WMI=m +CONFIG_ACPI_CMPC=m +# CONFIG_INTEL_INT0002_VGPIO is not set +CONFIG_INTEL_HID_EVENT=m +CONFIG_INTEL_VBTN=m +CONFIG_INTEL_IPS=m +CONFIG_INTEL_PMC_CORE=y +CONFIG_IBM_RTL=m +CONFIG_SAMSUNG_LAPTOP=m +CONFIG_MXM_WMI=m +CONFIG_INTEL_OAKTRAIL=m +CONFIG_SAMSUNG_Q10=m +CONFIG_APPLE_GMUX=m +CONFIG_INTEL_RST=m +CONFIG_INTEL_SMARTCONNECT=m +CONFIG_PVPANIC=m +CONFIG_INTEL_PMC_IPC=m +CONFIG_INTEL_BXTWC_PMIC_TMU=m +CONFIG_SURFACE_PRO3_BUTTON=m +CONFIG_INTEL_PUNIT_IPC=m +CONFIG_INTEL_TELEMETRY=m +CONFIG_MLX_PLATFORM=m +CONFIG_MLX_CPLD_PLATFORM=m +CONFIG_INTEL_TURBO_MAX_3=y +CONFIG_SILEAD_DMI=y +CONFIG_PMC_ATOM=y +CONFIG_CHROME_PLATFORMS=y +CONFIG_CHROMEOS_LAPTOP=m +CONFIG_CHROMEOS_PSTORE=m +CONFIG_CROS_EC_CHARDEV=m +CONFIG_CROS_EC_LPC=m +# CONFIG_CROS_EC_LPC_MEC is not set +CONFIG_CROS_EC_PROTO=y +CONFIG_CROS_KBD_LED_BACKLIGHT=m +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Common Clock Framework +# +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_NXP is not set +# CONFIG_COMMON_CLK_PXA is not set +# CONFIG_COMMON_CLK_PIC32 is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +# CONFIG_ATMEL_PIT is not set +# CONFIG_SH_TIMER_CMT is not set +# CONFIG_SH_TIMER_MTU2 is not set +# CONFIG_SH_TIMER_TMU is not set +# CONFIG_EM_TIMER_STI is not set +CONFIG_MAILBOX=y +CONFIG_PCC=y +# CONFIG_ALTERA_MBOX is not set +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IOVA=y +CONFIG_AMD_IOMMU=y +CONFIG_AMD_IOMMU_V2=m +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +# CONFIG_INTEL_IOMMU_SVM is not set +# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +CONFIG_IRQ_REMAP=y + +# +# Remoteproc drivers +# +CONFIG_REMOTEPROC=m + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# + +# +# Broadcom SoC drivers +# + +# +# i.MX SoC drivers +# + +# +# Qualcomm SoC drivers +# +# CONFIG_SUNXI_SRAM is not set +# CONFIG_SOC_TI is not set +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m +CONFIG_DEVFREQ_GOV_PERFORMANCE=m +CONFIG_DEVFREQ_GOV_POWERSAVE=m +CONFIG_DEVFREQ_GOV_USERSPACE=m +CONFIG_DEVFREQ_GOV_PASSIVE=m + +# +# DEVFREQ Drivers +# +# CONFIG_PM_DEVFREQ_EVENT is not set +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +CONFIG_EXTCON_ADC_JACK=m +CONFIG_EXTCON_ARIZONA=m +# CONFIG_EXTCON_AXP288 is not set +CONFIG_EXTCON_GPIO=m +CONFIG_EXTCON_INTEL_INT3496=m +CONFIG_EXTCON_MAX3355=m +CONFIG_EXTCON_RT8973A=m +CONFIG_EXTCON_SM5502=m +CONFIG_EXTCON_USB_GPIO=m +CONFIG_EXTCON_USBC_CROS_EC=m +CONFIG_MEMORY=y +CONFIG_IIO=m +CONFIG_IIO_BUFFER=y +CONFIG_IIO_BUFFER_CB=m +CONFIG_IIO_KFIFO_BUF=m +CONFIG_IIO_TRIGGERED_BUFFER=m +CONFIG_IIO_CONFIGFS=m +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +CONFIG_IIO_SW_DEVICE=m +CONFIG_IIO_SW_TRIGGER=m + +# +# Accelerometers +# +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +CONFIG_HID_SENSOR_ACCEL_3D=m +# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m +CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m +# CONFIG_KXSD9 is not set +CONFIG_KXCJK1013=m +# CONFIG_MC3230 is not set +CONFIG_MMA7455=m +CONFIG_MMA7455_I2C=m +CONFIG_MMA7455_SPI=m +CONFIG_MMA7660=m +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +CONFIG_MXC4005=m +CONFIG_MXC6255=m +# CONFIG_SCA3000 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set + +# +# Analog to digital converters +# +# CONFIG_AD7266 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD799X is not set +CONFIG_AXP20X_ADC=m +CONFIG_AXP288_ADC=m +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_NAU7802 is not set +# CONFIG_QCOM_SPMI_IADC is not set +# CONFIG_QCOM_SPMI_VADC is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_AM335X_ADC is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_VIPERBOARD_ADC is not set + +# +# Amplifiers +# +# CONFIG_AD8366 is not set + +# +# Chemical Sensors +# +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_CCS811 is not set +# CONFIG_IAQCORE is not set +# CONFIG_VZ89X is not set +CONFIG_IIO_CROS_EC_SENSORS_CORE=m +CONFIG_IIO_CROS_EC_SENSORS=m + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=m +CONFIG_HID_SENSOR_IIO_TRIGGER=m + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +CONFIG_IIO_ST_SENSORS_I2C=m +CONFIG_IIO_ST_SENSORS_SPI=m +CONFIG_IIO_ST_SENSORS_CORE=m + +# +# Counters +# + +# +# Digital to analog converters +# +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_LTC2632 is not set +# CONFIG_AD5686 is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DS4424 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set + +# +# IIO dummy driver +# +# CONFIG_IIO_SIMPLE_DUMMY is not set + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +CONFIG_HID_SENSOR_GYRO_3D=m +# CONFIG_MPU3050_I2C is not set +CONFIG_IIO_ST_GYRO_3AXIS=m +CONFIG_IIO_ST_GYRO_I2C_3AXIS=m +CONFIG_IIO_ST_GYRO_SPI_3AXIS=m +# CONFIG_ITG3200 is not set + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_HDC100X is not set +# CONFIG_HID_SENSOR_HUMIDITY is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set + +# +# Light sensors +# +CONFIG_ACPI_ALS=m +# CONFIG_ADJD_S311 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9960 is not set +CONFIG_BH1750=m +CONFIG_BH1780=m +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM36651 is not set +# CONFIG_IIO_CROS_EC_LIGHT_PROX is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +CONFIG_HID_SENSOR_ALS=m +# CONFIG_HID_SENSOR_PROX is not set +# CONFIG_JSA1212 is not set +CONFIG_RPR0521=m +# CONFIG_SENSORS_LM3533 is not set +# CONFIG_LTR501 is not set +# CONFIG_MAX44000 is not set +CONFIG_OPT3001=m +CONFIG_PA12203001=m +# CONFIG_SI1145 is not set +CONFIG_STK3310=m +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VL6180 is not set + +# +# Magnetometer sensors +# +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +# CONFIG_MMC35240 is not set +CONFIG_IIO_ST_MAGN_3AXIS=m +CONFIG_IIO_ST_MAGN_I2C_3AXIS=m +CONFIG_IIO_ST_MAGN_SPI_3AXIS=m +CONFIG_SENSORS_HMC5843=m +CONFIG_SENSORS_HMC5843_I2C=m +CONFIG_SENSORS_HMC5843_SPI=m + +# +# Multiplexers +# + +# +# Inclinometer sensors +# +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m + +# +# Triggers - standalone +# +# CONFIG_IIO_HRTIMER_TRIGGER is not set +CONFIG_IIO_INTERRUPT_TRIGGER=m +# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set +# CONFIG_IIO_SYSFS_TRIGGER is not set + +# +# Digital potentiometers +# +# CONFIG_DS1803 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_TPL0102 is not set + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +CONFIG_BMP280=m +CONFIG_BMP280_I2C=m +CONFIG_BMP280_SPI=m +# CONFIG_IIO_CROS_EC_BARO is not set +# CONFIG_HID_SENSOR_PRESS is not set +# CONFIG_HP03 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +CONFIG_MS5611=m +CONFIG_MS5611_I2C=m +CONFIG_MS5611_SPI=m +# CONFIG_MS5637 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +CONFIG_ZPA2326=m +CONFIG_ZPA2326_I2C=m +CONFIG_ZPA2326_SPI=m + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set + +# +# Proximity and distance sensors +# +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set + +# +# Temperature sensors +# +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_HID_SENSOR_TEMP is not set +# CONFIG_MLX90614 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_NTB is not set +# CONFIG_VME_BUS is not set +# CONFIG_PWM is not set + +# +# IRQ chip support +# +CONFIG_ARM_GIC_MAX_NR=1 +# CONFIG_ARM_GIC_V3_ITS is not set +CONFIG_IPACK_BUS=m +CONFIG_BOARD_TPCI200=m +CONFIG_SERIAL_IPOCTAL=m +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_ATH79 is not set +# CONFIG_RESET_AXS10X is not set +# CONFIG_RESET_BERLIN is not set +# CONFIG_RESET_IMX7 is not set +# CONFIG_RESET_LANTIQ is not set +# CONFIG_RESET_LPC18XX is not set +# CONFIG_RESET_MESON is not set +# CONFIG_RESET_PISTACHIO is not set +# CONFIG_RESET_SIMPLE is not set +# CONFIG_RESET_SUNXI is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_ZYNQ is not set +# CONFIG_RESET_TEGRA_BPMP is not set +CONFIG_FMC=m +CONFIG_FMC_FAKEDEV=m +CONFIG_FMC_TRIVIAL=m +CONFIG_FMC_WRITE_EEPROM=m +CONFIG_FMC_CHARDEV=m + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_BCM_KONA_USB2_PHY=m +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_CPCAP_USB is not set +CONFIG_POWERCAP=y +CONFIG_INTEL_RAPL=m +# CONFIG_MCB is not set + +# +# Performance monitor support +# +CONFIG_RAS=y +# CONFIG_RAS_CEC is not set +CONFIG_THUNDERBOLT=m + +# +# Android +# +# CONFIG_ANDROID is not set +CONFIG_LIBNVDIMM=m +CONFIG_BLK_DEV_PMEM=m +CONFIG_ND_BLK=m +CONFIG_ND_CLAIM=y +CONFIG_ND_BTT=m +CONFIG_BTT=y +CONFIG_ND_PFN=m +CONFIG_NVDIMM_PFN=y +CONFIG_NVDIMM_DAX=y +CONFIG_DAX=m +CONFIG_DEV_DAX=m +CONFIG_DEV_DAX_PMEM=m +CONFIG_NVMEM=y +CONFIG_STM=m +CONFIG_STM_DUMMY=m +CONFIG_STM_SOURCE_CONSOLE=m +# CONFIG_STM_SOURCE_HEARTBEAT is not set +# CONFIG_STM_SOURCE_FTRACE is not set +CONFIG_INTEL_TH=m +CONFIG_INTEL_TH_PCI=m +CONFIG_INTEL_TH_GTH=m +CONFIG_INTEL_TH_STH=m +CONFIG_INTEL_TH_MSU=m +CONFIG_INTEL_TH_PTI=m +# CONFIG_INTEL_TH_DEBUG is not set +CONFIG_FPGA=m +CONFIG_FPGA_MGR_ALTERA_CVP=m +CONFIG_FPGA_MGR_ALTERA_PS_SPI=m +CONFIG_FPGA_MGR_XILINX_SPI=m +CONFIG_ALTERA_PR_IP_CORE=m + +# +# FSI support +# +CONFIG_FSI=m +# CONFIG_FSI_MASTER_GPIO is not set +# CONFIG_FSI_MASTER_HUB is not set +# CONFIG_FSI_SCOM is not set +CONFIG_PM_OPP=y + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_EDD_OFF is not set +CONFIG_FIRMWARE_MEMMAP=y +CONFIG_DELL_RBU=m +CONFIG_DCDBAS=m +CONFIG_DMIID=y +CONFIG_DMI_SYSFS=m +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m +# CONFIG_FW_CFG_SYSFS is not set +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +# CONFIG_EFI_VARS is not set +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +CONFIG_APPLE_PROPERTIES=y +CONFIG_RESET_ATTACK_MITIGATION=y +CONFIG_UEFI_CPER=y +CONFIG_EFI_DEV_PATH_PARSER=y + +# +# Tegra firmware driver +# + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=m +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXT4_ENCRYPTION=y +CONFIG_EXT4_FS_ENCRYPTION=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +CONFIG_REISERFS_PROC_INFO=y +CONFIG_REISERFS_FS_XATTR=y +CONFIG_REISERFS_FS_POSIX_ACL=y +CONFIG_REISERFS_FS_SECURITY=y +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +CONFIG_JFS_SECURITY=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +CONFIG_XFS_QUOTA=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_XFS_RT=y +CONFIG_XFS_ONLINE_SCRUB=y +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_DLM=y +CONFIG_OCFS2_FS=m +CONFIG_OCFS2_FS_O2CB=m +CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m +CONFIG_OCFS2_FS_STATS=y +# CONFIG_OCFS2_DEBUG_MASKLOG is not set +# CONFIG_OCFS2_DEBUG_FS is not set +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +CONFIG_BTRFS_FS_REF_VERIFY=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=m +CONFIG_F2FS_STAT_FS=y +CONFIG_F2FS_FS_XATTR=y +CONFIG_F2FS_FS_POSIX_ACL=y +CONFIG_F2FS_FS_SECURITY=y +CONFIG_F2FS_CHECK_FS=y +CONFIG_F2FS_FS_ENCRYPTION=y +# CONFIG_F2FS_IO_TRACE is not set +# CONFIG_F2FS_FAULT_INJECTION is not set +# CONFIG_FS_DAX is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_MANDATORY_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=m +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_QUOTA=y +CONFIG_QUOTA_NETLINK_INTERFACE=y +# CONFIG_PRINT_QUOTA_WARNING is not set +# CONFIG_QUOTA_DEBUG is not set +CONFIG_QUOTA_TREE=m +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_QUOTACTL_COMPAT=y +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=m +CONFIG_CUSE=m +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set + +# +# Caches +# +CONFIG_FSCACHE=m +CONFIG_FSCACHE_STATS=y +CONFIG_FSCACHE_HISTOGRAM=y +# CONFIG_FSCACHE_DEBUG is not set +# CONFIG_FSCACHE_OBJECT_LIST is not set +CONFIG_CACHEFILES=m +# CONFIG_CACHEFILES_DEBUG is not set +# CONFIG_CACHEFILES_HISTOGRAM is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +CONFIG_NTFS_RW=y + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=y +CONFIG_EFIVAR_FS=y +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +# CONFIG_ECRYPT_FS_MESSAGING is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_HFSPLUS_FS_POSIX_ACL=y +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_UBIFS_FS=m +# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set +CONFIG_UBIFS_FS_LZO=y +CONFIG_UBIFS_FS_ZLIB=y +# CONFIG_UBIFS_ATIME_SUPPORT is not set +# CONFIG_UBIFS_FS_ENCRYPTION is not set +CONFIG_UBIFS_FS_SECURITY=y +CONFIG_CRAMFS=m +CONFIG_CRAMFS_BLOCKDEV=y +# CONFIG_CRAMFS_MTD is not set +CONFIG_SQUASHFS=m +# CONFIG_SQUASHFS_FILE_CACHE is not set +CONFIG_SQUASHFS_FILE_DIRECT=y +# CONFIG_SQUASHFS_DECOMP_SINGLE is not set +# CONFIG_SQUASHFS_DECOMP_MULTI is not set +CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +CONFIG_ROMFS_FS=m +CONFIG_ROMFS_BACKED_BY_BLOCK=y +# CONFIG_ROMFS_BACKED_BY_MTD is not set +# CONFIG_ROMFS_BACKED_BY_BOTH is not set +CONFIG_ROMFS_ON_BLOCK=y +CONFIG_PSTORE=y +CONFIG_PSTORE_ZLIB_COMPRESS=y +# CONFIG_PSTORE_LZO_COMPRESS is not set +# CONFIG_PSTORE_LZ4_COMPRESS is not set +# CONFIG_PSTORE_CONSOLE is not set +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_FTRACE is not set +CONFIG_PSTORE_RAM=y +# CONFIG_SYSV_FS is not set +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set +# CONFIG_UFS_DEBUG is not set +CONFIG_EXOFS_FS=m +# CONFIG_EXOFS_DEBUG is not set +CONFIG_ORE=m +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=m +CONFIG_NFS_V2=m +CONFIG_NFS_V3=m +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=m +CONFIG_NFS_SWAP=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_PNFS_FILE_LAYOUT=m +CONFIG_PNFS_BLOCK=m +CONFIG_PNFS_FLEXFILE_LAYOUT=m +CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" +CONFIG_NFS_V4_1_MIGRATION=y +CONFIG_NFS_V4_SECURITY_LABEL=y +CONFIG_NFS_FSCACHE=y +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFS_DEBUG=y +CONFIG_NFSD=m +CONFIG_NFSD_V2_ACL=y +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +# CONFIG_NFSD_BLOCKLAYOUT is not set +# CONFIG_NFSD_SCSILAYOUT is not set +# CONFIG_NFSD_FLEXFILELAYOUT is not set +CONFIG_NFSD_V4_SECURITY_LABEL=y +# CONFIG_NFSD_FAULT_INJECTION is not set +CONFIG_GRACE_PERIOD=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_SUNRPC_SWAP=y +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SUNRPC_DEBUG=y +CONFIG_SUNRPC_XPRT_RDMA=m +CONFIG_CEPH_FS=m +CONFIG_CEPH_FSCACHE=y +CONFIG_CEPH_FS_POSIX_ACL=y +CONFIG_CIFS=m +CONFIG_CIFS_STATS=y +# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +CONFIG_CIFS_ACL=y +# CONFIG_CIFS_DEBUG is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_SMB311=y +CONFIG_CIFS_FSCACHE=y +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +CONFIG_NCPFS_SMALLDOS=y +CONFIG_NCPFS_NLS=y +# CONFIG_NCPFS_EXTRAS is not set +CONFIG_CODA_FS=m +CONFIG_AFS_FS=m +# CONFIG_AFS_DEBUG is not set +CONFIG_AFS_FSCACHE=y +CONFIG_9P_FS=m +CONFIG_9P_FSCACHE=y +CONFIG_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_MAC_ROMAN=m +CONFIG_NLS_MAC_CELTIC=m +CONFIG_NLS_MAC_CENTEURO=m +CONFIG_NLS_MAC_CROATIAN=m +CONFIG_NLS_MAC_CYRILLIC=m +CONFIG_NLS_MAC_GAELIC=m +CONFIG_NLS_MAC_GREEK=m +CONFIG_NLS_MAC_ICELAND=m +CONFIG_NLS_MAC_INUIT=m +CONFIG_NLS_MAC_ROMANIAN=m +CONFIG_NLS_MAC_TURKISH=m +CONFIG_NLS_UTF8=m +CONFIG_DLM=m +# CONFIG_DLM_DEBUG is not set + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_DYNAMIC_DEBUG=y + +# +# Compile-time checks and compiler options +# +# CONFIG_DEBUG_INFO is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_FRAME_WARN=2048 +CONFIG_STRIP_ASM_SYMS=y +# CONFIG_READABLE_ASM is not set +CONFIG_UNUSED_SYMBOLS=y +# CONFIG_PAGE_OWNER is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +CONFIG_FRAME_POINTER=y +# CONFIG_STACK_VALIDATION is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_DEBUG_KERNEL=y + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_DEBUG_ON is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_VM is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_HAVE_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACKOVERFLOW is not set +CONFIG_HAVE_ARCH_KASAN=y +# CONFIG_KASAN is not set +CONFIG_ARCH_HAS_KCOV=y +# CONFIG_KCOV is not set +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Lockups and Hangs +# +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +CONFIG_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_SCHED_DEBUG=y +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# CONFIG_SCHED_STACK_END_CHECK is not set +# CONFIG_DEBUG_TIMEKEEPING is not set +# CONFIG_DEBUG_PREEMPT is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PI_LIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_CREDENTIALS is not set + +# +# RCU Debugging +# +# CONFIG_PROVE_RCU is not set +# CONFIG_TORTURE_TEST is not set +# CONFIG_RCU_PERF_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACER_MAX_TRACE=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_RING_BUFFER_ALLOW_SWAP=y +CONFIG_TRACING=y +CONFIG_GENERIC_TRACER=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +CONFIG_FUNCTION_TRACER=y +CONFIG_FUNCTION_GRAPH_TRACER=y +# CONFIG_PREEMPTIRQ_EVENTS is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +CONFIG_SCHED_TRACER=y +# CONFIG_HWLAT_TRACER is not set +CONFIG_FTRACE_SYSCALLS=y +CONFIG_TRACER_SNAPSHOT=y +# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +CONFIG_STACK_TRACER=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_KPROBE_EVENTS=y +# CONFIG_UPROBE_EVENTS is not set +CONFIG_BPF_EVENTS=y +CONFIG_PROBE_EVENTS=y +CONFIG_DYNAMIC_FTRACE=y +CONFIG_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_FUNCTION_PROFILER=y +CONFIG_FTRACE_MCOUNT_RECORD=y +# CONFIG_FTRACE_STARTUP_TEST is not set +CONFIG_MMIOTRACE=y +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_MMIOTRACE_TEST is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +CONFIG_RING_BUFFER_BENCHMARK=m +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +CONFIG_TRACING_EVENTS_GPIO=y +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_DMA_API_DEBUG is not set + +# +# Runtime Testing +# +CONFIG_LKDTM=m +# CONFIG_TEST_LIST_SORT is not set +# CONFIG_TEST_SORT is not set +# CONFIG_KPROBES_SANITY_TEST is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_RBTREE_TEST is not set +# CONFIG_INTERVAL_TREE_TEST is not set +CONFIG_PERCPU_TEST=m +# CONFIG_ATOMIC64_SELFTEST is not set +CONFIG_ASYNC_RAID6_TEST=m +# CONFIG_TEST_HEXDUMP is not set +# CONFIG_TEST_STRING_HELPERS is not set +CONFIG_TEST_KSTRTOX=m +# CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_BITMAP is not set +# CONFIG_TEST_UUID is not set +# CONFIG_TEST_RHASHTABLE is not set +# CONFIG_TEST_HASH is not set +# CONFIG_TEST_PARMAN is not set +# CONFIG_TEST_LKM is not set +# CONFIG_TEST_USER_COPY is not set +# CONFIG_TEST_BPF is not set +# CONFIG_TEST_FIND_BIT is not set +# CONFIG_TEST_FIRMWARE is not set +# CONFIG_TEST_SYSCTL is not set +# CONFIG_TEST_UDELAY is not set +# CONFIG_TEST_STATIC_KEYS is not set +# CONFIG_TEST_KMOD is not set +# CONFIG_MEMTEST is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_ARCH_WANTS_UBSAN_NO_NULL is not set +# CONFIG_UBSAN is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +CONFIG_STRICT_DEVMEM=y +# CONFIG_IO_STRICT_DEVMEM is not set +CONFIG_EARLY_PRINTK_USB=y +CONFIG_X86_VERBOSE_BOOTUP=y +CONFIG_EARLY_PRINTK=y +# CONFIG_EARLY_PRINTK_DBGP is not set +CONFIG_EARLY_PRINTK_EFI=y +CONFIG_EARLY_PRINTK_USB_XDBC=y +# CONFIG_X86_PTDUMP_CORE is not set +# CONFIG_X86_PTDUMP is not set +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_DEBUG_WX is not set +CONFIG_DOUBLEFAULT=y +# CONFIG_DEBUG_TLBFLUSH is not set +# CONFIG_IOMMU_DEBUG is not set +# CONFIG_IOMMU_STRESS is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +CONFIG_IO_DELAY_TYPE_0X80=0 +CONFIG_IO_DELAY_TYPE_0XED=1 +CONFIG_IO_DELAY_TYPE_UDELAY=2 +CONFIG_IO_DELAY_TYPE_NONE=3 +CONFIG_IO_DELAY_0X80=y +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +CONFIG_DEFAULT_IO_DELAY_TYPE=0 +# CONFIG_DEBUG_BOOT_PARAMS is not set +# CONFIG_CPA_DEBUG is not set +CONFIG_OPTIMIZE_INLINING=y +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_X86_DEBUG_FPU is not set +# CONFIG_PUNIT_ATOM_DEBUG is not set +# CONFIG_UNWINDER_ORC is not set +CONFIG_UNWINDER_FRAME_POINTER=y + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_COMPAT=y +CONFIG_PERSISTENT_KEYRINGS=y +# CONFIG_BIG_KEYS is not set +CONFIG_TRUSTED_KEYS=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_KEY_DH_OPERATIONS=y +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITY=y +# CONFIG_SECURITY_WRITABLE_HOOKS is not set +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +CONFIG_PAGE_TABLE_ISOLATION=y +# CONFIG_SECURITY_INFINIBAND is not set +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_PATH=y +# CONFIG_INTEL_TXT is not set +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +# CONFIG_HARDENED_USERCOPY is not set +CONFIG_FORTIFY_SOURCE=y +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SELINUX is not set +# CONFIG_SECURITY_SMACK is not set +CONFIG_SECURITY_TOMOYO=y +CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048 +CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024 +# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set +CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init" +CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/usr/lib/systemd/systemd" +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +CONFIG_SECURITY_YAMA=y +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +CONFIG_INTEGRITY_AUDIT=y +# CONFIG_IMA is not set +# CONFIG_EVM is not set +# CONFIG_DEFAULT_SECURITY_TOMOYO is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_DEFAULT_SECURITY="" +CONFIG_XOR_BLOCKS=m +CONFIG_ASYNC_CORE=m +CONFIG_ASYNC_MEMCPY=m +CONFIG_ASYNC_XOR=m +CONFIG_ASYNC_PQ=m +CONFIG_ASYNC_RAID6_RECOV=m +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=m +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=y +CONFIG_CRYPTO_ECDH=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=m +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_GF128MUL=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_PCRYPT=m +CONFIG_CRYPTO_WORKQUEUE=y +CONFIG_CRYPTO_CRYPTD=m +CONFIG_CRYPTO_MCRYPTD=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_ABLK_HELPER=m +CONFIG_CRYPTO_SIMD=m +CONFIG_CRYPTO_GLUE_HELPER_X86=m +CONFIG_CRYPTO_ENGINE=m + +# +# Authenticated Encryption with Associated Data +# +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_GCM=m +CONFIG_CRYPTO_CHACHA20POLY1305=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_ECHAINIV=m + +# +# Block modes +# +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CTS=m +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_XTS=m +CONFIG_CRYPTO_KEYWRAP=m + +# +# Hash modes +# +CONFIG_CRYPTO_CMAC=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_VMAC=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_CRC32C_INTEL=m +CONFIG_CRYPTO_CRC32=m +CONFIG_CRYPTO_CRC32_PCLMUL=m +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m +CONFIG_CRYPTO_GHASH=m +CONFIG_CRYPTO_POLY1305=m +CONFIG_CRYPTO_POLY1305_X86_64=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_RMD128=m +CONFIG_CRYPTO_RMD160=m +CONFIG_CRYPTO_RMD256=m +CONFIG_CRYPTO_RMD320=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_SSSE3=m +CONFIG_CRYPTO_SHA256_SSSE3=m +CONFIG_CRYPTO_SHA512_SSSE3=m +CONFIG_CRYPTO_SHA1_MB=m +CONFIG_CRYPTO_SHA256_MB=m +CONFIG_CRYPTO_SHA512_MB=m +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_SHA3=m +# CONFIG_CRYPTO_SM3 is not set +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_AES_TI=m +CONFIG_CRYPTO_AES_X86_64=m +CONFIG_CRYPTO_AES_NI_INTEL=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_BLOWFISH_COMMON=m +CONFIG_CRYPTO_BLOWFISH_X86_64=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAMELLIA_X86_64=m +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m +CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64=m +CONFIG_CRYPTO_CAST_COMMON=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST5_AVX_X86_64=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_CAST6_AVX_X86_64=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_DES3_EDE_X86_64=m +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_SALSA20=m +CONFIG_CRYPTO_SALSA20_X86_64=m +CONFIG_CRYPTO_CHACHA20=m +CONFIG_CRYPTO_CHACHA20_X86_64=m +CONFIG_CRYPTO_SEED=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m +CONFIG_CRYPTO_SERPENT_AVX_X86_64=m +CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m +CONFIG_CRYPTO_TWOFISH_X86_64=m +CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m +CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_842=m +CONFIG_CRYPTO_LZ4=m +CONFIG_CRYPTO_LZ4HC=m + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m +CONFIG_CRYPTO_DRBG_MENU=m +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG=m +CONFIG_CRYPTO_JITTERENTROPY=m +CONFIG_CRYPTO_USER_API=m +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m +CONFIG_CRYPTO_USER_API_RNG=m +CONFIG_CRYPTO_USER_API_AEAD=m +CONFIG_CRYPTO_HASH_INFO=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_DEV_PADLOCK=m +CONFIG_CRYPTO_DEV_PADLOCK_AES=m +CONFIG_CRYPTO_DEV_PADLOCK_SHA=m +# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set +CONFIG_CRYPTO_DEV_CCP=y +CONFIG_CRYPTO_DEV_CCP_DD=m +CONFIG_CRYPTO_DEV_SP_CCP=y +CONFIG_CRYPTO_DEV_CCP_CRYPTO=m +CONFIG_CRYPTO_DEV_QAT=m +CONFIG_CRYPTO_DEV_QAT_DH895xCC=m +CONFIG_CRYPTO_DEV_QAT_C3XXX=m +CONFIG_CRYPTO_DEV_QAT_C62X=m +CONFIG_CRYPTO_DEV_QAT_DH895xCCVF=m +CONFIG_CRYPTO_DEV_QAT_C3XXXVF=m +CONFIG_CRYPTO_DEV_QAT_C62XVF=m +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +# CONFIG_CRYPTO_DEV_CHELSIO is not set +CONFIG_CRYPTO_DEV_VIRTIO=m +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +CONFIG_HAVE_KVM=y +CONFIG_HAVE_KVM_IRQCHIP=y +CONFIG_HAVE_KVM_IRQFD=y +CONFIG_HAVE_KVM_IRQ_ROUTING=y +CONFIG_HAVE_KVM_EVENTFD=y +CONFIG_KVM_MMIO=y +CONFIG_KVM_ASYNC_PF=y +CONFIG_HAVE_KVM_MSI=y +CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y +CONFIG_KVM_VFIO=y +CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y +CONFIG_KVM_COMPAT=y +CONFIG_HAVE_KVM_IRQ_BYPASS=y +CONFIG_VIRTUALIZATION=y +CONFIG_KVM=m +CONFIG_KVM_INTEL=m +CONFIG_KVM_AMD=m +CONFIG_KVM_MMU_AUDIT=y +CONFIG_VHOST_NET=m +CONFIG_VHOST_SCSI=m +CONFIG_VHOST_VSOCK=m +CONFIG_VHOST=m +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=m +CONFIG_BITREVERSE=y +# CONFIG_HAVE_ARCH_BITREVERSE is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=m +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC4=m +CONFIG_CRC7=m +CONFIG_LIBCRC32C=m +CONFIG_CRC8=m +CONFIG_XXHASH=m +# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_842_COMPRESS=m +CONFIG_842_DECOMPRESS=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=m +CONFIG_LZ4HC_COMPRESS=m +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMPRESS=m +CONFIG_ZSTD_DECOMPRESS=m +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_BTREE=y +CONFIG_INTERVAL_TREE=y +CONFIG_RADIX_TREE_MULTIORDER=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +# CONFIG_DMA_NOOP_OPS is not set +CONFIG_DMA_VIRT_OPS=y +CONFIG_CHECK_SIGNATURE=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m +CONFIG_CLZ_TAB=y +CONFIG_CORDIC=m +CONFIG_DDR=y +CONFIG_IRQ_POLL=y +CONFIG_MPILIB=y +CONFIG_OID_REGISTRY=y +CONFIG_UCS2_STRING=y +CONFIG_FONT_SUPPORT=y +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_6x10 is not set +# CONFIG_FONT_10x18 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +CONFIG_FONT_AUTOSELECT=y +# CONFIG_SG_SPLIT is not set +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_SG_CHAIN=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_SBITMAP=y +CONFIG_PARMAN=m +# CONFIG_STRING_SELFTEST is not set diff --git a/talimatname/genel/k/kernel/config.aufs b/talimatname/genel/k/kernel/config.aufs new file mode 100644 index 000000000..faec0f9a1 --- /dev/null +++ b/talimatname/genel/k/kernel/config.aufs @@ -0,0 +1,21 @@ +CONFIG_AUFS_FS=m +CONFIG_AUFS_BRANCH_MAX_127=y +# CONFIG_AUFS_BRANCH_MAX_511 is not set +# CONFIG_AUFS_BRANCH_MAX_1023 is not set +# CONFIG_AUFS_BRANCH_MAX_32767 is not set +CONFIG_AUFS_SBILIST=y +CONFIG_AUFS_HNOTIFY=y +CONFIG_AUFS_HFSNOTIFY=y +CONFIG_AUFS_EXPORT=y +CONFIG_AUFS_INO_T_64=y +# CONFIG_AUFS_FHSM is not set +# CONFIG_AUFS_XATTR is not set +CONFIG_AUFS_RDU=y +# CONFIG_AUFS_DIRREN is not set +CONFIG_AUFS_SHWH=y +CONFIG_AUFS_BR_RAMFS=y +CONFIG_AUFS_BR_FUSE=y +CONFIG_AUFS_POLL=y +CONFIG_AUFS_BR_HFSPLUS=y +CONFIG_AUFS_BDEV_LOOP=y +# CONFIG_AUFS_DEBUG is not set diff --git a/talimatname/genel/k/kernel/create-aufs.sh b/talimatname/genel/k/kernel/create-aufs.sh new file mode 100755 index 000000000..b9871c72c --- /dev/null +++ b/talimatname/genel/k/kernel/create-aufs.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +rm -Rf aufs4-standalone +# clone the aufs repository to the local disk +git clone git://github.com/sfjro/aufs4-standalone.git aufs4-standalone +cd aufs4-standalone +git branch -r +git checkout origin/aufs4.13 + +# modify what you want + +# and after +# create the patch with the directories: fs, include and Documentation + +rm -v $(find . -type f -name '*.orig') +grep -qse 'EXPORT_SYMBOL(' aufs4-standalone.patch && \ +sed -i-old -e 's|EXPORT_SYMBOL(|EXPORT_SYMBOL_GPL(|' aufs4-standalone.patch +rm -rf ../tmp/linux-4.13 +mkdir -p ../tmp/linux-4.13 +cp -a fs ../tmp/linux-4.13 +cp -a include ../tmp/linux-4.13 +cp -a Documentation ../tmp/linux-4.13 +rm ../tmp/linux-4.13/include/uapi/linux/Kbuild +cd ../tmp +diff -Naur null linux-4.13 | filterdiff | \ +sed -e 's|null\(/include/uapi/linux/Kbuild\)|linux-4.13-old\1|;s|^--- null.*|--- /dev/null|;\|linux-4.13/include/uapi/linux/Kbuild|,${\|@@ -0,0 +1 @@|,$d}' \ +| bzip2 > aufs$(sed -ne 's|#define.*AUFS_VERSION.*"\(.*\)"|\1|p' linux-4.13/include/uapi/linux/aufs_type.h).patch.bz2 +mv *.bz2 $OLDPWD +cd $OLDPWD +mv *patch* .. +cd .. +rm -rf tmp aufs4-standalone + + +# the patch is created in ../tmp +# the other patches needed to compile are in the base directory diff --git a/talimatname/genel/k/kernel/kernel.kos-sil b/talimatname/genel/k/kernel/kernel.kos-sil new file mode 100644 index 000000000..b7b10b372 --- /dev/null +++ b/talimatname/genel/k/kernel/kernel.kos-sil @@ -0,0 +1,8 @@ +#!/bin/sh +for _kurtar in \ +'/boot/grub' ; \ +do +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/kernel.sil + +done diff --git a/talimatname/genel/k/kernel/kernel.kur-kos b/talimatname/genel/k/kernel/kernel.kur-kos new file mode 100644 index 000000000..58f3a6f27 --- /dev/null +++ b/talimatname/genel/k/kernel/kernel.kur-kos @@ -0,0 +1,24 @@ +#!/bin/bash +surum=4.15.7 +sonek=milis +depmod ${surum}-$sonek +cd /boot +[ -L /boot/kernel ] && rm -rf /boot/kernel +ln -s kernel-$surum kernel +if [ -f initramfs ];then + mv initramfs initramfs_eski +fi + +[ -f /usr/bin/dracut ] && dracut -N --force --xz --omit systemd --add-drivers "ahci" -f /boot/initramfs $surum-$sonek +[ -f /usr/bin/os-prober ] && os-prober + +mkdir -p /boot/grub +if [ -f /boot/grub/grub.cfg ];then + mv /boot/grub/grub.cfg /boot/grub/grub.cfg.eski +fi +[ ! -f /boot/grub/grub.cfg.new ] && cp /etc/default/grub/grub.cfg /boot/grub/grub.cfg.new +[ ! -d /boot/grub/i386-pc ] && cp -r /usr/lib/grub/i386-pc /boot/grub/ +[ ! -f /boot/grub/unicode.pf2 ] && cp /usr/share/grub/unicode.pf2 /boot/grub/ +grub-mkconfig -o /boot/grub/grub.cfg + +cd - diff --git a/talimatname/genel/k/kernel/talimat b/talimatname/genel/k/kernel/talimat new file mode 100644 index 000000000..a45cccea0 --- /dev/null +++ b/talimatname/genel/k/kernel/talimat @@ -0,0 +1,212 @@ +# Tanım: Kararli kernel sürümü +# URL: http://www.kernel.org +# Paketçi: milisarge +# Gerekler: linux-firmware intel-ucode + +isim=kernel +_basekernel=4.15 +surum=4.15.7 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/kernel/v4.x/linux-$_basekernel.tar.xz + http://www.kernel.org/pub/linux/kernel/v4.x/patch-${surum}.xz + config + aufs4-loopback.patch + aufs4-base.patch + aufs4-mmap.patch + aufs4-standalone.patch + aufs4-kbuild.patch + aufs4.patch + config.aufs + tmpfs-idr.patch + vfs-ino.patch) + + +derle() { + + cd "${SRC}/linux-$_basekernel" + cp "${SRC}/patch-$surum.xz" . + unxz patch-$surum.xz + # güncel kernel yama + patch -p1 -i "patch-${surum}" + + # güvenli kernel yaması + #patch -p1 -i "${SRC}/linux-hardened-${surum}.a.patch" + + #çalışan sistem aufs yamaları + patch -p1 -i "${SRC}/aufs4.patch" + patch -p1 -i "${SRC}/aufs4-base.patch" + patch -p1 -i "${SRC}/aufs4-kbuild.patch" + patch -p1 -i "${SRC}/aufs4-loopback.patch" + patch -p1 -i "${SRC}/aufs4-mmap.patch" + patch -p1 -i "${SRC}/aufs4-standalone.patch" + patch -p1 -i "${SRC}/tmpfs-idr.patch" + patch -p1 -i "${SRC}/vfs-ino.patch" + + cat "${SRC}/config" > ./.config + + cat "${SRC}/config.aufs" >> ./.config + + # kernel sürümüne devir sayısı eklemek için + # set extraversion to release + #sed -ri "s|^(EXTRAVERSION =).*|\1 -${devir}|" Makefile + + cd "${SRC}/linux-${_basekernel}" + + export KBUILD_BUILD_USER="milisarge" + export KBUILD_BUILD_HOST="`uname -m`.milislinux.org" + + # ayarları onaylama + yes "" | make oldconfig >/dev/null + + # derleme + make ${MAKEFLAGS} bzImage modules || make ${MAKEFLAGS} bzImage modules + + KARCH=x86 + + # get kernel version + #_kernver="$(make kernelrelease)" + #KERNEL_VERSION="${surum}-milis" + _kernver="${surum}-milis" + mkdir -p "${PKG}"/{lib/modules,lib/firmware,boot} + make INSTALL_MOD_PATH="${PKG}" modules_install + cp arch/$KARCH/boot/bzImage "${PKG}/boot/kernel-${surum}" + + # vmlinux un source a eklenmesi,modül derlerken bu geçici silinecek + install -D -m644 vmlinux "${PKG}/usr/src/linux-${_kernver}/vmlinux" + + # derleme kalıntılarının temizlenmesi + rm -f "${PKG}"/lib/modules/${_kernver}/{source,build} + # firmwarelerin temizlenmesi + rm -rf "${PKG}/lib/firmware" + # modüllerin sıkıştırılarak ek yer kazanılması + find "${PKG}" -name '*.ko' -exec gzip -9 {} \; + + #linux-headers / linux modülleri + + install -dm755 "${PKG}/lib/modules/${_kernver}" + + cd "${PKG}/lib/modules/${_kernver}" + ln -sf ../../../usr/src/linux-${_kernver} build + + cd "${SRC}/linux-${_basekernel}" + install -D -m644 Makefile \ + "${PKG}/usr/src/linux-${_kernver}/Makefile" + install -D -m644 kernel/Makefile \ + "${PKG}/usr/src/linux-${_kernver}/kernel/Makefile" + install -D -m644 .config \ + "${PKG}/usr/src/linux-${_kernver}/.config" + + ###################### + mkdir -p "${PKG}/usr/src/linux-${_kernver}/include" + + for i in acpi asm-generic config crypto drm generated linux math-emu \ + media net pcmcia scsi rdma soc sound trace uapi video xen; do + cp -a include/${i} "${PKG}/usr/src/linux-${_kernver}/include/" + done + + # copy arch includes for external modules + mkdir -p "${PKG}/usr/src/linux-${_kernver}/arch/x86" + cp -a arch/x86/include "${PKG}/usr/src/linux-${_kernver}/arch/x86/" + + # copy files necessary for later builds, like nvidia and vmware + cp Module.symvers "${PKG}/usr/src/linux-${_kernver}" + cp -a scripts "${PKG}/usr/src/linux-${_kernver}" + + # fix permissions on scripts dir + chmod og-w -R "${PKG}/usr/src/linux-${_kernver}/scripts" + mkdir -p "${PKG}/usr/src/linux-${_kernver}/.tmp_versions" + + mkdir -p "${PKG}/usr/src/linux-${_kernver}/arch/${KARCH}/kernel" + + cp arch/${KARCH}/Makefile "${PKG}/usr/src/linux-${_kernver}/arch/${KARCH}/" + + cp arch/${KARCH}/kernel/asm-offsets.s "${PKG}/usr/src/linux-${_kernver}/arch/${KARCH}/kernel/" + + # add headers for lirc package + # pci + for i in bt8xx cx88 saa7134; do + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/pci/${i}" + cp -a drivers/media/pci/${i}/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/pci/${i}" + done + # usb + for i in cpia2 em28xx pwc; do + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/usb/${i}" + cp -a drivers/media/usb/${i}/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/usb/${i}" + done + # i2c + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/i2c" + cp drivers/media/i2c/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/i2c/" + for i in cx25840; do + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/i2c/${i}" + cp -a drivers/media/i2c/${i}/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/i2c/${i}" + done + + # add docbook makefile + #install -D -m644 Documentation/DocBook/Makefile \ + # "${PKG}/usr/src/linux-${_kernver}/Documentation/DocBook/Makefile" + + # add dm headers + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/md" + cp drivers/md/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/md" + + # add inotify.h + mkdir -p "${PKG}/usr/src/linux-${_kernver}/include/linux" + cp include/linux/inotify.h "${PKG}/usr/src/linux-${_kernver}/include/linux/" + + # add wireless headers + mkdir -p "${PKG}/usr/src/linux-${_kernver}/net/mac80211/" + cp net/mac80211/*.h "${PKG}/usr/src/linux-${_kernver}/net/mac80211/" + + # add dvb headers for external modules + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-core" + cp drivers/media/dvb-core/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-core/" + # and... + mkdir -p "${PKG}/usr/src/linux-${_kernver}/include/config/dvb/" + cp include/config/dvb/*.h "${PKG}/usr/src/linux-${_kernver}/include/config/dvb/" + + # add dvb headers for http://mcentral.de/hg/~mrec/em28xx-new + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-frontends/" + cp drivers/media/dvb-frontends/lgdt330x.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-frontends/" + cp drivers/media/i2c/msp3400-driver.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/i2c/" + + # add dvb headers + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/usb/dvb-usb" + cp drivers/media/usb/dvb-usb/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/usb/dvb-usb/" + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-frontends" + cp drivers/media/dvb-frontends/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/dvb-frontends/" + mkdir -p "${PKG}/usr/src/linux-${_kernver}/drivers/media/tuners" + cp drivers/media/tuners/*.h "${PKG}/usr/src/linux-${_kernver}/drivers/media/tuners/" + + # add xfs and shmem for aufs building + mkdir -p "${PKG}/usr/src/linux-${_kernver}/fs/xfs/libxfs" + mkdir -p "${PKG}/usr/src/linux-${_kernver}/mm" + cp fs/xfs/libxfs/xfs_sb.h "${PKG}/usr/src/linux-${_kernver}/fs/xfs/libxfs/xfs_sb.h" + + #aufs4-util need + sed -i "s:__user::g" "${PKG}/usr/src/linux-${_kernver}/include/uapi/linux/aufs_type.h" + + # copy in Kconfig files + for i in `find . -name "Kconfig*"`; do + mkdir -p "${PKG}"/usr/src/linux-${_kernver}/`echo ${i} | sed 's|/Kconfig.*||'` + cp ${i} "${PKG}/usr/src/linux-${_kernver}/${i}" + done + + chown -R root.root "${PKG}/usr/src/linux-${_kernver}" + find "${PKG}/usr/src/linux-${_kernver}" -type d -exec chmod 755 {} \; + + # strip scripts directory + find "${PKG}/usr/src/linux-${_kernver}/scripts" -type f -perm -u+w 2>/dev/null | while read binary ; do + case "$(file -bi "${binary}")" in + *application/x-sharedlib*) # Libraries (.so) + /usr/bin/strip ${STRIP_SHARED} "${binary}";; + *application/x-archive*) # Libraries (.a) + /usr/bin/strip ${STRIP_STATIC} "${binary}";; + *application/x-executable*) # Binaries + /usr/bin/strip ${STRIP_BINARIES} "${binary}";; + esac + done + + # remove unneeded architectures + rm -rf "${PKG}"/usr/src/linux-${_kernver}/arch/{alpha,arm,arm26,arm64,avr32,blackfin,c6x,cris,frv,h8300,hexagon,ia64,m32r,m68k,m68knommu,mips,microblaze,mn10300,openrisc,parisc,powerpc,ppc,s390,score,sh,sh64,sparc,sparc64,tile,unicore32,um,v850,xtensa} +} diff --git a/talimatname/genel/k/kernel/tmpfs-idr.patch b/talimatname/genel/k/kernel/tmpfs-idr.patch new file mode 100644 index 000000000..ec610557a --- /dev/null +++ b/talimatname/genel/k/kernel/tmpfs-idr.patch @@ -0,0 +1,225 @@ +SPDX-License-Identifier: GPL-2.0 +diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h +index 06b295b..45e4de6 100644 +--- a/include/linux/shmem_fs.h ++++ b/include/linux/shmem_fs.h +@@ -25,10 +25,13 @@ struct shmem_inode_info { + }; + + struct shmem_sb_info { ++ struct mutex idr_lock; ++ bool idr_nouse; ++ struct idr idr; /* manages inode-number */ + unsigned long max_blocks; /* How many blocks are allowed */ + struct percpu_counter used_blocks; /* How many are allocated */ +- unsigned long max_inodes; /* How many inodes are allowed */ +- unsigned long free_inodes; /* How many are left for allocation */ ++ int max_inodes; /* How many inodes are allowed */ ++ int free_inodes; /* How many are left for allocation */ + spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ + umode_t mode; /* Mount mode for root directory */ + unsigned char huge; /* Whether to try for hugepages */ +diff --git a/mm/shmem.c b/mm/shmem.c +index 7fbe67b..f6695c1 100644 +--- a/mm/shmem.c ++++ b/mm/shmem.c +@@ -111,9 +111,13 @@ static unsigned long shmem_default_max_blocks(void) + return totalram_pages / 2; + } + +-static unsigned long shmem_default_max_inodes(void) ++static int shmem_default_max_inodes(void) + { +- return min(totalram_pages - totalhigh_pages, totalram_pages / 2); ++ unsigned long ul; ++ ++ ul = INT_MAX; ++ ul = min3(ul, totalram_pages - totalhigh_pages, totalram_pages / 2); ++ return ul; + } + #endif + +@@ -1082,6 +1086,11 @@ static void shmem_evict_inode(struct inode *inode) + + simple_xattrs_free(&info->xattrs); + WARN_ON(inode->i_blocks); ++ if (!sbinfo->idr_nouse && inode->i_ino) { ++ mutex_lock(&sbinfo->idr_lock); ++ idr_remove(&sbinfo->idr, inode->i_ino); ++ mutex_unlock(&sbinfo->idr_lock); ++ } + shmem_free_inode(inode->i_sb); + clear_inode(inode); + } +@@ -2150,13 +2159,13 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode + struct inode *inode; + struct shmem_inode_info *info; + struct shmem_sb_info *sbinfo = SHMEM_SB(sb); ++ int ino; + + if (shmem_reserve_inode(sb)) + return NULL; + + inode = new_inode(sb); + if (inode) { +- inode->i_ino = get_next_ino(); + inode_init_owner(inode, dir, mode); + inode->i_blocks = 0; + inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); +@@ -2198,6 +2207,25 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode + mpol_shared_policy_init(&info->policy, NULL); + break; + } ++ ++ if (!sbinfo->idr_nouse) { ++ /* inum 0 and 1 are unused */ ++ mutex_lock(&sbinfo->idr_lock); ++ ino = idr_alloc(&sbinfo->idr, inode, 2, INT_MAX, ++ GFP_NOFS); ++ if (ino > 0) { ++ inode->i_ino = ino; ++ mutex_unlock(&sbinfo->idr_lock); ++ __insert_inode_hash(inode, inode->i_ino); ++ } else { ++ inode->i_ino = 0; ++ mutex_unlock(&sbinfo->idr_lock); ++ iput(inode); ++ /* shmem_free_inode() will be called */ ++ inode = NULL; ++ } ++ } else ++ inode->i_ino = get_next_ino(); + } else + shmem_free_inode(sb); + return inode; +@@ -3397,8 +3425,7 @@ static struct dentry *shmem_get_parent(struct dentry *child) + static int shmem_match(struct inode *ino, void *vfh) + { + __u32 *fh = vfh; +- __u64 inum = fh[2]; +- inum = (inum << 32) | fh[1]; ++ __u64 inum = fh[1]; + return ino->i_ino == inum && fh[0] == ino->i_generation; + } + +@@ -3409,14 +3436,11 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, + struct dentry *dentry = NULL; + u64 inum; + +- if (fh_len < 3) ++ if (fh_len < 2) + return NULL; + +- inum = fid->raw[2]; +- inum = (inum << 32) | fid->raw[1]; +- +- inode = ilookup5(sb, (unsigned long)(inum + fid->raw[0]), +- shmem_match, fid->raw); ++ inum = fid->raw[1]; ++ inode = ilookup5(sb, inum, shmem_match, fid->raw); + if (inode) { + dentry = d_find_alias(inode); + iput(inode); +@@ -3428,30 +3452,15 @@ static struct dentry *shmem_fh_to_dentry(struct super_block *sb, + static int shmem_encode_fh(struct inode *inode, __u32 *fh, int *len, + struct inode *parent) + { +- if (*len < 3) { +- *len = 3; ++ if (*len < 2) { ++ *len = 2; + return FILEID_INVALID; + } + +- if (inode_unhashed(inode)) { +- /* Unfortunately insert_inode_hash is not idempotent, +- * so as we hash inodes here rather than at creation +- * time, we need a lock to ensure we only try +- * to do it once +- */ +- static DEFINE_SPINLOCK(lock); +- spin_lock(&lock); +- if (inode_unhashed(inode)) +- __insert_inode_hash(inode, +- inode->i_ino + inode->i_generation); +- spin_unlock(&lock); +- } +- + fh[0] = inode->i_generation; + fh[1] = inode->i_ino; +- fh[2] = ((__u64)inode->i_ino) >> 32; + +- *len = 3; ++ *len = 2; + return 1; + } + +@@ -3515,7 +3524,7 @@ static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo, + goto bad_val; + } else if (!strcmp(this_char,"nr_inodes")) { + sbinfo->max_inodes = memparse(value, &rest); +- if (*rest) ++ if (*rest || sbinfo->max_inodes < 2) + goto bad_val; + } else if (!strcmp(this_char,"mode")) { + if (remount) +@@ -3580,7 +3589,7 @@ static int shmem_remount_fs(struct super_block *sb, int *flags, char *data) + { + struct shmem_sb_info *sbinfo = SHMEM_SB(sb); + struct shmem_sb_info config = *sbinfo; +- unsigned long inodes; ++ int inodes; + int error = -EINVAL; + + config.mpol = NULL; +@@ -3629,7 +3638,7 @@ static int shmem_show_options(struct seq_file *seq, struct dentry *root) + seq_printf(seq, ",size=%luk", + sbinfo->max_blocks << (PAGE_SHIFT - 10)); + if (sbinfo->max_inodes != shmem_default_max_inodes()) +- seq_printf(seq, ",nr_inodes=%lu", sbinfo->max_inodes); ++ seq_printf(seq, ",nr_inodes=%d", sbinfo->max_inodes); + if (sbinfo->mode != (S_IRWXUGO | S_ISVTX)) + seq_printf(seq, ",mode=%03ho", sbinfo->mode); + if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID)) +@@ -3747,6 +3756,8 @@ static void shmem_put_super(struct super_block *sb) + { + struct shmem_sb_info *sbinfo = SHMEM_SB(sb); + ++ if (!sbinfo->idr_nouse) ++ idr_destroy(&sbinfo->idr); + percpu_counter_destroy(&sbinfo->used_blocks); + mpol_put(sbinfo->mpol); + kfree(sbinfo); +@@ -3765,6 +3776,8 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent) + if (!sbinfo) + return -ENOMEM; + ++ mutex_init(&sbinfo->idr_lock); ++ idr_init(&sbinfo->idr); + sbinfo->mode = S_IRWXUGO | S_ISVTX; + sbinfo->uid = current_fsuid(); + sbinfo->gid = current_fsgid(); +@@ -3872,6 +3885,15 @@ static void shmem_destroy_inodecache(void) + kmem_cache_destroy(shmem_inode_cachep); + } + ++static __init void shmem_no_idr(struct super_block *sb) ++{ ++ struct shmem_sb_info *sbinfo; ++ ++ sbinfo = SHMEM_SB(sb); ++ sbinfo->idr_nouse = true; ++ idr_destroy(&sbinfo->idr); ++} ++ + static const struct address_space_operations shmem_aops = { + .writepage = shmem_writepage, + .set_page_dirty = __set_page_dirty_no_writeback, +@@ -4002,6 +4024,7 @@ int __init shmem_init(void) + pr_err("Could not kern_mount tmpfs\n"); + goto out1; + } ++ shmem_no_idr(shm_mnt->mnt_sb); + + #ifdef CONFIG_TRANSPARENT_HUGE_PAGECACHE + if (has_transparent_hugepage() && shmem_huge > SHMEM_HUGE_DENY) diff --git a/talimatname/genel/k/kernel/vfs-ino.patch b/talimatname/genel/k/kernel/vfs-ino.patch new file mode 100644 index 000000000..4b7b944d3 --- /dev/null +++ b/talimatname/genel/k/kernel/vfs-ino.patch @@ -0,0 +1,23 @@ +SPDX-License-Identifier: GPL-2.0 +diff --git a/fs/inode.c b/fs/inode.c +index 03102d6..a0b03c7 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -856,6 +856,8 @@ unsigned int get_next_ino(void) + unsigned int *p = &get_cpu_var(last_ino); + unsigned int res = *p; + ++start: ++ + #ifdef CONFIG_SMP + if (unlikely((res & (LAST_INO_BATCH-1)) == 0)) { + static atomic_t shared_last_ino; +@@ -868,7 +870,7 @@ unsigned int get_next_ino(void) + res++; + /* get_next_ino should not provide a 0 inode number */ + if (unlikely(!res)) +- res++; ++ goto start; + *p = res; + put_cpu_var(last_ino); + return res; diff --git a/talimatname/genel/k/keybinder/talimat b/talimatname/genel/k/keybinder/talimat new file mode 100644 index 000000000..22427d78c --- /dev/null +++ b/talimatname/genel/k/keybinder/talimat @@ -0,0 +1,18 @@ +# Tanım: Genel tuş vuruşlarını kaydetmek için bir kütüphane +# URL: https://github.com/engla/keybinder +# Paketçi: milisarge +# Gerekler: gtk2 python-gtk gobject-introspection + +isim=keybinder +surum=0.3.1 +devir=1 + +kaynak=(https://github.com/engla/$isim/releases/download/v$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --libexecdir=/usr/lib/$isim --sysconfdir=/etc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/k/keybinder3/talimat b/talimatname/genel/k/keybinder3/talimat new file mode 100644 index 000000000..b23e1d7dd --- /dev/null +++ b/talimatname/genel/k/keybinder3/talimat @@ -0,0 +1,18 @@ +# Tanım: Genel klavye kısayollarını kaydetmek için bir kütüphane +# URL: https://github.com/engla/keybinder/tree/keybinder-3.0 +# Paketçi: Cihan_Alkan +# Gerekler: gobject-introspection gtk3 +# Grup: kütüphane + +isim=keybinder3 +surum=0.3.2 +devir=1 +kaynak=(https://github.com/kupferlauncher/keybinder/releases/download/keybinder-3.0-v$surum/keybinder-3.0-$surum.tar.gz) + +derle() { + cd keybinder-3.0-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + install -Dm644 COPYING "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/k/keyutils/talimat b/talimatname/genel/k/keyutils/talimat new file mode 100644 index 000000000..8a1df4e0d --- /dev/null +++ b/talimatname/genel/k/keyutils/talimat @@ -0,0 +1,18 @@ +# Tanım: Keyutils, çekirdekte anahtar tutma yerini yönetmek için kullanılan bir dizi araçtır. +# URL: https://rhn.redhat.com/errata/RHEA-2006-0090.html +# Paketçi: milisarge +# Gerekler: + +isim=keyutils +surum=1.5.9 +devir=1 + +kaynak=( http://people.redhat.com/~dhowells/$isim/$isim-$surum.tar.bz2 ) + +derle() { + unset MAKEFLAGS + cd $isim-$surum + sed -i "s/-O2/${CFLAGS}/" Makefile + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-attica/talimat b/talimatname/genel/k/kf5-attica/talimat new file mode 100644 index 000000000..42d98b0ea --- /dev/null +++ b/talimatname/genel/k/kf5-attica/talimat @@ -0,0 +1,24 @@ +# Tanım: Açık İşbirliği Hizmetleri API'sı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-attica +surum=5.41.0 +devir=1 +_isim=attica +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-baloo/kf5-baloo.kur-kos b/talimatname/genel/k/kf5-baloo/kf5-baloo.kur-kos new file mode 100644 index 000000000..297ac603c --- /dev/null +++ b/talimatname/genel/k/kf5-baloo/kf5-baloo.kur-kos @@ -0,0 +1,2 @@ +[[ -x xdg-icon-resource ]] && xdg-icon-resource forceupdate --theme hicolor &> /dev/null || true + diff --git a/talimatname/genel/k/kf5-baloo/talimat b/talimatname/genel/k/kf5-baloo/talimat new file mode 100644 index 000000000..a519175a5 --- /dev/null +++ b/talimatname/genel/k/kf5-baloo/talimat @@ -0,0 +1,25 @@ +# Tanım: Meta verileri aramak ve yönetmek için bir çerçeve +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: lmdb attr kf5-kauth kf5-kcrash kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kfilemetadata kf5-ki18n kf5-kidletime kf5-kio kf5-solid hicolor-icon-theme xdg-utils +# Grup: kde + +isim=kf5-baloo +surum=5.41.0 +devir=1 +_isim=baloo +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-bluez-qt/talimat b/talimatname/genel/k/kf5-bluez-qt/talimat new file mode 100644 index 000000000..52d5d094b --- /dev/null +++ b/talimatname/genel/k/kf5-bluez-qt/talimat @@ -0,0 +1,25 @@ +# Tanım: BlueZ 5 DBus API için Qt sarmalayıcı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-bluez-qt +surum=5.41.0 +devir=1 +_isim=bluez-qt +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-breeze-icons/talimat b/talimatname/genel/k/kf5-breeze-icons/talimat new file mode 100644 index 000000000..4ce49a6f7 --- /dev/null +++ b/talimatname/genel/k/kf5-breeze-icons/talimat @@ -0,0 +1,24 @@ +# Tanım: Kf5 için Breeze Icon Teması +# URL: https://www.kde.org/ +# Paketçi: milisarge +# Gerekler: cmake, qt5, kf5-extra-cmake-modules +# Grup: kde + +isim=kf5-breeze-icons +surum=5.41.0 +devir=1 +_isim=breeze-icons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-extra-cmake-modules/talimat b/talimatname/genel/k/kf5-extra-cmake-modules/talimat new file mode 100644 index 000000000..463f19536 --- /dev/null +++ b/talimatname/genel/k/kf5-extra-cmake-modules/talimat @@ -0,0 +1,21 @@ +# Tanım: Tüm KDE Framework'ler tarafından kullanılan ekstra CMake modülleri 5 paketi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake + +isim=kf5-extra-cmake-modules +surum=5.41.0 +devir=1 +_isim=extra-cmake-modules +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DECM_MKSPECS_INSTALL_DIR=/usr/lib/qt5/mkspecs + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-frameworkintegration/talimat b/talimatname/genel/k/kf5-frameworkintegration/talimat new file mode 100644 index 000000000..d0939efee --- /dev/null +++ b/talimatname/genel/k/kf5-frameworkintegration/talimat @@ -0,0 +1,24 @@ +# Tanım: Uygulamaların bir KDE Çalışma Alanıyla bütünleşmesine izin veren bileşenler sağlayan çerçeve +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kjobwidgets kf5-knotifications kf5-kwidgetsaddons kf5-kxmlgui qt5 libxcb xorg-libxcursor noto-fonts + +isim=kf5-frameworkintegration +surum=5.41.0 +devir=1 +_isim=frameworkintegration +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kactivities-stats/talimat b/talimatname/genel/k/kf5-kactivities-stats/talimat new file mode 100644 index 000000000..99f25eb58 --- /dev/null +++ b/talimatname/genel/k/kf5-kactivities-stats/talimat @@ -0,0 +1,27 @@ +# Tanım: Aktivite sistemi tarafından toplanan kullanım verilerine erişmek için bir kütüphane +# URL: https://community.kde.org/Frameworks +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost kf5-kactivities +# Grup: kde + +isim=kf5-kactivities-stats +surum=5.41.0 +devir=1 +_isim=kactivities-stats +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kactivities/talimat b/talimatname/genel/k/kf5-kactivities/talimat new file mode 100644 index 000000000..407c6f2e1 --- /dev/null +++ b/talimatname/genel/k/kf5-kactivities/talimat @@ -0,0 +1,27 @@ +# Tanım: Çalışma zamanını ve kütüphaneyi kullanıcı faaliyetlerini ayrı etkinlikler halinde organize etmek için +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 boost kf5-kcmutils kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-kglobalaccel kf5-ki18n kf5-kio kf5-kservice kf5-kwindowsystem kf5-kxmlgui +# Grup: kde + +isim=kf5-kactivities +surum=5.41.0 +devir=1 +_isim=kactivities +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kapidox/talimat b/talimatname/genel/k/kf5-kapidox/talimat new file mode 100644 index 000000000..a8682f8ce --- /dev/null +++ b/talimatname/genel/k/kf5-kapidox/talimat @@ -0,0 +1,23 @@ +# Tanım: Çerçeveler API Belgeleri Araçları +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-attica doxygen python-pyyaml +# Grup: kde + +isim=kf5-kapidox +surum=5.41.0 +devir=1 +_isim=kapidox +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-karchive/talimat b/talimatname/genel/k/kf5-karchive/talimat new file mode 100644 index 000000000..a163f7443 --- /dev/null +++ b/talimatname/genel/k/kf5-karchive/talimat @@ -0,0 +1,24 @@ +# Tanım: Çeşitli arşiv türlerine erişim sağlayan Qt 5 eklentisi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 bzip2 xz zlib + +isim=kf5-karchive +surum=5.41.0 +devir=1 +_isim=karchive +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kauth/talimat b/talimatname/genel/k/kf5-kauth/talimat new file mode 100644 index 000000000..56e925f29 --- /dev/null +++ b/talimatname/genel/k/kf5-kauth/talimat @@ -0,0 +1,24 @@ +# Tanım: Sistem politikası ve kimlik doğrulama özelliklerinin soyutlanması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcoreaddons polkit-qt5 + +isim=kf5-kauth +surum=5.41.0 +devir=1 +_isim=kauth +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kbookmarks/talimat b/talimatname/genel/k/kf5-kbookmarks/talimat new file mode 100644 index 000000000..b319e0145 --- /dev/null +++ b/talimatname/genel/k/kf5-kbookmarks/talimat @@ -0,0 +1,25 @@ +# Tanım: Yer imleri ve XBEL formatı desteği +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-kcodecs kf5-kconfig kf5-kcoreaddons kf5-kiconthemes kf5-kwidgetsaddons kf5-kconfigwidgets kf5-kxmlgui +# Grup: kde + +isim=kf5-kbookmarks +surum=5.41.0 +devir=1 +_isim=kbookmarks +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kcmutils/talimat b/talimatname/genel/k/kf5-kcmutils/talimat new file mode 100644 index 000000000..6e86f7f40 --- /dev/null +++ b/talimatname/genel/k/kf5-kcmutils/talimat @@ -0,0 +1,27 @@ +# Tanım: KCModules ile etkileşim kurmak için kullanılan yardımcı programlar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-kauth kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdeclarative kf5-ki18n kf5-kiconthemes kf5-kitemviews kf5-kservice kf5-kwidgetsaddons kf5-kxmlgui pciutils +# Grup: kde + +isim=kf5-kcmutils +surum=5.41.0 +devir=1 +_isim=kcmutils +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kcodecs/talimat b/talimatname/genel/k/kf5-kcodecs/talimat new file mode 100644 index 000000000..d4ce9337a --- /dev/null +++ b/talimatname/genel/k/kf5-kcodecs/talimat @@ -0,0 +1,25 @@ +# Tanım: Çeşitli kodlamaları kullanarak dizeleri işlemek için bir yöntem koleksiyonu sağlayın +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kcodecs +surum=5.41.0 +devir=1 +_isim=kcodecs +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kcompletion/talimat b/talimatname/genel/k/kf5-kcompletion/talimat new file mode 100644 index 000000000..ea3da07ad --- /dev/null +++ b/talimatname/genel/k/kf5-kcompletion/talimat @@ -0,0 +1,26 @@ +# Tanım: Metin tamamlama yardımcıları ve widget'ları +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-kconfig kf5-kwidgetsaddons +# Grup: kde + +isim=kf5-kcompletion +surum=5.41.0 +devir=1 +_isim=kcompletion +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum + +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kconfig/talimat b/talimatname/genel/k/kf5-kconfig/talimat new file mode 100644 index 000000000..7a46c6107 --- /dev/null +++ b/talimatname/genel/k/kf5-kconfig/talimat @@ -0,0 +1,25 @@ +# Tanım: Konfigürasyon sistemi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kconfig +surum=5.41.0 +devir=1 +_isim=kconfig +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kconfigwidgets/talimat b/talimatname/genel/k/kf5-kconfigwidgets/talimat new file mode 100644 index 000000000..2ef0df656 --- /dev/null +++ b/talimatname/genel/k/kf5-kconfigwidgets/talimat @@ -0,0 +1,26 @@ +# Tanım: KConfig için Widget'lar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kauth kf5-kcodecs kf5-kconfig kf5-kcoreaddons kf5-kguiaddons kf5-ki18n kf5-kwidgetsaddons kf5-kdoctools +# Grup: kde + +isim=kf5-kconfigwidgets +surum=5.41.0 +devir=1 +_isim=kconfigwidgets +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kcoreaddons/kf5-kcoreaddons.kur-kos b/talimatname/genel/k/kf5-kcoreaddons/kf5-kcoreaddons.kur-kos new file mode 100644 index 000000000..7a6305a73 --- /dev/null +++ b/talimatname/genel/k/kf5-kcoreaddons/kf5-kcoreaddons.kur-kos @@ -0,0 +1 @@ +update-mime-database /usr/share/mime > /dev/null diff --git a/talimatname/genel/k/kf5-kcoreaddons/talimat b/talimatname/genel/k/kf5-kcoreaddons/talimat new file mode 100644 index 000000000..07a20df29 --- /dev/null +++ b/talimatname/genel/k/kf5-kcoreaddons/talimat @@ -0,0 +1,25 @@ +# Tanım: QtCore'a Eklentiler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 shared-mime-info + +isim=kf5-kcoreaddons +surum=5.41.0 +devir=1 +_isim=kcoreaddons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kcrash/talimat b/talimatname/genel/k/kf5-kcrash/talimat new file mode 100644 index 000000000..b90ff3f4e --- /dev/null +++ b/talimatname/genel/k/kf5-kcrash/talimat @@ -0,0 +1,26 @@ +# Tanım: Uygulamalardan gelen uygulama çöküş analizi ve hata raporu için destek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcoreaddons kf5-kwindowsystem + +isim=kf5-kcrash +surum=5.41.0 +devir=1 +_isim=kcrash +_surum=5.41 + +kaynak=(http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { + + cd ${_isim}-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdbusaddons/talimat b/talimatname/genel/k/kf5-kdbusaddons/talimat new file mode 100644 index 000000000..978e4183e --- /dev/null +++ b/talimatname/genel/k/kf5-kdbusaddons/talimat @@ -0,0 +1,25 @@ +# Tanım: QtDBus'a eklentiler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kdbusaddons +surum=5.41.0 +devir=1 +_isim=kdbusaddons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdeclarative/talimat b/talimatname/genel/k/kf5-kdeclarative/talimat new file mode 100644 index 000000000..4edb9bea2 --- /dev/null +++ b/talimatname/genel/k/kf5-kdeclarative/talimat @@ -0,0 +1,26 @@ +# Tanım: QML ve KDE Framework'lerin entegrasyonunu sağlar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-kio kf5-kpackage kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem kf5-kcompletion libepoxy +# Grup: kde + +isim=kf5-kdeclarative +surum=5.41.0 +devir=1 +_isim=kdeclarative +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kded/talimat b/talimatname/genel/k/kf5-kded/talimat new file mode 100644 index 000000000..2fec43b89 --- /dev/null +++ b/talimatname/genel/k/kf5-kded/talimat @@ -0,0 +1,26 @@ +# Tanım: Sistem düzeyinde hizmetler sağlamak için genişletilebilir arka plan programı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kinit kf5-kservice kf5-kdoctools +# Grup: kde + +isim=kf5-kded +surum=5.41.0 +devir=1 +_isim=kded +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdelibs4support/talimat b/talimatname/genel/k/kf5-kdelibs4support/talimat new file mode 100644 index 000000000..34b3134db --- /dev/null +++ b/talimatname/genel/k/kf5-kdelibs4support/talimat @@ -0,0 +1,29 @@ +# Tanım: KDELibs4'ten yardım taşıma. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kded kf5-kauth kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kdesignerplugin kf5-kglobalaccel kf5-kguiaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-kjobwidgets kf5-knotifications kf5-kparts kf5-kservice kf5-ktextwidgets kf5-kunitconversion kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-solid kf5-kdoctools kf5-kemoticons kf5-kinit kf5-kitemmodels kf5-kdoctools openssl perl-uri +# Grup: kde + +isim=kf5-kdelibs4support +surum=5.41.0 +devir=1 +_isim=kdelibs4support +_surum=5.41 +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum + +sed -i "s:4.2:4.5:g" cmake/FindDocBookXML4.cmake + +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install + +} + diff --git a/talimatname/genel/k/kf5-kdesignerplugin/talimat b/talimatname/genel/k/kf5-kdesignerplugin/talimat new file mode 100644 index 000000000..a45514bd6 --- /dev/null +++ b/talimatname/genel/k/kf5-kdesignerplugin/talimat @@ -0,0 +1,26 @@ +# Tanım: Frameworks widget'larının Qt Tasarım/Oluşturucu'da entegrasyonu. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfigwidgets kf5-kiconthemes kf5-kio kf5-kitemviews kf5-kplotting kf5-ktextwidgets kf5-kxmlgui kf5-sonnet kf5-kdewebkit kf5-kdoctools +# Grup: kde + +isim=kf5-kdesignerplugin +surum=5.41.0 +devir=1 +_isim=kdesignerplugin +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdesu/talimat b/talimatname/genel/k/kf5-kdesu/talimat new file mode 100644 index 000000000..0e048c5c6 --- /dev/null +++ b/talimatname/genel/k/kf5-kdesu/talimat @@ -0,0 +1,26 @@ +# Tanım: Yüksek ayrıcalıklar için su ile entegrasyon +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kservice kf5-kpty +# Grup: kde + +isim=kf5-kdesu +surum=5.41.0 +devir=1 +_isim=kdesu +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdewebkit/talimat b/talimatname/genel/k/kf5-kdewebkit/talimat new file mode 100644 index 000000000..43c10175b --- /dev/null +++ b/talimatname/genel/k/kf5-kdewebkit/talimat @@ -0,0 +1,27 @@ +# Tanım: QtWebKit için KDE Entegrasyonu +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5-webkit kf5-kconfig kf5-kcoreaddons kf5-kio kf5-kjobwidgets kf5-kparts kf5-kservice kf5-kwallet +# Grup: kde + +isim=kf5-kdewebkit +surum=5.41.0 +devir=1 +_isim=kdewebkit +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdnssd/talimat b/talimatname/genel/k/kf5-kdnssd/talimat new file mode 100644 index 000000000..433c9d375 --- /dev/null +++ b/talimatname/genel/k/kf5-kdnssd/talimat @@ -0,0 +1,26 @@ +# Tanım: Sistem DNSSD özelliklerinin soyutlanması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 avahi +# Grup: kde + +isim=kf5-kdnssd +surum=5.41.0 +devir=1 +_isim=kdnssd +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kdoctools/talimat b/talimatname/genel/k/kf5-kdoctools/talimat new file mode 100644 index 000000000..8aa65cf0a --- /dev/null +++ b/talimatname/genel/k/kf5-kdoctools/talimat @@ -0,0 +1,26 @@ +# Tanım: DocBook'tan dokümantasyon yarat +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive docbook-xml docbook-xsl libxslt perl-uri kf5-ki18n +# Grup: kde + +isim=kf5-kdoctools +surum=5.41.0 +devir=1 +_isim=kdoctools +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kemoticons/talimat b/talimatname/genel/k/kf5-kemoticons/talimat new file mode 100644 index 000000000..e62fff36a --- /dev/null +++ b/talimatname/genel/k/kf5-kemoticons/talimat @@ -0,0 +1,25 @@ +# Tanım: İfadeler ve ifade temaları için destek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive kf5-kconfig kf5-kcoreaddons kf5-kservice + +isim=kf5-kemoticons +surum=5.41.0 +devir=1 +_isim=kemoticons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kfilemetadata/talimat b/talimatname/genel/k/kf5-kfilemetadata/talimat new file mode 100644 index 000000000..a79cc6da2 --- /dev/null +++ b/talimatname/genel/k/kf5-kfilemetadata/talimat @@ -0,0 +1,25 @@ +# Tanım: Dosya meta verilerini ayıklamak için bir kütüphane +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive kf5-ki18n ebook-tools exiv2 ffmpeg poppler-qt5 taglib +# Grup: kde + +isim=kf5-kfilemetadata +surum=5.41.0 +devir=1 +_isim=kfilemetadata +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd $_isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-kglobalaccel/talimat b/talimatname/genel/k/kf5-kglobalaccel/talimat new file mode 100644 index 000000000..58fffb2cf --- /dev/null +++ b/talimatname/genel/k/kf5-kglobalaccel/talimat @@ -0,0 +1,25 @@ +# Tanım: Genel çalışma alanı kısayolları için destek ekleyin +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kwindowsystem libxcb xcb-util-keysyms + +isim=kf5-kglobalaccel +surum=5.41.0 +devir=1 +_isim=kglobalaccel +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kguiaddons/talimat b/talimatname/genel/k/kf5-kguiaddons/talimat new file mode 100644 index 000000000..13f3f3069 --- /dev/null +++ b/talimatname/genel/k/kf5-kguiaddons/talimat @@ -0,0 +1,25 @@ +# Tanım: QtGui'ye eklentiler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kguiaddons +surum=5.41.0 +devir=1 +_isim=kguiaddons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-khtml/talimat b/talimatname/genel/k/kf5-khtml/talimat new file mode 100644 index 000000000..91107132d --- /dev/null +++ b/talimatname/genel/k/kf5-khtml/talimat @@ -0,0 +1,26 @@ +# Tanım: KHTML API'leri +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-kio kf5-kjobwidgets kf5-kjs kf5-knotifications kf5-kparts kf5-kservice kf5-ktextwidgets kf5-kwallet kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-sonnet giflib libjpeg-turbo libpng phonon-qt5 giflib openssl +# Grup: kde + +isim=kf5-khtml +surum=5.41.0 +devir=1 +_isim=khtml +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-ki18n/kf5-ki18n.kos-kur b/talimatname/genel/k/kf5-ki18n/kf5-ki18n.kos-kur new file mode 100644 index 000000000..ac1fee209 --- /dev/null +++ b/talimatname/genel/k/kf5-ki18n/kf5-ki18n.kos-kur @@ -0,0 +1 @@ +mkdir -p /usr/share/locale diff --git a/talimatname/genel/k/kf5-ki18n/talimat b/talimatname/genel/k/kf5-ki18n/talimat new file mode 100644 index 000000000..06bee63ad --- /dev/null +++ b/talimatname/genel/k/kf5-ki18n/talimat @@ -0,0 +1,25 @@ +# Tanım: Gelişmiş uluslararasılaşma çerçevesi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-ki18n +surum=5.41.0 +devir=1 +_isim=ki18n +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kiconthemes/talimat b/talimatname/genel/k/kf5-kiconthemes/talimat new file mode 100644 index 000000000..c8f33648b --- /dev/null +++ b/talimatname/genel/k/kf5-kiconthemes/talimat @@ -0,0 +1,26 @@ +# Tanım: Simge temaları için destek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kitemviews kf5-kwidgetsaddons +# Grup: kde + +isim=kf5-kiconthemes +surum=5.41.0 +devir=1 +_isim=kiconthemes +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kidletime/talimat b/talimatname/genel/k/kf5-kidletime/talimat new file mode 100644 index 000000000..06018f48f --- /dev/null +++ b/talimatname/genel/k/kf5-kidletime/talimat @@ -0,0 +1,26 @@ +# Tanım: Kullanıcı etkinliğini izleme +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-kidletime +surum=5.41.0 +devir=1 +_isim=kidletime +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kimageformats/talimat b/talimatname/genel/k/kf5-kimageformats/talimat new file mode 100644 index 000000000..abd190952 --- /dev/null +++ b/talimatname/genel/k/kf5-kimageformats/talimat @@ -0,0 +1,26 @@ +# Tanım: Qt5 için görüntü formatı eklentileri +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 jasper openexr kf5-karchive +# Grup: kde + +isim=kf5-kimageformats +surum=5.41.0 +devir=1 +_isim=kimageformats +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kinit/talimat b/talimatname/genel/k/kf5-kinit/talimat new file mode 100644 index 000000000..fdfe2172f --- /dev/null +++ b/talimatname/genel/k/kf5-kinit/talimat @@ -0,0 +1,26 @@ +# Tanım: KDE uygulamalarını başlatmayı hızlandırmak için işlem başlatıcısı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-ki18n kf5-kservice kf5-kwindowsystem libcap kf5-kio +# Grup: kde + +isim=kf5-kinit +surum=5.41.0 +devir=1 +_isim=kinit +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kio/kf5-kio.kur-kos b/talimatname/genel/k/kf5-kio/kf5-kio.kur-kos new file mode 100644 index 000000000..ede5eb8d0 --- /dev/null +++ b/talimatname/genel/k/kf5-kio/kf5-kio.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database -q + diff --git a/talimatname/genel/k/kf5-kio/talimat b/talimatname/genel/k/kf5-kio/talimat new file mode 100644 index 000000000..2aaa58e7e --- /dev/null +++ b/talimatname/genel/k/kf5-kio/talimat @@ -0,0 +1,26 @@ +# Tanım: Kaynak ve ağ erişimi soyutlama +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: desktop-file-utils kf5-attica kf5-kbookmarks kf5-kjobwidgets kf5-kwallet kf5-solid kerberos +# Grup: kde + +isim=kf5-kio +surum=5.41.0 +devir=1 +_isim=kio +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kitemmodels/talimat b/talimatname/genel/k/kf5-kitemmodels/talimat new file mode 100644 index 000000000..51a74f059 --- /dev/null +++ b/talimatname/genel/k/kf5-kitemmodels/talimat @@ -0,0 +1,26 @@ +# Tanım: Qt Model / Görünüm sistemi için modeller +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-kitemmodels +surum=5.41.0 +devir=1 +_isim=kitemmodels +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kitemviews/talimat b/talimatname/genel/k/kf5-kitemviews/talimat new file mode 100644 index 000000000..f4acde9cb --- /dev/null +++ b/talimatname/genel/k/kf5-kitemviews/talimat @@ -0,0 +1,26 @@ +# Tanım: Qt Model / Görünüm için Widget eklentileri +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-kitemviews +surum=5.41.0 +devir=1 +_isim=kitemviews +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kjobwidgets/talimat b/talimatname/genel/k/kf5-kjobwidgets/talimat new file mode 100644 index 000000000..575f2bf1a --- /dev/null +++ b/talimatname/genel/k/kf5-kjobwidgets/talimat @@ -0,0 +1,26 @@ +# Tanım: İş örneklerini izlemek için kullanılan widget'lar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcoreaddons kf5-kwidgetsaddons +# Grup: kde + +isim=kf5-kjobwidgets +surum=5.41.0 +devir=1 +_isim=kjobwidgets +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kjs/talimat b/talimatname/genel/k/kf5-kjs/talimat new file mode 100644 index 000000000..4aeb36f7b --- /dev/null +++ b/talimatname/genel/k/kf5-kjs/talimat @@ -0,0 +1,26 @@ +# Tanım: Uygulamalarda JS betiğini destekleme +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kdoctools pcre +# Grup: kde + +isim=kf5-kjs +surum=5.41.0 +devir=1 +_isim=kjs +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kjsembed/talimat b/talimatname/genel/k/kf5-kjsembed/talimat new file mode 100644 index 000000000..43c1957ae --- /dev/null +++ b/talimatname/genel/k/kf5-kjsembed/talimat @@ -0,0 +1,26 @@ +# Tanım: KSJEmbed, JavaScript nesnelerini QObjects'e bağlama yöntemi sunar, böylece uygulamalarınızı komut dosyasına yazabilirsiniz. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-ki18n kf5-kjs kf5-kdoctools +# Grup: kde + +isim=kf5-kjsembed +surum=5.41.0 +devir=1 +_isim=kjsembed +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kmediaplayer/talimat b/talimatname/genel/k/kf5-kmediaplayer/talimat new file mode 100644 index 000000000..d073c3144 --- /dev/null +++ b/talimatname/genel/k/kf5-kmediaplayer/talimat @@ -0,0 +1,26 @@ +# Tanım: Medya oynatıcı özellikleri için eklenti arayüzü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kparts kf5-kxmlgui +# Grup: kde + +isim=kf5-kmediaplayer +surum=5.41.0 +devir=1 +_isim=kmediaplayer +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-knewstuff/talimat b/talimatname/genel/k/kf5-knewstuff/talimat new file mode 100644 index 000000000..a7474db1c --- /dev/null +++ b/talimatname/genel/k/kf5-knewstuff/talimat @@ -0,0 +1,26 @@ +# Tanım: Uygulama varlıklarını ağdan indirmeye destek +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-attica kf5-karchive kf5-kcompletion kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-kservice kf5-ktextwidgets kf5-kxmlgui +# Grup: kde + +isim=kf5-knewstuff +surum=5.41.0 +devir=1 +_isim=knewstuff +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-knotifications/talimat b/talimatname/genel/k/kf5-knotifications/talimat new file mode 100644 index 000000000..61b048a13 --- /dev/null +++ b/talimatname/genel/k/kf5-knotifications/talimat @@ -0,0 +1,26 @@ +# Tanım: Sistem bildirimleri için soyutlama +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcodecs kf5-kconfig kf5-kcoreaddons kf5-kwindowsystem phonon-qt5 libdbusmenu-qt5 +# Grup: kde + +isim=kf5-knotifications +surum=5.41.0 +devir=1 +_isim=knotifications +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-knotifyconfig/talimat b/talimatname/genel/k/kf5-knotifyconfig/talimat new file mode 100644 index 000000000..02b4c0f3f --- /dev/null +++ b/talimatname/genel/k/kf5-knotifyconfig/talimat @@ -0,0 +1,26 @@ +# Tanım: KNotify için yapılandırma sistemi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-ki18n kf5-kio phonon-qt5 +# Grup: kde + +isim=kf5-knotifyconfig +surum=5.41.0 +devir=1 +_isim=knotifyconfig +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kpackage/talimat b/talimatname/genel/k/kf5-kpackage/talimat new file mode 100644 index 000000000..f0f48885a --- /dev/null +++ b/talimatname/genel/k/kf5-kpackage/talimat @@ -0,0 +1,26 @@ +# Tanım: Uygulamaların, ikili olmayan öğelerin kullanıcı tarafından kurulabilir paketlerini yönetmesine olanak sağlayan çerçeve +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kdoctools kf5-karchive kf5-ki18n kf5-kcoreaddons kf5-kconfig +# Grup: kde + +isim=kf5-kpackage +surum=5.41.0 +devir=1 +_isim=kpackage +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kparts/talimat b/talimatname/genel/k/kf5-kparts/talimat new file mode 100644 index 000000000..0ec36fb80 --- /dev/null +++ b/talimatname/genel/k/kf5-kparts/talimat @@ -0,0 +1,26 @@ +# Tanım: Doküman merkezli eklenti sistemi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kjobwidgets kf5-knotifications kf5-kservice kf5-kwidgetsaddons kf5-kxmlgui kf5-ktextwidgets +# Grup: kde + +isim=kf5-kparts +surum=5.41.0 +devir=1 +_isim=kparts +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kpeople/talimat b/talimatname/genel/k/kf5-kpeople/talimat new file mode 100644 index 000000000..31dc44248 --- /dev/null +++ b/talimatname/genel/k/kf5-kpeople/talimat @@ -0,0 +1,25 @@ +# Tanım: Tüm kişilere ve onları tutan insanlara erişimi sağlayan bir kütüphane +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kitemviews kf5-kservice kf5-kwidgetsaddons + +isim=kf5-kpeople +surum=5.41.0 +devir=1 +_isim=kpeople +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kplotting/talimat b/talimatname/genel/k/kf5-kplotting/talimat new file mode 100644 index 000000000..00836a512 --- /dev/null +++ b/talimatname/genel/k/kf5-kplotting/talimat @@ -0,0 +1,26 @@ +# Tanım: Hafif plotlama çerçevesi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-kplotting +surum=5.41.0 +devir=1 +_isim=kplotting +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kprison/talimat b/talimatname/genel/k/kf5-kprison/talimat new file mode 100644 index 000000000..21d3ff979 --- /dev/null +++ b/talimatname/genel/k/kf5-kprison/talimat @@ -0,0 +1,24 @@ +# Tanım: QRCode barkodları ve DataMatrix barkodları üretmek için bir barkod API sı +# URL: https://www.kde.org/ +# Paketçi: Cihan_Alkan +# Gerekler: libdmtx qrencode kf5-extra-cmake-modules doxygen qt5 +# Grup: kde + +isim=kf5-kprison +surum=5.41.0 +devir=1 +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/prison-$surum.tar.xz) + +derle() { +cd prison-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-kpty/talimat b/talimatname/genel/k/kf5-kpty/talimat new file mode 100644 index 000000000..836d8c48b --- /dev/null +++ b/talimatname/genel/k/kf5-kpty/talimat @@ -0,0 +1,25 @@ +# Tanım: Pty soyutlama +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28 +# Gerekler: kf5-kcoreaddons kf5-ki18n + +isim=kf5-kpty +surum=5.41.0 +devir=1 +_isim=kpty +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kross/talimat b/talimatname/genel/k/kf5-kross/talimat new file mode 100644 index 000000000..198d3499f --- /dev/null +++ b/talimatname/genel/k/kf5-kross/talimat @@ -0,0 +1,26 @@ +# Tanım: Çok dilli uygulama betiği +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kparts kf5-kwidgetsaddons kf5-kxmlgui kf5-kdoctools +# Grup: kde + +isim=kf5-kross +surum=5.41.0 +devir=1 +_isim=kross +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/portingAids/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-krunner/talimat b/talimatname/genel/k/kf5-krunner/talimat new file mode 100644 index 000000000..54687f558 --- /dev/null +++ b/talimatname/genel/k/kf5-krunner/talimat @@ -0,0 +1,25 @@ +# Tanım: Bir dize sorgusu verilen farklı eylemler sağlamak için çerçeve +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kio kf5-kservice kf5-plasma-framework kf5-solid kf5-threadweaver +# Grup: kde + +isim=kf5-krunner +surum=5.41.0 +devir=1 +_isim=krunner +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-kservice/talimat b/talimatname/genel/k/kf5-kservice/talimat new file mode 100644 index 000000000..ed39179ea --- /dev/null +++ b/talimatname/genel/k/kf5-kservice/talimat @@ -0,0 +1,26 @@ +# Tanım: Gelişmiş eklenti ve servis içgözlemi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-ki18n kf5-kdoctools +# Grup: kde + +isim=kf5-kservice +surum=5.41.0 +devir=1 +_isim=kservice +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-ktexteditor/talimat b/talimatname/genel/k/kf5-ktexteditor/talimat new file mode 100644 index 000000000..5a3120af3 --- /dev/null +++ b/talimatname/genel/k/kf5-ktexteditor/talimat @@ -0,0 +1,26 @@ +# Tanım: Gelişmiş gömülebilir metin editörü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28 +# Gerekler: kf5-karchive kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kguiaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-kjobwidgets kf5-kparts kf5-ktextwidgets kf5-kwidgetsaddons kf5-kxmlgui kf5-sonnet +# Grup: kde + +isim=kf5-ktexteditor +surum=5.41.0 +devir=1 +_isim=ktexteditor +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-ktextwidgets/talimat b/talimatname/genel/k/kf5-ktextwidgets/talimat new file mode 100644 index 000000000..7634e3ee7 --- /dev/null +++ b/talimatname/genel/k/kf5-ktextwidgets/talimat @@ -0,0 +1,26 @@ +# Tanım: Gelişmiş metin düzenleme widget'ları +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem kf5-sonnet +# Grup: kde + +isim=kf5-ktextwidgets +surum=5.41.0 +devir=1 +_isim=ktextwidgets +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kunitconversion/talimat b/talimatname/genel/k/kf5-kunitconversion/talimat new file mode 100644 index 000000000..e64b7103f --- /dev/null +++ b/talimatname/genel/k/kf5-kunitconversion/talimat @@ -0,0 +1,26 @@ +# Tanım: Birim dönüştürme desteği +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-ki18n +# Grup: kde + +isim=kf5-kunitconversion +surum=5.41.0 +devir=1 +_isim=kunitconversion +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kwallet/talimat b/talimatname/genel/k/kf5-kwallet/talimat new file mode 100644 index 000000000..1bcbd2efb --- /dev/null +++ b/talimatname/genel/k/kf5-kwallet/talimat @@ -0,0 +1,26 @@ +# Tanım: Kullanıcı şifreleri için güvenli ve birleşik konteyner +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gpgmepp kf5-kconfig kf5-kcoreaddons kf5-kdbusaddons kf5-ki18n kf5-kiconthemes kf5-knotifications kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem libgcrypt gnupg +# Grup: kde + +isim=kf5-kwallet +surum=5.41.0 +devir=1 +_isim=kwallet +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kwayland/talimat b/talimatname/genel/k/kf5-kwayland/talimat new file mode 100644 index 000000000..33c0ec376 --- /dev/null +++ b/talimatname/genel/k/kf5-kwayland/talimat @@ -0,0 +1,24 @@ +# Tanım: Wayland kütüphaneleri için Qt tarzı İstemci ve Sunucu kitaplığı sarmalayıcı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 wayland +# Grup: kde + +isim=kf5-kwayland +surum=5.41.0 +devir=1 +_isim=kwayland +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-kwidgetsaddons/talimat b/talimatname/genel/k/kf5-kwidgetsaddons/talimat new file mode 100644 index 000000000..396ec4908 --- /dev/null +++ b/talimatname/genel/k/kf5-kwidgetsaddons/talimat @@ -0,0 +1,25 @@ +# Tanım: QtWidgets'a eklentiler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kwidgetsaddons +surum=5.41.0 +devir=1 +_isim=kwidgetsaddons +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kwindowsystem/talimat b/talimatname/genel/k/kf5-kwindowsystem/talimat new file mode 100644 index 000000000..b208b3180 --- /dev/null +++ b/talimatname/genel/k/kf5-kwindowsystem/talimat @@ -0,0 +1,25 @@ +# Tanım: Pencere sistemine erişim +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 + +isim=kf5-kwindowsystem +surum=5.41.0 +devir=1 +_isim=kwindowsystem +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kxmlgui/talimat b/talimatname/genel/k/kf5-kxmlgui/talimat new file mode 100644 index 000000000..0ad6cd998 --- /dev/null +++ b/talimatname/genel/k/kf5-kxmlgui/talimat @@ -0,0 +1,26 @@ +# Tanım: Kullanıcı tarafından konfigüre edilebilir ana pencereler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-kitemviews kf5-ktextwidgets kf5-kwidgetsaddons kf5-kwindowsystem kf5-attica +# Grup: kde + +isim=kf5-kxmlgui +surum=5.41.0 +devir=1 +_isim=kxmlgui +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-kxmlrpcclient/talimat b/talimatname/genel/k/kf5-kxmlrpcclient/talimat new file mode 100644 index 000000000..7cfed3437 --- /dev/null +++ b/talimatname/genel/k/kf5-kxmlrpcclient/talimat @@ -0,0 +1,26 @@ +# Tanım: KDE için XML-RPC istemci kütüphanesi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28 +# Gerekler: kf5-kcoreaddons kf5-ki18n kf5-kio +# Grup: kde + +isim=kf5-kxmlrpcclient +surum=5.41.0 +devir=1 +_isim=kxmlrpcclient +_surum=5.41 + +kaynak=(http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-modemmanager-qt/talimat b/talimatname/genel/k/kf5-modemmanager-qt/talimat new file mode 100644 index 000000000..57cfe27c8 --- /dev/null +++ b/talimatname/genel/k/kf5-modemmanager-qt/talimat @@ -0,0 +1,25 @@ +# Tanım: ModemManager DBus API için Qt sarıcı. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules modemmanager qt5 + +isim=kf5-modemmanager-qt +surum=5.41.0 +devir=1 +_isim=modemmanager-qt +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-networkmanager-qt/talimat b/talimatname/genel/k/kf5-networkmanager-qt/talimat new file mode 100644 index 000000000..e336c2670 --- /dev/null +++ b/talimatname/genel/k/kf5-networkmanager-qt/talimat @@ -0,0 +1,25 @@ +# Tanım: NetworkManager API için Qt sarmalayıcı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kwindowsystem networkmanager +# Grup: kde + +isim=kf5-networkmanager-qt +surum=5.41.0 +devir=1 +_isim=networkmanager-qt +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-oxygen-icons5/talimat b/talimatname/genel/k/kf5-oxygen-icons5/talimat new file mode 100644 index 000000000..3ee57f7b6 --- /dev/null +++ b/talimatname/genel/k/kf5-oxygen-icons5/talimat @@ -0,0 +1,23 @@ +# Tanım: Kf5 için Oksijen simge teması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake, qt5, kf5-extra-cmake-modules +# Grup: kde + +isim=kf5-oxygen-icons5 +surum=5.41.0 +devir=1 +_isim=oxygen-icons5 +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kf5-plasma-framework/talimat b/talimatname/genel/k/kf5-plasma-framework/talimat new file mode 100644 index 000000000..6e02314c8 --- /dev/null +++ b/talimatname/genel/k/kf5-plasma-framework/talimat @@ -0,0 +1,26 @@ +# Tanım: KF5 ve Qt5'e dayanan plazma kitaplığı ve çalışma zamanı bileşenleri +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kactivities kf5-karchive kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-kglobalaccel kf5-kguiaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-knotifications kf5-kpackage kf5-kservice kf5-kwindowsystem kf5-kxmlgui xorg-mesa libxcb +# Grup: kde + +isim=kf5-plasma-framework +surum=5.41.0 +devir=1 +_isim=plasma-framework +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-solid/talimat b/talimatname/genel/k/kf5-solid/talimat new file mode 100644 index 000000000..fc297971d --- /dev/null +++ b/talimatname/genel/k/kf5-solid/talimat @@ -0,0 +1,25 @@ +# Tanım: Donanım entegrasyonu ve algılama +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules eudev udisks udisks2 upower media-player-info gvfs + +isim=kf5-solid +surum=5.41.0 +devir=1 +_isim=solid +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-sonnet/talimat b/talimatname/genel/k/kf5-sonnet/talimat new file mode 100644 index 000000000..ca58e15f2 --- /dev/null +++ b/talimatname/genel/k/kf5-sonnet/talimat @@ -0,0 +1,27 @@ +# Tanım: Qt5 için yazım çerçevesi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 aspell aspell-tr hunspell +# Grup: kde + +isim=kf5-sonnet +surum=5.41.0 +devir=1 +_isim=sonnet +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5-threadweaver/talimat b/talimatname/genel/k/kf5-threadweaver/talimat new file mode 100644 index 000000000..8eef52e8a --- /dev/null +++ b/talimatname/genel/k/kf5-threadweaver/talimat @@ -0,0 +1,26 @@ +# Tanım: Üst düzey çok iş parçacıklı çerçeve +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 +# Grup: kde + +isim=kf5-threadweaver +surum=5.41.0 +devir=1 +_isim=threadweaver +_surum=5.41 + +kaynak=( http://download.kde.org/stable/frameworks/${_surum}/${_isim}-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kf5/talimat b/talimatname/genel/k/kf5/talimat new file mode 100644 index 000000000..a9c65d459 --- /dev/null +++ b/talimatname/genel/k/kf5/talimat @@ -0,0 +1,15 @@ +# Tanım: Bu paket KDE Frameworks 5'i yüklemektedir. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-attica kf5-baloo kf5-bluez-qt kf5-breeze-icons kf5-frameworkintegration kf5-kactivities kf5-kactivities-stats kf5-kapidox kf5-karchive kf5-kauth kf5-kbookmarks kf5-kcmutils kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kdeclarative kf5-kded kf5-kdelibs4support kf5-kdesignerplugin kf5-kdesu kf5-kdewebkit kf5-kdnssd kf5-kdoctools kf5-kemoticons kf5-kfilemetadata kf5-kglobalaccel kf5-kguiaddons kf5-khtml kf5-ki18n kf5-kiconthemes kf5-kidletime kf5-kimageformats kf5-kinit kf5-kio kf5-kitemmodels kf5-kitemviews kf5-kjobwidgets kf5-kjs kf5-kjsembed kf5-kmediaplayer kf5-knewstuff kf5-knotifications kf5-knotifyconfig kf5-kpackage kf5-kparts kf5-kpeople kf5-kplotting kf5-kpty kf5-kross kf5-krunner kf5-kservice kf5-ktexteditor kf5-ktextwidgets kf5-kunitconversion kf5-kwallet kf5-kwayland kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-kxmlrpcclient kf5-modemmanager-qt kf5-networkmanager-qt kf5-oxygen-icons5 kf5-plasma-framework kf5-solid kf5-sonnet kf5-threadweaver +# Grup: kde + +isim=kf5 +surum=5.41.0 +devir=1 + +kaynak=(talimat) + +derle() { +echo "KDE Frameworks 5" +} diff --git a/talimatname/genel/k/khelpcenter/talimat b/talimatname/genel/k/khelpcenter/talimat new file mode 100644 index 000000000..ffd2a8283 --- /dev/null +++ b/talimatname/genel/k/khelpcenter/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE Uygulamalarının belgelerini göstermek için uygulama +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcmutils kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-khtml kf5-ki18n kf5-kiconthemes kf5-kinit kf5-kio kf5-kparts kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui plasma-kde-cli-tools grantlee-qt5 xapian +# Grup: kde + +isim=khelpcenter +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kholidays/talimat b/talimatname/genel/k/kholidays/talimat new file mode 100644 index 000000000..9c97ffeca --- /dev/null +++ b/talimatname/genel/k/kholidays/talimat @@ -0,0 +1,21 @@ +# Tanım: Coğrafi bölge için tatil ve diğer özel olayları belirleyen C ++ API'si +# URL : https://projects.kde.org/projects/kde/pim +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kf5-kdelibs4support kf5-kitemviews qt5 + +isim=kholidays +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kidentitymanagement/talimat b/talimatname/genel/k/kidentitymanagement/talimat new file mode 100644 index 000000000..77d1cba77 --- /dev/null +++ b/talimatname/genel/k/kidentitymanagement/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE PIM kitaplıkları +# URL: https://projects.kde.org/projects/kde/pim/ +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kf5-kdelibs4support kf5-kcoreaddons kpimtextedit + +isim=kidentitymanagement +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kimap/talimat b/talimatname/genel/k/kimap/talimat new file mode 100644 index 000000000..055321cd4 --- /dev/null +++ b/talimatname/genel/k/kimap/talimat @@ -0,0 +1,21 @@ +# Tanım: IMAP sunucularıyla etkileşim kurmak için iş tabanlı API +# URL: https://projects.kde.org/projects/kde/pim/ +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kf5-kdelibs4support kmime boost cyrus-sasl + +isim=kimap +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kio-extras/kio-extras.kur-kos b/talimatname/genel/k/kio-extras/kio-extras.kur-kos new file mode 100644 index 000000000..7d330dd27 --- /dev/null +++ b/talimatname/genel/k/kio-extras/kio-extras.kur-kos @@ -0,0 +1 @@ +update-mime-database /usr/share/mime &> /dev/null diff --git a/talimatname/genel/k/kio-extras/talimat b/talimatname/genel/k/kio-extras/talimat new file mode 100644 index 000000000..fd4edb565 --- /dev/null +++ b/talimatname/genel/k/kio-extras/talimat @@ -0,0 +1,22 @@ +# Tanım: KIO'nun işlevselliğini artırmak için ek bileşenler +# URL: https://www.kde.org/ +# Paketçi: cihanAlkan +# Gerekler: qt5 kf5-karchive kf5-kbookmarks kf5-kcodecs kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-kdnssd kf5-kguiaddons kf5-khtml kf5-ki18n kf5-kiconthemes kf5-kio kf5-kparts kf5-kpty kf5-kservice kf5-kxmlgui kf5-solid libjpeg-turbo exiv2 libmtp phonon-qt5 samba shared-mime-info kf5-kactivities openexr + +isim=kio-extras +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/kio-extras-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kirigami/talimat b/talimatname/genel/k/kirigami/talimat new file mode 100644 index 000000000..09ca82128 --- /dev/null +++ b/talimatname/genel/k/kirigami/talimat @@ -0,0 +1,22 @@ +# Tanım: QtQuick tabanlı bileşenler seti +# URL: https://community.kde.org/Frameworks +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules kf5-plasma-framework +# Grup: + +isim=kirigami +surum=1.1.0 +devir=1 +kaynak=(http://download.kde.org/stable/$isim/$isim-$surum.tar.xz) + +derle() { + mkdir build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/klavaro/klavaro.mo b/talimatname/genel/k/klavaro/klavaro.mo new file mode 100644 index 0000000000000000000000000000000000000000..926f8b18f474a75923f13400edf9cd1fdbf625e2 GIT binary patch literal 29018 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 E1@eZDr~m)} literal 0 HcmV?d00001 diff --git a/talimatname/genel/k/klavaro/talimat b/talimatname/genel/k/klavaro/talimat new file mode 100644 index 000000000..19e905baa --- /dev/null +++ b/talimatname/genel/k/klavaro/talimat @@ -0,0 +1,18 @@ +# Tanım: Hızlı klavye yazma uygulaması +# URL: http://klavaro.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: curl intltool gtk3 + +isim=klavaro +surum=3.03 +devir=1 +kaynak=(https://sourceforge.net/projects/klavaro/files/klavaro-3.03.tar.bz2 +klavaro.mo) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make +make DESTDIR=$PKG install +cp -f $SRC/klavaro.mo /usr/share/locale/tr/LC_MESSAGES/ +} diff --git a/talimatname/genel/k/kldap/talimat b/talimatname/genel/k/kldap/talimat new file mode 100644 index 000000000..b06a7dce2 --- /dev/null +++ b/talimatname/genel/k/kldap/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE için LDAP erişim API'sı +# URL: https://projects.kde.org/kldap +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules python kf5-ki18n kf5-kcompletion cyrus-sasl kf5-kio kmbox +# Grup: kde + +isim=kldap +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kmahjongg/talimat b/talimatname/genel/k/kmahjongg/talimat new file mode 100644 index 000000000..4e95a9bec --- /dev/null +++ b/talimatname/genel/k/kmahjongg/talimat @@ -0,0 +1,21 @@ +# Tanım: kmahjongg oyunu +# URL: http://kde.org/applications/games/kpatience/ +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools libkdegames libkmahjongg kf5-knotifyconfig xdg-utils + +isim=kmahjongg +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kmailtransport/talimat b/talimatname/genel/k/kmailtransport/talimat new file mode 100644 index 000000000..191af46a7 --- /dev/null +++ b/talimatname/genel/k/kmailtransport/talimat @@ -0,0 +1,21 @@ +# Tanım: Posta Taşıma Hizmeti +# URL: https://projects.kde.org/projects/kde/pim/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost python kf5-kdoctools kf5-kdelibs4support kf5-kcmutils akonadi-mime + +isim=kmailtransport +surum=16.08.2 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kmbox/talimat b/talimatname/genel/k/kmbox/talimat new file mode 100644 index 000000000..30436e27f --- /dev/null +++ b/talimatname/genel/k/kmbox/talimat @@ -0,0 +1,22 @@ +# Tanım: MBox formatında posta depolarına erişmek için kullanılan kütüphane +# URL: https://projects.kde.org/kmbox +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules python boost kf5-kdoctools kf5-kdelibs4support kmime +# Grup: kde + +isim=kmbox +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kmime/talimat b/talimatname/genel/k/kmime/talimat new file mode 100644 index 000000000..cdf43bf93 --- /dev/null +++ b/talimatname/genel/k/kmime/talimat @@ -0,0 +1,21 @@ +# Tanım: Posta mesajları ve haber grubu makaleleri için kitaplık +# URL: https://projects.kde.org/kmime +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python boost kf5-ki18n kf5-kcodecs + +isim=kmime +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kmix/talimat b/talimatname/genel/k/kmix/talimat new file mode 100644 index 000000000..dad12a3b6 --- /dev/null +++ b/talimatname/genel/k/kmix/talimat @@ -0,0 +1,26 @@ +# Tanım: KDE ses kontrol programı +# URL: http://kde.org/applications/multimedia/kmix/ +# Paketçi: cihanAlkan +# Gerekler: kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-knotifications kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui alsa-lib pulseaudio libcanberra kf5-plasma-framework + +isim=kmix +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/kmix-$surum.tar.xz) + +derle() { +cd kmix-$surum + +sed -e 's|${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}|${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_SOURCE_DIR}/cmake/modules|' -i CMakeLists.txt + +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DKMIX_KF5_BUILD=ON \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kolourpaint/talimat b/talimatname/genel/k/kolourpaint/talimat new file mode 100644 index 000000000..6f961f1dd --- /dev/null +++ b/talimatname/genel/k/kolourpaint/talimat @@ -0,0 +1,24 @@ +# Tanım: Boyama programı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules hicolor-icon-theme kf5-kdelibs4support libksane + +isim=kolourpaint +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kompare/talimat b/talimatname/genel/k/kompare/talimat new file mode 100644 index 000000000..b8e45e02b --- /dev/null +++ b/talimatname/genel/k/kompare/talimat @@ -0,0 +1,24 @@ +# Tanım: Grafiksel dosya farklılıkları aracı +# URL: http://www.kde.org/ +# Paketçi: Cihan_Alkan +# Gerekler: kf5-extra-cmake-modules kf5-kcodecs kf5-kconfig kf5-kcoreaddons kf5-kdoctools kf5-kiconthemes kf5-kjobwidgets kf5-kparts kf5-ktexteditor kf5-kwidgetsaddons libkomparediff2 qt5 syntax-highlighting +# Grup: kde + + +isim=kompare +surum=17.12.0 +devir=1 +kaynak=(https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + + mkdir build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF \ + -Wno-dev + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/komutan/komutan.kur-kos b/talimatname/genel/k/komutan/komutan.kur-kos new file mode 100644 index 000000000..37fa16f7c --- /dev/null +++ b/talimatname/genel/k/komutan/komutan.kur-kos @@ -0,0 +1,22 @@ +pip2 install flask +pip2 install psutil +pip2 install /opt/komutan/gerekliler/python-stdnum-1.1.tar.gz + +if [ -d /home/$USER ];then + evdizin=/home/$USER +else + evdizin=/$USER +fi + +if [ -d $evdizin/Desktop/ ]; then + masa="Desktop" +else + masa="Masaüstü" +fi + +cp /opt/komutan/mps.desktop $evdizin/$masa/ +cp /opt/komutan/komutan.desktop $evdizin/$masa/ + +cd /opt/komutan +git pull +cd - diff --git a/talimatname/genel/k/komutan/talimat b/talimatname/genel/k/komutan/talimat new file mode 100644 index 000000000..2e7c561fe --- /dev/null +++ b/talimatname/genel/k/komutan/talimat @@ -0,0 +1,25 @@ +# Tanım: milis işletim sistemi web tabanlı yönetim programı +# URL: https://github.com/milisarge/komutan +# Paketçi: milisarge +# Gerekler: python python-pip python-yaml gunicorn +isim=komutan +name2=mps +surum=git +devir=5 + +kaynak=() +derle() { +if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/milisarge/$isim.git $DERLEME_KAYNAKDIZIN/$isim +else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - +fi +mkdir $PKG/opt +cp -r $DERLEME_KAYNAKDIZIN/$isim $PKG/opt/ +install -D -m644 $DERLEME_KAYNAKDIZIN/$isim/$isim.desktop "${PKG}"/usr/share/applications/$isim.desktop +install -D -m644 $DERLEME_KAYNAKDIZIN/$isim/$isim.svg "${PKG}"/usr/share/pixmaps/$isim.svg +install -D -m644 $DERLEME_KAYNAKDIZIN/$isim/$isim2.desktop "${PKG}"/usr/share/applications/$isim2.desktop +install -D -m644 $DERLEME_KAYNAKDIZIN/$isim/$isim2.svg "${PKG}"/usr/share/pixmaps/$isim2.svg +} diff --git a/talimatname/genel/k/konsole/talimat b/talimatname/genel/k/konsole/talimat new file mode 100644 index 000000000..0f304953f --- /dev/null +++ b/talimatname/genel/k/konsole/talimat @@ -0,0 +1,23 @@ +# Tanım: Terminal +# URL: https://www.kde.org/ +# Paketçi: CihanAlkan +# Gerekler: kf5-kdelibs4support kf5-knotifyconfig kf5-kpty kf5-extra-cmake-modules kf5-kdoctools kf5-knotifyconfig kf5-kpty + +isim=konsole +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/kontactinterface/talimat b/talimatname/genel/k/kontactinterface/talimat new file mode 100644 index 000000000..3e203c9bf --- /dev/null +++ b/talimatname/genel/k/kontactinterface/talimat @@ -0,0 +1,22 @@ +# Tanım: Uygulama parçalarının Kontact bileşeni olarak gömülmesi için gereken yapıştırıcıyı sağlar +# URL: https://projects.kde.org/kontactinterface +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost kf5-kdoctools kf5-kdelibs4support kf5-kparts xorg-libx11 +# Grup: kde + +isim=kontactinterface +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/konversation/talimat b/talimatname/genel/k/konversation/talimat new file mode 100644 index 000000000..200dfc89b --- /dev/null +++ b/talimatname/genel/k/konversation/talimat @@ -0,0 +1,20 @@ +# Tanım: KDE için kullanıcı dostu bir IRC istemcisi +# URL: http://konversation.kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-knotifyconfig kf5-kemoticons kf5-kparts kf5-kidletime qca-qt5 hicolor-icon-theme kf5-extra-cmake-modules kf5-kdoctools + +isim=konversation +surum=1.6.2 +devir=1 + +kaynak=(http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kpat/kpat.kur-kos b/talimatname/genel/k/kpat/kpat.kur-kos new file mode 100644 index 000000000..2d1029009 --- /dev/null +++ b/talimatname/genel/k/kpat/kpat.kur-kos @@ -0,0 +1,3 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null +update-desktop-database -q +update-mime-database /usr/share/mime &> /dev/null diff --git a/talimatname/genel/k/kpat/talimat b/talimatname/genel/k/kpat/talimat new file mode 100644 index 000000000..810f9ece7 --- /dev/null +++ b/talimatname/genel/k/kpat/talimat @@ -0,0 +1,22 @@ +# Tanım: Solitaire kart oyunları seçenekleri sunuyor +# URL: http://kde.org/applications/games/kpatience/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools libkdegames kf5-knotifyconfig xdg-utils +# Grup: kde + +isim=kpat +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kpimtextedit/talimat b/talimatname/genel/k/kpimtextedit/talimat new file mode 100644 index 000000000..608d1b17b --- /dev/null +++ b/talimatname/genel/k/kpimtextedit/talimat @@ -0,0 +1,21 @@ +# Tanım: PIM'e özgü özelliklere sahip bir metin düzenlemesi. +# URL: https://projects.kde.org/projects/kde/pim/ +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kf5-kdelibs4support kf5-kcoreaddons grantlee-qt5 syntax-highlighting + +isim=kpimtextedit +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kpmcore/talimat b/talimatname/genel/k/kpmcore/talimat new file mode 100644 index 000000000..9a07ffde5 --- /dev/null +++ b/talimatname/genel/k/kpmcore/talimat @@ -0,0 +1,23 @@ +# Tanım: Bölümleri yönetmek için kütüphane +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 kf5-kauth kf5-ki18n kf5-kiconthemes kf5-kio kf5-kservice kf5-kwidgetsaddons xfsprogs reiserfsprogs ntfs-3g jfsutils e2fsprogs dosfstools parted + +isim=kpmcore +surum=2.2.1 +devir=1 + +kaynak=( http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/k/krb5/krb5-config_LDFLAGS.patch b/talimatname/genel/k/krb5/krb5-config_LDFLAGS.patch new file mode 100644 index 000000000..826f721e5 --- /dev/null +++ b/talimatname/genel/k/krb5/krb5-config_LDFLAGS.patch @@ -0,0 +1,13 @@ +diff --git a/krb5-config.in b/krb5-config.in +index c950b36..fb6520e 100755 +--- a/krb5-config.in ++++ b/krb5-config.in +@@ -31,7 +31,7 @@ prefix=@prefix@ + exec_prefix=@exec_prefix@ + includedir=@includedir@ + libdir=@libdir@ +-CC_LINK='@CC_LINK@' ++CC_LINK='$(PROG_LIBPATH) $(PROG_RPATH_FLAGS)' + KDB5_DB_LIB=@KDB5_DB_LIB@ + LDFLAGS='@LDFLAGS@' + RPATH_FLAG='@RPATH_FLAG@' diff --git a/talimatname/genel/k/krb5/talimat b/talimatname/genel/k/krb5/talimat new file mode 100644 index 000000000..098cf2397 --- /dev/null +++ b/talimatname/genel/k/krb5/talimat @@ -0,0 +1,38 @@ +# Tanım: Ağ Kimlik Doğrulama İletişim Kuralı +# URL: http://web.mit.edu/kerberos +# Maintainer: Jose V Beneyto, sepen at crux dot nu +# Paketçi: Alan Mizrahi, alan at mizrahi dot com dot ve +# Gerekler: openldap e2fsprogs + +isim=krb5 +surum=1.14 +devir=1 +kaynak=(http://web.mit.edu/kerberos/dist/$isim/$surum/$isim-$surum.tar.gz \ + $isim-config_LDFLAGS.patch) + +derle() { + cd $isim-$surum/src/build-tools + patch -p1 -i $SRC/$isim-config_LDFLAGS.patch + + cd $SRC/$isim-$surum/src + sed -e '/KRB5ROOT=/ s/\/local//' -i util/ac_check_krb5.m4 + + export CFLAGS="${CFLAGS/-Os/-O2} -I/usr/include/et" + + ./configure --prefix=/usr \ + --localstatedir=/var \ + --enable-shared \ + --disable-rpath \ + --without-tcl \ + --with-ldap \ + --with-system-et \ + --with-system-ss \ + --without-system-verto + + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share $PKG/usr/man/cat* $PKG/usr/man5/.* + + # comment this if you want kerberized versions of ftp and telnet + rm -rf $PKG/usr/bin/{ftp,telnet} $PKG/usr/man/man1/{ftp,telnet}.1 +} diff --git a/talimatname/genel/k/krita/talimat b/talimatname/genel/k/krita/talimat new file mode 100644 index 000000000..53b9cb158 --- /dev/null +++ b/talimatname/genel/k/krita/talimat @@ -0,0 +1,23 @@ +# Tanım: Resim düzenleme ve boyama programı +# URL: https://krita.org +# Paketçi: Cihan_Alkan +# Gerekler: kf5-kio kf5-kitemmodels gsl libraw exiv2 openexr fftw curl boost hicolor-icon-theme kf5-extra-cmake-modules kf5-kdoctools python eigen3 poppler-qt5 opencolorio +# Grup: kde + +isim=krita +surum=3.3.3 +devir=1 +kaynak=(https://download.kde.org/stable/krita/$surum/$isim-$surum.tar.gz) + +derle() { + + mkdir -p build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/k/ktnef/talimat b/talimatname/genel/k/ktnef/talimat new file mode 100644 index 000000000..b25a55acc --- /dev/null +++ b/talimatname/genel/k/ktnef/talimat @@ -0,0 +1,22 @@ +# Tanım: TNEF verilerini işleme API'si +# URL: https://projects.kde.org/projects/kde/pim/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules python kf5-kdoctools kcalutils kcontacts +# Grup: kde + +isim=ktnef +surum=17.12.0 +devir=1 + +kaynak=( http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/k/kutuphane/baglanti.java b/talimatname/genel/k/kutuphane/baglanti.java new file mode 100644 index 000000000..59fb245d4 --- /dev/null +++ b/talimatname/genel/k/kutuphane/baglanti.java @@ -0,0 +1,290 @@ + +package kutuphane.otomasyonu; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import javax.swing.JOptionPane; +import javax.swing.table.DefaultTableModel; +import java.util.Date; + +public class baglanti +{ +//--------------------------------------------------------------------------// + //----------------------------------------------------------// +public Connection con = null; // Bağlantı nesnesi +//public String url = "jdbc:mysql://localhost:3307/kutuphane?useUnicode=true&amp;characterEncoding=utf8"; // Veritabanı adresi +//public String userName = "root"; // Veritabanı kullanıcı adı +public String driver = "com.mysql.jdbc.Driver"; +//public String password = "Şifre girilecek"; // Veritabanı şifresi +public ResultSet result; // Yapılan sorgu sonucunda döndürülen değerlerin tutulacağı nesnedir. +public Statement statement; // Veri tabanına gönderilen sorgu ifadesi nesnesidir. +public PreparedStatement pst=null; +public Date simdikiZaman;//Şimdiki zamanı aldık +public DateFormat df = new SimpleDateFormat("yyyy-M-dd hh:mm:ss");//zamanı formatladık. +public DefaultTableModel model = new DefaultTableModel();//Model oluşturuyoruz +public DefaultTableModel tm = new DefaultTableModel();//Model oluşturuyoruz +public int sayac_grti=0; +//--------------------/*df.format(simdikiZaman);*/-------------------------------// +//------------------------------------------------------------------------------// +public String ekle_mesaj="Kayıt işleminiz tamamlanmıştır."; +public String sil_mesaj="Silme işleminiz tamamlanmıştır."; +public String güncelle_mesaj="Güncelleme işleminiz tamamlanmıştır."; +public String genel_mesaj="Ebubekir Bastama Kütüphane Otomasyonu"; +public String k_girisi_hata="Lütfen Kullanıcıbilgilerinizi kontrol ediniz."; +public String Verivar="Eklemek istediğiniz kitap elimizde bulunmaktadır."; +public String baglantıerro="Bağlantı Başarısız"; +public String text_kntrl="Lütfen gerekliyeri boş bırakmayınız."; +public String text_kntrl_1="Lütfen Öğrenciyi ve Teslim edeceğiniz kitabı seçiniz"; +public String hat="Hata"; +public String kitap_yok="Aradığınız kitap kütüphanemizde bulunmamaktadır."; +public ArrayList list = new ArrayList(); +//------------------------------------------------------------------------------// +public String kitap_verigetirme="SELECT id,ktp_brkt_nmr,ktp_ismi,ktp_adedi,ktp_ktgr,ktp_raf_nmr, ktp_yzr_ismi , ktp_kayit_tarih FROM kitaplar"; +public String ogrenci_verigetirme="SELECT * FROM ogr"; +public String kitap_kategori_verigetirme="select * from ktp_ktgr"; +public String yetkili_verigetirme="select * from yetkili"; +//------------------------------------------------------------------------------// +public String []dgr_ogrenci={"No", "Öğrenci Tc No", "Öğrenci Adı", "öğrenci Soyadı", "Sınıfı", "Telefon Numarası", "Tarih"}; +public String []dgr_kitap={"No","Barkot Numarası","Kitap İsmi","Kitap Adedi","Kitap Kategorisi","Kitap Raf No","Yazar İsmi","Tarih"}; +public String []dgr_kitap_kategorisi={"No","Kategori İsmi","Tarih"}; +public String []dgr_yetkili={"No","Yetkili İsmi", "Yetkili Soyadı", "Yetkili Ünvanı", "Yetkili Şifresi","Tarih"}; +public String []k_girisi_par={"ytkl_ism","ytkl_sf"}; +public String []ktp_odunc={"Öğrenci Numarası","Kitap Barkot Numarası","Kayıt Tarihi"}; +public String []ktp_ekleme={"ktp_brkt_nmr_,ktp_ismi_,ktp_adedi_,ktp_ktgr_,ktp_raf_nmr_,ktp_yzr_ismi_,ktp_kayit_tarih_"}; +public String []ktp_guncelle={"ktp_brkt_nmr_,ktp_ismi_,ktp_adedi_,ktp_ktgr_,ktp_raf_nmr_,ktp_yzr_ismi_,ktp_kayit_tarih_"}; +//-----------------------------------------------------------------// +//--------------------------------------------------------------------------// +public void oku() throws FileNotFoundException, IOException +{ +try{ + +FileReader fileReader = new FileReader("/etc/kutup.conf"); +String line; +BufferedReader br = new BufferedReader(fileReader); +while ((line = br.readLine()) != null) { +list.add(line); +} +br.close(); +} +catch(Exception ex) +{ + JOptionPane.showMessageDialog(null, ex.getMessage() ,hat, 1); +} + +} +public void baglanti() +{ +try + { + oku(); + Class.forName(driver); + con=DriverManager.getConnection(list.get(0).toString(),list.get(1).toString(),list.get(2).toString()); + statement=(Statement)con.createStatement(); + if (con != null){} + else{JOptionPane.showMessageDialog(null,baglantıerro);} + } + catch(Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,hat, 1); + } +} + +public void veri_ekle(String sqlcumle,String a[]) +{ + try + { + baglanti(); + CallableStatement calstat=con.prepareCall("{call'"+sqlcumle+"'(?,?,?,?,?,?)}"); + calstat.setString("ktp_brkt_nmr_",a[0]); + JOptionPane.showMessageDialog(null,"hata1"); + calstat.setString(ktp_ekleme[1],a[1]); + calstat.setString(ktp_ekleme[2],a[2]); + calstat.setString(ktp_ekleme[3],a[3]); + calstat.setString(ktp_ekleme[4],a[4]); + calstat.setString(ktp_ekleme[5],a[5]); + calstat.setString(ktp_ekleme[6],a[6]); + JOptionPane.showMessageDialog(null,"hata1"); + ResultSet rdr= calstat.executeQuery(); + while(rdr.next()) + { + + if ("1".equals(rdr.getObject(1).toString())) + { + JOptionPane.showMessageDialog(null,ekle_mesaj,genel_mesaj,2); + } + else + { + JOptionPane.showMessageDialog(null,Verivar,genel_mesaj,2); + } + } + con.close(); + calstat.close(); + } + catch(SQLException e ) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} + +public void veri_sil(String sqlcumle,String a[]) throws SQLException +{ + try + { + baglanti(); + CallableStatement calstat=con.prepareCall("{call '"+sqlcumle+"'(?,?,?)}"); + calstat.setString(ktp_ekleme[0],a[0]); + ResultSet rdr= calstat.executeQuery(); + while(rdr.next()) + { + + if ("1".equals(rdr.getObject(1).toString())) + { + JOptionPane.showMessageDialog(null,ekle_mesaj,genel_mesaj,2); + } + else + { + JOptionPane.showMessageDialog(null,Verivar,genel_mesaj,2); + } + } + con.close(); + calstat.close(); + } + catch(Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} + +public void veri_guncelle(String sqlcumle,String a[]) throws SQLException +{ + try + { + baglanti(); + CallableStatement calstat=con.prepareCall("{call '"+sqlcumle+"'(?,?,?)}"); + calstat.setString(ktp_guncelle[0],a[0]); + calstat.setString(ktp_guncelle[1],a[1]); + calstat.setString(ktp_guncelle[2],a[2]); + calstat.setString(ktp_guncelle[3],a[3]); + calstat.setString(ktp_guncelle[4],a[4]); + calstat.setString(ktp_guncelle[5],a[5]); + calstat.setString(ktp_guncelle[6],a[6]); + ResultSet rdr= calstat.executeQuery(); + while(rdr.next()) + { + + if ("1".equals(rdr.getObject(1).toString())) + { + JOptionPane.showMessageDialog(null,ekle_mesaj,genel_mesaj,2); + } + else + { + JOptionPane.showMessageDialog(null,Verivar,genel_mesaj,2); + } + } + con.close(); + calstat.close(); + } + catch(Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} +public void gtr(String sqlcumle,javax.swing.JTable tablo,int kolon_sayisi,String[] dgr) +{ + try + { + baglanti(); + try (ResultSet rs = statement.executeQuery(sqlcumle))//Veritabanındaki tabloya bağlandık + { + int colcount = rs.getMetaData().getColumnCount();//Veritabanındaki tabloda kaç tane sütun var? + for(int i = 1;i<=colcount;i++) + tm.addColumn(tm);//Tabloya sütun ekliyoruz veritabanımızdaki sütun ismiyle aynı olacak şekilde + while(rs.next()) + { + Object[] row = new Object[colcount]; + for(int i=1;i<=colcount;i++) + row[i-1] = rs.getObject(i); + tm.addRow(row); + } + tablo.setModel(tm); + for (int i = 0; i < kolon_sayisi; i++) + { + tablo.getColumnModel().getColumn(i).setHeaderValue(dgr[i]); + } + } + con.close(); + } catch (Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} +public void ktgr_sil(String sqlcumle,String a[]) +{ + try + { + baglanti(); + CallableStatement calstat=con.prepareCall("{call '"+sqlcumle+"'(?,?,?)}"); +// calstat.setString(ktgr_ekle[0],a[0]); + ResultSet rdr= calstat.executeQuery(); + while(rdr.next()) + { + if ("1".equals(rdr.getObject(1).toString())) + { + JOptionPane.showMessageDialog(null,ekle_mesaj,genel_mesaj,2); + } + else + { + JOptionPane.showMessageDialog(null,Verivar,genel_mesaj,2); + } + } + con.close(); + calstat.close(); + } + catch(Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} +public void rapor(String sqlcumle,javax.swing.JTable tablo,int kolon_sayisi,String[] dgr) +{ + try + { + baglanti(); + try (ResultSet rs = statement.executeQuery(sqlcumle))//Veritabanındaki tabloya bağlandık + { + int colcount = rs.getMetaData().getColumnCount();//Veritabanındaki tabloda kaç tane sütun var? + for(int i = 1;i<=colcount;i++) + tm.addColumn(tm);//Tabloya sütun ekliyoruz veritabanımızdaki sütun ismiyle aynı olacak şekilde + while(rs.next()) + { + Object[] row = new Object[colcount]; + for(int i=1;i<=colcount;i++) + row[i-1] = rs.getObject(i); + tm.addRow(row); + } + tablo.setModel(tm); + for (int i = 0; i < kolon_sayisi; i++) + { + tablo.getColumnModel().getColumn(i).setHeaderValue(dgr[i]); + } + } + con.close(); + } catch (Exception e) + { + JOptionPane.showMessageDialog(null, e.getMessage() ,"Hata", 1); + } +} +} + diff --git a/talimatname/genel/k/kutuphane/kutuphane.kur-kos b/talimatname/genel/k/kutuphane/kutuphane.kur-kos new file mode 100644 index 000000000..a4f06d84e --- /dev/null +++ b/talimatname/genel/k/kutuphane/kutuphane.kur-kos @@ -0,0 +1,3 @@ +cd /opt +./kutuphane_vt_yukle +cd - diff --git a/talimatname/genel/k/kutuphane/talimat b/talimatname/genel/k/kutuphane/talimat new file mode 100644 index 000000000..9a137f2a9 --- /dev/null +++ b/talimatname/genel/k/kutuphane/talimat @@ -0,0 +1,27 @@ +# Tanım: Javada yazılmış bir kütüphane uygulaması - Ebubekir Bastama +# URL: https://github.com/ebubekirbastama/KutuphaneOtomasyonu +# Paketçi: milisarge +# Gerekler: apache-ant openjdk java-mysql mariadb xorg-server + +isim=kutuphane +surum=1.0 +devir=2 + +kaynak=(https://github.com/milisarge/KutuphaneOtomasyonu/archive/$surum.tar.gz + baglanti.java) + +derle() { + cd KutuphaneOtomasyonu-$surum + export JAVA_HOME=/opt/jdk + export ANT_HOME="/opt/ant" + cp -f $SRC/baglanti.java src/kutuphane/otomasyonu/ + /opt/ant/bin/ant + install -d $PKG/opt + install -d $PKG/usr/bin + install -d $PKG/etc + cp dist/Kutuphane_Otomasyonu.jar $PKG/opt/ + install -m 755 kutuphane $PKG/usr/bin/ + install -m 644 kutup.conf $PKG/etc/ + install -m 755 kutuphane_vt_yukle $PKG/opt/ + cp -r Sqldizini $PKG/opt/ +} diff --git a/talimatname/genel/l/ladspa/ladspa-fallback-ladspa-path.patch b/talimatname/genel/l/ladspa/ladspa-fallback-ladspa-path.patch new file mode 100644 index 000000000..7743bf4b4 --- /dev/null +++ b/talimatname/genel/l/ladspa/ladspa-fallback-ladspa-path.patch @@ -0,0 +1,27 @@ +diff -upr ladspa_sdk.orig/src/load.c ladspa_sdk/src/load.c +--- ladspa_sdk.orig/src/load.c 2012-09-26 07:37:24.000000000 +0300 ++++ ladspa_sdk/src/load.c 2012-09-26 07:38:58.000000000 +0300 +@@ -54,6 +54,8 @@ dlopenLADSPA(const char * pcFilename, in + to search. */ + + pcLADSPAPath = getenv("LADSPA_PATH"); ++ if (! pcLADSPAPath) ++ pcLADSPAPath = "/usr/lib/ladspa"; + + if (pcLADSPAPath) { + +diff -upr ladspa_sdk.orig/src/search.c ladspa_sdk/src/search.c +--- ladspa_sdk.orig/src/search.c 2012-09-26 07:37:24.000000000 +0300 ++++ ladspa_sdk/src/search.c 2012-09-26 07:38:46.000000000 +0300 +@@ -99,10 +99,7 @@ LADSPAPluginSearch(LADSPAPluginSearchCal + + pcLADSPAPath = getenv("LADSPA_PATH"); + if (!pcLADSPAPath) { +- fprintf(stderr, +- "Warning: You do not have a LADSPA_PATH " +- "environment variable set.\n"); +- return; ++ pcLADSPAPath = "/usr/lib/ladspa"; + } + + pcStart = pcLADSPAPath; diff --git a/talimatname/genel/l/ladspa/ladspa-fix-memleak-in-plugin-scanning.patch b/talimatname/genel/l/ladspa/ladspa-fix-memleak-in-plugin-scanning.patch new file mode 100644 index 000000000..76cb2e864 --- /dev/null +++ b/talimatname/genel/l/ladspa/ladspa-fix-memleak-in-plugin-scanning.patch @@ -0,0 +1,11 @@ +--- src/search.c.orig 2008-11-07 00:38:18.000000000 +0100 ++++ src/search.c 2008-11-07 00:50:51.000000000 +0100 +@@ -83,6 +83,8 @@ + dlclose(pcFilename); + free(pcFilename); + } ++ } else { ++ free(pcFilename); + } + } + } diff --git a/talimatname/genel/l/ladspa/talimat b/talimatname/genel/l/ladspa/talimat new file mode 100644 index 000000000..19e9a27e8 --- /dev/null +++ b/talimatname/genel/l/ladspa/talimat @@ -0,0 +1,29 @@ +# Tanım: Linux Ses Geliştiricisinin Basit Eklenti API'sı (LADSPA) +# URL: http://www.ladspa.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=ladspa +surum=1.13 +devir=1 + +kaynak=(https://github.com/OpenMandrivaAssociation/ladspa/raw/master/ladspa_sdk_$surum.tgz + ladspa-fix-memleak-in-plugin-scanning.patch + ladspa-fallback-ladspa-path.patch) + +derle() { +cd ladspa_sdk/src + +patch -Np1 -i ../../ladspa-fix-memleak-in-plugin-scanning.patch +patch -Np2 -i ../../ladspa-fallback-ladspa-path.patch + +sed \ + -e 's/mkdirhier/mkdir -p/' \ + -e "s#-O3#${CFLAGS} ${LDFLAGS/,--as-needed/}#" \ + -i makefile + +make targets +make INSTALL_PLUGINS_DIR="$PKG/usr/lib/ladspa/" \ + INSTALL_INCLUDE_DIR="$PKG/usr/include/" \ + INSTALL_BINARY_DIR="$PKG/usr/bin/" install +} diff --git a/talimatname/genel/l/lame/talimat b/talimatname/genel/l/lame/talimat new file mode 100644 index 000000000..e946e28af --- /dev/null +++ b/talimatname/genel/l/lame/talimat @@ -0,0 +1,16 @@ +# Tanım: MP3 kodlayıcı, sıkıştırılmış ses dosyalarını analiz etmek için kullanışlı bir MP3 çerçeve analizörü. +# URL: http://lame.sourceforge.net/index.php +# Paketçi: milisarge +# Gerekler: libsndfile nasm +isim=lame +surum=3.99.5 +devir=2 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +sed -i -e '/xmmintrin\.h/d' configure +./configure --prefix=/usr --enable-mp3rtp --disable-static +make +make DESTDIR=$PKG pkghtmldir=/usr/share/doc/$isim-$surum install +} diff --git a/talimatname/genel/l/lapack/talimat b/talimatname/genel/l/lapack/talimat new file mode 100644 index 000000000..0aa801902 --- /dev/null +++ b/talimatname/genel/l/lapack/talimat @@ -0,0 +1,25 @@ +# Tanım: Temel Lineer Cebir Altprogramları +# URL: http://www.netlib.org/blas +# Paketçi: milisarge +# Gerekler: cmake + +isim=lapack +surum=3.5.0 +devir=1 + +kaynak=(http://www.netlib.org/$isim/$isim-$surum.tgz ) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_SKIP_RPATH=ON \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_Fortran_COMPILER=gfortran \ + -DLAPACKE=ON + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lazagne/lazagne.kur-kos b/talimatname/genel/l/lazagne/lazagne.kur-kos new file mode 100644 index 000000000..48367686f --- /dev/null +++ b/talimatname/genel/l/lazagne/lazagne.kur-kos @@ -0,0 +1 @@ +pip2 install https://github.com/n1nj4sec/memorpy/archive/master.zip diff --git a/talimatname/genel/l/lazagne/sifrebul b/talimatname/genel/l/lazagne/sifrebul new file mode 100644 index 000000000..062fb0286 --- /dev/null +++ b/talimatname/genel/l/lazagne/sifrebul @@ -0,0 +1,2 @@ +#!/bin/bash +python /usr/share/lazagne/laZagne.py all diff --git a/talimatname/genel/l/lazagne/talimat b/talimatname/genel/l/lazagne/talimat new file mode 100644 index 000000000..0554568ba --- /dev/null +++ b/talimatname/genel/l/lazagne/talimat @@ -0,0 +1,21 @@ +# Tanım: Bilgisayara kayıtlı şifreleri bulma programı +# URL: https://github.com/AlessandroZ/LaZagne +# Paketçi: Cihan Alkan +# Gerekler: python-pyasn1 python-crypto python python-pip + +isim=lazagne +surum=2.2 +devir=1 + +kaynak=(https://github.com/AlessandroZ/LaZagne/archive/$surum.tar.gz + sifrebul) + +derle() { + cd LaZagne-$surum + mkdir -p $PKG/usr/share/$isim + cp -r Linux/* $PKG/usr/share/$isim/ + + mkdir -p $PKG/usr/bin + cp $SRC/sifrebul $PKG/usr/bin/ + chmod +x $PKG/usr/bin/sifrebul +} diff --git a/talimatname/genel/l/lazarus/talimat b/talimatname/genel/l/lazarus/talimat new file mode 100644 index 000000000..d4ff08ca5 --- /dev/null +++ b/talimatname/genel/l/lazarus/talimat @@ -0,0 +1,24 @@ +# Tanım: fpc için arayüz +# URL: http://www.lazarus-ide.org/ +# Paketçi: milisarge +# Gerekler: fpc fpc-src gdb gtk2 + +isim=lazarus +surum=1.6.4 +devir=1 +kaynak=(http://sourceforge.net/projects/$isim/files/Lazarus%20Zip%20_%20GZip/Lazarus%20$surum/$isim-$surum-0.tar.gz) + +derle() { + cd $isim + MAKEFLAGS="$(echo "$MAKEFLAGS" | sed "s/-j[[:digit:]]\+\s\?//")" make bigide + make install PREFIX=$PKG/usr + find $PKG \ + \( \ + -name "*README*" -o \ + -name "*BUGS*" -o \ + -name "*TODOS*" -o \ + -name "*COPYING*" -o \ + -name "*INSTALL*" -o \ + -name "*ChangeLog*" \ + \) -delete +} diff --git a/talimatname/genel/l/lcms/talimat b/talimatname/genel/l/lcms/talimat new file mode 100644 index 000000000..1aebb0664 --- /dev/null +++ b/talimatname/genel/l/lcms/talimat @@ -0,0 +1,19 @@ +# Tanım: Diğer programlar için renklerin yönetimini sağlar +# URL: http://www.littlecms.com/ +# Paketçi: milisarge +# Gerekler: libtiff libjpeg-turbo + +isim=lcms +surum=1.19 +devir=1 + +kaynak=( http://www.littlecms.com/1/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lcms2/talimat b/talimatname/genel/l/lcms2/talimat new file mode 100644 index 000000000..0868d3171 --- /dev/null +++ b/talimatname/genel/l/lcms2/talimat @@ -0,0 +1,21 @@ +# Tanım: Hafif renk yönetimi geliştirme kitaplığı/motor +# URL: http://www.littlecms.com/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo libtiff +# Grup: kütüphane + +isim=lcms2 +surum=2.9 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lcms/$isim-$surum.tar.gz) + +derle() { +cd $isim* +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/ldns/talimat b/talimatname/genel/l/ldns/talimat new file mode 100644 index 000000000..ee8de5dbc --- /dev/null +++ b/talimatname/genel/l/ldns/talimat @@ -0,0 +1,30 @@ +# Tanım: DNS programlamayı basitleştirmek amacıyla hızlı DNS kütüphanesi. +# URL: http://www.nlnetlabs.nl +# Paketçi: milisarge +# Gerekler: openssl ca-certificates libcap python swig doxygen + +isim=ldns +surum=1.6.17 +devir=1 +kaynak=(http://www.nlnetlabs.nl/downloads/ldns/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + sed -i 's/defined(@$also)/@$also/' doc/doxyparse.pl + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --with-drill + make + + make doc + + make DESTDIR=$PKG install + + install -v -m755 -d $PKG/usr/share/doc/ldns-1.6.17 + install -v -m644 doc/html/* $PKG/usr/share/doc/ldns-1.6.17 + +} diff --git a/talimatname/genel/l/leafpad/talimat b/talimatname/genel/l/leafpad/talimat new file mode 100644 index 000000000..19deeed37 --- /dev/null +++ b/talimatname/genel/l/leafpad/talimat @@ -0,0 +1,18 @@ +# Tanım: GTK + 2.0 için bir not defteri klonu +# URL: http://tarot.freeshell.org/leafpad/ +# Paketçi: milisarge +# Gerekler: gtk2 desktop-file-utils + +isim=leafpad +surum=0.8.18.1 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/${isim}/${isim}-${surum}.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr --enable-chooser + make + make DESTDIR=$PKG install + echo 'StartupNotify=true' >> ${PKG}/usr/share/applications/leafpad.desktop +} diff --git a/talimatname/genel/l/lemonbar/talimat b/talimatname/genel/l/lemonbar/talimat new file mode 100644 index 000000000..49aee4ba7 --- /dev/null +++ b/talimatname/genel/l/lemonbar/talimat @@ -0,0 +1,29 @@ +# Tanım: Tamamen XCB'ye dayanan hafif bir çubuktur. +# URL: https://github.com/LemonBoy/bar +# Paketçi: milisarge +# Gerekler: libxcb git xorg-libxinerama + +isim=lemonbar +surum=v1.1.r12.gb331ee3 +devir=1 + +kaynak=() + +version() { + cd bar + + if git_surum=$( git describe --long --tags 2>/dev/null ); then + IFS='-' read last_tag tag_rev commit <<< "$git_version" + printf '%s.r%s.%s' "$last_tag" "$tag_rev" "$commit" + else + printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" + fi +} + +derle() { + git clone "https://github.com/LemonBoy/bar.git" + cd bar + make + + make PREFIX=/usr DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/lensfun/talimat b/talimatname/genel/l/lensfun/talimat new file mode 100644 index 000000000..e83b333bf --- /dev/null +++ b/talimatname/genel/l/lensfun/talimat @@ -0,0 +1,18 @@ +# Tanım: Fotoğrafik merceklerin veri tabanı ve veritabanına gelişmiş erişim sağlayan bir kütüphane +# URL: http://lensfun.berlios.de +# Paketçi: milisarge +# Gerekler: cmake glib libpng doxygen + +isim=lensfun +surum=0.3.1 +devir=1 + +kaynak=(http://sourceforge.net/projects/$isim/files/$surum/$isim-$surum.tar.gz + ) +derle(){ +cd $isim-$surum +cd build +cmake .. -DLENSFUN_INSTALL_PREFIX=/usr +make all +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/leptonica/talimat b/talimatname/genel/l/leptonica/talimat new file mode 100644 index 000000000..a47bf6f61 --- /dev/null +++ b/talimatname/genel/l/leptonica/talimat @@ -0,0 +1,20 @@ +# Tanım: Görüntü işleme ve görüntü analizi uygulamaları için geniş ölçüde yararlı olan yazılım +# URL: http://www.leptonica.com/ +# Paketçi: Cihan Alkan +# Gerekler: giflib libjpeg-turbo libpng libtiff libwebp +# Grup: medya + +isim=leptonica +surum=1.74.4 +devir=1 + +kaynak=(https://github.com/DanBloomberg/leptonica/archive/$surum.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd "$SRC"/leptonica-${surum} + ./autobuild + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + install -D leptonica-license.txt "$PKG"/usr/share/licenses/leptonica/leptonica-license.txt +} diff --git a/talimatname/genel/l/lesstif/talimat b/talimatname/genel/l/lesstif/talimat new file mode 100644 index 000000000..510fe4979 --- /dev/null +++ b/talimatname/genel/l/lesstif/talimat @@ -0,0 +1,29 @@ +# Tanım: LessTif, Motif® araç kitinin bir klonudur. +# URL: http://www.lesstif.org/ +# Paketçi: milisarge +# Gerekler: freetype xorg-libxt xorg-libxext + +isim=lesstif +surum=0.95.2 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/$isim/$isim/$surum/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --enable-nonstandard-conversions \ + --disable-debug \ + --with-editres \ + --with-xdnd \ + --mandir=/usr/man + make + make DESTDIR=$PKG install + + # remove xprint stuff + rm $PKG/usr/include/Xm/Print{SP,}.h + sed -i -e 's/.*Print.h.*//' $PKG/usr/include/Xm/XmAll.h + + rm -rf $PKG/usr/LessTif $PKG/usr/lib/X11/ \ + $PKG/usr/man/man{1/mwm.1,5/mwmrc.5} +} diff --git a/talimatname/genel/l/lftp/talimat b/talimatname/genel/l/lftp/talimat new file mode 100644 index 000000000..2bfe8abfe --- /dev/null +++ b/talimatname/genel/l/lftp/talimat @@ -0,0 +1,20 @@ +# Tanım: LFTP, ağ protokollerini (ftp, http, ftp, ftp, torrent) destekleyen komut satırı arayüzü ile sofistike bir dosya aktarım programıdır. +# URL: http://lftp.tech/ +# Paketçi: milisarge +# Gerekler: gnutls libidn + +isim=lftp +surum=4.7.7 +devir=1 + +kaynak=(http://lftp.yar.ru/ftp/$isim-$surum.tar.xz) +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --with-gnutls \ + --without-openssl \ + --without-included-regex \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/liba52/talimat b/talimatname/genel/l/liba52/talimat new file mode 100644 index 000000000..23fcf3dcd --- /dev/null +++ b/talimatname/genel/l/liba52/talimat @@ -0,0 +1,26 @@ +# Tanım: ATSC A/52 akışlarını çözmek için ücretsiz bir kütüphane +# URL: http://liba52.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=liba52 +surum=0.7.4 +devir=1 + +kaynak=(http://liba52.sourceforge.net/files/a52dec-$surum.tar.gz) + +derle() { + cd a52dec-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --enable-shared \ + --disable-static \ + CFLAGS="-g -O2 $([ $(uname -m) = x86_64 ] && echo -fPIC)" + + make + make DESTDIR=$PKG install + # required for xine-lib + install -m644 liba52/a52_internal.h $PKG/usr/include/a52dec/ + install -v -m644 -D doc/liba52.txt \ + $PKG/usr/share/doc/liba52-$surum/liba52.txt +} diff --git a/talimatname/genel/l/libabw/talimat b/talimatname/genel/l/libabw/talimat new file mode 100644 index 000000000..4ebfae36a --- /dev/null +++ b/talimatname/genel/l/libabw/talimat @@ -0,0 +1,20 @@ +# Tanım: AbiWord belgelerinin dosya formatını ayrıştıran bir kütüphane +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libabw +# Paketçi: Cihan Alkan +# Gerekler: libxml2 librevenge doxygen boost + +isim=libabw +surum=0.1.1 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz + https://github.com/LibreOffice/libabw/commit/ee2d0729.patch::libabw-boost-1.59.patch) + +derle() { + cd $isim-$surum + patch -p1 -i $SRC/libabw-boost-1.59.patch + autoreconf -vi + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libaccounts-glib/talimat b/talimatname/genel/l/libaccounts-glib/talimat new file mode 100644 index 000000000..4f8e1395e --- /dev/null +++ b/talimatname/genel/l/libaccounts-glib/talimat @@ -0,0 +1,23 @@ +# Tanım: Çevrimiçi hesap veritabanına erişmek için Glib tabanlı istemci kitaplığı +# URL: https://gitlab.com/accounts-sso/libaccounts-glib +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: dbus-glib libxml2 sqlite python-gobject docbook-xsl + +isim=libaccounts-glib +surum=1.21 +devir=1 + +PKGMK_KEEP_SOURCES="no" + +kaynak=(https://gitlab.com/accounts-sso/libaccounts-glib/repository/archive.zip) + +derle() { +cd libaccounts* +./autogen.sh +./configure \ + --prefix=/usr \ + --disable-static \ + --disable-gtk-doc +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libaccounts-qt5/talimat b/talimatname/genel/l/libaccounts-qt5/talimat new file mode 100644 index 000000000..da21ad4eb --- /dev/null +++ b/talimatname/genel/l/libaccounts-qt5/talimat @@ -0,0 +1,19 @@ +# Tanım: Çevrimiçi hesap veritabanına erişmek için t5 tabanlı istemci kitaplığı +# URL: https://gitlab.com/accounts-sso/libaccounts-qt +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 libaccounts-glib + +isim=libaccounts-qt5 +surum=1.14 +devir=1 + +PKGMK_KEEP_SOURCES="no" + +kaynak=(https://gitlab.com/accounts-sso/libaccounts-qt/repository/archive.zip) +derle() { +cd libaccounts* +sed -i 's|SUBDIRS += Accounts tests|SUBDIRS += Accounts|' accounts-qt.pro +qmake-qt5 PREFIX=/usr LIBDIR=/usr/lib +make +make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/l/libao/talimat b/talimatname/genel/l/libao/talimat new file mode 100644 index 000000000..630cfdd7f --- /dev/null +++ b/talimatname/genel/l/libao/talimat @@ -0,0 +1,16 @@ +# Tanım: Çapraz platform ses çıkışı kitaplığı ve eklentileri. +# URL: http://www.xiph.org/ao/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: alsa-lib + +isim=libao +surum=1.2.0 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/ao/libao-1.2.0.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libappindicator-gtk2/talimat b/talimatname/genel/l/libappindicator-gtk2/talimat new file mode 100644 index 000000000..8c6b0088c --- /dev/null +++ b/talimatname/genel/l/libappindicator-gtk2/talimat @@ -0,0 +1,31 @@ +# Tanım: Uygulamaların bir menüyü Unity Menü çubuğuna vermesine izin veren bir kütüphane (Gtk2 kitaplığı). +# URL: https://launchpad.net/libappindicator +# Paketçi: milisarge +# Gerekler: gtk2 glib gnome-doc-utils libindicator-gtk2 libdbusmenu-gtk2 libdbusmenu-glib gobject-introspection vala python-gtk python-gobject2 dbus-glib + +run=(libindicator-gtk2 libdbusmenu-gtk2 libdbusmenu-glib) + +isim=libappindicator-gtk2 +surum=12.10.0 +devir=1 + +kaynak=(http://launchpad.net/libappindicator/${surum%.*}/$surum/+download/libappindicator-$surum.tar.gz) + +derle() { + + export CFLAGS+=" -Wno-error=deprecated-declarations" + cd libappindicator-$surum + sed -i 's|/cli/|/mono/|' bindings/mono/{appindicator-sharp-0.1.pc.in,Makefile.in} + + autoreconf -vfi + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-static \ + --disable-{gtk-doc-html,mono-test,static,tests} \ + --with-gtk=2 + make -j1 + make -j1 DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libart_lgpl/talimat b/talimatname/genel/l/libart_lgpl/talimat new file mode 100644 index 000000000..e24548d14 --- /dev/null +++ b/talimatname/genel/l/libart_lgpl/talimat @@ -0,0 +1,16 @@ +# Tanım: Yüksek performanslı 2D grafikler için bir kütüphane. +# URL: http://www.levien.com/libart/ +# Paketçi: milisarge +# Gerekler: + +isim=libart_lgpl +surum=2.3.21 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/2.3/$isim-$surum.tar.bz2) +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libass/talimat b/talimatname/genel/l/libass/talimat new file mode 100644 index 000000000..d49d1c4f2 --- /dev/null +++ b/talimatname/genel/l/libass/talimat @@ -0,0 +1,16 @@ +# Tanım: Libass ASS / SSA (Gelişmiş Altyapı Alfa / Altyapı Alfa) altyazı biçimi için taşınabilir bir altyazı oluşturucudur. Çoğunlukla VSFilter ile uyumludur. +# URL: https://github.com/libass +# Paketçi: milisarge +# Gerekler: freetype fribidi xorg-fontconfig harfbuzz + +isim=libass +surum=0.13.1 +devir=1 +kaynak=(https://github.com/$isim/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libassuan/talimat b/talimatname/genel/l/libassuan/talimat new file mode 100644 index 000000000..d470e081c --- /dev/null +++ b/talimatname/genel/l/libassuan/talimat @@ -0,0 +1,19 @@ +# Tanım: Diğer bazı GnuPG ile ilgili paketlerin kullandığı bir IPC kitaplığı içerir +# URL: http://www.gnupg.org/related_software/libassuan/ +# Paketçi: milisarge +# Gerekler: libgpg-error + +isim=libassuan +surum=2.4.3 +devir=1 + +kaynak=( ftp://ftp.gnupg.org/gcrypt/$isim/$isim-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libasyncd/talimat b/talimatname/genel/l/libasyncd/talimat new file mode 100644 index 000000000..f5caf1a0c --- /dev/null +++ b/talimatname/genel/l/libasyncd/talimat @@ -0,0 +1,16 @@ +# Tanım: Gömülü ssl destekli asenkron c,c++ sunucu uygulaması. +# Url: https://github.com/wolkykim/libasyncd +# Paketçi: milisarge +# Gerekler: libevent qlibc + +isim=libasyncd +surum=1.0.2 +devir=1 +kaynak=(https://github.com/wolkykim/libasyncd/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make -j1 QLIBC=system DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libasyncns/talimat b/talimatname/genel/l/libasyncns/talimat new file mode 100644 index 000000000..efdee033d --- /dev/null +++ b/talimatname/genel/l/libasyncns/talimat @@ -0,0 +1,16 @@ +# Tanım: Linux/Unix isim servis sorgularını asenkron çalıştıran C kütüphanesi +# URL: http://0pointer.de/lennart/projects/libasyncns +# Paketçi: milisarge +# Gerekler: + +isim=libasyncns +surum=0.8 +devir=1 +kaynak=(http://0pointer.de/lennart/projects/libasyncns/libasyncns-$surum.tar.gz) + +derle() { + cd $isim-${surum} + ./configure --prefix=/usr --disable-lynx + make + make DESTDIR=${PKG} install +} diff --git a/talimatname/genel/l/libatasmart/talimat b/talimatname/genel/l/libatasmart/talimat new file mode 100644 index 000000000..65c5a3cc7 --- /dev/null +++ b/talimatname/genel/l/libatasmart/talimat @@ -0,0 +1,18 @@ +# Tanım: Bir disk raporlama kitaplığı. Yalnızca ATA S.M.A.R.T işlevinin bir alt kümesini destekler. +# URL: http://0pointer.de/blog/projects/being-smart.html +# Paketçi: milisarge +# Gerekler: + +isim=libatasmart +surum=0.19 +devir=1 + +kaynak=(http://0pointer.de/public/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG docdir=/usr/share/doc/libatasmart-$surum install +} diff --git a/talimatname/genel/l/libatomic-ops/talimat b/talimatname/genel/l/libatomic-ops/talimat new file mode 100644 index 000000000..4e3866e6a --- /dev/null +++ b/talimatname/genel/l/libatomic-ops/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir dizi mimaride atom hafızası güncelleme işlemleri için uygulamalar. +# URL: http://www.hpl.hp.com/research/linux/atomic_ops/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=libatomic-ops +surum=7.4.4 +devir=1 + +kaynak=(http://www.ivmaisoft.com/_bin/atomic_ops//libatomic_ops-$surum.tar.gz) + +derle() { +cd libatomic_ops-$surum +sed -i 's#pkgdata#doc#' doc/Makefile.am +autoreconf -fi +./configure --prefix=/usr \ + --enable-shared \ + --disable-static \ + --docdir=/usr/share/doc/libatomic_ops-$surum +make +make DESTDIR=$PKG install +rm -vrf $PKG/usr/share/libatomic_ops +} diff --git a/talimatname/genel/l/libb64/talimat b/talimatname/genel/l/libb64/talimat new file mode 100644 index 000000000..1ec1dc729 --- /dev/null +++ b/talimatname/genel/l/libb64/talimat @@ -0,0 +1,30 @@ +# Tanım: Base64 Encoding/Decoding Routines +# URL: http://libb64.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=libb64 +surum=1.2.1 +devir=1 +kaynak=(https://downloads.sourceforge.net/${isim}/${isim}-${surum}.zip + https://sources.debian.net/data/main/libb/libb64/1.2-3/debian/patches/bufsiz-as-buffer-size.diff) + +derle() { + cd $isim-$surum + patch -p1 -i "$SRC"/bufsiz-as-buffer-size.diff + + cd src + export CFLAGS="${CFLAGS} -fPIC" + make + + export CFLAGS="${CFLAGS} -shared -Wl,-soname,${isim}.so.0" + gcc ${LDFLAGS} ${CFLAGS} *.o -o ${isim}.so.0 + + install -d "${PKG}/usr/lib" + install libb64.so.0 "${PKG}/usr/lib" + ln -sf /usr/lib/libb64.so.0 "${PKG}/usr/lib/libb64.so" + cd .. + cp -r include "${PKG}/usr" + + install -Dm644 LICENSE "${PKG}"/usr/share/licenses/${isim}/LICENSE +} diff --git a/talimatname/genel/l/libbluray/talimat b/talimatname/genel/l/libbluray/talimat new file mode 100644 index 000000000..213b02cfd --- /dev/null +++ b/talimatname/genel/l/libbluray/talimat @@ -0,0 +1,20 @@ +# Tanım: Blu-Ray erişim kitaplığı. +# URL: http://www.videolan.org/developers/libbluray.html +# Paketçi: milisarge +# Gerekler: libxml2 freetype + +isim=libbluray +surum=0.6.2 +devir=1 +kaynak=(https://get.videolan.org/$isim/$surum/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libbsd/talimat b/talimatname/genel/l/libbsd/talimat new file mode 100644 index 000000000..5f6e73ce2 --- /dev/null +++ b/talimatname/genel/l/libbsd/talimat @@ -0,0 +1,17 @@ +# Tanım: BSD kitaplığı +# URL: http://libbsd.freedesktop.org +# Paketçi: milisarge +# Gerekler: +# Grup: sistem + +isim=libbsd +surum=0.8.7 +devir=1 + +kaynak=(http://libbsd.freedesktop.org/releases/$isim-$surum.tar.xz) +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libburn/talimat b/talimatname/genel/l/libburn/talimat new file mode 100644 index 000000000..68bd2096d --- /dev/null +++ b/talimatname/genel/l/libburn/talimat @@ -0,0 +1,17 @@ +# Tanım: Libburn, optik medyada önceden formatlanmış verileri yazmak için kullanılan bir kütüphanedir +# URL: http://icculus.org/burn/ +# Paketçi: milisarge +# Gerekler: + +isim=libburn +surum=1.4.2 +devir=1 + +kaynak=(http://files.libburnia-project.org/releases/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcaca/talimat b/talimatname/genel/l/libcaca/talimat new file mode 100644 index 000000000..56c78ec4a --- /dev/null +++ b/talimatname/genel/l/libcaca/talimat @@ -0,0 +1,22 @@ +# Tanım: Renkli ASCII Sanat Kütüphanesi +# URL: http://libcaca.zoy.org/ +# Paketçi: milisarge +# Gerekler: imlib2 + +isim=libcaca +surum=0.99.beta19 +devir=1 + +kaynak=(http://libcaca.zoy.org/files/libcaca/libcaca-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --disable-doc \ + --localstatedir=/var + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libcacard/talimat b/talimatname/genel/l/libcacard/talimat new file mode 100644 index 000000000..9b628886d --- /dev/null +++ b/talimatname/genel/l/libcacard/talimat @@ -0,0 +1,17 @@ +# Tanım: Common Access Card) library thar provides emulation of smart cards to a virtual card reader running in a guest virtual machine +# URL: http://www.spice-space.org/page/Libcacard +# Paketçi: milisarge +# Gerekler: nss glib + +isim=libcacard +surum=2.5.3 +devir=1 + +kaynak=(http://www.spice-space.org/download/libcacard/libcacard-$surum.tar.xz) + +derle() { + cd libcacard-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libcanberra/talimat b/talimatname/genel/l/libcanberra/talimat new file mode 100644 index 000000000..479a78c1e --- /dev/null +++ b/talimatname/genel/l/libcanberra/talimat @@ -0,0 +1,25 @@ +# Tanım: XDG ses temasının ve isim özelliklerinin uygulanması. +# URL: http://0pointer.de/lennart/projects/libcanberra/ +# Paketçi: milisarge +# Gerekler: libvorbis +# Optional: pulseaudio gstreamer alsa-lib gtk3 + +isim=libcanberra +surum=0.30 +devir=2 +kaynak=(http://0pointer.de/lennart/projects/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-oss + + make + make -j1 DESTDIR=$PKG install + #make DESTDIR=$PKG install + rm -r $PKG/usr/share/doc $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/l/libcap-ng/talimat b/talimatname/genel/l/libcap-ng/talimat new file mode 100644 index 000000000..e0792f2a1 --- /dev/null +++ b/talimatname/genel/l/libcap-ng/talimat @@ -0,0 +1,19 @@ +# Tanım: POSIX yetenekleri ile programlamayı geleneksel libcap'tan daha kolay hale getiren bir kütüphane. +# URL: http://people.redhat.com/sgrubb/libcap-ng/ +# Paketçi: milisarge +# Gerekler: glibc + +isim=libcap-ng +surum=0.7.7 +devir=1 + +kaynak=(http://people.redhat.com/sgrubb/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--without-python +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcddb/talimat b/talimatname/genel/l/libcddb/talimat new file mode 100644 index 000000000..b64ff5300 --- /dev/null +++ b/talimatname/genel/l/libcddb/talimat @@ -0,0 +1,16 @@ +# Tanım: Bir CDDB sunucusundaki verilere erişmek için farklı protokolleri (CDDBP, HTTP, SMTP) uygular +# URL: http://sourceforge.net/projects/libcddb/ +# Paketçi: milisarge +# Gerekler: + +isim=libcddb +surum=1.3.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/${isim}/${isim}-${surum}.tar.bz2) +derle(){ +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcdio-paranoia/talimat b/talimatname/genel/l/libcdio-paranoia/talimat new file mode 100644 index 000000000..becf5de17 --- /dev/null +++ b/talimatname/genel/l/libcdio-paranoia/talimat @@ -0,0 +1,17 @@ +# Tanım: GNU Kompakt Disk Giriş ve Kontrol Kütüphanesi +# URL: http://www.gnu.org/software/libcdio/ +# Paketçi: milisarge +# Gerekler: libcdio + +isim=libcdio-paranoia +surum=10.2 +devir=1 + +kaynak=( http://ftp.gnu.org/gnu/libcdio/libcdio-paranoia-${surum}+0.93+1.tar.bz2) + +derle() { + cd $SRC/libcdio-paranoia-${surum}+0.93+1 + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcdio/talimat b/talimatname/genel/l/libcdio/talimat new file mode 100644 index 000000000..967dd914f --- /dev/null +++ b/talimatname/genel/l/libcdio/talimat @@ -0,0 +1,18 @@ +# Tanım: GNU Kompakt Disk Giriş ve Kontrol Kütüphanesi +# URL: http://www.gnu.org/software/libcdio/ +# Paketçi: milisarge +# Gerekler: libcddb + +isim=libcdio +surum=0.93 +devir=2 + +kaynak=( http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libcdr/talimat b/talimatname/genel/l/libcdr/talimat new file mode 100644 index 000000000..3fe146fc8 --- /dev/null +++ b/talimatname/genel/l/libcdr/talimat @@ -0,0 +1,17 @@ +# Tanım: LibreOffice için CorelDraw dosya biçimi ithalatçı kütüphanesi +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libcdr +# Paketçi: Cihan Alkan +# Gerekler: doxygen libwpd boost librevenge icu lcms2 + +isim=libcdr +surum=0.1.3 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libchamplain/talimat b/talimatname/genel/l/libchamplain/talimat new file mode 100644 index 000000000..334839251 --- /dev/null +++ b/talimatname/genel/l/libchamplain/talimat @@ -0,0 +1,17 @@ +# Tanım: Rasterized haritaları görüntülemek için Gtk3 aracı. +# URL: http://projects.gnome.org/libchamplain/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: clutter-gtk libsoup cairo sqlite gobject-introspection + +isim=libchamplain +surum=0.12.14 +devir=1 + +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static --disable-debug --enable-vala + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcli/talimat b/talimatname/genel/l/libcli/talimat new file mode 100644 index 000000000..6d28fb61c --- /dev/null +++ b/talimatname/genel/l/libcli/talimat @@ -0,0 +1,17 @@ +# Tanım: A shared library for including a Cisco-like command-line interface into other software. +# URL: https://github.com/dparrish/libcli +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libcli +surum=1.9.7 +devir=1 +kaynak=(https://github.com/dparrish/libcli/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + sed -i 's/-Werror//' "$SRC/$isim-$surum"/Makefile + cd "$SRC/$isim-$surum" + make + make DESTDIR="$PKG/" PREFIX='/usr' install +} diff --git a/talimatname/genel/l/libcmis/google_drive.diff b/talimatname/genel/l/libcmis/google_drive.diff new file mode 100644 index 000000000..2c2cf31b4 --- /dev/null +++ b/talimatname/genel/l/libcmis/google_drive.diff @@ -0,0 +1,106 @@ +diff --git a/src/libcmis/oauth2-providers.cxx b/src/libcmis/oauth2-providers.cxx +index 5e7f3bf..68a6aa5 100644 +--- a/src/libcmis/oauth2-providers.cxx ++++ b/src/libcmis/oauth2-providers.cxx +@@ -37,11 +37,28 @@ using namespace std; + string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUrl, + const string& username, const string& password ) + { ++ /* This member function implements 'Google OAuth 2.0' ++ * ++ * The interaction is carried out by libcmis, with no web browser involved. ++ * ++ * Normal sequence (without 2FA) is: ++ * 1) a get to activate login page ++ * receive first login page, html format ++ * 2) subsequent post to sent email ++ * receive html page for password input ++ * 3) subsequent post to send password ++ * receive html page for application consent ++ * 4) subsequent post to send a consent for the application ++ * receive a single-use authorization code ++ * this code is returned as a string ++ */ ++ + static const string CONTENT_TYPE( "application/x-www-form-urlencoded" ); + // STEP 1: Log in + string res; + try + { ++ // send the first get, receive the html login page + res = session->httpGetRequest( authUrl )->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -49,20 +66,39 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + return string( ); + } + +- string loginPost, loginLink; +- if ( !parseResponse( res.c_str( ), loginPost, loginLink ) ) ++ string loginEmailPost, loginEmailLink; ++ if ( !parseResponse( res.c_str( ), loginEmailPost, loginEmailLink ) ) + return string( ); +- +- loginPost += "Email="; +- loginPost += string( username ); +- loginPost += "&Passwd="; +- loginPost += string( password ); +- +- istringstream loginIs( loginPost ); +- string loginRes; +- try ++ ++ loginEmailPost += "Email="; ++ loginEmailPost += string( username ); ++ ++ istringstream loginEmailIs( loginEmailPost ); ++ string loginEmailRes; ++ try ++ { ++ // send a post with user email, receive the html page for password input ++ loginEmailRes = session->httpPostRequest ( loginEmailLink, loginEmailIs, CONTENT_TYPE ) ++ ->getStream( )->str( ); ++ } ++ catch ( const CurlException& e ) ++ { ++ return string( ); ++ } ++ ++ string loginPasswdPost, loginPasswdLink; ++ if ( !parseResponse( loginEmailRes.c_str( ), loginPasswdPost, loginPasswdLink ) ) ++ return string( ); ++ ++ loginPasswdPost += "Passwd="; ++ loginPasswdPost += string( password ); ++ ++ istringstream loginPasswdIs( loginPasswdPost ); ++ string loginPasswdRes; ++ try + { +- loginRes = session->httpPostRequest ( loginLink, loginIs, CONTENT_TYPE ) ++ // send a post with user password, receive the application consent page ++ loginPasswdRes = session->httpPostRequest ( loginPasswdLink, loginPasswdIs, CONTENT_TYPE ) + ->getStream( )->str( ); + } + catch ( const CurlException& e ) +@@ -71,8 +107,8 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + } + + // STEP 2: allow libcmis to access google drive +- string approvalPost, approvalLink; +- if ( !parseResponse( loginRes. c_str( ), approvalPost, approvalLink) ) ++ string approvalPost, approvalLink; ++ if ( !parseResponse( loginPasswdRes. c_str( ), approvalPost, approvalLink) ) + return string( ); + approvalPost += "submit_access=true"; + +@@ -80,7 +116,8 @@ string OAuth2Providers::OAuth2Gdrive( HttpSession* session, const string& authUr + string approvalRes; + try + { +- approvalRes = session->httpPostRequest ( approvalLink, approvalIs, ++ // send a post with application consent ++ approvalRes = session->httpPostRequest ( approvalLink, approvalIs, + CONTENT_TYPE) ->getStream( )->str( ); + } + catch ( const CurlException& e ) diff --git a/talimatname/genel/l/libcmis/talimat b/talimatname/genel/l/libcmis/talimat new file mode 100644 index 000000000..c4f8ef8c7 --- /dev/null +++ b/talimatname/genel/l/libcmis/talimat @@ -0,0 +1,19 @@ +# Tanım: CMIS protokolü için bir C / C ++ istemci kitaplığı +# URL: https://github.com/tdf/libcmis +# Paketçi: Cihan Alkan +# Gerekler: libxml2 boost libpng doxygen docbook2x + +isim=libcmis +surum=0.5.1 +devir=1 + +kaynak=(https://github.com/tdf/libcmis/releases/download/v$surum/$isim-$surum.tar.gz + google_drive.diff) + +derle() { + cd $isim-$surum + patch -Np1 -i $SRC/google_drive.diff + ./configure --prefix=/usr DOCBOOK2MAN='docbook2man' --disable-werror + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libconfig/talimat b/talimatname/genel/l/libconfig/talimat new file mode 100644 index 000000000..d51f22b6f --- /dev/null +++ b/talimatname/genel/l/libconfig/talimat @@ -0,0 +1,21 @@ +# Tanım: C / C ++ yapılandırma dosyası kitaplığı +# URL: http://www.hyperrealm.com/libconfig/ +# Paketçi: milisarge +# Gerekler: + +isim=libconfig +surum=1.5 +devir=2 +kaynak=(http://www.hyperrealm.com/libconfig/libconfig-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install + + rm $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libcroco/talimat b/talimatname/genel/l/libcroco/talimat new file mode 100644 index 000000000..427b6d1b0 --- /dev/null +++ b/talimatname/genel/l/libcroco/talimat @@ -0,0 +1,20 @@ +# Tanım: Libcroco paketi, tek başına bir CSS2 ayrıştırma ve değiştirme kütüphanesi içerir. +# URL: https://launchpad.net/libcroco +# Paketçi: milisarge +# Gerekler: libxml2 glib + +isim=libcroco +surum=0.6.11 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/libcroco/0.6/$isim-$surum.tar.xz) + + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-static +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/l/libcryptui/libcryptui.kur-kos b/talimatname/genel/l/libcryptui/libcryptui.kur-kos new file mode 100644 index 000000000..6ba5ccf8f --- /dev/null +++ b/talimatname/genel/l/libcryptui/libcryptui.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/l/libcryptui/talimat b/talimatname/genel/l/libcryptui/talimat new file mode 100644 index 000000000..df672f84e --- /dev/null +++ b/talimatname/genel/l/libcryptui/talimat @@ -0,0 +1,19 @@ +# Tanım: OpenPGP için Kütüphane komut istemleri +# URL: http://git.gnome.org/libcryptui +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk3 gpgme dbus-glib gnupg libnotify libgnome-keyring dconf gobject-introspection intltool + + +isim=libcryptui +surum=3.12.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/GNOME/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i "s@1.2 1.4 2.0@1.2 1.4 2.0 2.1@" configure + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libcxx/talimat b/talimatname/genel/l/libcxx/talimat new file mode 100644 index 000000000..d60c0ff7c --- /dev/null +++ b/talimatname/genel/l/libcxx/talimat @@ -0,0 +1,44 @@ +# Tanım: C + + 11'i hedef alan C ++ standart kütüphanesinin yeni bir uygulaması. +# URL: http://libcxx.llvm.org/ +# Paketçi: Cihan_Alkan +# Gerekler: clang cmake python3 libunwind +# Grup: kütüphane + +isim=libcxx +surum=5.0.1 +devir=1 + +kaynak=(https://releases.llvm.org/$surum/llvm-$surum.src.tar.xz + https://releases.llvm.org/$surum/libcxx-$surum.src.tar.xz + https://releases.llvm.org/$surum/libcxxabi-$surum.src.tar.xz) + +derle() { + mv llvm* llvm + mv libcxxabi* llvm/projects/libcxxabi + mv libcxx-* llvm/projects/libcxx + sed -i 's/CREDITS.TXT/CREDITS/' llvm/projects/libcxx/LICENSE.TXT + sed -i 's/CREDITS.TXT/CREDITS/' llvm/projects/libcxxabi/LICENSE.TXT + [[ -d build ]] || mkdir build + + cd build + CC=clang CXX=clang++ cmake \ + -G "Unix Makefiles" \ + -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=On \ + -DLIBCXX_INSTALL_EXPERIMENTAL_LIBRARY=Off \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + ${SRC}/llvm + make cxx cxx_experimental + + make DESTDIR="${PKG}" install-libcxx + install -Dm644 ${SRC}/llvm/projects/libcxx/CREDITS.TXT "${PKG}/usr/share/licenses/${isim}/CREDITS" + install -Dm644 ${SRC}/llvm/projects/libcxx/LICENSE.TXT "${PKG}/usr/share/licenses/${isim}/LICENSE" + make DESTDIR="${PKG}" install-libcxxabi + install -Dm644 ${SRC}/build/include/c++/v1/cxxabi.h "${PKG}/usr/include/c++/v1/cxxabi.h" + install -Dm644 ${SRC}/build/include/c++/v1/__cxxabi_config.h "${PKG}/usr/include/c++/v1/__cxxabi_config.h" + install -Dm644 ${SRC}/llvm/projects/libcxxabi/CREDITS.TXT "${PKG}/usr/share/licenses/${isim}/CREDITS" + install -Dm644 ${SRC}/llvm/projects/libcxxabi/LICENSE.TXT "${PKG}/usr/share/licenses/${isim}/LICENSE" + install -Dm644 ${SRC}/build/lib/libc++experimental.a ${PKG}/usr/lib/libc++experimental.a + install -Dm644 ${SRC}/llvm/projects/libcxx/CREDITS.TXT "${PKG}/usr/share/licenses/${isim}/CREDITS" + install -Dm644 ${SRC}/llvm/projects/libcxx/LICENSE.TXT "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/l/libdaemon/talimat b/talimatname/genel/l/libdaemon/talimat new file mode 100644 index 000000000..7362b7530 --- /dev/null +++ b/talimatname/genel/l/libdaemon/talimat @@ -0,0 +1,19 @@ +# Tanım: UNIX programlarını yazmayı kolaylaştıran hafif C kütüphanesi +# URL: http://0pointer.de/lennart/projects/libdaemon/ +# Paketçi: milisarge +# Gerekler: + +isim=libdaemon +surum=0.14 +devir=1 + +kaynak=( http://pkgs.fedoraproject.org/repo/pkgs/libdaemon/libdaemon-0.14.tar.gz/509dc27107c21bcd9fbf2f95f5669563/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-doxygen \ + --disable-lynx + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdatrie/talimat b/talimatname/genel/l/libdatrie/talimat new file mode 100644 index 000000000..57108d2d1 --- /dev/null +++ b/talimatname/genel/l/libdatrie/talimat @@ -0,0 +1,20 @@ +# Tanım: Junichi Aoe tarafından önerilen, bir tür dijital arama ağacı olan trie'yi temsil etmek için çift dizili yapının uygulanması +# URL: http://linux.thai.net/~thep/datrie/datrie.html +# Paketçi: milisarge +# Gerekler: + +isim=libdatrie +surum=0.2.9 +devir=1 + +kaynak=(http://linux.thai.net/pub/thailinux/software/libthai/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdbusmenu-glib/talimat b/talimatname/genel/l/libdbusmenu-glib/talimat new file mode 100644 index 000000000..5fd6d2c86 --- /dev/null +++ b/talimatname/genel/l/libdbusmenu-glib/talimat @@ -0,0 +1,27 @@ +# Tanım: DBusMenu protokolünün Glib uygulaması sağlayan kitaplık +# URL: https://launchpad.net/dbusmenu +# Paketçi: milisarge +# Gerekler: python gobject-introspection gtk2 gtk3 glib vala gnome-doc-utils atk libepoxy json-glib gnome-common pkg-config valgrind + +isim=libdbusmenu-glib +_isim=libdbusmenu +devir=1 +surum=16.04.0 + +kaynak=(https://launchpad.net/${_name}/${surum%.*}.tar.gz ) + +derle() { + export HAVE_VALGRIND_TRUE='#' + export HAVE_VALGRIND_FALSE='' + + cd $_name-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libexecdir=/usr/lib/$_name \ + --disable-static --disable-scrollkeeper --disable-tests + + make + + make -C libdbusmenu-glib DESTDIR=$PKG install + make -C tools DESTDIR=$PKG install + make -C docs DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdbusmenu-gtk2/talimat b/talimatname/genel/l/libdbusmenu-gtk2/talimat new file mode 100644 index 000000000..678d36ec5 --- /dev/null +++ b/talimatname/genel/l/libdbusmenu-gtk2/talimat @@ -0,0 +1,27 @@ +# Tanım: DBusMenu protokolünün GTK2 uygulaması olan kitaplık +# URL: https://launchpad.net/dbusmenu +# Paketçi: milisarge +# Gerekler: python gobject-introspection gtk2 gtk3 libdbusmenu-glib vala gnome-doc-utils atk libepoxy json-glib + +isim=libdbusmenu-gtk2 +_isim=libdbusmenu +devir=1 +surum=16.04.0 + +kaynak=(http://launchpad.net/$_name/${surum%.*}-$surum.tar.gz ) + +derle() { + export HAVE_VALGRIND_TRUE='#' + export HAVE_VALGRIND_FALSE='' + + cd $_name-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-{dumper,static,tests} \ + --with-gtk=2 + make + make -C libdbusmenu-glib DESTDIR=$PKG install + make -C libdbusmenu-gtk DESTDIR=$PKG install + make -C libdbusmenu-glib DESTDIR=$PKG uninstall +} \ No newline at end of file diff --git a/talimatname/genel/l/libdbusmenu-gtk3/talimat b/talimatname/genel/l/libdbusmenu-gtk3/talimat new file mode 100644 index 000000000..570b6effb --- /dev/null +++ b/talimatname/genel/l/libdbusmenu-gtk3/talimat @@ -0,0 +1,27 @@ +# Tanım: DBusMenu protokolünün GTK3 uygulaması olan kitaplık +# URL: https://launchpad.net/dbusmenu +# Paketçi: milisarge +# Gerekler: python gobject-introspection gtk2 gtk3 libdbusmenu-glib vala gnome-doc-utils atk libepoxy json-glib + +isim=libdbusmenu-gtk3 +_isim=libdbusmenu +devir=1 +surum=16.04.0 + +kaynak=(http://launchpad.net/$_name/${surum%.*}-$surum.tar.gz ) + +derle() { + export HAVE_VALGRIND_TRUE='#' + export HAVE_VALGRIND_FALSE='' + + cd $_name-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-{dumper,static,tests} \ + --with-gtk=3 + make -j1 + make -C libdbusmenu-glib DESTDIR=$PKG install + make -C libdbusmenu-gtk DESTDIR=$PKG install + make -C libdbusmenu-glib DESTDIR=$PKG uninstall +} diff --git a/talimatname/genel/l/libdbusmenu-qt/talimat b/talimatname/genel/l/libdbusmenu-qt/talimat new file mode 100644 index 000000000..471103a7c --- /dev/null +++ b/talimatname/genel/l/libdbusmenu-qt/talimat @@ -0,0 +1,18 @@ +# Tanım: DBusMenu spesifikasyonunun Qt uygulanmasını sağlayan bir kütüphane +# URL: http://launchpad.net/libdbusmenu-qt +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt4 + +isim=libdbusmenu-qt +surum=0.9.2 +devir=1 + +kaynak=(http://launchpad.net/libdbusmenu-qt/trunk/$surum/+download/$isim-$surum.tar.bz2) +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DWITH_DOC=OFF + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdbusmenu-qt5/talimat b/talimatname/genel/l/libdbusmenu-qt5/talimat new file mode 100644 index 000000000..3b275b681 --- /dev/null +++ b/talimatname/genel/l/libdbusmenu-qt5/talimat @@ -0,0 +1,21 @@ +# Tanım: DBusMenu protokolünün Qt5 uygulamasını sağlayan kitaplık +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com yasarciv67@gmail.com +# Gerekler: cmake qt5 qjson + +isim=libdbusmenu-qt5 +_isim=libdbusmenu-qt +devir=1 +surum=0.9.3+16.04.20160218 +kaynak=(http://archive.ubuntu.com/ubuntu/pool/main/libd/$_name/libdbusmenu-qt_$surum.orig.tar.gz) + +derle() { +cd libdbusmenu-qt-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DWITH_DOC=OFF \ + -Wno-dev -DKDE_INSTALL_USE_QT_SYS_PATHS=ON +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdmapsharing/talimat b/talimatname/genel/l/libdmapsharing/talimat new file mode 100644 index 000000000..a5ff026e7 --- /dev/null +++ b/talimatname/genel/l/libdmapsharing/talimat @@ -0,0 +1,19 @@ +# Tanım: DMAP protokol ailesini uygulayan bir kütüphane +# URL: http://www.flyn.org/projects/libdmapsharing/index.html +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk-doc gobject-introspection libsoup avahi gstreamer1-plugins-base gdk-pixbuf + +isim=libdmapsharing +surum=2.9.39 +devir=1 +kaynak=(https://git.gnome.org/browse/$isim/snapshot/LIBDMAPSHARING_2_9_39.tar.xz) + +derle() { + cd LIBDMAPSHARING_2_9_39 + ./autogen.sh + ./configure --prefix=/usr --with-mdns=avahi --enable-gtk-doc + + make + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/l/libdmtx/talimat b/talimatname/genel/l/libdmtx/talimat new file mode 100644 index 000000000..5f325d49b --- /dev/null +++ b/talimatname/genel/l/libdmtx/talimat @@ -0,0 +1,19 @@ +# Tanım: Data Matrix 2D barkodları okumak ve yazmak için bir yazılım +# URL: https://libdmtx.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: glibc +# Grup: + +isim=libdmtx +surum=0.7.4 +devir=1 +kaynak=(https://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) + +derle() { + + cd $isim-$surum + ./configure --prefix=/usr + make + + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libdnet/talimat b/talimatname/genel/l/libdnet/talimat new file mode 100644 index 000000000..ada676c18 --- /dev/null +++ b/talimatname/genel/l/libdnet/talimat @@ -0,0 +1,18 @@ +# Tanım: ARP arkaplan çalıştırma ve araçlar +# URL: http://arpon.sf.net +# Paketçi: milisarge +# Gerekler: libpcap libnet + +isim=libdnet +surum=1.11 +devir=1 +kaynak=(http://download.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + autoreconf -i -Iconfig + ./configure --prefix=/usr \ + --mandir=/usr/man + make + make install DESTDIR=$PKG +} diff --git a/talimatname/genel/l/libdv/talimat b/talimatname/genel/l/libdv/talimat new file mode 100644 index 000000000..d9b1d8b2e --- /dev/null +++ b/talimatname/genel/l/libdv/talimat @@ -0,0 +1,17 @@ +# Tanım: Quasar DV codec (libdv), DV video için bir yazılım codec bileşenidir +# URL: http://downloads.sourceforge.net/libdv +# Paketçi: milisarge +# Gerekler: popt sdl xorg-libxv + +isim=libdv +surum=1.0.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/libdv/libdv-1.0.0.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-xv \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdvdcss/talimat b/talimatname/genel/l/libdvdcss/talimat new file mode 100644 index 000000000..e43f89343 --- /dev/null +++ b/talimatname/genel/l/libdvdcss/talimat @@ -0,0 +1,17 @@ +# Tanım: DVD şifre çözme için portatif soyutlama kütüphanesi +# URL: http://www.videolan.org +# Paketçi: milisarge +# Gerekler: doxygen + +isim=libdvdcss +surum=1.4.0 +devir=1 + +kaynak=(http://download.videolan.org/libdvdcss/$surum/libdvdcss-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static \ +--docdir=/usr/share/doc/libdvdcss-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdvdnav/talimat b/talimatname/genel/l/libdvdnav/talimat new file mode 100644 index 000000000..be642754e --- /dev/null +++ b/talimatname/genel/l/libdvdnav/talimat @@ -0,0 +1,18 @@ +# Tanım: Xine-dvdnav eklentisi için kütüphane +# URL: http://mplayerhq.hu +# Paketçi: milisarge +# Gerekler: libdvdread + +isim=libdvdnav +surum=5.0.3 +devir=1 + +kaynak=( http://download.videolan.org/videolan/$isim/$surum/$isim-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--docdir=/usr/share/doc/$isim-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libdvdread/talimat b/talimatname/genel/l/libdvdread/talimat new file mode 100644 index 000000000..0b2956227 --- /dev/null +++ b/talimatname/genel/l/libdvdread/talimat @@ -0,0 +1,18 @@ +# Tanım: DVD video disklerini okumak için basit bir temel sağlar +# URL: http://mplayerhq.hu +# Paketçi: milisarge +# Gerekler: + +isim=libdvdread +surum=5.0.3 +devir=1 + +kaynak=(http://download.videolan.org/videolan/$isim/$surum/$isim-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--docdir=/usr/share/libdvdread-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libe-book/talimat b/talimatname/genel/l/libe-book/talimat new file mode 100644 index 000000000..f819604a9 --- /dev/null +++ b/talimatname/genel/l/libe-book/talimat @@ -0,0 +1,18 @@ +# Tanım: e-kitap formatları için kütüphane +# URL: http://sourceforge.net/projects/libebook/ +# Paketçi: milisarge +# Gerekler: boost cppunit doxygen librevenge libxml2 liblangtag +# Grup: ofis_düzenleyici + +isim=libe-book +surum=0.1.3 +devir=1 +kaynak=(https://sourceforge.net/projects/libebook/files/libe-book-$surum/libe-book-$surum.tar.xz) + +derle() { + cd ${isim}-${surum} + ./configure --prefix=/usr + make + make check + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libechonest/talimat b/talimatname/genel/l/libechonest/talimat new file mode 100644 index 000000000..6b5fb2673 --- /dev/null +++ b/talimatname/genel/l/libechonest/talimat @@ -0,0 +1,25 @@ +# Tanım: Echo Nest ile arabirim oluşturmak için C ++ kütüphanesi (qt5 sürümünü oluşturur) +# URL: https://projects.kde.org/projects/playground/libs/libechonest +# Paketçi: milisarge +# Gerekler: qt5 + +isim=libechonest +surum=2.3.1 +devir=1 + +kaynak=(https://github.com/lfranchi/libechonest/archive/$surum.tar.gz) + +derle() { + mkdir build + cd build + + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DECHONEST_BUILD_TESTS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_WITH_QT4=off + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libedit/talimat b/talimatname/genel/l/libedit/talimat new file mode 100644 index 000000000..ca48e898e --- /dev/null +++ b/talimatname/genel/l/libedit/talimat @@ -0,0 +1,20 @@ +# Tanım: Genel satır düzenleme, tarih ve tokenization işlevleri sağlayan komut satırı düzenleyicisi. +# URL: http://thrysoee.dk/editline/ +# Paketçi: milisarge +# Gerekler: + +isim=libedit +_surum=20170329-3.1 +surum=${_surum/-/_} +devir=1 + +kaynak=(http://www.thrysoee.dk/editline/libedit-${_surum}.tar.gz) + +derle(){ + cd $isim-${_version} + ./configure --prefix=/usr \ + --enable-widec + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/l/libepoxy/talimat b/talimatname/genel/l/libepoxy/talimat new file mode 100644 index 000000000..72399d7e1 --- /dev/null +++ b/talimatname/genel/l/libepoxy/talimat @@ -0,0 +1,18 @@ +# Tanım: OpenGL işlev göstergesi yönetimi ile ilgili kitaplık +# URL: https://github.com/anholt/libepoxy +# Paketçi: milisarge +# Gerekler: glibc xorg-mesa python xorg-util-macros + +isim=libepoxy +surum=1.3.1 +devir=1 + +kaynak=( https://github.com/anholt/libepoxy/releases/download/v$surum/libepoxy-$surum.tar.bz2) + +derle() { +cd libepoxy-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libesmtp/talimat b/talimatname/genel/l/libesmtp/talimat new file mode 100644 index 000000000..a503826e8 --- /dev/null +++ b/talimatname/genel/l/libesmtp/talimat @@ -0,0 +1,19 @@ +# Tanım: Bazı programlar tarafından posta aktarım katmanına e-posta göndermeyi yönetmek için kullanılan kitaplıklar. +# URL: http://www.stafford.uklinux.net/libesmtp/ +# Paketçi: milisarge +# Gerekler: + +isim=libesmtp +surum=1.0.6 +devir=1 + +kaynak=( http://www.stafford.uklinux.net/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr\ + --mandir=/usr/share/man\ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libetonyek/0001-Allow-building-with-mdds-1.2.patch b/talimatname/genel/l/libetonyek/0001-Allow-building-with-mdds-1.2.patch new file mode 100644 index 000000000..32466aae4 --- /dev/null +++ b/talimatname/genel/l/libetonyek/0001-Allow-building-with-mdds-1.2.patch @@ -0,0 +1,83 @@ +From f6d14b3b510de5c50e45c98fe812a73ba00f3def Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fridrich=20=C5=A0trba?= +Date: Thu, 9 Jun 2016 10:50:41 +0200 +Subject: [PATCH] Allow building with mdds-1.2 + +Change-Id: If8791b4c1c3fbefdd06af345276e0a724dff5482 +--- + configure.ac | 44 +++++++++++++++++++++++--------------------- + 1 file changed, 23 insertions(+), 21 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ca4bb07..bb946eb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -24,7 +24,7 @@ AC_LANG([C++]) + # Configure options + # ================= + AC_ARG_WITH([mdds], +- AS_HELP_STRING([--with-mdds=1.0|0.x], [Specify which version of mdds to use (1.0 is the default)]), ++ AS_HELP_STRING([--with-mdds=1.2|1.0|0.x], [Specify which version of mdds to use (1.0 is the default)]), + [], [with_mdds="1.0"]) + + # =========================== +@@ -47,7 +47,7 @@ AC_PROG_SED + + AM_MISSING_PROG([GPERF], [gperf]) + +-AS_IF([test "$with_mdds" = "1.0"], [AX_CXX_COMPILE_STDCXX_11([noext])]) ++AS_IF([test "$with_mdds" = "1.0" -o "$with_mdds" = "1.2" ], [AX_CXX_COMPILE_STDCXX_11([noext])]) + + # =============== + # Find librevenge +@@ -138,25 +138,27 @@ AC_SUBST([GLM_CFLAGS]) + # ========= + # Find mdds + # ========= +-AS_IF([test "$with_mdds" = "1.0"], [ +- PKG_CHECK_MODULES([MDDS], [mdds-1.0]) +-], [ +- PKG_CHECK_MODULES([MDDS], [mdds]) +- AC_MSG_CHECKING([checking if mdds::flat_segment_tree can store values of any type]) +- old_CPPFLAGS="$CPPFLAGS" +- CPPFLAGS="$MDDS_CFLAGS $CPPFLAGS" +- AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +- #include +- struct Value {}; +- mdds::flat_segment_tree tree(0, 4, Value()); +- ])], [ +- AC_MSG_RESULT([yes]) +- ], [ +- AC_MSG_RESULT([no]) +- AC_MSG_ERROR([please install mdds >= 0.12.1]) +- ]) +- CPPFLAGS="$old_CPPFLAGS" +-]) ++AS_CASE(["$with_mdds"], ++ ["1.2"], [PKG_CHECK_MODULES([MDDS], [mdds-1.2])], ++ ["1.0"], [PKG_CHECK_MODULES([MDDS], [mdds-1.0])], ++ [ ++ PKG_CHECK_MODULES([MDDS], [mdds]) ++ AC_MSG_CHECKING([checking if mdds::flat_segment_tree can store values of any type]) ++ old_CPPFLAGS="$CPPFLAGS" ++ CPPFLAGS="$MDDS_CFLAGS $CPPFLAGS" ++ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ++ #include ++ struct Value {}; ++ mdds::flat_segment_tree tree(0, 4, Value()); ++ ])], [ ++ AC_MSG_RESULT([yes]) ++ ], [ ++ AC_MSG_RESULT([no]) ++ AC_MSG_ERROR([please install mdds >= 0.12.1]) ++ ]) ++ CPPFLAGS="$old_CPPFLAGS" ++ ] ++) + + # ================================= + # Libtool/Version Makefile settings +-- +2.9.3 + + diff --git a/talimatname/genel/l/libetonyek/0001-drop-test-that-violates-Unicode-tr-35.patch b/talimatname/genel/l/libetonyek/0001-drop-test-that-violates-Unicode-tr-35.patch new file mode 100644 index 000000000..38c17f616 --- /dev/null +++ b/talimatname/genel/l/libetonyek/0001-drop-test-that-violates-Unicode-tr-35.patch @@ -0,0 +1,37 @@ +From 1a20d8ece2ea3e8aa1d319cd88e8a6aa637982f2 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Fri, 30 Sep 2016 09:57:15 +0200 +Subject: [PATCH] drop test that violates Unicode tr#35 + +(and therefore fails with latest liblangtag) + +Change-Id: I0e06c6c4e8bcf999cf5559d6287e77ae97e555d8 +--- + src/test/IWORKLanguageManagerTest.cpp | 10 ---------- + 1 file changed, 10 deletions(-) + +diff --git a/src/test/IWORKLanguageManagerTest.cpp b/src/test/IWORKLanguageManagerTest.cpp +index 8fca0a6..e663bd2 100644 +--- a/src/test/IWORKLanguageManagerTest.cpp ++++ b/src/test/IWORKLanguageManagerTest.cpp +@@ -104,16 +104,6 @@ void IWORKLanguageManagerTest::testTagToProps() + } + + { +- const string tag(mgr.addTag("ccc")); +- CPPUNIT_ASSERT(!tag.empty()); +- RVNGPropertyList props; +- mgr.writeProperties(tag, props); +- assertProperty("unknown lang", props, "fo:language", "ccc"); +- CPPUNIT_ASSERT(!props["fo:country"]); +- CPPUNIT_ASSERT(!props["fo:script"]); +- } +- +- { + // invalid tag + const string tag(mgr.addTag("13c")); + CPPUNIT_ASSERT(tag.empty()); +-- +2.9.3 + + diff --git a/talimatname/genel/l/libetonyek/0001-fix-test-on-i686.patch b/talimatname/genel/l/libetonyek/0001-fix-test-on-i686.patch new file mode 100644 index 000000000..be8faf03e --- /dev/null +++ b/talimatname/genel/l/libetonyek/0001-fix-test-on-i686.patch @@ -0,0 +1,27 @@ +From b63a2f52d95243aef4660b2d4573f0e149eeb9a6 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Wed, 22 Feb 2017 15:03:19 -0500 +Subject: [PATCH] fix test on i686 + +Change-Id: Ib9dafdfd76175cc6bbcd94596f7a7bd8b924ed34 +--- + src/test/IWORKTransformationTest.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/test/IWORKTransformationTest.cpp b/src/test/IWORKTransformationTest.cpp +index 77f0b27..5e96e60 100644 +--- a/src/test/IWORKTransformationTest.cpp ++++ b/src/test/IWORKTransformationTest.cpp +@@ -232,7 +232,7 @@ void IWORKTransformationTest::testInverseOperations() + + CPPUNIT_ASSERT(scale(2, 1) * scale(0.5, 1) == eye); + CPPUNIT_ASSERT(scale(1, 2) * scale(1, 0.5) == eye); +- CPPUNIT_ASSERT(scale(3, 2) * scale(1.0 / 3, 0.5) == eye); ++ CPPUNIT_ASSERT(approxEqual(scale(3, 2) * scale(1.0 / 3, 0.5), eye)); + + // CPPUNIT_ASSERT(shear() == eye); + +-- +2.11.1 + + diff --git a/talimatname/genel/l/libetonyek/talimat b/talimatname/genel/l/libetonyek/talimat new file mode 100644 index 000000000..fb1752441 --- /dev/null +++ b/talimatname/genel/l/libetonyek/talimat @@ -0,0 +1,25 @@ +# Tanım: Apple Keynote sunumlarını okumak ve dönüştürmek için kullanılan kütüphane ve araçlar +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libetonyek +# Paketçi: Cihan Alkan +# Gerekler: libxml2 boost librevenge doxygen mdds libwpd liblangtag glm + +isim=libetonyek +surum=0.1.6 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz + 0001-Allow-building-with-mdds-1.2.patch + 0001-drop-test-that-violates-Unicode-tr-35.patch + 0001-fix-test-on-i686.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../0001-Allow-building-with-mdds-1.2.patch + patch -Np1 -i ../0001-drop-test-that-violates-Unicode-tr-35.patch + patch -Np1 -i ../0001-fix-test-on-i686.patch + autoreconf -vfi + + ./configure --prefix=/usr --with-mdds=1.2 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libetpan/talimat b/talimatname/genel/l/libetpan/talimat new file mode 100644 index 000000000..c1cea88e5 --- /dev/null +++ b/talimatname/genel/l/libetpan/talimat @@ -0,0 +1,16 @@ +# Tanım: E-posta erişimi için portatif bir katman +# URL: http://www.etpan.org/ +# Paketçi: milisarge +# Gerekler: curl expat + +isim=libetpan +surum=1.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libev/talimat b/talimatname/genel/l/libev/talimat new file mode 100644 index 000000000..39a93fcba --- /dev/null +++ b/talimatname/genel/l/libev/talimat @@ -0,0 +1,18 @@ +# Tanım: yüksek performans loop/event modeli +# URL: http://software.schmorp.de/pkg/libev.html +# Paketçi: milisarge +# Gerekler: + +isim=libev +surum=4.22 +devir=1 +kaynak=(http://dist.schmorp.de/$isim/Attic/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static + make + make prefix=$PKG/usr install + rm $PKG/usr/include/event.h +} diff --git a/talimatname/genel/l/libevdev/talimat b/talimatname/genel/l/libevdev/talimat new file mode 100644 index 000000000..fe028d3aa --- /dev/null +++ b/talimatname/genel/l/libevdev/talimat @@ -0,0 +1,17 @@ +# Tanım: Libevdev paketi Xorg giriş sürücüleri için ortak işlevler içerir. +# URL: http://www.freedesktop.org/wiki/Software/libevdev/ +# Paketçi: milisarge +# Gerekler: python + +isim=libevdev +surum=1.4.6 +devir=1 + +kaynak=( http://www.freedesktop.org/software/libevdev/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libevent/talimat b/talimatname/genel/l/libevent/talimat new file mode 100644 index 000000000..f341ff4eb --- /dev/null +++ b/talimatname/genel/l/libevent/talimat @@ -0,0 +1,16 @@ +# Tanım: Bir etkinlik bildirim kitaplığı +# URL: http://www.monkey.org/~provos/libevent/ +# Paketçi: milisarge +# Gerekler: + +isim=libevent +surum=2.0.22 +devir=1 + +kaynak=(http://downloads.sourceforge.net/levent/$isim-$surum-stable.tar.gz) +derle() { +cd $isim-$surum-stable +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libexif/talimat b/talimatname/genel/l/libexif/talimat new file mode 100644 index 000000000..df37c991b --- /dev/null +++ b/talimatname/genel/l/libexif/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir EXIF dosyasını ayrıştırmak ve bu etiketlerdeki verileri okumak için bir kitaplık +# URL: http://libexif.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=libexif +surum=0.6.21 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) + + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--with-doc-dir=/usr/share/doc/libexif-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libexttextcat/talimat b/talimatname/genel/l/libexttextcat/talimat new file mode 100644 index 000000000..01a53f669 --- /dev/null +++ b/talimatname/genel/l/libexttextcat/talimat @@ -0,0 +1,20 @@ +# Tanım: Öncelikle dil tahmininde kullanılan N-Gram Tabanlı Metin Sınıflandırma kitaplığı +# URL: http://www.freedesktop.org/wiki/Software/libexttextcat/ +# Paketçi: Cihan Alkan +# Gerekler: + +isim=libexttextcat +surum=3.4.4 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + + install -D -m644 LICENSE "$PKG"/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/l/libfakekey/talimat b/talimatname/genel/l/libfakekey/talimat new file mode 100644 index 000000000..1c6918b6a --- /dev/null +++ b/talimatname/genel/l/libfakekey/talimat @@ -0,0 +1,20 @@ +# Tanım: X sanal klavye kitaplığı. +# URL: https://www.yoctoproject.org/tools-resources/projects/matchbox +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg-libxtst + +isim=libfakekey +surum=0.1 +devir=1 + +kaynak=(http://downloads.yoctoproject.org/releases/matchbox/$isim/$surum/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-static +make AM_LDFLAGS=-lX11 +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libffi/libffi.kur-kos b/talimatname/genel/l/libffi/libffi.kur-kos new file mode 100755 index 000000000..3bd493194 --- /dev/null +++ b/talimatname/genel/l/libffi/libffi.kur-kos @@ -0,0 +1,2 @@ +ln -s /usr/lib/libffi.la /usr/lib64/ +ln -s /usr/lib/libffi.so /usr/lib64/ diff --git a/talimatname/genel/l/libffi/talimat b/talimatname/genel/l/libffi/talimat new file mode 100644 index 000000000..9e29a41b1 --- /dev/null +++ b/talimatname/genel/l/libffi/talimat @@ -0,0 +1,28 @@ +# Tanım: Çeşitli arama kurallarına taşınabilir, yüksek seviyeli bir programlama arabirimi sağlayın. +# URL: http://sourceware.org/libffi/ +# Paketçi: milisarge +# Gerekler: + +isim=libffi +surum=3.2.1 +devir=1 + +kaynak=( ftp://sourceware.org/pub/$isim/$isim-$surum.tar.gz ) + + +derle() { +cd $isim-$surum +sed -e '/^includesdir/ s:$(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include:$(includedir):' \ +-i include/Makefile.in +sed -e '/^includedir/ s:${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include:@includedir@:' \ +-e 's/^Cflags: -I${includedir}/Cflags:/' \ +-i libffi.pc.in +./configure --prefix=/usr +make +make DESTDIR=$PKG install +rm -f $PKG/usr/share/info/dir +if [ "`uname -m`" == "x86_64" ];then + mv $PKG/usr/lib64/lib* $PKG/usr/lib + rm -r $PKG/usr/lib64 +fi +} diff --git a/talimatname/genel/l/libfilezilla/talimat b/talimatname/genel/l/libfilezilla/talimat new file mode 100644 index 000000000..e7894f405 --- /dev/null +++ b/talimatname/genel/l/libfilezilla/talimat @@ -0,0 +1,18 @@ +# Tanım: Temel işlevler sunup platform bağımsız uygulamalar yapmak için C++ kütüphanesi +# URL: https://lib.filezilla-project.org +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libfilezilla +surum=0.11.2 +devir=1 +kaynak=(http://download.filezilla-project.org/libfilezilla/libfilezilla-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libfm-extra/talimat b/talimatname/genel/l/libfm-extra/talimat new file mode 100644 index 000000000..4cd17808e --- /dev/null +++ b/talimatname/genel/l/libfm-extra/talimat @@ -0,0 +1,21 @@ +# Tanım: Libfm-ekstra paket kütüphane ve önbelleği 1.0.0-menü libexec menü-cache-gen tarafından gerekli diğer dosyaları içerir. +# URL: http://pcmanfm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: glib intltool perl-xml-parser + +isim=libfm-extra +_isim=libfm +surum=1.2.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/pcmanfm/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --with-extra-only \ + --with-gtk=no \ + --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libfm-qt/talimat b/talimatname/genel/l/libfm-qt/talimat new file mode 100644 index 000000000..71a44b683 --- /dev/null +++ b/talimatname/genel/l/libfm-qt/talimat @@ -0,0 +1,22 @@ +# Tanım: Libfm-qt, masaüstü dosya yöneticileri oluşturmak için bileşenleri sağlayan bir kütüphane olan libfm'in Qt bağlantı noktasıdır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: cmake libfm qt5 +# Grup: lxqt + +isim=libfm-qt +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libfm/talimat b/talimatname/genel/l/libfm/talimat new file mode 100644 index 000000000..1b05985a4 --- /dev/null +++ b/talimatname/genel/l/libfm/talimat @@ -0,0 +1,24 @@ +# Tanım: Dosya yönetimi için kütüphane +# URL: http://pcmanfm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: udisks shared-mime-info xorg-libxinerama xorg-libxrandr xorg-libxdamage gtk2 menu-cache dbus-glib desktop-file-utils vala + +isim=libfm +surum=1.2.3 +devir=5 + +kaynak=(http://downloads.sourceforge.net/pcmanfm/${isim}-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static +make +make DESTDIR=$PKG install +# already in libfm-extra +rm $PKG/usr/lib/libfm-extra.* +rm $PKG/usr/lib/pkgconfig/libfm-extra.pc +rm $PKG/usr/include/libfm +rm $PKG/usr/include/libfm-1.0/{fm-xml-file.h,fm-extra.h,fm-version.h} +} diff --git a/talimatname/genel/l/libfprint/talimat b/talimatname/genel/l/libfprint/talimat new file mode 100644 index 000000000..e99bad08a --- /dev/null +++ b/talimatname/genel/l/libfprint/talimat @@ -0,0 +1,20 @@ +# Tanım: Parmak izi okuyucuları için kütüphane +# URL: https://www.freedesktop.org/wiki/Software/fprint/libfprint +# Paketçi: Cihan_Alkan +# Gerekler: libusb nss xorg-pixman glib xorg-pixman +# Grup: kütüphane + +isim=libfprint +surum=0.7.0 +devir=1 +kaynak=() + +derle() { + git_indir https://anongit.freedesktop.org/git/libfprint/libfprint.git libfprint + cd $SRC/$isim + NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr --sysconfdir=/etc --disable-static + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libftdi/talimat b/talimatname/genel/l/libftdi/talimat new file mode 100644 index 000000000..41fa90e3f --- /dev/null +++ b/talimatname/genel/l/libftdi/talimat @@ -0,0 +1,25 @@ +# Tanım: FTDI yongaları ile konuşmak için bir kütüphane, isteğe bağlı python bağları. +# URL: http://www.intra2net.com/en/developer/libftdi/download.php +# Paketçi: milisarge +# Gerekler: libusb confuse boost cmake python swig + +isim=libftdi +surum=1.3 +devir=1 + +kaynak=(http://www.intra2net.com/en/developer/libftdi/download/${isim}1-$surum.tar.bz2) + +derle() { +cd ${isim}1-$surum +sed -i 's|LIB_SUFFIX 64|LIB_SUFFIX ""|' CMakeLists.txt +sed -i "s|MODE=\"0664\", GROUP=\"plugdev\"|TAG+=\"uaccess\"|g" packages/99-libftdi.rules +mkdir -p build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_SKIP_BUILD_RPATH=ON \ +-DCMAKE_BUILD_TYPE=Release -DEXAMPLES=OFF -DFTDI_EEPROM=ON +make +make DESTDIR="$PKG" install +install -Dm644 "../packages/99-libftdi.rules" "$pkgdir/usr/lib/udev/rules.d/69-libftdi.rules" +# FS#45053 +cp -r ../examples/* "$PKG/usr/share/libftdi/examples" +} diff --git a/talimatname/genel/l/libgcrypt/talimat b/talimatname/genel/l/libgcrypt/talimat new file mode 100644 index 000000000..f9c451a6a --- /dev/null +++ b/talimatname/genel/l/libgcrypt/talimat @@ -0,0 +1,23 @@ +# Tanım: GnuPG'de kullanılan kodu temel alan genel amaçlı bir kripto kütüphanesi. +# URL: http://ftp.gnupg.org/gcrypt/libgcrypt/ +# Paketçi: milisarge +# Gerekler: libgpg-error + +isim=libgcrypt +surum=1.7.6 +devir=1 +kaynak=(ftp://ftp.gnupg.org/gcrypt/libgcrypt/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --disable-padlock-support \ + --enable-static=yes + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/sbin + rm -rf $PKG/usr/share/info +} diff --git a/talimatname/genel/l/libgd/talimat b/talimatname/genel/l/libgd/talimat new file mode 100644 index 000000000..59364feed --- /dev/null +++ b/talimatname/genel/l/libgd/talimat @@ -0,0 +1,21 @@ +# Tanım: Programcılar tarafından resimlerin dinamik oluşturulması için kütüphane +# URL: http://www.libgd.org/ +# Paketçi: milisarge +# Gerekler: xorg-fontconfig xorg-libxpm libwebp + +isim=libgd +surum=2.2.3 +devir=1 + +kaynak=("https://github.com/$isim/$isim/releases/download/gd-${surum}/$isim-${surum}.tar.xz") + + +derle() { + cd $isim-${surum} + ./configure \ + --prefix=/usr \ + --disable-rpath + make + make DESTDIR="${PKG}" install + install -D -m644 COPYING "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/l/libgda/0001-Convert-files-to-Unicode.patch b/talimatname/genel/l/libgda/0001-Convert-files-to-Unicode.patch new file mode 100644 index 000000000..67509f9a1 --- /dev/null +++ b/talimatname/genel/l/libgda/0001-Convert-files-to-Unicode.patch @@ -0,0 +1,83 @@ +From b611c805b3a2248e2f4f85f993f96c13a05b4730 Mon Sep 17 00:00:00 2001 +From: Emmanuele Bassi +Date: Mon, 17 Jul 2017 22:37:50 +0100 +Subject: Convert files to Unicode + +These header files have mixed encoding, and makes various tools choke on +them. +--- + libgda/gda-connection.h | 2 +- + libgda/sql-parser/gda-sql-statement.h | 2 +- + libgda/sql-parser/gda-statement-struct-delete.h | 2 +- + libgda/sql-parser/gda-statement-struct-unknown.h | 2 +- + libgda/sql-parser/gda-statement-struct-util.h | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/libgda/gda-connection.h b/libgda/gda-connection.h +index 94d1b27b5..19ca63fc3 100644 +--- a/libgda/gda-connection.h ++++ b/libgda/gda-connection.h +@@ -6,7 +6,7 @@ + * Copyright (C) 2002 - 2003 Gonzalo Paniagua Javier + * Copyright (C) 2003 Filip Van Raemdonck + * Copyright (C) 2004 - 2005 Alan Knowles +- * Copyright (C) 2004 Jos Mara Casanova Crespo ++ * Copyright (C) 2004 José María Casanova Crespo + * Copyright (C) 2005 - 2009 Bas Driessen + * Copyright (C) 2006 - 2008 Murray Cumming + * Copyright (C) 2007 Leonardo Boshell +diff --git a/libgda/sql-parser/gda-sql-statement.h b/libgda/sql-parser/gda-sql-statement.h +index 0ba1f9edc..8783ca8a1 100644 +--- a/libgda/sql-parser/gda-sql-statement.h ++++ b/libgda/sql-parser/gda-sql-statement.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * Copyright (C) 2011 Murray Cumming +diff --git a/libgda/sql-parser/gda-statement-struct-delete.h b/libgda/sql-parser/gda-statement-struct-delete.h +index cab8b9dad..2e51c5eae 100644 +--- a/libgda/sql-parser/gda-statement-struct-delete.h ++++ b/libgda/sql-parser/gda-statement-struct-delete.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2005 Dan Winship + * Copyright (C) 2005 - 2011 Vivien Malerba +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * Copyright (C) 2007 Armin Burgmeier + * Copyright (C) 2007 - 2009 Murray Cumming + * +diff --git a/libgda/sql-parser/gda-statement-struct-unknown.h b/libgda/sql-parser/gda-statement-struct-unknown.h +index 5c530d4d9..e0aaf945f 100644 +--- a/libgda/sql-parser/gda-statement-struct-unknown.h ++++ b/libgda/sql-parser/gda-statement-struct-unknown.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * Copyright (C) 2009 Murray Cumming +diff --git a/libgda/sql-parser/gda-statement-struct-util.h b/libgda/sql-parser/gda-statement-struct-util.h +index cd4596281..252d6edcc 100644 +--- a/libgda/sql-parser/gda-statement-struct-util.h ++++ b/libgda/sql-parser/gda-statement-struct-util.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2005 Dan Winship + * Copyright (C) 2005 - 2011 Vivien Malerba +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * Copyright (C) 2007 - 2009 Murray Cumming + * + * This library is free software; you can redistribute it and/or +-- +2.11.0 + diff --git a/talimatname/genel/l/libgda/fix-crash.diff b/talimatname/genel/l/libgda/fix-crash.diff new file mode 100644 index 000000000..ab665c700 --- /dev/null +++ b/talimatname/genel/l/libgda/fix-crash.diff @@ -0,0 +1,21 @@ +diff --git i/libgda-ui/data-entries/plugins/libmain.c w/libgda-ui/data-entries/plugins/libmain.c +index a30c2db2c3258111..1356488c8b0940f9 100644 +--- i/libgda-ui/data-entries/plugins/libmain.c ++++ w/libgda-ui/data-entries/plugins/libmain.c +@@ -39,15 +39,7 @@ + #endif + + #ifdef HAVE_GTKSOURCEVIEW +- #ifdef GTK_DISABLE_SINGLE_INCLUDES +- #undef GTK_DISABLE_SINGLE_INCLUDES +- #endif +- +- #include +- #include +- #include +- #include +- #include ++#include + #endif + + static GdauiDataEntry *plugin_entry_filesel_create_func (GdaDataHandler *handler, GType type, const gchar *options); diff --git a/talimatname/genel/l/libgda/glib-2.54-ftbfs-2.patch b/talimatname/genel/l/libgda/glib-2.54-ftbfs-2.patch new file mode 100644 index 000000000..1ca500f11 --- /dev/null +++ b/talimatname/genel/l/libgda/glib-2.54-ftbfs-2.patch @@ -0,0 +1,11 @@ +--- a/libgda-ui/gdaui-easy.h 2017-10-08 21:17:30.203226827 +0000 ++++ b/libgda-ui/gdaui-easy.h 2017-10-08 21:19:38.143497887 +0000 +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * diff --git a/talimatname/genel/l/libgda/glib-2.54-ftbfs.patch b/talimatname/genel/l/libgda/glib-2.54-ftbfs.patch new file mode 100644 index 000000000..f4831796c --- /dev/null +++ b/talimatname/genel/l/libgda/glib-2.54-ftbfs.patch @@ -0,0 +1,103 @@ +Description: Fix FTBFS with glib 2.54 + glib-mkenums now expects input files to be UTF-8, + fix the encoding of libgnomeui/gnome-scores.h +Author: Adrian Bunk + +--- libgda5-5.2.4.orig/libgda/gda-column.h ++++ libgda5-5.2.4/libgda/gda-column.h +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2005 - 2011 Vivien Malerba +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * Copyright (C) 2008 Przemysław Grzegorczyk + * + * This library is free software; you can redistribute it and/or +--- libgda5-5.2.4.orig/libgda/gda-data-model-extra.h ++++ libgda5-5.2.4/libgda/gda-data-model-extra.h +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2003 Rodrigo Moya + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 - 2003 Gonzalo Paniagua Javier +--- libgda5-5.2.4.orig/libgda/gda-data-model-iter-extra.h ++++ libgda5-5.2.4/libgda/gda-data-model-iter-extra.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * +--- libgda5-5.2.4.orig/libgda/gda-data-model.h ++++ libgda5-5.2.4/libgda/gda-data-model.h +@@ -4,7 +4,7 @@ + * Copyright (C) 2003 Laurent Sansonetti + * Copyright (C) 2005 Dan Winship + * Copyright (C) 2005 - 2012 Vivien Malerba +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * Copyright (C) 2007 Murray Cumming + * Copyright (C) 2011 Daniel Espinosa + * +--- libgda5-5.2.4.orig/libgda/gda-mutex.h ++++ libgda5-5.2.4/libgda/gda-mutex.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2013 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * +--- libgda5-5.2.4.orig/libgda/gda-row.h ++++ libgda5-5.2.4/libgda/gda-row.h +@@ -3,10 +3,10 @@ + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * Copyright (C) 2003 Laurent Sansonetti +- * Copyright (C) 2003 Xabier Rodrguez Calvar ++ * Copyright (C) 2003 Xabier Rodríguez Calvar + * Copyright (C) 2004 Paisa Seeluangsawat + * Copyright (C) 2005 Bas Driessen +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +--- libgda5-5.2.4.orig/libgda/gda-server-provider-private.h ++++ libgda5-5.2.4/libgda/gda-server-provider-private.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2005 Dan Winship + * Copyright (C) 2005 - 2011 Vivien Malerba +- * Copyright (C) 2005 lvaro Pea ++ * Copyright (C) 2005 Álvaro Peña + * Copyright (C) 2007 Murray Cumming + * + * This library is free software; you can redistribute it and/or +--- libgda5-5.2.4.orig/libgda/gda-util.h ++++ libgda5-5.2.4/libgda/gda-util.h +@@ -1,7 +1,7 @@ + /* + * Copyright (C) 2000 Reinhard Müller + * Copyright (C) 2000 - 2002 Rodrigo Moya +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2013 Vivien Malerba + * Copyright (C) 2002 Gonzalo Paniagua Javier + * Copyright (C) 2006 - 2007 Murray Cumming +--- libgda5-5.2.4.orig/libgda/libgda-global-variables.h ++++ libgda5-5.2.4/libgda/libgda-global-variables.h +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001 Carlos Perell Marn ++ * Copyright (C) 2001 Carlos Perelló Marín + * Copyright (C) 2001 - 2003 Rodrigo Moya + * Copyright (C) 2001 - 2011 Vivien Malerba + * Copyright (C) 2002 - 2003 Gonzalo Paniagua Javier diff --git a/talimatname/genel/l/libgda/java.patch b/talimatname/genel/l/libgda/java.patch new file mode 100644 index 000000000..7f12c5ad9 --- /dev/null +++ b/talimatname/genel/l/libgda/java.patch @@ -0,0 +1,36 @@ +diff -u -r libgda-5.2.4/getsp.java libgda-5.2.4-java/getsp.java +--- libgda-5.2.4/getsp.java 2014-02-05 21:28:20.000000000 +0100 ++++ libgda-5.2.4-java/getsp.java 2015-06-14 20:27:35.770310228 +0200 +@@ -25,7 +25,7 @@ + while (i<=j) { + if (i==j || lp.charAt(i)==ps) { + String lib=lp.substring(k,i); +- String suffix="/lib/amd64/server"; ++ String suffix="/lib/"+System.getProperty("os.arch")+"/server"; + k=i+1; + if (lib.compareTo(".")!=0) + r=(r==null)?(prefix+lib+suffix):(r+" "+prefix+lib+suffix); +@@ -50,7 +50,7 @@ + + if (r!=null) System.out.println(r); + } else if (args[0].compareTo("-ldpath")==0) { +- String lp1=System.getProperty("java.home")+"/lib/amd64/server"; ++ String lp1=System.getProperty("java.home")+"/lib/"+System.getProperty("os.arch")+"/server"; + String lp2=System.getProperty("java.library.path"); + System.out.println(lp1+":"+lp2); + } +diff -u -r libgda-5.2.4/m4/java.m4 libgda-5.2.4-java/m4/java.m4 +--- libgda-5.2.4/m4/java.m4 2015-06-13 10:36:25.000000000 +0200 ++++ libgda-5.2.4-java/m4/java.m4 2015-06-14 20:16:59.865581930 +0200 +@@ -175,6 +175,11 @@ + JTYPE="Sun JRE 1.7" + JFLAGS="-Xlint:unchecked -Xlint:deprecation" + ;; ++ JRE1.8.*) ++ try_java=true ++ JTYPE="Sun JRE 1.8" ++ JFLAGS="-Xlint:unchecked -Xlint:deprecation" ++ ;; + JREgcj-4*) + try_java=true + JTYPE="GCJ" diff --git a/talimatname/genel/l/libgda/talimat b/talimatname/genel/l/libgda/talimat new file mode 100644 index 000000000..176704bd3 --- /dev/null +++ b/talimatname/genel/l/libgda/talimat @@ -0,0 +1,44 @@ +# Tanım: Veritabanı erişim kitaplığı +# URL: https://git.gnome.org/browse/libgda +# Paketçi: Cihan_Alkan +# Gerekler: gnome-common json-glib gtksourceview3 libxslt python libsecret graphviz goocanvas iso-codes openjdk +# Grup: kütüphane + +isim=libgda +surum=5.2.4 +devir=1 +_apiver=5.0 + +kaynak=(https://git.gnome.org/browse/libgda/snapshot/LIBGDA_5_2_4.tar.xz + fix-crash.diff + java.patch + 0001-Convert-files-to-Unicode.patch + glib-2.54-ftbfs.patch + glib-2.54-ftbfs-2.patch) + +derle() { + mkdir providers + cd LIBGDA_5_2_4 + + patch -Np1 -i ../java.patch + patch -Np1 -i ../0001-Convert-files-to-Unicode.patch + patch -Np1 -i ../glib-2.54-ftbfs.patch + patch -Np1 -i ../glib-2.54-ftbfs-2.patch + patch -Np1 -i ../fix-crash.diff + /opt/jdk/bin/javac getsp.java + + find -name '*.py' -exec sed -i '1s/python$/&2/' {} + + + NOCONFIGURE=1 ./autogen.sh + + ./configure --prefix=/usr --sysconfdir=/etc --disable-static \ + --with-bdb=/usr --with-bdb-libdir-name=lib \ + --enable-json --enable-system-sqlite --enable-binreloc \ + --enable-gda-gi --enable-gdaui-gi \ + --enable-vala --enable-gdaui-vala VALA_API_VERSION=0.38 \ + --disable-crypto + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/l/libgdata/talimat b/talimatname/genel/l/libgdata/talimat new file mode 100644 index 000000000..44dd82616 --- /dev/null +++ b/talimatname/genel/l/libgdata/talimat @@ -0,0 +1,18 @@ +# Tanım: GData protokolünü kullanarak çevrimiçi hizmet API'lerine erişmek için kullanılan GLib tabanlı kitaplık. +# URL: http://live.gnome.org/libgdata +# Paketçi: yasarciv67@gmail.com +# Gerekler: liboauth libsoup json-glib gnome-online-accounts gcr uhttpmock gtk-doc + +isim=libgdata +surum=0.17.6 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/GNOME/sources/$isim/${surum%.*}/$isim-$surum.tar.xz ) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static --disable-tests + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libgdiplus/libgdiplus0-giflib5.patch b/talimatname/genel/l/libgdiplus/libgdiplus0-giflib5.patch new file mode 100644 index 000000000..5c7b46077 --- /dev/null +++ b/talimatname/genel/l/libgdiplus/libgdiplus0-giflib5.patch @@ -0,0 +1,136 @@ +--- + src/gifcodec.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 41 insertions(+), 9 deletions(-) + +Index: libgdiplus-2.10.9/src/gifcodec.c +=================================================================== +--- libgdiplus-2.10.9.orig/src/gifcodec.c ++++ libgdiplus-2.10.9/src/gifcodec.c +@@ -105,7 +112,7 @@ gdip_gif_inputfunc (GifFileType *gif, Gi + */ + + static int +-AddExtensionBlockMono(SavedImage *New, int Len, BYTE ExtData[]) ++AddExtensionBlockMono(SavedImage *New, int Len, int func, BYTE ExtData[]) + { + ExtensionBlock *ep; + +@@ -129,7 +136,7 @@ AddExtensionBlockMono(SavedImage *New, i + + if (ExtData) { + memcpy(ep->Bytes, ExtData, Len); +- ep->Function = New->Function; ++ ep->Function = func; + } + + return (GIF_OK); +@@ -232,20 +239,20 @@ DGifSlurpMono(GifFileType * GifFile, Sav + } + + case EXTENSION_RECORD_TYPE: { +- if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) == GIF_ERROR) { ++ int func; ++ if (DGifGetExtension(GifFile, &func, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); + } + + while (ExtData != NULL) { + /* Create an extension block with our data */ +- if (AddExtensionBlockMono(&temp_save, ExtData[0], &ExtData[1]) == GIF_ERROR) { ++ if (AddExtensionBlockMono(&temp_save, func, ExtData[0], &ExtData[1]) == GIF_ERROR) { + return (GIF_ERROR); + } + + if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); + } +- temp_save.Function = 0; + } + break; + } +@@ -303,12 +310,19 @@ gdip_load_gif_image (void *stream, GpIma + result = NULL; + loop_counter = FALSE; + ++#if GIFLIB_MAJOR < 5 + if (from_file) { + gif = DGifOpen(stream, &gdip_gif_fileinputfunc); + } else { + gif = DGifOpen (stream, &gdip_gif_inputfunc); + } +- ++#else ++ if (from_file) ++ gif = DGifOpen(stream, &gdip_gif_fileinputfunc, NULL); ++ else ++ gif = DGifOpen(stream, &gdip_gif_inputfunc, NULL); ++#endif ++ + if (gif == NULL) { + goto error; + } +@@ -581,7 +595,7 @@ gdip_load_gif_image (void *stream, GpIma + } + + FreeExtensionMono(&global_extensions); +- DGifCloseFile (gif); ++ DGifCloseFile (gif, NULL); + + *image = result; + return Ok; +@@ -597,7 +611,7 @@ error: + + if (gif != NULL) { + FreeExtensionMono (&global_extensions); +- DGifCloseFile (gif); ++ DGifCloseFile (gif, NULL); + } + + *image = NULL; +@@ -660,11 +674,22 @@ gdip_save_gif_image (void *stream, GpIma + return InvalidParameter; + } + ++#if GIFLIB_MAJOR < 5 + if (from_file) { + fp = EGifOpenFileName (stream, 0); + } else { + fp = EGifOpen (stream, gdip_gif_outputfunc); + } ++#else ++ if (from_file) ++ fp = EGifOpenFileName (stream, 0, NULL); ++ else ++ fp = EGifOpen (stream, gdip_gif_outputfunc, NULL); ++#define MakeMapObject GifMakeMapObject ++#define FreeMapObject GifFreeMapObject ++#define QuantizeBuffer GifQuantizeBuffer ++#define BitSize GifBitSize ++#endif + + if (!fp) { + return FileNotFound; +@@ -848,8 +873,15 @@ gdip_save_gif_image (void *stream, GpIma + Buffer[0] = 1; + Buffer[1] = ptr[0]; + Buffer[2] = ptr[1]; ++#if GIFLIB_MAJOR < 5 + EGifPutExtensionFirst(fp, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0"); + EGifPutExtensionLast(fp, APPLICATION_EXT_FUNC_CODE, 3, Buffer); ++#else ++ EGifPutExtensionLeader(fp, APPLICATION_EXT_FUNC_CODE); ++ EGifPutExtensionBlock(fp, 11, "NETSCAPE2.0"); ++ EGifPutExtensionBlock(fp, 3, Buffer); ++ EGifPutExtensionTrailer(fp); ++#endif + } + } + +@@ -923,7 +955,7 @@ gdip_save_gif_image (void *stream, GpIma + } + } + +- EGifCloseFile (fp); ++ EGifCloseFile (fp, NULL); + + return Ok; diff --git a/talimatname/genel/l/libgdiplus/talimat b/talimatname/genel/l/libgdiplus/talimat new file mode 100644 index 000000000..bda83359c --- /dev/null +++ b/talimatname/genel/l/libgdiplus/talimat @@ -0,0 +1,17 @@ +# Tanım: GDI + API'nin Açık Kaynak Uygulaması +# URL: http://www.mono-project.com/ +# Paketçi: milisarge +# Gerekler: libtiff cairo giflib glib libexif + +isim=libgdiplus +surum=4.2 +devir=1 +kaynak=(http://download.mono-project.com/sources/${isim}/${isim}-${surum}.tar.gz) + +derle() { + cd $isim-${surum} + sed -i -e 's/-L\${libjpeg_prefix}\/lib -ljpeg/-ljpeg/' configure + ./configure --prefix=/usr --with-cairo=system + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgee/talimat b/talimatname/genel/l/libgee/talimat new file mode 100644 index 000000000..03938b6e3 --- /dev/null +++ b/talimatname/genel/l/libgee/talimat @@ -0,0 +1,18 @@ +# Tanım: GObject koleksiyon kütüphanesi (eski) +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: glib gobject-introspection vala +# Grup: kütüphane + +isim=libgee +surum=0.20.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum:0:4}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgee06/talimat b/talimatname/genel/l/libgee06/talimat new file mode 100644 index 000000000..7ab590ca3 --- /dev/null +++ b/talimatname/genel/l/libgee06/talimat @@ -0,0 +1,18 @@ +# Tanım: GObject koleksiyon kütüphanesi (eski) +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: glib gobject-introspection vala + +isim=libgee06 +_isim=libgee +surum=0.6.8 +devir=1 + +kaynak=(http://ftp.acc.umu.se/pub/gnome/sources/$_name/${surum%.*}/$_name-$surum.tar.xz) + +derle() { +cd $_name-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgexiv2/talimat b/talimatname/genel/l/libgexiv2/talimat new file mode 100644 index 000000000..3ac66f9d0 --- /dev/null +++ b/talimatname/genel/l/libgexiv2/talimat @@ -0,0 +1,19 @@ +# Tanım: Exiv2 kitaplığının çevresindeki GObject tabanlı sarmalayıcı. +# URL: https://wiki.gnome.org/Projects/gexiv2 +# Paketçi: milisarge +# Gerekler: glib exiv2 gobject-introspection python-gobject +# Grup: kütüphane + +isim=libgexiv2 +surum=0.10.8 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/gexiv2/0.10/gexiv2-${surum}.tar.xz) + +derle() { +cd ${isim/lib/}-$surum + ./configure --prefix=/usr \ + --enable-introspection + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgig/talimat b/talimatname/genel/l/libgig/talimat new file mode 100644 index 000000000..5277adee3 --- /dev/null +++ b/talimatname/genel/l/libgig/talimat @@ -0,0 +1,20 @@ +# Tanım: Gigasampler ve DLS dosyalarını yüklemek için C ++ kütüphanesi +# URL: https://www.linuxsampler.org/libgig/ +# Paketçi: Cihan_Alkan +# Gerekler: libsndfile +# Grup: kütüphane + +isim=libgig +surum=4.1.0 +devir=1 +kaynak=(https://download.linuxsampler.org/packages/$isim-$surum.tar.bz2) + +derle() { + cd "${isim}-${surum}" + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + # add libgig library path to ld.so.conf.d (thanks to libgig-svn for the heads-up) + install -d "${PKG}/etc/ld.so.conf.d" + echo "/usr/lib/${isim}" > "${PKG}/etc/ld.so.conf.d/${isim}.conf" +} diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.0-fbsd.patch b/talimatname/genel/l/libgksu/libgksu-2.0.0-fbsd.patch new file mode 100644 index 000000000..5c007be5b --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.0-fbsd.patch @@ -0,0 +1,60 @@ +diff --exclude-from=/home/dang/.diffrc -up -ruN libgksu-2.0.0.orig/libgksu/libgksu.c libgksu-2.0.0/libgksu/libgksu.c +--- libgksu-2.0.0.orig/libgksu/libgksu.c 2006-09-14 22:35:51.000000000 -0400 ++++ libgksu-2.0.0/libgksu/libgksu.c 2006-12-12 11:28:01.000000000 -0500 +@@ -23,7 +23,12 @@ + #include + #include + #include ++#ifdef __FreeBSD__ ++#include ++#include ++#else + #include ++#endif + #include + #include + #include +diff --exclude-from=/home/dang/.diffrc -up -ruN libgksu-2.0.0.orig/libgksu/Makefile.am libgksu-2.0.0/libgksu/Makefile.am +--- libgksu-2.0.0.orig/libgksu/Makefile.am 2006-09-14 22:35:52.000000000 -0400 ++++ libgksu-2.0.0/libgksu/Makefile.am 2006-12-12 11:28:01.000000000 -0500 +@@ -30,6 +30,6 @@ gksu_run_helper_SOURCES = gksu-run-helpe + noinst_PROGRAMS = test-gksu + test_gksu_SOURCES = test-gksu.c + test_gksu_LDADD = libgksu2.la +-test_gksu_LDFLAGS = `pkg-config --libs glib-2.0` ++test_gksu_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` + + EXTRA_DIST = libgksu.ver +diff --exclude-from=/home/dang/.diffrc -up -ruN libgksu-2.0.0.orig/libgksu/Makefile.in libgksu-2.0.0/libgksu/Makefile.in +--- libgksu-2.0.0.orig/libgksu/Makefile.in 2006-09-23 15:37:44.000000000 -0400 ++++ libgksu-2.0.0/libgksu/Makefile.in 2006-12-12 11:30:09.000000000 -0500 +@@ -283,7 +283,7 @@ gksu_run_helper_LDFLAGS = `pkg-config -- + gksu_run_helper_SOURCES = gksu-run-helper.c + test_gksu_SOURCES = test-gksu.c + test_gksu_LDADD = libgksu2.la +-test_gksu_LDFLAGS = `pkg-config --libs glib-2.0` ++test_gksu_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` + EXTRA_DIST = libgksu.ver + all: all-am + +diff --exclude-from=/home/dang/.diffrc -up -ruN libgksu-2.0.0.orig/libgksuui/Makefile.am libgksu-2.0.0/libgksuui/Makefile.am +--- libgksu-2.0.0.orig/libgksuui/Makefile.am 2006-09-14 22:35:31.000000000 -0400 ++++ libgksu-2.0.0/libgksuui/Makefile.am 2006-12-12 11:28:01.000000000 -0500 +@@ -12,4 +12,4 @@ includedir = ${prefix}/include/$(PACKAGE + noinst_PROGRAMS = test-gksuui + test_gksuui_SOURCES = test-gksuui.c + test_gksuui_LDADD = libgksuui1.0.la +-test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0` ++test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` +diff --exclude-from=/home/dang/.diffrc -up -ruN libgksu-2.0.0.orig/libgksuui/Makefile.in libgksu-2.0.0/libgksuui/Makefile.in +--- libgksu-2.0.0.orig/libgksuui/Makefile.in 2006-09-23 15:37:44.000000000 -0400 ++++ libgksu-2.0.0/libgksuui/Makefile.in 2006-12-12 11:30:22.000000000 -0500 +@@ -250,7 +250,7 @@ libgksuui1_0_la_LDFLAGS = -Wl,-O1 `pkg-c + noinst_HEADERS = defines.h gksuui.h gksuui-dialog.h + test_gksuui_SOURCES = test-gksuui.c + test_gksuui_LDADD = libgksuui1.0.la +-test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0` ++test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` + all: all-am + + .SUFFIXES: diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.12-automake-1.11.2.patch b/talimatname/genel/l/libgksu/libgksu-2.0.12-automake-1.11.2.patch new file mode 100644 index 000000000..0f22166fb --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.12-automake-1.11.2.patch @@ -0,0 +1,25 @@ +Due to the following change, pkglib_PROGRAMS is invalid: + http://git.savannah.gnu.org/cgit/automake.git/commit/?id=9ca632642b006ac6b0fc4ce0ae5b34023faa8cbf + +https://savannah.nongnu.org/bugs/index.php?35241 +https://bugs.gentoo.org/show_bug.cgi?id=397411 + +--- + libgksu/Makefile.am | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libgksu/Makefile.am b/libgksu/Makefile.am +index 49362f9..3cb1090 100644 +--- a/libgksu/Makefile.am ++++ b/libgksu/Makefile.am +@@ -22,8 +22,8 @@ includedir = ${prefix}/include/${PACKAGE} + pkgconfigdir = ${libdir}/pkgconfig + pkgconfig_DATA = libgksu2.pc + +-pkglibdir = ${libdir}/${PACKAGE} +-pkglib_PROGRAMS = gksu-run-helper ++gksulibdir = ${libdir}/${PACKAGE} ++gksulib_PROGRAMS = gksu-run-helper + gksu_run_helper_LDADD = ${GLIB_LIBS} + gksu_run_helper_SOURCES = gksu-run-helper.c + diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.12-fix-make-3.82.patch b/talimatname/genel/l/libgksu/libgksu-2.0.12-fix-make-3.82.patch new file mode 100644 index 000000000..0a7c5f142 --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.12-fix-make-3.82.patch @@ -0,0 +1,19 @@ +--- Makefile.am-orig 2010-08-22 16:11:19.872577459 -0500 ++++ Makefile.am 2010-08-22 16:11:55.289599110 -0500 +@@ -17,11 +17,11 @@ + + if GCONF_SCHEMAS_INSTALL + install-data-local: +- if test -z "$(DESTDIR)" ; then \ +- for p in $(schemas_DATA) ; do \ +- GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$$p ; \ +- done \ +- fi ++ if test -z "$(DESTDIR)" ; then \ ++ for p in $(schemas_DATA) ; do \ ++ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$$p ; \ ++ done \ ++ fi + else + install-data-local: + endif diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.12-notests.patch b/talimatname/genel/l/libgksu/libgksu-2.0.12-notests.patch new file mode 100644 index 000000000..3787ef6bf --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.12-notests.patch @@ -0,0 +1,26 @@ +Index: libgksu-2.0.12/libgksu/Makefile.am +=================================================================== +--- libgksu-2.0.12.orig/libgksu/Makefile.am ++++ libgksu-2.0.12/libgksu/Makefile.am +@@ -27,7 +27,7 @@ pkglib_PROGRAMS = gksu-run-helper + gksu_run_helper_LDFLAGS = `pkg-config --libs glib-2.0` + gksu_run_helper_SOURCES = gksu-run-helper.c + +-noinst_PROGRAMS = test-gksu ++EXTRA_PROGRAMS = test-gksu + test_gksu_SOURCES = test-gksu.c + test_gksu_LDADD = libgksu2.la + test_gksu_LDFLAGS = `pkg-config --libs glib-2.0` +Index: libgksu-2.0.12/libgksuui/Makefile.am +=================================================================== +--- libgksu-2.0.12.orig/libgksuui/Makefile.am ++++ libgksu-2.0.12/libgksuui/Makefile.am +@@ -9,7 +9,7 @@ libgksuui1_0_la_LDFLAGS = -Wl,-O1 `pkg-c + noinst_HEADERS = defines.h gksuui.h gksuui-dialog.h + includedir = ${prefix}/include/$(PACKAGE) + +-noinst_PROGRAMS = test-gksuui ++EXTRA_PROGRAMS = test-gksuui + test_gksuui_SOURCES = test-gksuui.c + test_gksuui_LDADD = libgksuui1.0.la + test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0` diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.12-revert-forkpty.patch b/talimatname/genel/l/libgksu/libgksu-2.0.12-revert-forkpty.patch new file mode 100644 index 000000000..2c3a8cc78 --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.12-revert-forkpty.patch @@ -0,0 +1,359 @@ +diff --exclude-from=/home/dang/.scripts/diffrc -up -ruN libgksu-2.0.12.orig/libgksu/libgksu.c libgksu-2.0.12/libgksu/libgksu.c +--- libgksu-2.0.12.orig/libgksu/libgksu.c 2009-06-29 13:48:24.000000000 -0400 ++++ libgksu-2.0.12/libgksu/libgksu.c 2010-01-12 07:32:10.450657456 -0500 +@@ -1,7 +1,6 @@ + /* + * Gksu -- a library providing access to su functionality + * Copyright (C) 2004-2009 Gustavo Noronha Silva +- * Portions Copyright (C) 2009 VMware, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -56,9 +55,6 @@ + static void + gksu_context_launch_complete (GksuContext *context); + +-static void +-read_line (int fd, gchar *buffer, int n); +- + GType + gksu_error_get_type (void) + { +@@ -2009,8 +2005,6 @@ gksu_su_fuller (GksuContext *context, + for (i = 0 ; cmd[i] != NULL ; i++) + g_free (cmd[i]); + g_free(cmd); +- +- _exit(1); + } + else if (pid == -1) + { +@@ -2125,10 +2119,10 @@ gksu_su_fuller (GksuContext *context, + /* drop the \n echoed on password entry if su did request + a password */ + if (password_needed) +- read_line (fdpty, buf, 255); ++ read (fdpty, buf, 255); + if (context->debug) + fprintf (stderr, "DEBUG (run:post-after-pass) buf: -%s-\n", buf); +- read_line (fdpty, buf, 255); ++ read (fdpty, buf, 255); + if (context->debug) + fprintf (stderr, "DEBUG (run:post-after-pass) buf: -%s-\n", buf); + } +@@ -2142,9 +2136,7 @@ gksu_su_fuller (GksuContext *context, + { + int retval = 0; + +- /* Red Hat's su shows the full path to su in its error messages. */ +- if (!strncmp (buf, "su:", 3) || +- !strncmp (buf, "/bin/su:", 7)) ++ if (!strncmp (buf, "su", 2)) + { + gchar **strings; + +@@ -2155,11 +2147,7 @@ gksu_su_fuller (GksuContext *context, + } + + strings = g_strsplit (buf, ":", 2); +- +- /* Red Hat and Fedora use 'incorrect password'. */ +- if (strings[1] && +- (g_str_has_prefix(strings[1], " Authentication failure") || +- g_str_has_prefix(strings[1], " incorrect password"))) ++ if (strings[1] && !strncmp (strings[1], " Authentication failure", 23)) + { + if (used_gnome_keyring) + g_set_error (error, gksu_quark, +@@ -2473,12 +2461,6 @@ gksu_sudo_fuller (GksuContext *context, + { + char **cmd; + char buffer[256] = {0}; +- char *child_stderr = NULL; +- /* This command is used to gain a token */ +- char *const verifycmd[] = +- { +- "/usr/bin/sudo", "-p", "GNOME_SUDO_PASS", "-v", NULL +- }; + int argcount = 8; + int i, j; + +@@ -2489,8 +2471,9 @@ gksu_sudo_fuller (GksuContext *context, + + pid_t pid; + int status; +- FILE *fdfile = NULL; +- int fdpty = -1; ++ FILE *infile, *outfile; ++ int parent_pipe[2]; /* For talking to the parent */ ++ int child_pipe[2]; /* For talking to the child */ + + context->sudo_mode = TRUE; + +@@ -2565,10 +2548,6 @@ gksu_sudo_fuller (GksuContext *context, + cmd[argcount] = g_strdup("-S"); + argcount++; + +- /* Make sudo noninteractive (we should already have a token) */ +- cmd[argcount] = g_strdup("-n"); +- argcount++; +- + /* Make sudo use next arg as prompt */ + cmd[argcount] = g_strdup("-p"); + argcount++; +@@ -2647,21 +2626,26 @@ gksu_sudo_fuller (GksuContext *context, + fprintf (stderr, "cmd[%d]: %s\n", i, cmd[i]); + } + +- pid = forkpty(&fdpty, NULL, NULL, NULL); +- if (pid == 0) ++ if ((pipe(parent_pipe)) == -1) + { +- // Child +- setsid(); // make us session leader +- +- execv(verifycmd[0], verifycmd); ++ g_set_error (error, gksu_quark, GKSU_ERROR_PIPE, ++ _("Error creating pipe: %s"), ++ strerror(errno)); ++ sudo_reset_xauth (context, xauth, xauth_env); ++ return FALSE; ++ } + +- g_set_error (error, gksu_quark, GKSU_ERROR_EXEC, +- _("Failed to exec new process: %s"), ++ if ((pipe(child_pipe)) == -1) ++ { ++ g_set_error (error, gksu_quark, GKSU_ERROR_PIPE, ++ _("Error creating pipe: %s"), + strerror(errno)); + sudo_reset_xauth (context, xauth, xauth_env); + return FALSE; + } +- else if (pid == -1) ++ ++ pid = fork(); ++ if (pid == -1) + { + g_set_error (error, gksu_quark, GKSU_ERROR_FORK, + _("Failed to fork new process: %s"), +@@ -2669,26 +2653,56 @@ gksu_sudo_fuller (GksuContext *context, + sudo_reset_xauth (context, xauth, xauth_env); + return FALSE; + } ++ else if (pid == 0) ++ { ++ // Child ++ setsid(); // make us session leader ++ close(child_pipe[1]); ++ dup2(child_pipe[0], STDIN_FILENO); ++ dup2(parent_pipe[1], STDERR_FILENO); + ++ execv(cmd[0], cmd); ++ ++ g_set_error (error, gksu_quark, GKSU_ERROR_EXEC, ++ _("Failed to exec new process: %s"), ++ strerror(errno)); ++ sudo_reset_xauth (context, xauth, xauth_env); ++ return FALSE; ++ } + else + { + gint counter = 0; + gchar *cmdline = NULL; +- struct termios tio; + + // Parent +- fdfile = fdopen(fdpty, "w+"); ++ close(parent_pipe[1]); + +- /* make sure we notice that ECHO is turned off, if it gets +- turned off */ +- tcgetattr (fdpty, &tio); +- for (counter = 0; (tio.c_lflag & ECHO) && counter < 15; counter++) +- { +- usleep (1000); +- tcgetattr (fdpty, &tio); +- } ++ infile = fdopen(parent_pipe[0], "r"); ++ if (!infile) ++ { ++ g_set_error (error, gksu_quark, GKSU_ERROR_PIPE, ++ _("Error opening pipe: %s"), ++ strerror(errno)); ++ sudo_reset_xauth (context, xauth, xauth_env); ++ return FALSE; ++ } + +- fcntl (fdpty, F_SETFL, O_NONBLOCK); ++ outfile = fdopen(child_pipe[1], "w"); ++ if (!outfile) ++ { ++ g_set_error (error, gksu_quark, GKSU_ERROR_PIPE, ++ _("Error opening pipe: %s"), ++ strerror(errno)); ++ sudo_reset_xauth (context, xauth, xauth_env); ++ return FALSE; ++ } ++ ++ /* ++ we are expecting to receive a GNOME_SUDO_PASS ++ if we don't there are two possibilities: an error ++ or a password is not needed ++ */ ++ fcntl (parent_pipe[0], F_SETFL, O_NONBLOCK); + + { /* no matter if we can read, since we're using + O_NONBLOCK; this is just to avoid the prompt +@@ -2697,11 +2711,11 @@ gksu_sudo_fuller (GksuContext *context, + struct timeval tv; + + FD_ZERO(&rfds); +- FD_SET(fdpty, &rfds); ++ FD_SET(parent_pipe[0], &rfds); + tv.tv_sec = 1; + tv.tv_usec = 0; + +- select (fdpty + 1, &rfds, NULL, NULL, &tv); ++ select (parent_pipe[0] + 1, &rfds, NULL, NULL, &tv); + } + + /* Try hard to find the prompt; it may happen that we're +@@ -2713,7 +2727,7 @@ gksu_sudo_fuller (GksuContext *context, + if (strncmp (buffer, "GNOME_SUDO_PASS", 15) == 0) + break; + +- read_line (fdpty, buffer, 256); ++ read_line (parent_pipe[0], buffer, 256); + + if (context->debug) + fprintf (stderr, "buffer: -%s-\n", buffer); +@@ -2747,17 +2761,18 @@ gksu_sudo_fuller (GksuContext *context, + + usleep (1000); + +- write (fdpty, password, strlen(password) + 1); +- write (fdpty, "\n", 1); ++ fprintf (outfile, "%s\n", password); ++ fclose (outfile); + + nullify_password (password); + +- fcntl(fdpty, F_SETFL, fcntl(fdpty, F_GETFL) & ~O_NONBLOCK); ++ /* turn NONBLOCK off */ ++ fcntl(parent_pipe[0], F_SETFL, fcntl(parent_pipe[0], F_GETFL) & ~O_NONBLOCK); + /* ignore the first newline that comes right after sudo receives + the password */ +- fgets (buffer, 255, fdfile); +- /* this is the status we are interested in */ +- fgets (buffer, 255, fdfile); ++ fgets (buffer, 255, infile); ++ /* this is the status we are interessted in */ ++ fgets (buffer, 255, infile); + } + else + { +@@ -2766,7 +2781,7 @@ gksu_sudo_fuller (GksuContext *context, + fprintf (stderr, "No password prompt found; we'll assume we don't need a password.\n"); + + /* turn NONBLOCK off, also if have no prompt */ +- fcntl(fdpty, F_SETFL, fcntl(fdpty, F_GETFL) & ~O_NONBLOCK); ++ fcntl(parent_pipe[0], F_SETFL, fcntl(parent_pipe[0], F_GETFL) & ~O_NONBLOCK); + + should_display = gconf_client_get_bool (context->gconf_client, + BASE_PATH "display-no-pass-info", NULL); +@@ -2785,9 +2800,14 @@ gksu_sudo_fuller (GksuContext *context, + fprintf (stderr, "%s", buffer); + } + +- if (g_str_has_prefix (buffer, "Sorry, try again.")) ++ if (!strcmp (buffer, "Sorry, try again.\n")) + g_set_error (error, gksu_quark, GKSU_ERROR_WRONGPASS, + _("Wrong password.")); ++ else if (!strncmp (buffer, "Sorry, user ", 12)) ++ g_set_error (error, gksu_quark, GKSU_ERROR_NOT_ALLOWED, ++ _("The underlying authorization mechanism (sudo) " ++ "does not allow you to run this program. Contact " ++ "the system administrator.")); + else + { + gchar *haystack = buffer; +@@ -2805,10 +2825,6 @@ gksu_sudo_fuller (GksuContext *context, + } + } + +- /* If we have an error, let's just stop sudo right there. */ +- if (error) +- close(fdpty); +- + cmdline = g_strdup("sudo"); + /* wait for the child process to end or become something other + than sudo */ +@@ -2825,23 +2841,17 @@ gksu_sudo_fuller (GksuContext *context, + if (context->sn_context) + gksu_context_launch_complete (context); + ++ while (read (parent_pipe[0], buffer, 255) > 0) ++ { ++ fprintf (stderr, "%s", buffer); ++ bzero(buffer, 256); ++ } ++ + /* if the process is still active waitpid() on it */ + if (pid_exited != pid) + waitpid(pid, &status, 0); + sudo_reset_xauth (context, xauth, xauth_env); + +- /* +- * Did token acquisition succeed? If so, spawn sudo in +- * non-interactive mode. It should either succeed or die +- * immediately if you're not allowed to run the command. +- */ +- if (WEXITSTATUS(status) == 0) +- { +- g_spawn_sync(NULL, cmd, NULL, 0, NULL, NULL, +- NULL, &child_stderr, &status, +- error); +- } +- + if (exit_status) + { + if (WIFEXITED(status)) { +@@ -2853,13 +2863,6 @@ gksu_sudo_fuller (GksuContext *context, + + if (WEXITSTATUS(status)) + { +- if (g_str_has_prefix(child_stderr, "Sorry, user ")) +- { +- g_set_error (error, gksu_quark, GKSU_ERROR_NOT_ALLOWED, +- _("The underlying authorization mechanism (sudo) " +- "does not allow you to run this program. Contact " +- "the system administrator.")); +- } + if(cmdline) + { + /* sudo already exec()ed something else, don't report +@@ -2868,7 +2871,6 @@ gksu_sudo_fuller (GksuContext *context, + if (!g_str_has_suffix (cmdline, "sudo")) + { + g_free (cmdline); +- g_free (child_stderr); + return FALSE; + } + g_free (cmdline); +@@ -2881,11 +2883,11 @@ gksu_sudo_fuller (GksuContext *context, + } + } + +- fprintf(stderr, child_stderr); +- g_free(child_stderr); +- + /* if error is set we have found an error condition */ +- return (error == NULL); ++ if (error) ++ return FALSE; ++ ++ return TRUE; + } + + /** diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.7-libs.patch b/talimatname/genel/l/libgksu/libgksu-2.0.7-libs.patch new file mode 100644 index 000000000..b9fb77f27 --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.7-libs.patch @@ -0,0 +1,76 @@ +# https://savannah.nongnu.org/bugs/?25362 +# https://bugs.gentoo.org/show_bug.cgi?id=226837 +diff -Nura a/configure.ac b/configure.ac +--- a/configure.ac 2009-01-19 22:15:30.000000000 +0100 ++++ b/configure.ac 2009-01-19 22:18:10.000000000 +0100 +@@ -43,6 +43,9 @@ + PKG_CHECK_MODULES(LIBGKSU, [gtk+-2.0 >= 2.4.0, gconf-2.0, libstartup-notification-1.0, gnome-keyring-1, libgtop-2.0]) + PKG_CHECK_MODULES(GKSU_PROPERTIES, [gtk+-2.0 >= 2.4.0, gconf-2.0, libglade-2.0]) + ++PKG_CHECK_MODULES(GLIB, [glib-2.0 gthread-2.0]) ++PKG_CHECK_MODULES(GTK, [gtk+-2.0 gconf-2.0]) ++ + # Checks for library functions. + ALL_LINGUAS="ca cs da de es eu fr hu it ko lt pl pt_BR ro ru sk sv nb nl zh_CN" + +diff -Nura a/gksu-properties/Makefile.am b/gksu-properties/Makefile.am +--- a/gksu-properties/Makefile.am 2009-01-19 22:15:59.000000000 +0100 ++++ b/gksu-properties/Makefile.am 2009-01-19 22:19:13.000000000 +0100 +@@ -3,7 +3,7 @@ + AM_CPPFLAGS = -DLOCALEDIR=\"$(datadir)/locale\" -DDATA_DIR=\"$(datadir)\" -DPREFIX=\"$(prefix)\" + + bin_PROGRAMS = gksu-properties +-gksu_properties_LDFLAGS = ${GKSU_PROPERTIES_LIBS} ++gksu_properties_LDADD = ${GKSU_PROPERTIES_LIBS} + gksu_properties_SOURCES = gksu-properties.c + + gladedir = ${prefix}/share/${PACKAGE} +diff -Nura a/libgksu/Makefile.am b/libgksu/Makefile.am +--- a/libgksu/Makefile.am 2009-01-19 22:15:59.000000000 +0100 ++++ b/libgksu/Makefile.am 2009-01-19 22:18:25.000000000 +0100 +@@ -8,8 +8,8 @@ + # major -> breaks backward compatibility (changes to existing ABI) + # minor -> keeps compatibility (additions to the API) + # micro -> no change to the API/ABI +-libgksu2_la_LIBADD = ../libgksuui/libgksuui1.0.la +-libgksu2_la_LDFLAGS = -version-info 0:2:0 -Wl,-O1 -lutil ${LIBGKSU_LIBS} ++libgksu2_la_LIBADD = ../libgksuui/libgksuui1.0.la -lutil ${LIBGKSU_LIBS} ++libgksu2_la_LDFLAGS = -version-info 0:2:0 -Wl,-O1 + if USE_VERSION_SCRIPT + libgksu2_la_LDFLAGS += -Wl,--version-script=libgksu.ver + endif +@@ -24,12 +24,11 @@ + + pkglibdir = ${libdir}/${PACKAGE} + pkglib_PROGRAMS = gksu-run-helper +-gksu_run_helper_LDFLAGS = `pkg-config --libs glib-2.0` ++gksu_run_helper_LDADD = ${GLIB_LIBS} + gksu_run_helper_SOURCES = gksu-run-helper.c + + noinst_PROGRAMS = test-gksu + test_gksu_SOURCES = test-gksu.c +-test_gksu_LDADD = libgksu2.la +-test_gksu_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` ++test_gksu_LDADD = libgksu2.la ${GLIB_LIBS} + + EXTRA_DIST = libgksu.ver +diff -Nura a/libgksuui/Makefile.am b/libgksuui/Makefile.am +--- a/libgksuui/Makefile.am 2009-01-19 22:15:59.000000000 +0100 ++++ b/libgksuui/Makefile.am 2009-01-19 22:18:54.000000000 +0100 +@@ -4,12 +4,13 @@ + + noinst_LTLIBRARIES = libgksuui1.0.la + libgksuui1_0_la_SOURCES = gksuui-dialog.c +-libgksuui1_0_la_LDFLAGS = -Wl,-O1 `pkg-config --libs gtk+-2.0 gconf-2.0` ++libgksuui1_0_la_LDFLAGS = -Wl,-O1 ++libgksuui1_0_la_LIBADD = ${GTK_LIBS} + + noinst_HEADERS = defines.h gksuui.h gksuui-dialog.h + includedir = ${prefix}/include/$(PACKAGE) + + noinst_PROGRAMS = test-gksuui + test_gksuui_SOURCES = test-gksuui.c +-test_gksuui_LDADD = libgksuui1.0.la +-test_gksuui_LDFLAGS = `pkg-config --libs glib-2.0 gthread-2.0` ++test_gksuui_LDADD = libgksuui1.0.la ${GLIB_LIBS} ++ diff --git a/talimatname/genel/l/libgksu/libgksu-2.0.7-polinguas.patch b/talimatname/genel/l/libgksu/libgksu-2.0.7-polinguas.patch new file mode 100644 index 000000000..e423af16b --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-2.0.7-polinguas.patch @@ -0,0 +1,40 @@ +# https://savannah.nongnu.org/bugs/?25360 +diff -Nura a/configure.ac b/configure.ac +--- a/configure.ac 2009-01-19 21:50:57.000000000 +0100 ++++ b/configure.ac 2009-01-19 21:53:21.000000000 +0100 +@@ -50,7 +50,7 @@ + GETTEXT_PACKAGE=AC_PACKAGE_NAME + AC_SUBST(GETTEXT_PACKAGE) + +-IT_PROG_INTLTOOL ++IT_PROG_INTLTOOL([0.35.5]) + AM_GLIB_GNU_GETTEXT + + ################################################## +diff -Nura a/po/LINGUAS b/po/LINGUAS +--- a/po/LINGUAS 1970-01-01 01:00:00.000000000 +0100 ++++ b/po/LINGUAS 2009-01-19 21:54:24.000000000 +0100 +@@ -0,0 +1,23 @@ ++# please keep this list sorted alphabetically ++# http://live.gnome.org/GnomeGoals/PoLinguas ++# ++ca ++cs ++da ++de ++es ++eu ++fr ++hu ++it ++ko ++lt ++pl ++pt_BR ++ro ++ru ++sk ++sv ++nb ++nl ++zh_CN diff --git a/talimatname/genel/l/libgksu/libgksu-tr.po b/talimatname/genel/l/libgksu/libgksu-tr.po new file mode 100644 index 000000000..c5f6dba90 --- /dev/null +++ b/talimatname/genel/l/libgksu/libgksu-tr.po @@ -0,0 +1,682 @@ +# Turkish translation of GKsu. +# Copyright (C) 2003 Free Software Foundation, Inc. +# This file is distributed under the same license as the GKsu package. +# Sebastian Heinlein , 2003. +# +# +msgid "" +msgstr "" +"Project-Id-Version: GKsu 0.9.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-02-03 12:27-0200\n" +"PO-Revision-Date: 2003-11-18 21:19-0200\n" +"Last-Translator: Cihan Alkan \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../libgksu/libgksu.c:119 +#, c-format +msgid "Not using locking for read only lock file %s" +msgstr "Sadece okunabilir kilit dosyası %s için kilitleme kullanılmıyor" + +#: ../libgksu/libgksu.c:139 +#, c-format +msgid "Not using locking for nfs mounted lock file %s" +msgstr "Nfs ye bağlı kilit dosyası %s için kilitleme kullanılmıyor" + +#: ../libgksu/libgksu.c:495 +#, fuzzy +msgid "" +"Could not grab your mouse.\n" +"\n" +"A malicious client may be eavesdropping on your session or you may have just " +"clicked a menu or some application just decided to get focus.\n" +"\n" +"Try again." +msgstr "" +"Farenizi alamadı.\n" +"\n" +"A malicious client may be eavesdropping on your session or you may have just " +"clicked a menu or some application just decided to get focus.\n" +"\n" +"Tekrar deneyin." + +#: ../libgksu/libgksu.c:507 +#, fuzzy +msgid "" +"Could not grab your keyboard.\n" +"\n" +"A malicious client may be eavesdropping on your session or you may have just " +"clicked a menu or some application just decided to get focus.\n" +"\n" +"Try again." +msgstr "" +"Klavyenizi alamadı.\n" +"\n" +"A malicious client may be eavesdropping on your session or you may have just " +"clicked a menu or some application just decided to get focus.\n" +"\n" +"Tekrar deneyin." + +#: ../libgksu/libgksu.c:855 +#, c-format +msgid "" +"Enter your password to perform administrative tasks\n" +"\n" +"The application '%s' lets you modify essential parts of your system." +msgstr "" + +#: ../libgksu/libgksu.c:862 +#, fuzzy, c-format +msgid "" +"Enter your password to run the application '%s' as user %s" +msgstr "" +"'%s' uygulamasını kullanıcı %s olarak çalıştırmak için şifrenizi girin" + +#: ../libgksu/libgksu.c:870 +#, c-format +msgid "" +"Enter the administrative password\n" +"\n" +"The application '%s' lets you modify essential parts of your system." +msgstr "" +"Yönetici Şifresini Girin\n" +"\n" +"'%s' uygulaması, sisteminizin önemli kısımlarını değiştirmenize izin verir." + +#: ../libgksu/libgksu.c:877 +#, fuzzy, c-format +msgid "Enter the password of %s to run the application '%s'" +msgstr "'%s' uygulamasını çalıştırmak için %s şifresini girin" + + +#: ../libgksu/libgksu.c:908 +msgid "Password prompt canceled." +msgstr "" + +#: ../libgksu/libgksu.c:978 +#, fuzzy, c-format +msgid "" +"Granted permissions without asking for password\n" +"\n" +"The '%s' program was started with the privileges of the %s user without the " +"need to ask for a password, due to your system's authentication mechanism " +"setup.\n" +"\n" +"It is possible that you are being allowed to run specific programs as user %" +"s without the need for a password, or that the password is cached.\n" +"\n" +"This is not a problem report; it's simply a notification to make sure you " +"are aware of this." +msgstr "" +"Parola istemeksizin giriş izinleri verildi\n" +"\n" +"The '%s' program was started with the privileges of the %s user without the " +"need to ask for a password, due to your system's authentication mechanism " +"setup.\n" +"\n" +"It is possible that you are being allowed to run specific programs as user %" +"s without the need for a password, or that the password is cached.\n" +"\n" +"Bu bir sorun raporu değildir; Sadece size bilgi verilmektedir. " + + +#: ../libgksu/libgksu.c:1002 +msgid "Do _not display this message again" +msgstr "Bu mesajı tekrar gösterme" + +#: ../libgksu/libgksu.c:1022 +msgid "" +"Would you like your screen to be \"grabbed\"\n" +"while you enter the password?\n" +"\n" +"This means all applications will be paused to avoid\n" +"the eavesdropping of your password by a a malicious\n" +"application while you type it." +msgstr "" + +#: ../libgksu/libgksu.c:1299 +msgid "Granting Rights" +msgstr "Yetki Sağlama" + +#: ../libgksu/libgksu.c:1854 +msgid "gksu_run needs a command to be run, none was provided." +msgstr "gksu_run'un çalıştırılması için bir komuta ihtiyacı var, hiçbiri sağlanmadı." + +#: ../libgksu/libgksu.c:1865 +msgid "The gksu-run-helper command was not found or is not executable." +msgstr "gksu-run-helper komutu bulunamadı veya çalıştırılamaz." + +#: ../libgksu/libgksu.c:1873 ../libgksu/libgksu.c:2379 +msgid "Unable to copy the user's Xauthorization file." +msgstr "Kullanıcının Xauthorization dosyası kopyalanamadı." + +#: ../libgksu/libgksu.c:1919 ../libgksu/libgksu.c:2513 +#, fuzzy, c-format +msgid "Failed to fork new process: %s" +msgstr "%s/bin/gksu: %s konnte nicht ausgeführt werden" + +#: ../libgksu/libgksu.c:2050 +#, fuzzy +msgid "Wrong password got from keyring." +msgstr "Anahtarlıkta yanlış şifre var." + +#: ../libgksu/libgksu.c:2054 ../libgksu/libgksu.c:2664 +msgid "Wrong password." +msgstr "Yanlış Şifre." + +#: ../libgksu/libgksu.c:2109 ../libgksu/libgksu.c:2123 +#, c-format +msgid "" +"Failed to communicate with gksu-run-helper.\n" +"\n" +"Received:\n" +" %s\n" +"While expecting:\n" +" %s" +msgstr "" + +#: ../libgksu/libgksu.c:2115 +#, c-format +msgid "" +"Failed to communicate with gksu-run-helper.\n" +"\n" +"Received bad string while expecting:\n" +" %s" +msgstr "" + +#: ../libgksu/libgksu.c:2191 +#, c-format +msgid "Could not read from the pipe with the child: %s" +msgstr "" + +#: ../libgksu/libgksu.c:2238 +#, fuzzy, c-format +msgid "su terminated with %d status" +msgstr "Unterprozess endete mit dem Status %d" + +#: ../libgksu/libgksu.c:2353 +msgid "gksu_sudo_run needs a command to be run, none was provided." +msgstr "" + +#: ../libgksu/libgksu.c:2494 ../libgksu/libgksu.c:2503 +#, c-format +msgid "Error creating pipe: %s" +msgstr "" + +#: ../libgksu/libgksu.c:2529 +#, c-format +msgid "Failed to exec new process: %s" +msgstr "" + +#: ../libgksu/libgksu.c:2546 ../libgksu/libgksu.c:2556 +#, c-format +msgid "Error opening pipe: %s" +msgstr "" + +#: ../libgksu/libgksu.c:2614 +#, fuzzy +msgid "Password: " +msgstr "Parola:" + +#: ../libgksu/libgksu.c:2667 ../libgksu/libgksu.c:2681 +msgid "" +"The underlying authorization mechanism (sudo) does not allow you to run this " +"program. Contact the system administrator." +msgstr "" + +#: ../libgksu/libgksu.c:2734 +#, fuzzy, c-format +msgid "sudo terminated with %d status" +msgstr "sudo %d durumu ile sonlandı" + +#: ../libgksuui/gksuui-dialog.c:218 +#, fuzzy +msgid "Remember password" +msgstr "Parolayı hatırla" + +#: ../libgksuui/gksuui-dialog.c:235 +msgid "Save for this session" +msgstr "Bu oturum için kaydet" + +#: ../libgksuui/gksuui-dialog.c:240 +msgid "Save in the keyring" +msgstr "Anahtarlıkta saklayın" + +#. label +#: ../libgksuui/gksuui-dialog.c:334 +msgid "Type the root password.\n" +msgstr "" +"Root şifresini yazın.\n" + +#. entry label +#: ../libgksuui/gksuui-dialog.c:355 +#, fuzzy +msgid "Password:" +msgstr "Parola:" + +#. label capslock warning +#: ../libgksuui/gksuui-dialog.c:376 +msgid "You have capslock on" +msgstr "Capslock açık durumda" + +#: ../gksu-properties/gksu-properties.c:248 +msgid "Failed to load glade file; please check your installation." +msgstr "Glade dosyası yüklenemedi; lütfen kurulumunuzu kontrol edin." + +#: ../gksu-properties/gksu-properties.desktop.in.h:1 +msgid "Configure behavior of the privilege-granting tool" +msgstr "Ayrıcalık verici aracın davranışını yapılandırma" + +#: ../gksu-properties/gksu-properties.desktop.in.h:2 +msgid "Privilege granting" +msgstr "Ayrıcalık verme" + +#: ../gksu-properties/gksu-properties.glade.h:1 +msgid "Behavior" +msgstr "Davranış" + +#: ../gksu-properties/gksu-properties.glade.h:2 +msgid "Screen Grabbing" +msgstr "Ekran Yakalama" + +#: ../gksu-properties/gksu-properties.glade.h:3 +msgid "_Authentication mode:" +msgstr "Kimlik Doğrulama Modu" + +#: ../gksu-properties/gksu-properties.glade.h:4 +msgid "_Grab mode:" +msgstr "Yakalama Modu" + +#: ../gksu-properties/gksu-properties.glade.h:5 +msgid "" +"enable\n" +"disable\n" +"force enable\n" +"prompt\n" +msgstr "" + +#: ../gksu-properties/gksu-properties.glade.h:10 +msgid "gtk-close" +msgstr "" + +#: ../gksu-properties/gksu-properties.glade.h:11 +msgid "" +"su\n" +"sudo" +msgstr "" + +#: ../gksu.schemas.in.h:1 +msgid "Disable keyboard and mouse grab" +msgstr "Klavye veya fare yakalama kapalı" + +#: ../gksu.schemas.in.h:2 +msgid "Display information message when no password is needed" +msgstr "Şifre gerekli olmadığında bilgi mesajını gösterin" + +#: ../gksu.schemas.in.h:3 +msgid "Force keyboard and mouse grab" +msgstr "" + +#: ../gksu.schemas.in.h:4 +msgid "" +"Grab keyboard and mouse even if -g has been passed as argument on the " +"command line." +msgstr "" + +#: ../gksu.schemas.in.h:5 +msgid "Keyring to which passwords will be saved" +msgstr "" + +#: ../gksu.schemas.in.h:6 +msgid "Prompt for grabbing" +msgstr "" + +#: ../gksu.schemas.in.h:7 +msgid "Save password to gnome-keyring" +msgstr "" + +#: ../gksu.schemas.in.h:8 +msgid "Sudo mode" +msgstr "Sudo modu" + +#: ../gksu.schemas.in.h:9 +msgid "" +"The name of the keyring gksu should use. Usual values are \"session\", which " +"saves the password for the session, and \"default\", which saves the " +"password with no timeout." +msgstr "" + +#: ../gksu.schemas.in.h:10 +msgid "" +"This option determines whether a message dialog will be displayed informing " +"the user that the program is being run without the need of a password being " +"asked for some reason." +msgstr "" + +#: ../gksu.schemas.in.h:11 +msgid "" +"This option will make gksu prompt the user if he wants to have the screen " +"grabbed before entering the password. Notice that this only has an effect if " +"force-grab is disabled." +msgstr "" + +#: ../gksu.schemas.in.h:12 +msgid "" +"Whether sudo should be the default backend method. This method is otherwise " +"accessed though the -S switch or by running 'gksudo' instead of 'gksu'." +msgstr "" + +#: ../gksu.schemas.in.h:13 +msgid "" +"Whether the keyboard and mouse grabbing should be turned off. This will make " +"it possible for other X applications to listen to keyboard input events, " +"thus making it not possible to shield from malicious applications which may " +"be running." +msgstr "" + +#: ../gksu.schemas.in.h:14 +msgid "" +"gksu can save the password you type to the gnome-keyring so you'll not be " +"asked everytime" +msgstr "" + +#: ../libgksu/gksu-run-helper.c:149 +#, c-format +msgid "Failed to obtain xauth key: xauth binary not found at usual locations" +msgstr "" + +#, fuzzy +#~ msgid "Failed to obtain xauth key: %s" +#~ msgstr "%s/bin/gksu: %s konnte nicht ausgeführt werden" + +#, fuzzy +#~ msgid "Unable to run /bin/su: %s" +#~ msgstr "/bin/su: %s konnte nicht ausgeführt werden" + +#~ msgid "Continue" +#~ msgstr "Weiter" + +#~ msgid "Option not accepted for --disable-grab: %s\n" +#~ msgstr "Option wird für --disable-grab nicht akzeptiert: %s \n" + +#~ msgid "Option not accepted for --sudo-mode: %s\n" +#~ msgstr "Option wird für --sudo-mode nicht akzeptiert: %s\n" + +#~ msgid "Option not accepted for --prompt: %s\n" +#~ msgstr "Option wird für --prompt nicht akzeptiert: %s\n" + +#, fuzzy +#~ msgid "Please enter %s's password" +#~ msgstr "Bitte geben Sie das Passwort von %s ein" + +#~ msgid "Missing command to run." +#~ msgstr "Kein auszuführender Befehl angegeben." + +#, fuzzy +#~ msgid "" +#~ "Failed to run %s as user %s.\n" +#~ "\n" +#~ "%s" +#~ msgstr "" +#~ "Das Passwort von %s ist erforderlich zum Ausführen von:\n" +#~ "%s" + +#~ msgid "Advanced options" +#~ msgstr "Details zum Programmstart" + +#~ msgid "Options to use when changing user" +#~ msgstr "Optionen für den Benutzerwechsel" + +#~ msgid "_login shell" +#~ msgstr "Als _Login-Shell starten" + +#, fuzzy +#~ msgid "_preserve environment" +#~ msgstr "_Umgebungsvariablen erhalten" + +#~ msgid "Run program" +#~ msgstr "Programm ausführen" + +#~ msgid "Run:" +#~ msgstr "Auszuführender Befehl:" + +#~ msgid "As user:" +#~ msgstr "Als Benutzer:" + +#~ msgid "_Advanced" +#~ msgstr "_Details" + +#, fuzzy +#~ msgid "Always request a password" +#~ msgstr "Bitte geben Sie das Passwort von %s ein" + +#~ msgid "" +#~ "Opens a terminal as the root user, using gksu to ask for the password" +#~ msgstr "Root-Terminal" + +#~ msgid "" +#~ "Opens a dialog where you can type a command to be run as a given user" +#~ msgstr "Anwendung als anderer Benutzer ausführen" + +#, fuzzy +#~ msgid "" +#~ "GKsu version %s\n" +#~ "\n" +#~ "Usage: %s [-u ] [-k] [-l] \n" +#~ "\n" +#~ " --always-ask-password, -a\n" +#~ " Do not try to check if a password is really\n" +#~ " needed for running the command, or if there\n" +#~ " are other means of obtaining it: simply ask for it.\n" +#~ " --debug, -d\n" +#~ " Print information on the screen that might be\n" +#~ " useful for diagnosing and/or solving problems.\n" +#~ " --disable-grab, -g\n" +#~ " Disable the \"locking\" of the keyboard, mouse,\n" +#~ " and focus done by the program when asking for\n" +#~ " password.\n" +#~ " --icon , -i \n" +#~ " Replace the default window icon with the argument.\n" +#~ " --message , -m \n" +#~ " Replace the standard message shown to ask for\n" +#~ " password for the argument passed to the option.\n" +#~ " --print-pass, -p\n" +#~ " Ask gksu to print the password to stdout, just\n" +#~ " like ssh-askpass. Useful to use in scripts with\n" +#~ " programs that accept receiving the password on\n" +#~ " stdin.\n" +#~ " --prompt, -P\n" +#~ " Ask the user if they want to have their keyboard\n" +#~ " and mouse grabbed before doing so.\n" +#~ " --ssh-fwd, -s\n" +#~ " Strip the host part of the $DISPLAY variable, so that\n" +#~ " GKSu will work on SSH X11 Forwarding.\n" +#~ " --sudo-mode, -S\n" +#~ " Make GKSu use sudo instead of su, as if it had been\n" +#~ " run as \"gksudo\".\n" +#~ " --title , -t <title>\n" +#~ " Replace the default title with the argument.\n" +#~ " --user <user>, -u <user>\n" +#~ " Call <command> as the specified user.\n" +#~ " --desktop <file>, -D <file>\n" +#~ " Use a .desktop file to get the name of the application and the " +#~ "icon from.\n" +#~ "\n" +#~ " --preserve-env, -k\n" +#~ " Preserve the current environments, does not set $HOME\n" +#~ " nor $PATH, for example.\n" +#~ " --login, -l\n" +#~ " Make this a login shell. Beware this may cause\n" +#~ " problems with the Xauthority magic. Run xhost\n" +#~ " to allow the target user to open windows on your\n" +#~ " display!\n" +#~ "\n" +#~ "\n" +#~ msgstr "" +#~ "GKsu Version %s\n" +#~ "\n" +#~ "Anwendung: %s [-u <user>] [-k] [-l] <command>\n" +#~ "\n" +#~ " --debug, -d\n" +#~ " Informationen auf dem Bildschirm ausgeben die für eine\n" +#~ " Diagnose hilfreich sind und/oder helfen Probleme zu lösen.\n" +#~ " --disable-grab, -g\n" +#~ " Verhindere das sperren der Tastatur, der Maus,\n" +#~ " und Fokus des Programmes bei der Passwort\n" +#~ " abfrage.\n" +#~ " --icon <icon>, -i <icon>\n" +#~ " Ersetze das vorgegebene window icon mit dem Argument.\n" +#~ " --message <message>, -m <message>\n" +#~ " Ersetze die angezeigte standard Meldung der Passwort \n" +#~ " Abfrage mit dem Argument der Option <message>.\n" +#~ " --print-pass, -p\n" +#~ " Das Passwort auf stdout ausgeben, so wie\n" +#~ " ssh-askpass. Nützlich bei der Verwendung in\n" +#~ " Skripten mit Programmen die das Passwort auf\n" +#~ " stdin erwarten.\n" +#~ " --prompt, -P\n" +#~ " Den Benutzer vorab fragen ob Tastatur und\n" +#~ " Maus für alle anderen Anwendungen gesperrt werden sollen.\n" +#~ " --ssh-fwd, -s\n" +#~ " Entferne den host Teil der $DISPLAY Variablen, damit\n" +#~ " GKSu bei einem SSH X11 Forwarding funktioniert.\n" +#~ " --sudo-mode, -S\n" +#~ " GKSu soll sudo anstatt su verwenden, als wäre es\n" +#~ " \"gksudo\".\n" +#~ " --title <title>, -t <title>\n" +#~ " Ersetze den vorgegebenen Titel mit dem Argument\n" +#~ " <title>\n" +#~ " --user <user>, -u <user>\n" +#~ " Starte <command> als der angegebene Benutzer.\n" +#~ "\n" +#~ " --preserve-env, -k\n" +#~ " Erhalte die aktuellen Umgebungs Variablen, so wird\n" +#~ " z.B. weder $HOME noch $PATH neu gesetzt.\n" +#~ " --login, -l\n" +#~ " Sei eine login shell.\n" +#~ " Vorsicht, dies kann Probleme mit Xauthority magic\n" +#~ " ergeben. Der Benutzer <user> kann mit xhost\n" +#~ " so Fenster auf ihrer Anzeige öffnen!\n" +#~ "\n" +#~ "\n" + +#~ msgid "FATAL: File %s is not owned by root.\n" +#~ msgstr "FATAL: Datei %s ist nicht im Besitz von root.\n" + +#~ msgid "FATAL: File %s is not owned by group root.\n" +#~ msgstr "FATAL: Datei %s ist nicht im Besitz der Gruppe root.\n" + +#~ msgid "FATAL: File %s has wrong permissions, should be 0644.\n" +#~ msgstr "FATAL: Datei %s hat falsche Rechte, es sollte 0644 sein.\n" + +#~ msgid "FATAL: Could not open %s: %s.\n" +#~ msgstr "FATAL: Kann %s: %s nicht öffnen.\n" + +#, fuzzy +#~ msgid "" +#~ "<b>Please enter %s's password\n" +#~ "to run %s.</b>" +#~ msgstr "" +#~ "<b>Das Passwort von %s ist erforderlich zum Ausführen von:</b>\n" +#~ "<i>%s</i>" + +#~ msgid "" +#~ "libgksu: Failed to init the Gtk+ library, GKSu is not able to continue.\n" +#~ msgstr "" +#~ "libgksu: Die Gtk+-Bibliothek konnte nicht initialisiert werden, GKSu kann " +#~ "nicht fortfahren.\n" + +#~ msgid "" +#~ "<b>I need %s's password to run:</b>\n" +#~ "<i>%s</i>" +#~ msgstr "" +#~ "<b>Das Passwort von %s ist erforderlich zum Ausführen von:</b>\n" +#~ "<i>%s</i>" + +#~ msgid "Changing user..." +#~ msgstr "Benutzerwechsel" + +#, fuzzy +#~ msgid "" +#~ "<b>I need your password to run:</b>\n" +#~ "<i>%s</i>" +#~ msgstr "" +#~ "<b>Das Passwort von %s ist erforderlich zum Ausführen von:</b>\n" +#~ "<i>%s</i>" + +#~ msgid "" +#~ "GKsu version %s\n" +#~ "\n" +#~ "Usage: %s [-u <user>] [-k] [-l] <command>\n" +#~ "\n" +#~ " --user <user>, -u <user>\n" +#~ " Calls <command> as the specified user\n" +#~ " --message <message>, -m <message>\n" +#~ " Replaces the standard message shown to ask for\n" +#~ " password for the argument passed to the option\n" +#~ " --title <title>, -t <title>\n" +#~ " Replaces the default title with the argument\n" +#~ " --icon <icon>, -i <icon>\n" +#~ " Replaces the default window icon with the argument\n" +#~ " --print-pass, -p\n" +#~ " Asks gksu to print the password to stdout, just\n" +#~ " like ssh-askpass. Useful to use in scripts with\n" +#~ " programs that accept receiving the passowrd on\n" +#~ " stdin.\n" +#~ " --disable-grab, -g\n" +#~ " Disables the \"locking\" of the keyboard, mouse,\n" +#~ " and focus done by the program when asking for\n" +#~ " password\n" +#~ " --ssh-fwd, -s\n" +#~ " Strip the host part of the $DISPLAY variable, so that\n" +#~ " GKSu will work on SSH X11 Forwarding.\n" +#~ "\n" +#~ " --login, -l\n" +#~ " Makes this a login shell. Beware this may cause\n" +#~ " problems with the Xauthority magic. Run xhost\n" +#~ " to allow the target user to open windows on your\n" +#~ " display!\n" +#~ " --preserv-env, -k\n" +#~ " Preserve the current environments, does not set $HOME\n" +#~ " nor $PATH, for example.\n" +#~ "\n" +#~ "\n" +#~ msgstr "" +#~ "GKsu Version %s\n" +#~ "Benutzung: %s [-u BENUTZER] [-k] [-l] BEFEHL\n" +#~ " --user BENUTZER\n" +#~ " Führt den angegebenen BEFEHL als BENUTZER aus\n" +#~ " --message NACHRICHT, -m NACHRICHT\n" +#~ " Verwendet NACHRICHT und nicht den Standardtext bei der\n" +#~ " Frage nach dem Passwort\n" +#~ " --title TITEL, -t TITEL\n" +#~ " Ersetzt den Standard-Fenstertitel durch TITEL\n" +#~ " --icon ICON, -i ICON\n" +#~ " Ersetzt das Standard-Icon durch ICON\n" +#~ " --print-pass, -p\n" +#~ " Ausgabe des Passworts nach stdout. Dies verhält sich wie bei ssh\n" +#~ " askpass: Dadurch ist es möglich anderen Programmen das Passwort\n" +#~ " über stdin in Skripten zu übermitteln\n" +#~ " --disable-grab, -g\n" +#~ " Deaktiviert das Sperren von Tastatur, Maus und Fokus bei\n" +#~ " der Passworteingabe\n" +#~ " --ssh-fwd, -s\n" +#~ " Entfernt den Host-Teil aus der $DISPLAY-Variable, so dass GKsu\n" +#~ " auch über SSH-X11-Forwaring verwendet werden kann\n" +#~ "\n" +#~ " --login, -l\n" +#~ " Startet als Login-Shell. Dies kann jedoch zu Problemen mit der\n" +#~ " Xauthority magic führen: Es muss erst mittels xhost dem jeweiligen\n" +#~ " Benutzer gestattet werden, Fenster auf dem Desktop zu öffnen\n" +#~ " --preserv-env, -k\n" +#~ " Erhält die momentanen Umgebungsvariablen: Es wird zum Beispiel\n" +#~ " keine $HOME- oder $PATH-Variable gesetzt\n" +#~ " \n" +#~ " \n" + +#~ msgid "Using %s as username...\n" +#~ msgstr "Verwende %s als Benutzername ...\n" diff --git a/talimatname/genel/l/libgksu/talimat b/talimatname/genel/l/libgksu/talimat new file mode 100644 index 000000000..b9e851889 --- /dev/null +++ b/talimatname/genel/l/libgksu/talimat @@ -0,0 +1,50 @@ +# Tanım: Gksu yetkilendirme kütüphanesi +# URL: http://www.nongnu.org/gksu/index.html +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool gtk-doc gconf gtk2 libgnome-keyring libgtop startup-notification libglade + +isim=libgksu +surum=2.0.12 +devir=2 +kaynak=(http://people.debian.org/~kov/gksu/$isim-$surum.tar.gz + libgksu-2.0.0-fbsd.patch + libgksu-2.0.12-automake-1.11.2.patch + libgksu-2.0.12-fix-make-3.82.patch + libgksu-2.0.12-notests.patch + libgksu-2.0.12-revert-forkpty.patch + libgksu-2.0.7-libs.patch + libgksu-2.0.7-polinguas.patch + libgksu-tr.po) + +derle() { + cd $isim-$surum + patch -Np1 -i "${SRC}/libgksu-2.0.0-fbsd.patch" + patch -Np1 -i "${SRC}/libgksu-2.0.7-libs.patch" + patch -Np1 -i "${SRC}/libgksu-2.0.7-polinguas.patch" + patch -Np1 -i "${SRC}/libgksu-2.0.12-revert-forkpty.patch" + patch -Np0 -i "${SRC}/libgksu-2.0.12-fix-make-3.82.patch" + patch -Np1 -i "${SRC}/libgksu-2.0.12-notests.patch" + patch -Np1 -i "${SRC}/libgksu-2.0.12-automake-1.11.2.patch" + + touch NEWS README + + intltoolize --force --copy --automake + autoreconf -fi + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-static \ + --disable-schemas-install + + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 DESTDIR="${PKG}" install + rm -f ${PKG}/usr/lib/*.a + install -m755 -d "${PKG}/usr/share/gconf/schemas" + gconf-merge-schema "${PKG}/usr/share/gconf/schemas/$isim.schemas" --domain libgksu ${PKG}/etc/gconf/schemas/*.schemas + rm -rf ${PKG}/etc/gconf + rm -rf ${PKG}/usr/share/gtk-doc + mkdir -p $PKG/usr/share/locale/tr/LC_MESSAGES + msgfmt $SRC/libgksu-tr.po -o $PKG/usr/share/locale/tr/LC_MESSAGES/libgksu.mo +} diff --git a/talimatname/genel/l/libglade/talimat b/talimatname/genel/l/libglade/talimat new file mode 100644 index 000000000..6437ae732 --- /dev/null +++ b/talimatname/genel/l/libglade/talimat @@ -0,0 +1,22 @@ +# Tanım: Glade arayüz dosyalarını bir programda çalışma zamanında yüklemenize izin verir. +# URL: http://www.jamesh.id.au/software/libglade/ +# Paketçi: milisarge +# Gerekler: gtk2 libxml2 + +isim=libglade +surum=2.6.4 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + sed -i '/DG_DISABLE_DEPRECATED/d' glade/Makefile.in + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} + diff --git a/talimatname/genel/l/libglademm/talimat b/talimatname/genel/l/libglademm/talimat new file mode 100644 index 000000000..04b5543f6 --- /dev/null +++ b/talimatname/genel/l/libglademm/talimat @@ -0,0 +1,21 @@ +# Tanım: Libglade için bir C ++ sarmalayıcı. +# URL: http://gtkmm.sourceforge.net/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: libglade gtkmm +# Grup: kütüphane + +isim=libglademm +surum=2.6.7 +devir=1 +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.bz2 +) + +derle() { + cd $isim-$surum + + CXXFLAGS+=' -std=c++11' + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/l/libgnome-keyring/talimat b/talimatname/genel/l/libgnome-keyring/talimat new file mode 100644 index 000000000..da1237a76 --- /dev/null +++ b/talimatname/genel/l/libgnome-keyring/talimat @@ -0,0 +1,17 @@ +# Tanım: GNOME anahtarlık istemci kitaplığı +# URL: http://www.gnome.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python dbus glib intltool libgcrypt gobject-introspection vala + +isim=libgnome-keyring +surum=3.12.0 +devir=1 + +kaynak=( http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgnomecanvas/talimat b/talimatname/genel/l/libgnomecanvas/talimat new file mode 100644 index 000000000..d9fb2cd19 --- /dev/null +++ b/talimatname/genel/l/libgnomecanvas/talimat @@ -0,0 +1,19 @@ +# Tanım: GNOME Canvas kitaplığı +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool libglade libart_lgpl + +isim=libgnomecanvas +surum=2.30.3 +devir=3.0 +kaynak=(https://download.gnome.org/sources/$isim/2.30/$isim-$surum.tar.bz2 +) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static \ + --enable-glade + make + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/l/libgnomecanvasmm/talimat b/talimatname/genel/l/libgnomecanvasmm/talimat new file mode 100644 index 000000000..593eb76af --- /dev/null +++ b/talimatname/genel/l/libgnomecanvasmm/talimat @@ -0,0 +1,21 @@ +# Tanım: Libgnomecanvas için bir C ++ sarmalayıcı. +# URL: http://www.gtkmm.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: pkg-config gtkmm libgnomecanvas + +isim=libgnomecanvasmm +surum=2.26.0 +devir=1 +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.bz2 +) + +derle() { + cd $isim-$surum + + CXXFLAGS+=' -std=c++11' + ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var + make + make DESTDIR=$PKG install + +} \ No newline at end of file diff --git a/talimatname/genel/l/libgnomekbd/libgnomekbd.kur-kos b/talimatname/genel/l/libgnomekbd/libgnomekbd.kur-kos new file mode 100644 index 000000000..e940cd93a --- /dev/null +++ b/talimatname/genel/l/libgnomekbd/libgnomekbd.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas > /dev/null 2>&1 diff --git a/talimatname/genel/l/libgnomekbd/talimat b/talimatname/genel/l/libgnomekbd/talimat new file mode 100644 index 000000000..309621a90 --- /dev/null +++ b/talimatname/genel/l/libgnomekbd/talimat @@ -0,0 +1,17 @@ +# Tanım: GNOME klavye kitaplığı +# URL: http://www.gnome.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk3 intltool xorg-libxkbfile xorg-libxklavier gobject-introspection + +isim=libgnomekbd +surum=3.22.0.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${version:0:4}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgovirt/talimat b/talimatname/genel/l/libgovirt/talimat new file mode 100644 index 000000000..d53893984 --- /dev/null +++ b/talimatname/genel/l/libgovirt/talimat @@ -0,0 +1,20 @@ +# Tanım: OVirt REST API'sına erişmek için GObject tabanlı kitaplık +# URL: https://github.com/MBach/Miam-Player +# Paketçi: Cihan Alkan +# Gerekler: librest gnome-common +# Grup: kütüphane + +isim=libgovirt +surum=0.3.4 +devir=1 +kaynak=(https://git.gnome.org/browse/libgovirt/snapshot/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + autoreconf -fvi + + ./autogen.sh --prefix=/usr --sysconfdir=/etc --localstatedir=/var + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/l/libgpg-error/talimat b/talimatname/genel/l/libgpg-error/talimat new file mode 100644 index 000000000..9357a22f6 --- /dev/null +++ b/talimatname/genel/l/libgpg-error/talimat @@ -0,0 +1,20 @@ +# Tanım: Tüm GnuPG bileşenleri için ortak hata değerlerini tanımlayan bir kitaplık içerir +# URL: http://www.gnupg.org +# Paketçi: milisarge +# Gerekler: + +isim=libgpg-error +surum=1.21 +devir=1 + +kaynak=(ftp://ftp.gnupg.org/gcrypt/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +install -v -m644 -D README \ +$PKG/usr/share/doc/$isim-$surum/README +rm -f $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libgphoto2/jpeg.patch b/talimatname/genel/l/libgphoto2/jpeg.patch new file mode 100644 index 000000000..34baeadd6 --- /dev/null +++ b/talimatname/genel/l/libgphoto2/jpeg.patch @@ -0,0 +1,92 @@ +From 0df14db3eda1b780a27b1c54bc8f251d15afebbc Mon Sep 17 00:00:00 2001 +From: Patrick Ohly <patrick.ohly@intel.com> +Date: Wed, 15 Jun 2016 10:33:24 +0200 +Subject: [PATCH] jpeg_memsrcdest: extend feature check + +libjpeg.h in OpenEmbedded master (from libjpeg-turbo 1.5.0) provides +these methods if "JPEG_LIB_VERSION >= 80 || +defined(MEM_SRCDST_SUPPORTED)". + +The support for the jpeg_mem functions was added even when not +emulating the libjpeg8 API, controlled via the MEM_SRCDST_SUPPORTED +define, so checking for the version alone is not enough anymore. + +See https://github.com/libjpeg-turbo/libjpeg-turbo/commit/ab70623eb29e09e67222be5b9e1ea320fe5aa0e9 + +This fixes errors about conflicting declarations (signed vs. unsigned +char). + +Signed-off-by: Patrick Ohly <patrick.ohly@intel.com> +--- + camlibs/ax203/jpeg_memsrcdest.c | 4 ++-- + camlibs/ax203/jpeg_memsrcdest.h | 4 ++++ + camlibs/jl2005c/jpeg_memsrcdest.c | 4 ++-- + camlibs/jl2005c/jpeg_memsrcdest.h | 4 ++++ + 4 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/camlibs/ax203/jpeg_memsrcdest.c b/camlibs/ax203/jpeg_memsrcdest.c +index 0ed83b1..5614573 100644 +--- a/camlibs/ax203/jpeg_memsrcdest.c ++++ b/camlibs/ax203/jpeg_memsrcdest.c +@@ -25,8 +25,8 @@ + #include "jpeg_memsrcdest.h" + + /* libjpeg8 and later come with their own (API compatible) memory source +- and dest */ +-#if JPEG_LIB_VERSION < 80 ++ and dest, and older versions may have it backported */ ++#if JPEG_LIB_VERSION < 80 && !defined(MEM_SRCDST_SUPPORTED) + + /* Expanded data source object for memory input */ + +diff --git a/camlibs/ax203/jpeg_memsrcdest.h b/camlibs/ax203/jpeg_memsrcdest.h +index e971182..b13bf3f 100644 +--- a/camlibs/ax203/jpeg_memsrcdest.h ++++ b/camlibs/ax203/jpeg_memsrcdest.h +@@ -1,5 +1,7 @@ + #include <jpeglib.h> + ++#if JPEG_LIB_VERSION < 80 && !defined(MEM_SRCDST_SUPPORTED) ++ + void + jpeg_mem_src (j_decompress_ptr cinfo, unsigned char * buffer, + unsigned long bufsize); +@@ -7,3 +9,5 @@ jpeg_mem_src (j_decompress_ptr cinfo, unsigned char * buffer, + void + jpeg_mem_dest (j_compress_ptr cinfo, unsigned char ** outbuffer, + unsigned long * outsize); ++ ++#endif +diff --git a/camlibs/jl2005c/jpeg_memsrcdest.c b/camlibs/jl2005c/jpeg_memsrcdest.c +index 321f926..b65310e 100644 +--- a/camlibs/jl2005c/jpeg_memsrcdest.c ++++ b/camlibs/jl2005c/jpeg_memsrcdest.c +@@ -25,8 +25,8 @@ + #include "jpeg_memsrcdest.h" + + /* libjpeg8 and later come with their own (API compatible) memory source +- and dest */ +-#if JPEG_LIB_VERSION < 80 ++ and dest, and older versions may have it backported */ ++#if JPEG_LIB_VERSION < 80 && !defined(MEM_SRCDST_SUPPORTED) + + /* Expanded data source object for memory input */ + +diff --git a/camlibs/jl2005c/jpeg_memsrcdest.h b/camlibs/jl2005c/jpeg_memsrcdest.h +index e971182..b13bf3f 100644 +--- a/camlibs/jl2005c/jpeg_memsrcdest.h ++++ b/camlibs/jl2005c/jpeg_memsrcdest.h +@@ -1,5 +1,7 @@ + #include <jpeglib.h> + ++#if JPEG_LIB_VERSION < 80 && !defined(MEM_SRCDST_SUPPORTED) ++ + void + jpeg_mem_src (j_decompress_ptr cinfo, unsigned char * buffer, + unsigned long bufsize); +@@ -7,3 +9,5 @@ jpeg_mem_src (j_decompress_ptr cinfo, unsigned char * buffer, + void + jpeg_mem_dest (j_compress_ptr cinfo, unsigned char ** outbuffer, + unsigned long * outsize); ++ ++#endif diff --git a/talimatname/genel/l/libgphoto2/talimat b/talimatname/genel/l/libgphoto2/talimat new file mode 100644 index 000000000..385f76a10 --- /dev/null +++ b/talimatname/genel/l/libgphoto2/talimat @@ -0,0 +1,20 @@ +# Tanım: Harici programlar tarafından dijital kameraya erişime izin vermek için tasarlanmış gphoto2 çekirdek kütüphanesi. +# URL: http://www.gphoto.org/proj/libgphoto2/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo libexif libusb-compat + +isim=libgphoto2 +surum=2.5.10 +devir=1 + +kaynak=(https://distfiles.macports.org/libgphoto2/libgphoto2-2.5.10.tar.bz2 + jpeg.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../jpeg.patch + ./configure --prefix=/usr --sysconfdir=/etc + make + make DESTDIR=$PKG install + rm -r $PKG/usr/share/doc +} diff --git a/talimatname/genel/l/libgravatar/talimat b/talimatname/genel/l/libgravatar/talimat new file mode 100644 index 000000000..87e8bd094 --- /dev/null +++ b/talimatname/genel/l/libgravatar/talimat @@ -0,0 +1,22 @@ +# Tanım: Gravatar desteği sağlayan KDE PIM kütüphanesi +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-kwidgetsaddons pimcommon kf5-kdoctools boost +# grup: kde + +isim=libgravatar +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgsf/talimat b/talimatname/genel/l/libgsf/talimat new file mode 100644 index 000000000..6bbcad9f5 --- /dev/null +++ b/talimatname/genel/l/libgsf/talimat @@ -0,0 +1,18 @@ +# Tanım: Yapısal dosya biçimleri için genişletilebilir bir giriş/çıkış özetleme katmanı sağlayın. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: glib intltool libxml2 gobject-introspection + +isim=libgsf +surum=1.14.35 +devir=1 + +kaynak=( http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgsignon-glib/talimat b/talimatname/genel/l/libgsignon-glib/talimat new file mode 100644 index 000000000..d3493629b --- /dev/null +++ b/talimatname/genel/l/libgsignon-glib/talimat @@ -0,0 +1,22 @@ +# Tanım: Hesap kimlik doğrulamasını yürüten uygulamalar için GLib tabanlı istemci kitaplığı +# URL: https://gitlab.com/accounts-sso/libgsignon-glib +# Paketçi: Cihan_Alkan +# Gerekler: gtk-doc vala gobject-introspection glib2 +# Grup: kütüphane + +isim=libgsignon-glib +surum=2.4.1 +devir=1 + +kaynak=(https://gitlab.com/accounts-sso/libgsignon-glib/repository/master/archive.tar.gz) + +derle() { +cd libgsignon-glib* + ./autogen.sh + ./configure --prefix=/usr \ + --localstatedir=/var \ + --sysconfdir=/etc + make -j1 + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/l/libgtop/talimat b/talimatname/genel/l/libgtop/talimat new file mode 100644 index 000000000..8f840b23f --- /dev/null +++ b/talimatname/genel/l/libgtop/talimat @@ -0,0 +1,21 @@ +# Tanım: İşlemler ve çalışan sistem hakkında bilgi içeren bir kütüphane +# URL: http://www.gnu.org/directory/libs/LibGTop.html +# Paketçi: milisarge +# Gerekler: gtk-doc intltool gobject-introspection + +isim=libgtop +surum=2.32.0 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +install -v -m755 -d $PKG/usr/lib/libgtop/examples +install -v -m755 examples/.libs/* $PKG/usr/lib/libgtop/examples +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libgudev/talimat b/talimatname/genel/l/libgudev/talimat new file mode 100644 index 000000000..82e81e692 --- /dev/null +++ b/talimatname/genel/l/libgudev/talimat @@ -0,0 +1,17 @@ +# Tanım: Libgudev paketi, libudev için GObject bağlamlarını içerir. +# URL: http://www.codeforge.com/s/0/libgudev +# Paketçi: milisarge +# Gerekler: glib gobject-introspection gtk-doc + +isim=libgudev +surum=230 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/libgudev/$surum/libgudev-$surum.tar.xz) +derle() { +cd ${isim}-$surum + +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libguestfs/libguestfs.kur-kos b/talimatname/genel/l/libguestfs/libguestfs.kur-kos new file mode 100644 index 000000000..67caf6a92 --- /dev/null +++ b/talimatname/genel/l/libguestfs/libguestfs.kur-kos @@ -0,0 +1,15 @@ +if [ -f .bash_profile ]; then + if [ -z LIBGUESTFS_PATH ]; then + echo "export LIBGUESTFS_PATH=/usr/lib/guestfs/appliance/" >> .bash_profile + fi +else + echo "export LIBGUESTFS_PATH=/usr/lib/guestfs/appliance/" >> /etc/bashrc +fi + +echo "Avant d'utiliser l'application il faut relancer BASH" +echo "afin de prendre en compte LIBGUESTFS_PATH" +echo "ensuite il est possible de tester les fonctions " +echo "avec la commande \"libguestfs-test-tool\" " +echo "un système virtuel est créé et les fonctions internes sont testées " +echo "si tout va bien le message de fin est \"===== TEST FINISHED OK =====\"" + diff --git a/talimatname/genel/l/libguestfs/talimat b/talimatname/genel/l/libguestfs/talimat new file mode 100644 index 000000000..663698dc6 --- /dev/null +++ b/talimatname/genel/l/libguestfs/talimat @@ -0,0 +1,45 @@ +# Tanım: Libguestfs, sanal makine (VM) disk görüntülerine erişmek ve değiştirmek için kullanılan bir takım araçtır +# URL: http://libguestfs.org +# Paketçi: milisarge +# Gerekler: ocaml ocaml-findlib python ruby lua cdrkit qemu augeas libxml2 pcre db systemtap fuse gdisk bash-completion libconfig + + + +isim=libguestfs +surum=1.30.4 +devir=1 +kaynak=(http://$isim.org/download/1.30-stable/$isim-$surum.tar.gz + http://libguestfs.org/download/binaries/appliance/appliance-1.30.1.tar.xz) + + +derle() { + + cd $isim-$surum + + export LIBTINFO_CFLAGS="-D_GNU_SOURCE" + export LIBTINFO_LIBS="-lncursesw" + + ./configure --prefix=/usr \ + --mandir=/usr/man \ + --sysconfdir=/etc/ \ + --disable-ocaml \ + --disable-haskell \ + --disable-php \ + --disable-erlang \ + --enable-threads=posix \ + --disable-appliance \ + --disable-daemon + + make + make DESTDIR=$PKG install + + cd .. + cd appliance + + install -m 755 -d $PKG/usr/lib/guestfs/appliance + cp -v kernel $PKG/usr/lib/guestfs/appliance/ + cp -v initrd $PKG/usr/lib/guestfs/appliance/initrd + cp -v root $PKG/usr/lib/guestfs/appliance/root + cp -v README.fixed $PKG/usr/lib/guestfs/appliance/README.fixed + +} diff --git a/talimatname/genel/l/libgusb/talimat b/talimatname/genel/l/libgusb/talimat new file mode 100644 index 000000000..545e1d8f8 --- /dev/null +++ b/talimatname/genel/l/libgusb/talimat @@ -0,0 +1,18 @@ +# Tanım: Libgusb paketi libusb-1.0 için GObject sarmalayıcılarını içerir +# URL: https://gitorious.org/gusb/ +# Paketçi: milisarge +# Gerekler: libusb gperf glib gobject-introspection libgudev + +isim=libgusb +surum=0.2.8 +devir=1 + +kaynak=(http://people.freedesktop.org/~hughsient/releases/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libgweather/libgweather.kur-kos b/talimatname/genel/l/libgweather/libgweather.kur-kos new file mode 100644 index 000000000..3b3990e7b --- /dev/null +++ b/talimatname/genel/l/libgweather/libgweather.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas > /dev/null 2>&1 +gtk-update-icon-cache -q -t -f /usr/share/icons/gnome diff --git a/talimatname/genel/l/libgweather/talimat b/talimatname/genel/l/libgweather/talimat new file mode 100644 index 000000000..2bbbe680d --- /dev/null +++ b/talimatname/genel/l/libgweather/talimat @@ -0,0 +1,17 @@ +# Tanım: İnternetten hava durumu bilgisine erişim sağlar +# URL: https://wiki.gnome.org/action/show/Projects/LibGWeather?action=show&redirect=LibGWeather +# Paketçi: yasarciv67@gmail.com +# Gerekler: geocode-glib gtk3 libsoup gobject-introspection vala gtk-update-icon-cache + +isim=libgweather +surum=3.20.3 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --with-zoneinfo-dir +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libical/libical.kur-kos b/talimatname/genel/l/libical/libical.kur-kos new file mode 100755 index 000000000..9677e4749 --- /dev/null +++ b/talimatname/genel/l/libical/libical.kur-kos @@ -0,0 +1,2 @@ +rm -rf /usr/lib/pkgconfig/libical.pc +ln -s /usr/lib64/pkgconfig/libical.pc /usr/lib/pkgconfig/ diff --git a/talimatname/genel/l/libical/talimat b/talimatname/genel/l/libical/talimat new file mode 100644 index 000000000..4a5083331 --- /dev/null +++ b/talimatname/genel/l/libical/talimat @@ -0,0 +1,22 @@ +# Tanım: ICalendar protokollerinin ve veri formatlarının uygulanması. +# URL: http://sourceforge.net/projects/freeassociation/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=libical +surum=2.0.0 +devir=2 + +kaynak=( https://github.com/libical/libical/releases/download/v2.0.0/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DSHARED_ONLY=yes \ + .. + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libid3tag/talimat b/talimatname/genel/l/libid3tag/talimat new file mode 100644 index 000000000..f16d62c1a --- /dev/null +++ b/talimatname/genel/l/libid3tag/talimat @@ -0,0 +1,21 @@ +# Tanım: Id3 etiketleme için kütüphane +# URL: http://www.mars.org/home/rob/proj/mpeg/ +# Paketçi: milisarge +# Gerekler: + +isim=libid3tag +surum=0.15.1b +devir=1 + +kaynak=(ftp://ftp.mars.org/pub/mpeg/$isim-$surum.tar.gz\ + http://downloads.nutyx.org/files/patchs/$isim/id3tag.pc) + +derle() { + mkdir -p $PKG/usr/lib/pkgconfig/ + sed "s/#version#/$surum/" id3tag.pc > \ + $PKG/usr/lib/pkgconfig/id3tag.pc + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libidl/talimat b/talimatname/genel/l/libidl/talimat new file mode 100644 index 000000000..8e28ac01f --- /dev/null +++ b/talimatname/genel/l/libidl/talimat @@ -0,0 +1,19 @@ +# Tanım: CORBA 2.2 IDL ve Netscape'in XPIDL'leri için bir ön uç +# URL: http://www.gnome.org +# Paketçi: milisarge +# Gerekler: glib + +isim=libidl +surum=0.8.14 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/libIDL/0.8/libIDL-$surum.tar.bz2) +derle() { +cd libIDL-$surum +./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libidn/talimat b/talimatname/genel/l/libidn/talimat new file mode 100644 index 000000000..5641deddc --- /dev/null +++ b/talimatname/genel/l/libidn/talimat @@ -0,0 +1,27 @@ +# Tanım: GNU Libidn, Stringprep, Punycode ve IDNA 2003 teknik özelliklerinin tam olarak belgelendirilmiş bir uygulamasıdır. +# URL: http://www.gnu.org/software/libidn/ +# Paketçi: milisarge +# Gerekler: + +isim=libidn +surum=1.32 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + +./configure --prefix=/usr --disable-static \ +--mandir=/usr/share/man --infodir=/usr/share/info + +make +make DESTDIR=$PKG install + +rm $PKG/usr/share/info/{dir,libidn-components.png} +# Doc +find doc -name "Makefile*" -delete +rm -rf -v doc/{gdoc,idn.1,stamp-vti,man,texi} +mkdir -p /usr/share/doc/$isim-$surum +cp -r -v doc/* /usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/l/libindicator-gtk2/talimat b/talimatname/genel/l/libindicator-gtk2/talimat new file mode 100644 index 000000000..49dd72ee1 --- /dev/null +++ b/talimatname/genel/l/libindicator-gtk2/talimat @@ -0,0 +1,31 @@ +# Tanım: Göstergeler için bir dizi sembol ve kolaylık fonksiyonu +# URL: https://launchpad.net/libindicator +# Paketçi: milisarge +# Gerekler: gtk2 + +isim=libindicator-gtk2 +surum=0.4.93 +devir=1 + +kaynak=(http://launchpad.net/libindicator/0.5/$surum/+download/libindicator-$surum.tar.gz) + +derle() { + + sed '/-Werror/s/$/ -Wno-deprecated-declarations/' -i libindicator-$surum/libindicator/Makefile.{am,in} + sed 's/LIBINDICATOR_LIBS+="$LIBM"/LIBINDICATOR_LIBS+=" $LIBM"/g' -i libindicator-$surum/configure + sed 's/LIBM="-lmw"/LIBM=" -lmw"/g' -i libindicator-$surum/configure + sed 's/LIBM="-lm"/LIBM=" -lm"/g' -i libindicator-$surum/configure + sed 's/LIBS="-lm $LIBS"/LIBS=" -lm $LIBS"/g' -i libindicator-$surum/configure + sed 's/LIBS="-lmw $LIBS"/LIBS=" -lmw $LIBS"/g' -i libindicator-$surum/configure + + cd libindicator-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --libexecdir=/usr/lib/$isim \ + --disable-static \ + --with-gtk=2 +make -j1 +make -j1 DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libindicator/talimat b/talimatname/genel/l/libindicator/talimat new file mode 100644 index 000000000..a62fac473 --- /dev/null +++ b/talimatname/genel/l/libindicator/talimat @@ -0,0 +1,31 @@ +# Tanım: Göstergeler için bir dizi sembol ve kolaylık fonksiyonu +# URL: https://launchpad.net/libindicator +# Paketçi: yasarciv +# Gerekler: gtk3 + +isim=libindicator +surum=12.10.1 +devir=1 +kaynak=(https://launchpad.net/$isim/12.10/12.10.1/+download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed '/-Werror/s/$/ -Wno-deprecated-declarations/' -i libindicator/Makefile.{am,in} + sed 's/LIBINDICATOR_LIBS+="$LIBM"/LIBINDICATOR_LIBS+=" $LIBM"/g' -i configure + sed 's/LIBM="-lmw"/LIBM=" -lmw"/g' -i configure + sed 's/LIBM="-lm"/LIBM=" -lm"/g' -i configure + sed 's/LIBS="-lm $LIBS"/LIBS=" -lm $LIBS"/g' -i configure + sed 's/LIBS="-lmw $LIBS"/LIBS=" -lmw $LIBS"/g' -i configure + sed 's/LIBM="-lm"/LIBM=" -lm"/g' -i m4/libtool.m4 + export CFLAGS="${CFLAGS} -Wno-error=deprecated-declarations" + ./configure \ + --prefix=/usr \ + --localstatedir=/var \ + --libexecdir=/usr/lib/libindicator \ + --sysconfdir=/etc \ + --with-gtk=3 \ + --disable-static \ + --disable-tests + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libinput/talimat b/talimatname/genel/l/libinput/talimat new file mode 100644 index 000000000..55216388c --- /dev/null +++ b/talimatname/genel/l/libinput/talimat @@ -0,0 +1,20 @@ +# Tanım: Görüntüleme sunucuları ve giriş aygıtlarıyla uğraşmak zorunda kalan diğer uygulamalar için kitaplık +# URL:http://www.freedesktop.org/wiki/Software/libinput/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libevdev mtdev libwacom + +isim=libinput +surum=1.4.0 +devir=1 + +kaynak=(http://freedesktop.org/software/$isim/$isim-$surum.tar.xz ) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static \ +--with-udev-dir=/lib/udev +make +make DESTDIR=$PKG install +install -v -dm755 $PKG/usr/share/doc/libinput-$surum +cp -rv doc/html/* $PKG/usr/share/doc/libinput-$surum +} diff --git a/talimatname/genel/l/libiodbc/talimat b/talimatname/genel/l/libiodbc/talimat new file mode 100644 index 000000000..bda488cf2 --- /dev/null +++ b/talimatname/genel/l/libiodbc/talimat @@ -0,0 +1,21 @@ +# Tanım: Linux için bağımsız açık veri tabanı bağlantısı +# URL: http://www.iodbc.org +# Paketçi: milisarge +# Gerekler: + +isim=libiodbc +surum=3.52.10 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/iodbc/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--includedir=/usr/include/libiodbc \ +--disable-gui \ +--disable-libodbc +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/libiodbc/ +} diff --git a/talimatname/genel/l/libisoburn/talimat b/talimatname/genel/l/libisoburn/talimat new file mode 100644 index 000000000..1e9b3b7fb --- /dev/null +++ b/talimatname/genel/l/libisoburn/talimat @@ -0,0 +1,18 @@ +# Tanım: Libisoburn libburn ve libisofs kütüphaneleri için bir ön uçtur +# URL: http://libburnia-project.org/ +# Paketçi: milisarge +# Gerekler: libburn libisofs acl attr + +isim=libisoburn +surum=1.4.2 +devir=1 + +kaynak=(http://files.libburnia-project.org/releases/libisoburn-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static \ +--enable-pkg-check-modules +make +make DESTDIR=$PKG install +rm -f $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libisofs/talimat b/talimatname/genel/l/libisofs/talimat new file mode 100644 index 000000000..5f0d46dd2 --- /dev/null +++ b/talimatname/genel/l/libisofs/talimat @@ -0,0 +1,17 @@ +# Tanım: Libisofs, bir ISO-9660 dosya sistemi oluşturmak için kullanılan bir kütüphanedir +# URL: http://libburnia.pykix.org/ +# Paketçi: milisarge +# Gerekler: + +isim=libisofs +surum=1.4.2 +devir=1 + +kaynak=(http://files.libburnia-project.org/releases/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libixion/talimat b/talimatname/genel/l/libixion/talimat new file mode 100644 index 000000000..8527f0329 --- /dev/null +++ b/talimatname/genel/l/libixion/talimat @@ -0,0 +1,22 @@ +# Tanım: Genel amaçlı formül çözümleyici ve yorumlayıcı +# URL: https://gitlab.com/ixion/ixion/blob/master/README.md +# Paketçi: Cihan Alkan +# Gerekler: boost mdds python3 + +isim=libixion +surum=0.13.0 +devir=1 + +kaynak=(http://kohei.us/files/ixion/src/libixion-$surum.tar.xz) + +derle() { + cd $isim-$surum + [ ! -f /usr/lib/pkgconfig/python3.pc ] && ln -s /usr/lib/pkgconfig/python-3.5.pc /usr/lib/pkgconfig/python3.pc + ./configure \ + --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + rm -f /usr/lib/pkgconfig/python3.pc +} diff --git a/talimatname/genel/l/libjpeg-turbo/talimat b/talimatname/genel/l/libjpeg-turbo/talimat new file mode 100644 index 000000000..91d602ef1 --- /dev/null +++ b/talimatname/genel/l/libjpeg-turbo/talimat @@ -0,0 +1,21 @@ +# Tanım: Temel JPEG hızlandırmak için SIMD kullanan orijinal IJG libjpeg çatalı +# URL: http://libjpeg-turbo.virtualgl.org/ +# Paketçi: milisarge +# Gerekler: nasm + +isim=libjpeg-turbo +surum=1.5.3 +devir=1 + +kaynak=(http://sourceforge.net/projects/libjpeg-turbo/files/$surum/libjpeg-turbo-$surum.tar.gz) + +derle() { +cd $isim-$surum + sed -i -e '/^docdir/ s:$:/libjpeg-turbo-1.5.3:' Makefile.in + + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --with-jpeg8 --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkcddb/talimat b/talimatname/genel/l/libkcddb/talimat new file mode 100644 index 000000000..7d021b1a3 --- /dev/null +++ b/talimatname/genel/l/libkcddb/talimat @@ -0,0 +1,21 @@ +# Tanım: Libkcddb paketi internetten ses CD'si meta verilerini almak için kullanılan bir kitaplık içerir. +# URL: http://sourceforge.net/projects/libkcddb +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: git qt5 kf5-extra-cmake-modules kf5-kconfig kf5-kdoctools kf5-kcodecs kf5-ki18n kf5-kio kf5-kwidgetsaddons kf5-kxmlgui + +isim=libkcddb +surum=26160902 +devir=1 + +derle() { + git clone git://anongit.kde.org/libkcddb.git + mkdir build + cd build + cmake ../$isim \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkdcraw/talimat b/talimatname/genel/l/libkdcraw/talimat new file mode 100644 index 000000000..efcc29615 --- /dev/null +++ b/talimatname/genel/l/libkdcraw/talimat @@ -0,0 +1,21 @@ +# Tanım: RAW resim kodunu çözmek için kullanılan bir C ++ arabirimi +# URL: http://www.kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules libraw +# grup: kde + +isim=libkdcraw +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DKDE4_BUILD_TESTS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkdegames/talimat b/talimatname/genel/l/libkdegames/talimat new file mode 100644 index 000000000..67bcc4e64 --- /dev/null +++ b/talimatname/genel/l/libkdegames/talimat @@ -0,0 +1,21 @@ +# Tanım: Birçok KDE oyununda ortak kod ve veriler +# URL : https://projects.kde.org/projects/kde/kdegames/libkdegames +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools kf5-kdelibs4support kf5-kdeclarative kf5-kdnssd kf5-knewstuff openal + +isim=libkdegames +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkdepim/talimat b/talimatname/genel/l/libkdepim/talimat new file mode 100644 index 000000000..210f0da2b --- /dev/null +++ b/talimatname/genel/l/libkdepim/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE PIM uygulamaları için kütüphaneler +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules akonadi-contacts akonadi-search kcontacts kontactinterface kldap kf5-kdoctools boost kf5-kdelibs4support kmime kf5-kcmutils +# Grup: kde + +isim=libkdepim +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkexiv2/talimat b/talimatname/genel/l/libkexiv2/talimat new file mode 100644 index 000000000..67585d447 --- /dev/null +++ b/talimatname/genel/l/libkexiv2/talimat @@ -0,0 +1,20 @@ +# Tanım: Resim metaverilerini değiştirmek için bir kütüphane +# URL: http://www.kde.org +# Paketçi: alihan-ozturk28 +# Gerekler: exiv2 qt5 kf5-extra-cmake-modules + +isim=libkexiv2 +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkgapi/talimat b/talimatname/genel/l/libkgapi/talimat new file mode 100644 index 000000000..5501bb9de --- /dev/null +++ b/talimatname/genel/l/libkgapi/talimat @@ -0,0 +1,21 @@ +# Tanım: Çeşitli Google hizmetlerine genel API'lerinden erişmek için KDE tabanlı bir kütüphane +# URL: https://projects.kde.org/projects/extragear/libs/libkgapi +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kcalcore kcontacts kf5-extra-cmake-modules kf5-kdoctools qt5 + +isim=libkgapi +surum=5.3.1 +devir=1 + +kaynak=(http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkipi/libkipi.kur-kos b/talimatname/genel/l/libkipi/libkipi.kur-kos new file mode 100644 index 000000000..b74f6d479 --- /dev/null +++ b/talimatname/genel/l/libkipi/libkipi.kur-kos @@ -0,0 +1 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null diff --git a/talimatname/genel/l/libkipi/talimat b/talimatname/genel/l/libkipi/talimat new file mode 100644 index 000000000..f88b574cc --- /dev/null +++ b/talimatname/genel/l/libkipi/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir KDE uygulamasından kipi eklentileri kullanmak için bir arayüz +# URL: https://projects.kde.org/projects/kde/kdegraphics/libs/libkipi +# Pakager: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kxmlgui hicolor-icon-theme +# Grup: kde + +isim=libkipi +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libkleo/talimat b/talimatname/genel/l/libkleo/talimat new file mode 100644 index 000000000..2e1d28632 --- /dev/null +++ b/talimatname/genel/l/libkleo/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE PIM şifreleme kitaplığı +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost kpimtextedit + +isim=libkleo +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkmahjongg/talimat b/talimatname/genel/l/libkmahjongg/talimat new file mode 100644 index 000000000..c105d417e --- /dev/null +++ b/talimatname/genel/l/libkmahjongg/talimat @@ -0,0 +1,21 @@ +# Tanım: Kmahjongg oyunu için ortak kod ve veriler +# URL: https://projects.kde.org/projects/kde/kdegames/libkmahjongg +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools kf5-kdelibs4support kf5-kdeclarative kf5-kdnssd kf5-knewstuff openal + +isim=libkmahjongg +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/${surum}/src/${isim}-${surum}.tar.xz) + +derle() { +cd ${isim}-${surum} +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libkomparediff2/talimat b/talimatname/genel/l/libkomparediff2/talimat new file mode 100644 index 000000000..cf5f4ebdd --- /dev/null +++ b/talimatname/genel/l/libkomparediff2/talimat @@ -0,0 +1,24 @@ +# Tanım: Dosyaları ve dizeleri karşılaştırmak için kitaplık +# URL: http://www.kde.org/ +# Paketçi: Cihan_Alkan +# Gerekler: kf5-extra-cmake-modules kf5-kcodecs kf5-kconfig kf5-kcoreaddons kf5-ki18n kf5-kio kf5-kxmlgui qt5 +# Grup: kde kütüphane + + +isim=libkomparediff2 +surum=17.12.0 +devir=1 +kaynak=(https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + + mkdir build + cd build + cmake ../$isim-$surum \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF \ + -Wno-dev + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libksane/talimat b/talimatname/genel/l/libksane/talimat new file mode 100644 index 000000000..dded27489 --- /dev/null +++ b/talimatname/genel/l/libksane/talimat @@ -0,0 +1,26 @@ +# Tanım: Bir resim tarama kitaplığı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: sane kf5-extra-cmake-modules qt5 kf5-ki18n kf5-kwallet kf5-ktextwidgets +# Grup: kde kütüphane + +isim=libksane +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} + + diff --git a/talimatname/genel/l/libksba/talimat b/talimatname/genel/l/libksba/talimat new file mode 100644 index 000000000..1b780f6c2 --- /dev/null +++ b/talimatname/genel/l/libksba/talimat @@ -0,0 +1,20 @@ +# Tanım: Libksba, X.509 sertifikaları, CMS verileri ve ilgili nesnelerle çalışmanın görevlerini daha kolay hale getiren bir kütüphanedir (Şifreleme Mesaj Sözdizimi). +# URL: http://www.gnupg.org/related_software/libksba/ +# Paketçi: milisarge +# Gerekler: libgpg-error + +isim=libksba +surum=1.3.3 +devir=1 + +kaynak=(ftp://ftp.gnupg.org/gcrypt/$isim/$isim-$surum.tar.bz2 ) + +derle() { +cd $isim-$surum +./configure --prefix=/usr\ + --mandir=/usr/share/man\ + --infodir=/usr/share/info +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libksieve/talimat b/talimatname/genel/l/libksieve/talimat new file mode 100644 index 000000000..6e25f3018 --- /dev/null +++ b/talimatname/genel/l/libksieve/talimat @@ -0,0 +1,21 @@ +# Tanım: Elekleri yönetmek için KDE PIM kütüphanesi. +# URL: https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools boost qt5 kidentitymanagement pimcommon kmailtransport + +isim=libksieve +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/liblangtag/talimat b/talimatname/genel/l/liblangtag/talimat new file mode 100644 index 000000000..3618a6b8a --- /dev/null +++ b/talimatname/genel/l/liblangtag/talimat @@ -0,0 +1,18 @@ +# Tanım: Tanımlama dilleri için etiketlerle erişim arayüz kütüphanesi +# URL: http://tagoh.bitbucket.org/liblangtag/index.html +# Paketçi: Cihan Alkan +# Gerekler: libxml2 glib gobject-introspection + +isim=liblangtag +surum=0.6.2 +devir=1 + +kaynak=(https://bitbucket.org/tagoh/liblangtag/downloads/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/liblinear/talimat b/talimatname/genel/l/liblinear/talimat new file mode 100644 index 000000000..066fbf928 --- /dev/null +++ b/talimatname/genel/l/liblinear/talimat @@ -0,0 +1,18 @@ +# Tanım: Büyük ölçekli uygulamalar için doğrusal sınıflayıcı öğrenmek için kütüphane. +# URL: http://www.csie.ntu.edu.tw/~cjlin/liblinear/ +# Paketçi:milisarge +# Gerekler: + +isim=liblinear +surum=2.1 +devir=1 + +kaynak=(http://www.csie.ntu.edu.tw/~cjlin/liblinear/oldfiles/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +make lib +mkdir -p $PKG/usr/{lib,include} +install -vm644 linear.h $PKG/usr/include +install -vm755 liblinear.so.3 $PKG/usr/lib +ln -sfv liblinear.so.3 $PKG/usr/lib/liblinear.so +} diff --git a/talimatname/genel/l/liblo/talimat b/talimatname/genel/l/liblo/talimat new file mode 100644 index 000000000..f40c160ea --- /dev/null +++ b/talimatname/genel/l/liblo/talimat @@ -0,0 +1,19 @@ +# Tanım: Hafif bir OSC (Açık Ses Kontrolü) uygulaması +# URL: http://liblo.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: doxygen +# Grup: medya + +isim=liblo +surum=0.29 +devir=1 +kaynak=(https://github.com/radarsat1/liblo/releases/download/0.29/liblo-0.29.tar.gz) + +derle() { + cd "$SRC/$isim-$surum" + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + rm -rf $PKG/usr/share/doc + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/l/liblxqt/talimat b/talimatname/genel/l/liblxqt/talimat new file mode 100644 index 000000000..5642dc09e --- /dev/null +++ b/talimatname/genel/l/liblxqt/talimat @@ -0,0 +1,22 @@ +# Tanım: Liblxqt tüm LXQt bileşenleri için temel yardımcı program kitaplığıdır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: kf5-kwindowsystem libqtxdg +# Grup: lxqt + +isim=liblxqt +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmad/amd64-64bit.diff b/talimatname/genel/l/libmad/amd64-64bit.diff new file mode 100644 index 000000000..2ef025b6c --- /dev/null +++ b/talimatname/genel/l/libmad/amd64-64bit.diff @@ -0,0 +1,12 @@ +Index: libmad-0.15.1b/configure.ac +=================================================================== +--- libmad-0.15.1b.orig/configure.ac 2008-03-07 20:33:05.000000000 +0000 ++++ libmad-0.15.1b/configure.ac 2008-03-07 20:33:31.000000000 +0000 +@@ -233,6 +233,7 @@ + then + case "$host" in + i?86-*) FPM="INTEL" ;; ++ x86_64*) FPM="64BIT" ;; + arm*-*) FPM="ARM" ;; + mips*-*) FPM="MIPS" ;; + sparc*-*) FPM="SPARC" ;; diff --git a/talimatname/genel/l/libmad/frame_length.diff b/talimatname/genel/l/libmad/frame_length.diff new file mode 100644 index 000000000..d215b9b02 --- /dev/null +++ b/talimatname/genel/l/libmad/frame_length.diff @@ -0,0 +1,197 @@ +; You can calculate where the next frame will start depending on things +; like the bitrate. See mad_header_decode(). It seems that when decoding +; the frame you can go past that boundary. This attempts to catch those cases, +; but might not catch all of them. +; For more info see http://bugs.debian.org/508133 +Index: libmad-0.15.1b/layer12.c +=================================================================== +--- libmad-0.15.1b.orig/layer12.c 2008-12-23 21:38:07.000000000 +0100 ++++ libmad-0.15.1b/layer12.c 2008-12-23 21:38:12.000000000 +0100 +@@ -134,6 +134,12 @@ + for (sb = 0; sb < bound; ++sb) { + for (ch = 0; ch < nch; ++ch) { + nb = mad_bit_read(&stream->ptr, 4); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + if (nb == 15) { + stream->error = MAD_ERROR_BADBITALLOC; +@@ -146,6 +152,12 @@ + + for (sb = bound; sb < 32; ++sb) { + nb = mad_bit_read(&stream->ptr, 4); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + if (nb == 15) { + stream->error = MAD_ERROR_BADBITALLOC; +@@ -162,6 +174,12 @@ + for (ch = 0; ch < nch; ++ch) { + if (allocation[ch][sb]) { + scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + # if defined(OPT_STRICT) + /* +@@ -187,6 +205,12 @@ + frame->sbsample[ch][s][sb] = nb ? + mad_f_mul(I_sample(&stream->ptr, nb), + sf_table[scalefactor[ch][sb]]) : 0; ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + } + } + +@@ -195,6 +219,12 @@ + mad_fixed_t sample; + + sample = I_sample(&stream->ptr, nb); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + for (ch = 0; ch < nch; ++ch) { + frame->sbsample[ch][s][sb] = +@@ -403,7 +433,15 @@ + nbal = bitalloc_table[offsets[sb]].nbal; + + for (ch = 0; ch < nch; ++ch) ++ { + allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } ++ } + } + + for (sb = bound; sb < sblimit; ++sb) { +@@ -411,6 +449,13 @@ + + allocation[0][sb] = + allocation[1][sb] = mad_bit_read(&stream->ptr, nbal); ++ ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + } + + /* decode scalefactor selection info */ +@@ -419,6 +464,12 @@ + for (ch = 0; ch < nch; ++ch) { + if (allocation[ch][sb]) + scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + } + } + +@@ -442,6 +493,12 @@ + for (ch = 0; ch < nch; ++ch) { + if (allocation[ch][sb]) { + scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + switch (scfsi[ch][sb]) { + case 2: +@@ -452,11 +509,23 @@ + + case 0: + scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + /* fall through */ + + case 1: + case 3: + scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + } + + if (scfsi[ch][sb] & 1) +@@ -488,6 +557,12 @@ + index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; + + II_samples(&stream->ptr, &qc_table[index], samples); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + for (s = 0; s < 3; ++s) { + frame->sbsample[ch][3 * gr + s][sb] = +@@ -506,6 +581,12 @@ + index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; + + II_samples(&stream->ptr, &qc_table[index], samples); ++ if (mad_bit_nextbyte(&stream->ptr) > stream->next_frame) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + for (ch = 0; ch < nch; ++ch) { + for (s = 0; s < 3; ++s) { +Index: libmad-0.15.1b/layer3.c +=================================================================== +--- libmad-0.15.1b.orig/layer3.c 2008-12-23 21:38:07.000000000 +0100 ++++ libmad-0.15.1b/layer3.c 2008-12-23 21:38:12.000000000 +0100 +@@ -2608,6 +2608,12 @@ + next_md_begin = 0; + + md_len = si.main_data_begin + frame_space - next_md_begin; ++ if (md_len + MAD_BUFFER_GUARD > MAD_BUFFER_MDLEN) ++ { ++ stream->error = MAD_ERROR_LOSTSYNC; ++ stream->sync = 0; ++ return -1; ++ } + + frame_used = 0; + diff --git a/talimatname/genel/l/libmad/libmad.patch b/talimatname/genel/l/libmad/libmad.patch new file mode 100644 index 000000000..e8abb16bc --- /dev/null +++ b/talimatname/genel/l/libmad/libmad.patch @@ -0,0 +1,117 @@ +diff -ruN libmad-0.15.1b.orig/Makefile.am libmad-0.15.1b/Makefile.am +--- libmad-0.15.1b.orig/Makefile.am 2004-02-17 02:02:03.000000000 +0000 ++++ libmad-0.15.1b/Makefile.am 2005-08-25 12:08:04.000000000 +0000 +@@ -33,9 +33,12 @@ + minimad_INCLUDES = + minimad_LDADD = libmad.la + +-EXTRA_DIST = mad.h.sed \ ++EXTRA_DIST = mad.h.sed mad.pc.in \ + CHANGES COPYRIGHT CREDITS README TODO VERSION + ++pkgconfigdir = $(libdir)/pkgconfig ++pkgconfig_DATA= mad.pc ++ + exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \ + synth.h decoder.h + +diff -ruN libmad-0.15.1b.orig/Makefile.in libmad-0.15.1b/Makefile.in +--- libmad-0.15.1b.orig/Makefile.in 2004-02-17 02:33:23.000000000 +0000 ++++ libmad-0.15.1b/Makefile.in 2005-08-25 12:09:34.000000000 +0000 +@@ -14,6 +14,8 @@ + + @SET_MAKE@ + ++pkgconfigdir = $(libdir)/pkgconfig ++pkgconfig_DATA = mad.pc + + SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) $(minimad_SOURCES) + +@@ -43,7 +45,7 @@ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/libmad.list.in \ + $(top_srcdir)/configure COPYING INSTALL TODO config.guess \ +- config.sub depcomp install-sh ltmain.sh missing mkinstalldirs ++ config.sub depcomp install-sh ltmain.sh missing mkinstalldirs mad.pc.in + subdir = . + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/configure.ac +@@ -53,7 +55,7 @@ + configure.lineno configure.status.lineno + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = config.h +-CONFIG_CLEAN_FILES = libmad.list ++CONFIG_CLEAN_FILES = libmad.list mad.pc + am__installdirs = $(DESTDIR)$(libdir) $(DESTDIR)$(includedir) + libLTLIBRARIES_INSTALL = $(INSTALL) + LTLIBRARIES = $(lib_LTLIBRARIES) +@@ -218,7 +220,7 @@ + minimad_SOURCES = minimad.c + minimad_INCLUDES = + minimad_LDADD = libmad.la +-EXTRA_DIST = mad.h.sed \ ++EXTRA_DIST = mad.h.sed mad.pc.in \ + CHANGES COPYRIGHT CREDITS README TODO VERSION + + exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \ +@@ -298,6 +300,28 @@ + rm -f stamp-h1 + touch $@ + ++mad.pc: $(top_builddir)/config.status mad.pc.in ++ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ++ ++install-pkgconfigDATA: $(pkgconfig_DATA) ++ @$(NORMAL_INSTALL) ++ $(mkinstalldirs) $(DESTDIR)$(pkgconfigdir) ++ @list='$(pkgconfig_DATA)'; for p in $$list; do \ ++ if test -f $(srcdir)/$$p; then \ ++ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgconfigdir)/$$p"; \ ++ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgconfigdir)/$$p; \ ++ else if test -f $$p; then \ ++ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgconfigdir)/$$p"; \ ++ $(INSTALL_DATA) $$p $(DESTDIR)$(pkgconfigdir)/$$p; \ ++ fi; fi; \ ++ done ++ ++uninstall-pkgconfigDATA: ++ @$(NORMAL_UNINSTALL) ++ list='$(pkgconfig_DATA)'; for p in $$list; do \ ++ rm -f $(DESTDIR)$(pkgconfigdir)/$$p; \ ++ done ++ + distclean-hdr: + -rm -f config.h stamp-h1 + libmad.list: $(top_builddir)/config.status $(srcdir)/libmad.list.in +@@ -726,7 +750,7 @@ + + info-am: + +-install-data-am: install-includeHEADERS ++install-data-am: install-includeHEADERS install-pkgconfigDATA + + install-exec-am: install-libLTLIBRARIES + +@@ -757,7 +781,7 @@ + ps-am: + + uninstall-am: uninstall-includeHEADERS uninstall-info-am \ +- uninstall-libLTLIBRARIES ++ uninstall-libLTLIBRARIES install-pkgconfigDATA + + uninstall-info: uninstall-info-recursive + +diff -ruN libmad-0.15.1b.orig/mad.pc.in libmad-0.15.1b/mad.pc.in +--- libmad-0.15.1b.orig/mad.pc.in 1970-01-01 00:00:00.000000000 +0000 ++++ libmad-0.15.1b/mad.pc.in 2005-08-25 12:08:04.000000000 +0000 +@@ -0,0 +1,10 @@ ++prefix=@prefix@ ++exec_prefix=@exec_prefix@ ++libdir=@libdir@ ++includedir=@includedir@ ++ ++Name: MAD ++Tanım: libmad - MPEG audio decoder library ++Version: @VERSION@ ++Libs: -L${libdir} -lmad ++Cflags: diff --git a/talimatname/genel/l/libmad/mad.pc b/talimatname/genel/l/libmad/mad.pc new file mode 100644 index 000000000..87b213d4b --- /dev/null +++ b/talimatname/genel/l/libmad/mad.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: mad +Tanım: MPEG audio decoder +Requires: +Version: 0.15.1b +Libs: -L${libdir} -lmad +Cflags: -I${includedir} diff --git a/talimatname/genel/l/libmad/optimize.diff b/talimatname/genel/l/libmad/optimize.diff new file mode 100644 index 000000000..1418dc927 --- /dev/null +++ b/talimatname/genel/l/libmad/optimize.diff @@ -0,0 +1,77 @@ +Index: libmad-0.15.1b/configure.ac +=================================================================== +--- libmad-0.15.1b.orig/configure.ac 2008-03-07 20:31:23.000000000 +0000 ++++ libmad-0.15.1b/configure.ac 2008-03-07 20:34:26.000000000 +0000 +@@ -124,71 +124,7 @@ + + if test "$GCC" = yes + then +- if test -z "$arch" +- then +- case "$host" in +- i386-*) ;; +- i?86-*) arch="-march=i486" ;; +- arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;; +- armv4*-*) arch="-march=armv4 -mtune=strongarm" ;; +- powerpc-*) ;; +- mips*-agenda-*) arch="-mcpu=vr4100" ;; +- mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;; +- esac +- fi +- +- case "$optimize" in +- -O|"-O "*) +- optimize="-O" +- optimize="$optimize -fforce-mem" +- optimize="$optimize -fforce-addr" +- : #x optimize="$optimize -finline-functions" +- : #- optimize="$optimize -fstrength-reduce" +- optimize="$optimize -fthread-jumps" +- optimize="$optimize -fcse-follow-jumps" +- optimize="$optimize -fcse-skip-blocks" +- : #x optimize="$optimize -frerun-cse-after-loop" +- : #x optimize="$optimize -frerun-loop-opt" +- : #x optimize="$optimize -fgcse" +- optimize="$optimize -fexpensive-optimizations" +- optimize="$optimize -fregmove" +- : #* optimize="$optimize -fdelayed-branch" +- : #x optimize="$optimize -fschedule-insns" +- optimize="$optimize -fschedule-insns2" +- : #? optimize="$optimize -ffunction-sections" +- : #? optimize="$optimize -fcaller-saves" +- : #> optimize="$optimize -funroll-loops" +- : #> optimize="$optimize -funroll-all-loops" +- : #x optimize="$optimize -fmove-all-movables" +- : #x optimize="$optimize -freduce-all-givs" +- : #? optimize="$optimize -fstrict-aliasing" +- : #* optimize="$optimize -fstructure-noalias" +- +- case "$host" in +- arm*-*) +- optimize="$optimize -fstrength-reduce" +- ;; +- mips*-*) +- optimize="$optimize -fstrength-reduce" +- optimize="$optimize -finline-functions" +- ;; +- i?86-*) +- optimize="$optimize -fstrength-reduce" +- ;; +- powerpc-apple-*) +- # this triggers an internal compiler error with gcc2 +- : #optimize="$optimize -fstrength-reduce" +- +- # this is really only beneficial with gcc3 +- : #optimize="$optimize -finline-functions" +- ;; +- *) +- # this sometimes provokes bugs in gcc 2.95.2 +- : #optimize="$optimize -fstrength-reduce" +- ;; +- esac +- ;; +- esac ++ optimize="-O2" + fi + + case "$host" in diff --git a/talimatname/genel/l/libmad/talimat b/talimatname/genel/l/libmad/talimat new file mode 100644 index 000000000..b86556bad --- /dev/null +++ b/talimatname/genel/l/libmad/talimat @@ -0,0 +1,28 @@ +# Tanım: Yüksek kaliteli bir MPEG ses dekoderi +# URL: http://www.underbit.com/products/mad/ +# Paketçi: milisarge +# Gerekler: + +isim=libmad +surum=0.15.1b +devir=3 + +kaynak=(ftp://ftp.mars.org/pub/mpeg/$isim-$surum.tar.gz + libmad.patch + amd64-64bit.diff + frame_length.diff + optimize.diff) + + +derle() { + cd ${isim}-${surum} + patch -p1 -i "${SRC}/libmad.patch" + patch -p1 -i "${SRC}/amd64-64bit.diff" + patch -p1 -i "${SRC}/frame_length.diff" + patch -p1 -i "${SRC}/optimize.diff" + CFLAGS="$CFLAGS -ftree-vectorize -ftree-vectorizer-verbose=1" + autoconf + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/l/libmatekbd/libmatekbd.kur-kos b/talimatname/genel/l/libmatekbd/libmatekbd.kur-kos new file mode 100755 index 000000000..088752e4d --- /dev/null +++ b/talimatname/genel/l/libmatekbd/libmatekbd.kur-kos @@ -0,0 +1 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/l/libmatekbd/talimat b/talimatname/genel/l/libmatekbd/talimat new file mode 100644 index 000000000..b13c28eb4 --- /dev/null +++ b/talimatname/genel/l/libmatekbd/talimat @@ -0,0 +1,22 @@ +# Tanım: MATE klavye kitaplığı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool gtk3 xorg-libxklavier +# Grup: mate + +isim=libmatekbd +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmatemixer/talimat b/talimatname/genel/l/libmatemixer/talimat new file mode 100644 index 000000000..84550996c --- /dev/null +++ b/talimatname/genel/l/libmatemixer/talimat @@ -0,0 +1,24 @@ +# Tanım: MATE masaüstü için ses karıştırıcı kitaplığı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool glib pulseaudio +# Grup: mate + +isim=libmatemixer +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmateweather/libmateweather.kur-kos b/talimatname/genel/l/libmateweather/libmateweather.kur-kos new file mode 100755 index 000000000..538fd0f71 --- /dev/null +++ b/talimatname/genel/l/libmateweather/libmateweather.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/mate diff --git a/talimatname/genel/l/libmateweather/talimat b/talimatname/genel/l/libmateweather/talimat new file mode 100644 index 000000000..2d6ae782f --- /dev/null +++ b/talimatname/genel/l/libmateweather/talimat @@ -0,0 +1,26 @@ +# Tanım: Internet'ten hava durumuna erişim sağlar. +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv@gmail.com +# Gerekler: intltool gtk3 libsoup +# Grup: mate + +isim=libmateweather +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-python \ + --enable-locations-compression + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmbim/talimat b/talimatname/genel/l/libmbim/talimat new file mode 100644 index 000000000..941d8a126 --- /dev/null +++ b/talimatname/genel/l/libmbim/talimat @@ -0,0 +1,20 @@ +# Tanım: MBIM modem protokol yardımcı kitaplığı. +# URL: http://www.freedesktop.org/wiki/Software/libmbim/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: glib gobject-introspection libgudev + +isim=libmbim +surum=1.14.0 +devir=1 + +kaynak=( http://www.freedesktop.org/software/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-static + +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/l/libmcrypt/talimat b/talimatname/genel/l/libmcrypt/talimat new file mode 100644 index 000000000..c63d8dad5 --- /dev/null +++ b/talimatname/genel/l/libmcrypt/talimat @@ -0,0 +1,18 @@ +# Tanım: Simetrik şifreleme algoritma geliştirmek için gerekli kütüphane +# URL: http://mcrypt.sourceforge.net/ +# Paketçi: halityilmaz1982 +# Gerekler: + +isim=libmcrypt +surum=2.5.8 +devir=1 + +kaynak=(http://downloads.sourceforge.net/mcrypt/${isim}-${surum}.tar.bz2) + +derle() { + cd ${SRC}/${isim}-${surum} + ./configure --prefix=/usr \ + --mandir=/usr/share/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmediaart/talimat b/talimatname/genel/l/libmediaart/talimat new file mode 100644 index 000000000..3585d4c52 --- /dev/null +++ b/talimatname/genel/l/libmediaart/talimat @@ -0,0 +1,18 @@ +# Tanım: Medya sanat önbelleklerini ayıklama ve yönetme ile görevli kütüphane +# URL: https://github.com/curlybeast/libmediaart +# Paketçi: yasarciv67@gmail.com +# Gerekler: gdk-pixbuf + +isim=libmediaart +surum=1.9.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${version:0:3}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static --enable-gdkpixbuf --disable-qt + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmediainfo/talimat b/talimatname/genel/l/libmediainfo/talimat new file mode 100644 index 000000000..f4294a804 --- /dev/null +++ b/talimatname/genel/l/libmediainfo/talimat @@ -0,0 +1,34 @@ +# Tanım: Mediainfo için paylaşılan kütüphane. +# URL: http://mediainfo.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libmms libzen + +isim=libmediainfo +surum=0.7.69 +devir=1 + +kaynak=( http://downloads.sourceforge.net/mediainfo/${isim}_${surum}.tar.bz2) + +derle(){ + cd $SRC/MediaInfoLib/Project/GNU/Library + sh ./autogen + ./configure --prefix=/usr \ + --enable-shared \ + --disable-static \ + --enable-visibility \ + --with-libcurl \ + --with-libmms + make + make DESTDIR=$PKG install + + for i in MediaInfo MediaInfoDLL; do + install -dm755 $PKG/usr/include/$i + install -m644 $SRC/MediaInfoLib/Source/$i/*.h $PKG/usr/include/$i + done + install -dm755 $PKG/usr/lib/pkgconfig + install -m644 $SRC/MediaInfoLib/Project/GNU/Library/libmediainfo.pc \ + $PKG/usr/lib/pkgconfig + sed -i -e 's|Version: |Version: '$surum'|g' \ + $PKG/usr/lib/pkgconfig/libmediainfo.pc +} + diff --git a/talimatname/genel/l/libmicrohttpd/talimat b/talimatname/genel/l/libmicrohttpd/talimat new file mode 100644 index 000000000..65512ec15 --- /dev/null +++ b/talimatname/genel/l/libmicrohttpd/talimat @@ -0,0 +1,21 @@ +# Tanım: gömülü HTTP sunucular oluşturmaya yarar +# URL: http://www.gnu.org/software/libmicrohttpd/ +# Paketçi: milisarge +# Gerekler: libgcrypt gnutls + +isim=libmicrohttpd +surum=0.9.54 +devir=1 +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + CONFIG_SHELL=/bin/bash \ + ./configure \ + --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/info +} diff --git a/talimatname/genel/l/libmikmod/talimat b/talimatname/genel/l/libmikmod/talimat new file mode 100644 index 000000000..8cbe5db0c --- /dev/null +++ b/talimatname/genel/l/libmikmod/talimat @@ -0,0 +1,22 @@ +# Tanım: Taşınabilir bir ses kütüphanesi +# URL: http://mikmod.raphnet.net/ +# Paketçi: milisarge +# Gerekler: xorg-libxtst pulseaudio + +isim=libmikmod +surum=3.3.11 +devir=1 + +kaynak=( http://downloads.sourceforge.net/mikmod/$isim-$surum.tar.gz) + + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --prefix=/usr \ + --disable-static + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libmms/talimat b/talimatname/genel/l/libmms/talimat new file mode 100644 index 000000000..3e3eaead7 --- /dev/null +++ b/talimatname/genel/l/libmms/talimat @@ -0,0 +1,22 @@ +# Tanım: MMS akış protokol kitaplığı +# URL: http://sourceforge.net/projects/libmms/ +# Paketçi: milisarge +# Gerekler: + +isim=libmms +surum=0.6.4 +devir=1 + +kaynak=( +http://download.sourceforge.net/libmms/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/l/libmng/talimat b/talimatname/genel/l/libmng/talimat new file mode 100644 index 000000000..48728d75f --- /dev/null +++ b/talimatname/genel/l/libmng/talimat @@ -0,0 +1,24 @@ +# Tanım: Çoklu-Görüntü Ağ Grafikleri okumak, görüntülemek, yazmak ve incelemek için referans kitaplığı. +# URL: http://sourceforge.net/projects/libmng/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo lcms + +isim=libmng +surum=2.0.3 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +mkdir -p $PKG/usr/{lib,include,share/man/man{3,5}} +make prefix=$PKG/usr install +mkdir -p $PKG/usr/share/man/man{3,5} +install -v -m644 doc/man/*.3 $PKG/usr/share/man/man3 +install -v -m644 doc/man/*.5 $PKG/usr/share/man/man5 +install -v -m755 -d $PKG/usr/share/doc/libmng-$surum +install -v -m644 doc/*.txt \ +$PKG/usr/share/doc/libmng-$surum +} diff --git a/talimatname/genel/l/libmnl/talimat b/talimatname/genel/l/libmnl/talimat new file mode 100644 index 000000000..316402689 --- /dev/null +++ b/talimatname/genel/l/libmnl/talimat @@ -0,0 +1,18 @@ +# Tanım: Netlink geliştiricilerine yönelik minimalist kullanıcı-alanı kütüphanesi +# URL: http://www.netfilter.org/projects/libmnl/ +# Paketçi: milisarge +# Gerekler: + +isim=libmnl +surum=1.0.3 +devir=1 + +kaynak=( +http://www.netfilter.org/projects/$isim/files/$isim-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmodplug/talimat b/talimatname/genel/l/libmodplug/talimat new file mode 100644 index 000000000..ae0d163ad --- /dev/null +++ b/talimatname/genel/l/libmodplug/talimat @@ -0,0 +1,16 @@ +# Tanım: Library for playing module music. +# URL: http://modplug-xmms.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=libmodplug +surum=0.8.8.5 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/modplug-xmms/$isim/$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmp4v2/talimat b/talimatname/genel/l/libmp4v2/talimat new file mode 100644 index 000000000..0c3787022 --- /dev/null +++ b/talimatname/genel/l/libmp4v2/talimat @@ -0,0 +1,17 @@ +# Tanım: MPEG-4 kitaplığı +# URL: http://code.google.com/p/mp4v2 +# Paketçi: milisarge +# Gerekler: + +isim=libmp4v2 +surum=2.0.0 +devir=1 + +kaynak=(https://sources.archlinux.org/other/packages/$isim/mp4v2-${surum}.tar.bz2) + +derle() { + cd mp4v2-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmpcdec/talimat b/talimatname/genel/l/libmpcdec/talimat new file mode 100644 index 000000000..ce9823fba --- /dev/null +++ b/talimatname/genel/l/libmpcdec/talimat @@ -0,0 +1,22 @@ +# Tanım: Musepack kod çözme kütüphanesi +# URL: http://www.musepack.net/index.php?pg=home +# Paketçi: milisarge +# Gerekler: nasm + +isim=libmpcdec +surum=1.2.6 +devir=1 + +kaynak=( http://files.musepack.net/source/$isim-$surum.tar.bz2) + + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install +} + + diff --git a/talimatname/genel/l/libmpeg2/talimat b/talimatname/genel/l/libmpeg2/talimat new file mode 100644 index 000000000..af2d5a897 --- /dev/null +++ b/talimatname/genel/l/libmpeg2/talimat @@ -0,0 +1,20 @@ +# Tanım: MPEG-1 ve MPEG-2 video akışlarını çözmek için kullanılan kitaplık +# URL: http://mpg123.de/ +# Paketçi: milisarge +# Gerekler: + +isim=libmpeg2 +surum=0.5.1 +devir=1 + +kaynak=( http://$isim.sourceforge.net/files/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +sed -i 's/static const/static/' libmpeg2/idct_mmx.c +./configure --prefix=/usr --enable-shared +make +make DESTDIR=$PKG install +install -v -m755 -d $PKG/usr/share/doc/mpeg2dec-$surum +install -v -m644 README doc/libmpeg2.txt \ +$PKG/usr/share/doc/mpeg2dec-$surum +} diff --git a/talimatname/genel/l/libmspack/talimat b/talimatname/genel/l/libmspack/talimat new file mode 100644 index 000000000..d065db897 --- /dev/null +++ b/talimatname/genel/l/libmspack/talimat @@ -0,0 +1,18 @@ +# Tanım: Microsoft sıkıştırma kütüphaneleri +# URL: http://www.cabextract.org.uk/libmspack/ +# Paketçi: milisarge +# Gerekler: + +isim=libmspack +surum=1.5 +devir=1 +kaynak=(https://github.com/kyz/libmspack/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum/$isim/trunk + autoreconf -vfi + ./configure --prefix=/usr --disable-static + make + make check + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/l/libmspub/talimat b/talimatname/genel/l/libmspub/talimat new file mode 100644 index 000000000..0cb7c9bfa --- /dev/null +++ b/talimatname/genel/l/libmspub/talimat @@ -0,0 +1,17 @@ +# Tanım: Microsoft Publisher dosya biçimi ayrıştırıcı kitaplığı (en yeni anlık görüntü) +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libmspub +# Paketçi: Cihan Alkan +# Gerekler: doxygen libwpd boost librevenge icu + +isim=libmspub +surum=0.1.2 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --with-docs + make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmtp/talimat b/talimatname/genel/l/libmtp/talimat new file mode 100644 index 000000000..c6d16961b --- /dev/null +++ b/talimatname/genel/l/libmtp/talimat @@ -0,0 +1,19 @@ +# Tanım: Medya Aktarma Protokolünün kütüphane uygulaması. +# URL: http://libmtp.sourceforge.net +# Paketçi: milisarge +# Gerekler: libusb libgcrypt + +isim=libmtp +surum=1.1.9 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static + make + make -k check + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmusicbrainz2/talimat b/talimatname/genel/l/libmusicbrainz2/talimat new file mode 100644 index 000000000..43f3e8fcd --- /dev/null +++ b/talimatname/genel/l/libmusicbrainz2/talimat @@ -0,0 +1,25 @@ +# Tanım: MusicBrainz Sunucusuna Erişimi Sağlayan Kitaplık +# URL: http://musicbrainz.org/doc/libmusicbrainz +# Paketçi: milisarge +# Gerekler: python + +isim=libmusicbrainz2 +surum=2.1.5 +devir=1 + +kaynak=( ftp://ftp.musicbrainz.org/pub/musicbrainz/historical/libmusicbrainz-$surum.tar.gz + http://www.linuxfromscratch.org/patches/blfs/svn/libmusicbrainz-$surum-missing-includes-1.patch ) + +derle() { +cd libmusicbrainz-$surum +patch -Np1 -i ../libmusicbrainz-$surum-missing-includes-1.patch +./configure --prefix=/usr --disable-static +make +cd python +python setup.py build +cd .. +make DESTDIR=$PKG install +mkdir -p $PKG/usr/share/doc/libmusicbrainz-$surum +install -v -m644 -D docs/mb_howto.txt \ +$PKG/usr/share/doc/libmusicbrainz-$surum/mb_howto.txt +} diff --git a/talimatname/genel/l/libmusicbrainz5/talimat b/talimatname/genel/l/libmusicbrainz5/talimat new file mode 100644 index 000000000..c782981b6 --- /dev/null +++ b/talimatname/genel/l/libmusicbrainz5/talimat @@ -0,0 +1,26 @@ +# Tanım: MusicBrainz Sunucusuna Erişimi Sağlayan Kitaplık +# URL: http://musicbrainz.org/doc/libmusicbrainz +# Paketçi: milisarge +# Gerekler: cmake expat neon doxygen + +isim=libmusicbrainz5 +surum=5.1.0 +devir=1 + +kaynak=( https://github.com/metabrainz/libmusicbrainz/releases/download/release-$surum/libmusicbrainz-$surum.tar.gz) + +derle() { +cd libmusicbrainz-$surum +mkdir build +cd build +cmake .. \ +-DCMAKE_INSTALL_PREFIX:PATH=/usr \ +-DBUILD_SHARED_LIBS:BOOL=ON \ +-DBUILD_STATIC_LIBS:BOOL=OFF +make +doxygen ../Doxyfile +make DESTDIR=$PKG install +# Documentation +mkdir -p $PKG/usr/share/doc/$isim-$surum +cp -vr docs/ $PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/l/libmwaw/talimat b/talimatname/genel/l/libmwaw/talimat new file mode 100644 index 000000000..e7df7a812 --- /dev/null +++ b/talimatname/genel/l/libmwaw/talimat @@ -0,0 +1,17 @@ +# Tanım: Bazı eski mac metin belgeleri için kütüphaneyi içe aktarın. +# URL: https://sourceforge.net/projects/libmwaw/ +# Paketçi: Cihan Alkan +# Gerekler: doxygen boost librevenge + +isim=libmwaw +surum=0.3.12 +devir=1 + +kaynak=(https://sourceforge.net/projects/$isim/files/$isim/$isim-$surum/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libmypaint/gegl-0.4.patch b/talimatname/genel/l/libmypaint/gegl-0.4.patch new file mode 100644 index 000000000..f78b90338 --- /dev/null +++ b/talimatname/genel/l/libmypaint/gegl-0.4.patch @@ -0,0 +1,53 @@ +diff -u -r libmypaint-1.3.0/configure.ac libmypaint-1.3.0-gegl/configure.ac +--- libmypaint-1.3.0/configure.ac 2018-05-13 16:49:44.997077642 +0200 ++++ libmypaint-1.3.0-gegl/configure.ac 2018-05-13 16:49:36.223744476 +0200 +@@ -45,7 +45,7 @@ + + ## Dependencies ## + +-m4_define([gegl_required_version], [0.3]) ++m4_define([gegl_required_version], [0.4]) + m4_define([introspection_required_version], [1.32.0]) + + AC_INIT([libmypaint], +@@ -336,7 +336,7 @@ + ) + + if eval "test x$enable_gegl = xyes"; then +- PKG_CHECK_MODULES(GEGL, gegl-0.3 >= gegl_required_version) ++ PKG_CHECK_MODULES(GEGL, gegl-0.4 >= gegl_required_version) + fi + AM_CONDITIONAL(ENABLE_GEGL, test "x$enable_gegl" = "xyes") + +diff -u -r libmypaint-1.3.0/gegl/libmypaint-gegl.pc.in libmypaint-1.3.0-gegl/gegl/libmypaint-gegl.pc.in +--- libmypaint-1.3.0/gegl/libmypaint-gegl.pc.in 2016-12-01 23:47:14.000000000 +0100 ++++ libmypaint-1.3.0-gegl/gegl/libmypaint-gegl.pc.in 2018-05-13 16:50:16.620410376 +0200 +@@ -6,6 +6,6 @@ + Name: libmypaint + Description: MyPaint brush engine library, with GEGL integration. + Version: @LIBMYPAINT_VERSION@ +-Requires: gegl-0.3 libmypaint ++Requires: gegl-0.4 libmypaint + Cflags: -I${includedir}/libmypaint-gegl + Libs: -L${libdir} -lmypaint-gegl +diff -u -r libmypaint-1.3.0/gegl/Makefile.am libmypaint-1.3.0-gegl/gegl/Makefile.am +--- libmypaint-1.3.0/gegl/Makefile.am 2018-05-13 16:48:53.437078622 +0200 ++++ libmypaint-1.3.0-gegl/gegl/Makefile.am 2018-05-13 16:49:58.523744053 +0200 +@@ -11,7 +11,7 @@ + INTROSPECTION_GIRS = + INTROSPECTION_SCANNER_ARGS = \ + --warn-all \ +- --pkg="gegl-0.3" \ ++ --pkg="gegl-0.4" \ + --pkg="glib-2.0" \ + --namespace="MyPaintGegl" \ + --nsversion="$(LIBMYPAINT_MAJOR_VERSION).$(LIBMYPAINT_MINOR_VERSION)" \ +@@ -38,7 +38,7 @@ + mypaint-gegl-surface.c + + MyPaintGegl-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir: libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.la Makefile +-MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_INCLUDES = GObject-2.0 MyPaint-$(LIBMYPAINT_MAJOR_VERSION).$(LIBMYPAINT_MINOR_VERSION) Gegl-0.3 ++MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_INCLUDES = GObject-2.0 MyPaint-$(LIBMYPAINT_MAJOR_VERSION).$(LIBMYPAINT_MINOR_VERSION) Gegl-0.4 + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_CFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I. -I.. + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_LIBS = libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.la ../libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_FILES = $(introspection_sources) diff --git a/talimatname/genel/l/libmypaint/talimat b/talimatname/genel/l/libmypaint/talimat new file mode 100644 index 000000000..6bbbe306e --- /dev/null +++ b/talimatname/genel/l/libmypaint/talimat @@ -0,0 +1,24 @@ +# Tanım: hızlı ve kolay boyama uygulaması +# URL: http://mypaint.intilinux.com/ +# Paketçi: milisarge +# Gerekler: gobject-introspection json-c gegl intltool python +# Grup: kütüphane + +isim=libmypaint +surum=1.3.0 +devir=2 + +kaynak=(https://github.com/mypaint/libmypaint/archive/v$surum.tar.gz::$isim-$surum.tar.gz + versioning.patch + gegl-0.4.patch) + +derle() +{ + cd ${isim}-$surum + patch -uNp2 < ../versioning.patch + patch -Np1 < ../gegl-0.4.patch + ./autogen.sh + ./configure --prefix=/usr --enable-gegl + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libmypaint/versioning.patch b/talimatname/genel/l/libmypaint/versioning.patch new file mode 100644 index 000000000..56580d49b --- /dev/null +++ b/talimatname/genel/l/libmypaint/versioning.patch @@ -0,0 +1,268 @@ +Combines the following two patches adjusted to work with libmypaint 1.3 +https://github.com/mypaint/libmypaint/commit/0b31421ffbfb5f4a1c68ceeafa292c6ff08e949c +https://github.com/mypaint/libmypaint/commit/08c4236d4c0e871bf6c29f2e42cafd55d1f361ce +This will allow side-by-side installations of different libmypaint builds +at the level of the minor version number. +diff -Naur ./libmypaint-1.3.0.orig/configure.ac ./libmypaint-1.3.0/configure.ac +--- ./libmypaint-1.3.0.orig/configure.ac 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/configure.ac 2017-07-24 10:54:57.297918118 -0400 +@@ -1,27 +1,50 @@ + # AC_OPENMP requires autoconf >= 2.62. + AC_PREREQ(2.62) + ++ ++## Canonical version number components ## ++ + # API version: see https://github.com/mypaint/libmypaint/wiki/Versioning ++# See http://semver.org/ for what this means. ++ + m4_define([libmypaint_api_major], [1]) + m4_define([libmypaint_api_minor], [3]) + m4_define([libmypaint_api_micro], [0]) + m4_define([libmypaint_api_prerelease], []) # may be blank +-# The platform version is "major.minor" only. +-# The full version is "major.minor.micro[-prerelease]". + +-# ABI version see: https://autotools.io/libtool/version.html ++# ABI version. Changes independently of API version. ++# See: https://autotools.io/libtool/version.html + # https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html ++# The rules are fiddly, and are summarized here. ++ + m4_define([libmypaint_abi_revision], [0]) # increment on every release + m4_define([libmypaint_abi_current], [0]) # inc when add/remove/change interfaces + m4_define([libmypaint_abi_age], [0]) # inc only if changes backward compat + +-# Derivative version macros ++ ++## Derivative version macros ## ++ ++# The full version is "major.minor.micro[-prerelease]". ++ + m4_define([libmypaint_version], + [libmypaint_api_major.libmypaint_api_minor.libmypaint_api_micro]) + m4_define([libmypaint_version_full], + [libmypaint_api_major().libmypaint_api_minor().libmypaint_api_micro()m4_bpatsubst(libmypaint_api_prerelease(), [^\(.\)], [-\1])]) + +-# Dependencies. ++# The API "platform" or "intercompatibility" version. ++# ++# This one is used for library name prefixes, for introspection ++# namespace versions, for gettext domains, and basically anything that ++# needs to change when backwards or forwards API compatibility changes. ++# Another way of thinking about it: it allows meaningful side by side ++# installations of libmypaint. ++ ++m4_define([libmypaint_api_platform_version], ++ [libmypaint_api_major.libmypaint_api_minor]) ++ ++ ++## Dependencies ## ++ + m4_define([gegl_required_version], [0.3]) + m4_define([introspection_required_version], [1.32.0]) + +@@ -44,7 +67,8 @@ + LIBMYPAINT_MICRO_VERSION=libmypaint_api_micro + LIBMYPAINT_VERSION=libmypaint_version + LIBMYPAINT_VERSION_FULL=libmypaint_version_full +-LIBMYPAINT_API_PLATFORM_VERSION=libmypaint_api_major.libmypaint_api_minor ++LIBMYPAINT_API_PLATFORM_VERSION=libmypaint_api_platform_version ++LIBMYPAINT_API_PLATFORM_VERSION_UL=m4_bpatsubst(libmypaint_api_platform_version(), [[^A-Za-z0-9]], [_]) + LIBMYPAINT_ABI_VERSION_INFO=libmypaint_abi_current:libmypaint_abi_revision:libmypaint_abi_age + + AC_SUBST(LIBMYPAINT_MAJOR_VERSION) +@@ -54,6 +78,7 @@ + AC_SUBST(LIBMYPAINT_VERSION) + AC_SUBST(LIBMYPAINT_VERSION_FULL) + AC_SUBST(LIBMYPAINT_API_PLATFORM_VERSION) ++AC_SUBST(LIBMYPAINT_API_PLATFORM_VERSION_UL) + AC_SUBST(LIBMYPAINT_ABI_VERSION_INFO) + + AC_PROG_CC +@@ -72,9 +97,8 @@ + # Check for pkg-config + PKG_PROG_PKG_CONFIG(0.16) + +-########################### +-# Check host architecture +-########################### ++ ++## Check host and platform ## + + AC_CANONICAL_HOST + +@@ -273,7 +297,7 @@ + + if test "x$enable_i18n" != "xno"; then + enable_i18n="yes" +- GETTEXT_PACKAGE=libmypaint ++ GETTEXT_PACKAGE=libmypaint-libmypaint_api_platform_version + AC_SUBST(GETTEXT_PACKAGE) + AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", + [The prefix for our gettext translation domains.]) +@@ -321,9 +345,9 @@ + + AC_CONFIG_FILES([ + doc/Makefile +- gegl/libmypaint-gegl.pc:gegl/libmypaint-gegl.pc.in ++ gegl/libmypaint-gegl-]libmypaint_api_platform_version()[.pc:gegl/libmypaint-gegl.pc.in + gegl/Makefile +- libmypaint.pc:libmypaint.pc.in ++ libmypaint-]libmypaint_api_platform_version()[.pc:libmypaint.pc.in + m4macros/Makefile + Makefile + po/Makefile.in +diff -Naur ./libmypaint-1.3.0.orig/gegl/Makefile.am ./libmypaint-1.3.0/gegl/Makefile.am +--- ./libmypaint-1.3.0.orig/gegl/Makefile.am 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/gegl/Makefile.am 2017-07-24 10:54:57.297918118 -0400 +@@ -37,10 +37,10 @@ + ../glib/mypaint-gegl-glib.c \ + mypaint-gegl-surface.c + +-MyPaintGegl-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir: libmypaint-gegl.la Makefile ++MyPaintGegl-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir: libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.la Makefile + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_INCLUDES = GObject-2.0 MyPaint-$(LIBMYPAINT_MAJOR_VERSION).$(LIBMYPAINT_MINOR_VERSION) Gegl-0.3 + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_CFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I. -I.. +-MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_LIBS = libmypaint-gegl.la ../libmypaint.la ++MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_LIBS = libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.la ../libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la + MyPaintGegl_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_FILES = $(introspection_sources) + INTROSPECTION_GIRS += MyPaintGegl-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir + +@@ -56,10 +56,10 @@ + + ## pkg-config file ## + pkgconfigdir = $(libdir)/pkgconfig +-pkgconfig_DATA = libmypaint-gegl.pc ++pkgconfig_DATA = libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.pc + + ## libmypaint-gegl ## +-lib_LTLIBRARIES = libmypaint-gegl.la ++lib_LTLIBRARIES = libmypaint-gegl-@LIBMYPAINT_API_PLATFORM_VERSION@.la + + libmypaint_gegl_publicdir = $(includedir)/libmypaint-gegl + +@@ -70,9 +70,9 @@ + ../glib/mypaint-gegl-glib.c \ + mypaint-gegl-surface.c + +-libmypaint_gegl_la_SOURCES = $(libmypaint_gegl_public_HEADERS) $(LIBMYPAINT_GEGL_SOURCES) ++libmypaint_gegl_@LIBMYPAINT_API_PLATFORM_VERSION@_la_SOURCES = $(libmypaint_gegl_public_HEADERS) $(LIBMYPAINT_GEGL_SOURCES) + +-libmypaint_gegl_la_CFLAGS = $(JSON_CFLAGS) $(GLIB_CFLAGS) $(GEGL_CFLAGS) +-libmypaint_gegl_la_LIBADD = $(top_builddir)/libmypaint.la $(GEGL_LIBS) ++libmypaint_gegl_@LIBMYPAINT_API_PLATFORM_VERSION@_la_CFLAGS = $(JSON_CFLAGS) $(GLIB_CFLAGS) $(GEGL_CFLAGS) ++libmypaint_gegl_@LIBMYPAINT_API_PLATFORM_VERSION@_la_LIBADD = $(top_builddir)/libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la $(GEGL_LIBS) + + endif # enable_gegl +diff -Naur ./libmypaint-1.3.0.orig/.gitignore ./libmypaint-1.3.0/.gitignore +--- ./libmypaint-1.3.0.orig/.gitignore 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/.gitignore 2017-07-24 10:54:57.297918118 -0400 +@@ -39,8 +39,8 @@ + .libs/ + *.lo + +-libmypaint.la +-gegl/libmypaint-gegl.la ++libmypaint-*.la ++gegl/libmypaint-gegl-*.la + + po/*.gmo + po/Makefile* +diff -Naur ./libmypaint-1.3.0.orig/libmypaint.pc.in ./libmypaint-1.3.0/libmypaint.pc.in +--- ./libmypaint-1.3.0.orig/libmypaint.pc.in 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/libmypaint.pc.in 2017-07-24 10:54:57.297918118 -0400 +@@ -8,5 +8,5 @@ + URL: @PACKAGE_URL@ + Version: @LIBMYPAINT_VERSION@ + Requires: @PKG_CONFIG_REQUIRES@ +-Cflags: -I${includedir}/libmypaint +-Libs: -L${libdir} -lmypaint @OPENMP_CFLAGS@ ++Cflags: -I${includedir}/libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@ ++Libs: -L${libdir} -lmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@ @OPENMP_CFLAGS@ +diff -Naur ./libmypaint-1.3.0.orig/Makefile.am ./libmypaint-1.3.0/Makefile.am +--- ./libmypaint-1.3.0.orig/Makefile.am 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/Makefile.am 2017-07-24 10:54:57.297918118 -0400 +@@ -13,7 +13,7 @@ + --warn-all \ + --pkg="glib-2.0" \ + --namespace="MyPaint" \ +- --nsversion="$(LIBMYPAINT_MAJOR_VERSION).$(LIBMYPAINT_MINOR_VERSION)" \ ++ --nsversion="$(LIBMYPAINT_API_PLATFORM_VERSION)" \ + --identifier-prefix="MyPaint" \ + --symbol-prefix="mypaint_" \ + --add-include-path="$(srcdir)" \ +@@ -54,12 +54,13 @@ + mypaint-tiled-surface.c \ + tilemap.c + +-MyPaint-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir: libmypaint.la Makefile +-MyPaint_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_INCLUDES = GObject-2.0 GLib-2.0 +-MyPaint_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_CFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) +-MyPaint_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_LIBS = libmypaint.la +-MyPaint_@LIBMYPAINT_MAJOR_VERSION@_@LIBMYPAINT_MINOR_VERSION@_gir_FILES = $(introspection_sources) +-INTROSPECTION_GIRS += MyPaint-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir ++# CAUTION: some of these need to use the underscored API version string. ++MyPaint-@LIBMYPAINT_API_PLATFORM_VERSION@.gir: libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la Makefile ++MyPaint_@LIBMYPAINT_API_PLATFORM_VERSION_UL@_gir_INCLUDES = GObject-2.0 GLib-2.0 ++MyPaint_@LIBMYPAINT_API_PLATFORM_VERSION_UL@_gir_CFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) ++MyPaint_@LIBMYPAINT_API_PLATFORM_VERSION_UL@_gir_LIBS = libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la ++MyPaint_@LIBMYPAINT_API_PLATFORM_VERSION_UL@_gir_FILES = $(introspection_sources) ++INTROSPECTION_GIRS += MyPaint-@LIBMYPAINT_API_PLATFORM_VERSION@.gir + + girdir = $(datadir)/gir-1.0 + gir_DATA = $(INTROSPECTION_GIRS) +@@ -75,22 +76,23 @@ + + pkgconfigdir = $(libdir)/pkgconfig + +-pkgconfig_DATA = libmypaint.pc ++pkgconfig_DATA = libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.pc + +-## libmypaint ## ++## libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@ ## + + AM_CFLAGS = $(JSON_CFLAGS) $(GLIB_CFLAGS) + + LIBS = $(JSON_LIBS) $(GLIB_LIBS) @LIBS@ + +-lib_LTLIBRARIES = libmypaint.la ++lib_LTLIBRARIES = libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la + +-libmypaint_la_LDFLAGS = \ +- -release @LIBMYPAINT_API_PLATFORM_VERSION@ \ ++libmypaint_@LIBMYPAINT_API_PLATFORM_VERSION@_la_LDFLAGS = \ + -version-info @LIBMYPAINT_ABI_VERSION_INFO@ \ + -no-undefined + +-libmypaint_publicdir = $(includedir)/libmypaint ++# -release @LIBMYPAINT_API_PLATFORM_VERSION@ ++ ++libmypaint_publicdir = $(includedir)/libmypaint-$(LIBMYPAINT_API_PLATFORM_VERSION) + + nobase_libmypaint_public_HEADERS = \ + mypaint-config.h \ +@@ -117,9 +119,9 @@ + tilemap.c \ + utils.c + +-libmypaint_la_SOURCES = $(libmypaint_public_HEADERS) $(LIBMYPAINT_SOURCES) ++libmypaint_@LIBMYPAINT_API_PLATFORM_VERSION@_la_SOURCES = $(libmypaint_public_HEADERS) $(LIBMYPAINT_SOURCES) + +-DISTCLEANFILES = MyPaint-@LIBMYPAINT_MAJOR_VERSION@.@LIBMYPAINT_MINOR_VERSION@.gir.files ++DISTCLEANFILES = MyPaint-@LIBMYPAINT_API_PLATFORM_VERSION@.gir.files + + EXTRA_DIST = \ + brushsettings.json \ +diff -Naur ./libmypaint-1.3.0.orig/tests/Makefile.am ./libmypaint-1.3.0/tests/Makefile.am +--- ./libmypaint-1.3.0.orig/tests/Makefile.am 2016-12-01 17:47:14.000000000 -0500 ++++ ./libmypaint-1.3.0/tests/Makefile.am 2017-07-24 10:54:57.297918118 -0400 +@@ -41,7 +41,7 @@ + LDADD = \ + $(DEPS) \ + libmypaint-tests.a \ +- $(top_builddir)/libmypaint.la ++ $(top_builddir)/libmypaint-@LIBMYPAINT_API_PLATFORM_VERSION@.la + + EXTRA_DIST = \ + brushes/bulk.myb \ diff --git a/talimatname/genel/l/libnatpmp/talimat b/talimatname/genel/l/libnatpmp/talimat new file mode 100644 index 000000000..d874062cd --- /dev/null +++ b/talimatname/genel/l/libnatpmp/talimat @@ -0,0 +1,19 @@ +# Tanım: NAT-PMP protokolunun uygulanması +# URL: http://miniupnp.free.fr/libnatpmp.html +# Paketçi: milisarge +# Gerekler: + +isim=libnatpmp +surum=20150609 +devir=1 +kaynak=(http://miniupnp.tuxfamily.org/files/libnatpmp-20150609.tar.gz +) + +derle() { +cd $isim-$surum + sed -e 's/CFLAGS = /CFLAGS += /' -i Makefile + make + make INSTALLPREFIX="$PKG/usr" INSTALLDIRINC="$PKG/usr/include" install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + install -Dm644 natpmpc.1 "$PKG/usr/share/man/man1/natpmpc.1" +} diff --git a/talimatname/genel/l/libndp/talimat b/talimatname/genel/l/libndp/talimat new file mode 100644 index 000000000..05cac4d08 --- /dev/null +++ b/talimatname/genel/l/libndp/talimat @@ -0,0 +1,19 @@ +# Tanım: Libndp paketi, IPv6 Komşu Bulma Protokolü için bir sarıcı sağlar. +# URL: http://libndp.org +# Paketçi: milisarge +# Gerekler: + +isim=libndp +surum=1.5 +devir=1 + +kaynak=(http://libndp.org/files/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--localstatedir=/var \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnet/talimat b/talimatname/genel/l/libnet/talimat new file mode 100644 index 000000000..088849871 --- /dev/null +++ b/talimatname/genel/l/libnet/talimat @@ -0,0 +1,20 @@ +# Tanım: Ağ paketleri inşa etmek ve enjekte etmek için kütüphane. +# URL: http://libnet-dev.sf.net +# Paketçi: milisarge +# Gerekler: + +isim=libnet +surum=1.1.6 +devir=2 +kaynak=(http://downloads.sourceforge.net/project/libnet-dev/libnet-$surum.tar.gz) + +derle() { + cd $isim-$surum + export CFLAGS=$CFLAGS" -fPIC" + + ./configure --prefix=/usr --mandir=/usr/man + sed -i 's/ sample//g' Makefile + make + make DESTDIR=$PKG install + install -D -m 755 libnet-config $PKG/usr/bin/libnet-config +} diff --git a/talimatname/genel/l/libnetfilter_acct/talimat b/talimatname/genel/l/libnetfilter_acct/talimat new file mode 100644 index 000000000..1f9a3f3c4 --- /dev/null +++ b/talimatname/genel/l/libnetfilter_acct/talimat @@ -0,0 +1,16 @@ +# Tanım: Genişletilmiş hesap altyapısına bağlantı sağlayan kütüphane +# URL: https://www.netfilter.org/projects/libnetfilter_acct/ +# Paketçi: milisarge +# Gerekler: libnfnetlink libmnl + +isim=libnetfilter_acct +surum=1.0.3 +devir=1 +kaynak=(http://www.netfilter.org/projects/libnetfilter_acct/files/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libnetfilter_conntrack/talimat b/talimatname/genel/l/libnetfilter_conntrack/talimat new file mode 100644 index 000000000..bbadb439b --- /dev/null +++ b/talimatname/genel/l/libnetfilter_conntrack/talimat @@ -0,0 +1,17 @@ +# Tanım: Library providing an API to the in-kernel connection tracking state table +# URL: https://www.netfilter.org/projects/libnetfilter_conntrack/ +# Paketçi: milisarge +# Gerekler: libnfnetlink libmnl +# Grup: kütüphane + +isim=libnetfilter_conntrack +surum=1.0.6 +devir=1 +kaynak=(http://www.netfilter.org/projects/libnetfilter_conntrack/files/libnetfilter_conntrack-1.0.6.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libnetfilter_log/talimat b/talimatname/genel/l/libnetfilter_log/talimat new file mode 100644 index 000000000..ccbf5a6d4 --- /dev/null +++ b/talimatname/genel/l/libnetfilter_log/talimat @@ -0,0 +1,18 @@ +# Tanım: kernel paket filtresi tarafından günlüğe kaydedilen paketlere arabirim sağlayan bir kullanıcı alanı kütüphanesi. +# URL: http://netfilter.org/projects/libnetfilter_log/ +# Paketçi: milisarge +# Gerekler: libnfnetlink + +isim=libnetfilter_log +surum=1.0.1 +devir=1 +kaynak=(http://www.netfilter.org/projects/$isim/files/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnfnetlink/sync_with_kernel_headers.patch b/talimatname/genel/l/libnfnetlink/sync_with_kernel_headers.patch new file mode 100644 index 000000000..985b3711e --- /dev/null +++ b/talimatname/genel/l/libnfnetlink/sync_with_kernel_headers.patch @@ -0,0 +1,110 @@ +From 7a1a07c0028a1c88cd7716a058697c552a563b24 Mon Sep 17 00:00:00 2001 +From: Felix Janda <felix.janda@posteo.de> +Date: Sat, 16 May 2015 14:49:07 +0200 +Subject: include: Sync with kernel headers + +Signed-off-by: Felix Janda <felix.janda@posteo.de> +Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> +--- + include/libnfnetlink/linux_nfnetlink.h | 44 ++++----------------------- + include/libnfnetlink/linux_nfnetlink_compat.h | 12 ++++---- + 2 files changed, 12 insertions(+), 44 deletions(-) + +diff --git a/include/libnfnetlink/linux_nfnetlink.h b/include/libnfnetlink/linux_nfnetlink.h +index 76a8550..44a38d6 100644 +--- a/include/libnfnetlink/linux_nfnetlink.h ++++ b/include/libnfnetlink/linux_nfnetlink.h +@@ -25,9 +25,9 @@ enum nfnetlink_groups { + /* General form of address family dependent message. + */ + struct nfgenmsg { +- u_int8_t nfgen_family; /* AF_xxx */ +- u_int8_t version; /* nfnetlink version */ +- u_int16_t res_id; /* resource id */ ++ __u8 nfgen_family; /* AF_xxx */ ++ __u8 version; /* nfnetlink version */ ++ __be16 res_id; /* resource id */ + }; + + #define NFNETLINK_V0 0 +@@ -46,40 +46,8 @@ struct nfgenmsg { + #define NFNL_SUBSYS_CTNETLINK_EXP 2 + #define NFNL_SUBSYS_QUEUE 3 + #define NFNL_SUBSYS_ULOG 4 +-#define NFNL_SUBSYS_COUNT 5 ++#define NFNL_SUBSYS_OSF 5 ++#define NFNL_SUBSYS_IPSET 6 ++#define NFNL_SUBSYS_COUNT 7 + +-#ifdef __KERNEL__ +- +-#include <linux/netlink.h> +-#include <linux/capability.h> +-#include <net/netlink.h> +- +-struct nfnl_callback +-{ +- int (*call)(struct sock *nl, struct sk_buff *skb, +- struct nlmsghdr *nlh, struct nlattr *cda[]); +- const struct nla_policy *policy; /* netlink attribute policy */ +- const u_int16_t attr_count; /* number of nlattr's */ +-}; +- +-struct nfnetlink_subsystem +-{ +- const char *name; +- __u8 subsys_id; /* nfnetlink subsystem ID */ +- __u8 cb_count; /* number of callbacks */ +- const struct nfnl_callback *cb; /* callback for individual types */ +-}; +- +-extern int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n); +-extern int nfnetlink_subsys_unregister(const struct nfnetlink_subsystem *n); +- +-extern int nfnetlink_has_listeners(unsigned int group); +-extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, +- int echo); +-extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags); +- +-#define MODULE_ALIAS_NFNL_SUBSYS(subsys) \ +- MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys)) +- +-#endif /* __KERNEL__ */ + #endif /* _NFNETLINK_H */ +diff --git a/include/libnfnetlink/linux_nfnetlink_compat.h b/include/libnfnetlink/linux_nfnetlink_compat.h +index e145176..74b9e55 100644 +--- a/include/libnfnetlink/linux_nfnetlink_compat.h ++++ b/include/libnfnetlink/linux_nfnetlink_compat.h +@@ -1,6 +1,8 @@ + #ifndef _NFNETLINK_COMPAT_H + #define _NFNETLINK_COMPAT_H +-#ifndef __KERNEL__ ++ ++#include <linux/types.h> ++ + /* Old nfnetlink macros for userspace */ + + /* nfnetlink groups: Up to 32 maximum */ +@@ -18,10 +20,9 @@ + * ! nfnetlink use the same attributes methods. - J. Schulist. + */ + +-struct nfattr +-{ +- u_int16_t nfa_len; +- u_int16_t nfa_type; /* we use 15 bits for the type, and the highest ++struct nfattr { ++ __u16 nfa_len; ++ __u16 nfa_type; /* we use 15 bits for the type, and the highest + * bit to indicate whether the payload is nested */ + }; + +@@ -57,5 +58,4 @@ struct nfattr + + NLMSG_ALIGN(sizeof(struct nfgenmsg)))) + #define NFM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct nfgenmsg)) + +-#endif /* ! __KERNEL__ */ + #endif /* _NFNETLINK_COMPAT_H */ +-- +cgit v0.12 + diff --git a/talimatname/genel/l/libnfnetlink/talimat b/talimatname/genel/l/libnfnetlink/talimat new file mode 100644 index 000000000..533b9fc05 --- /dev/null +++ b/talimatname/genel/l/libnfnetlink/talimat @@ -0,0 +1,18 @@ +# Tanım: Netfilter kernel/userspace iletişim kütüphnesi +# URL: http://www.netfilter.org/projects/libnfnetlink/index.html +# Paketçi: milisarge +# Gerekler: + +isim=libnfnetlink +surum=1.0.1 +devir=1 +kaynak=(http://www.netfilter.org/projects/$isim/files/$isim-$surum.tar.bz2 + sync_with_kernel_headers.patch) + +derle() { + cd $isim-$surum + patch -p1 -i $SRC/sync_with_kernel_headers.patch + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnfs-python/talimat b/talimatname/genel/l/libnfs-python/talimat new file mode 100644 index 000000000..ac4fdbf1f --- /dev/null +++ b/talimatname/genel/l/libnfs-python/talimat @@ -0,0 +1,16 @@ +# Tanım: Python libnfs bağlamları +# URL: https://github.com/sahlberg/libnfs-python +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools python python-setuptools libnfs swig + +isim=libnfs-python +surum=git +devir=1 + +kaynak=(https://github.com/sahlberg/$isim/archive/master.zip::$isim-${surum}-$devir.tar.gz) + +derle() { + cd $isim-master + python2 setup.py install --prefix=/usr --root=$PKG + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/l/libnfs/talimat b/talimatname/genel/l/libnfs/talimat new file mode 100644 index 000000000..24992fea2 --- /dev/null +++ b/talimatname/genel/l/libnfs/talimat @@ -0,0 +1,17 @@ +# Tanım: NFS paylaşımlarına erişim için istemci kütüphanesi +# URL: https://github.com/sahlberg/libnfs +# Paketçi: milisarge +# Gerekler: + +isim=libnfs +surum=2.0.0 +devir=1 +kaynak=(https://github.com/sahlberg/libnfs/archive/libnfs-2.0.0.tar.gz) + +derle() { + cd "$isim-$isim-$surum" + autoreconf -vif + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libnftnl/talimat b/talimatname/genel/l/libnftnl/talimat new file mode 100644 index 000000000..293048a42 --- /dev/null +++ b/talimatname/genel/l/libnftnl/talimat @@ -0,0 +1,18 @@ +# Tanım: Nf_tables alt sistemine arabirim sağlayan Netfilter kütüphanesi +# URL: http://netfilter.org/projects/libnftnl/ +# Paketçi: milisarge +# Gerekler: libmnl + +isim=libnftnl +surum=1.0.3 +devir=1 + +kaynak=(http://netfilter.org/projects/libnftnl/files/libnftnl-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make check + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnice/talimat b/talimatname/genel/l/libnice/talimat new file mode 100644 index 000000000..4c325136c --- /dev/null +++ b/talimatname/genel/l/libnice/talimat @@ -0,0 +1,19 @@ +# Tanım: IETF'nin ICE taslağının bir uygulaması (p2p UDP veri akışları için) +# URL: http://people.suug.ch/~tgr/libnl +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: glib gstreamer1-plugins-base + +isim=libnice +surum=0.1.13 +devir=1 + +kaynak=(http://nice.freedesktop.org/releases/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--without-gstreamer-0.10 \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnih/talimat b/talimatname/genel/l/libnih/talimat new file mode 100644 index 000000000..3a0f78568 --- /dev/null +++ b/talimatname/genel/l/libnih/talimat @@ -0,0 +1,17 @@ +# Tanım: C uygulaması geliştirme için küçük kütüphane. +# URL: https://launchpad.net/libnih +# Paketçi: Cihan_Alkan +# Gerekler: dbus +# Grup: kütüphane + +isim=libnih +surum=1.0.3 +devir=1 +kaynak=(https://launchpad.net/libnih/1.0/${surum}/+download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG"/ install +} diff --git a/talimatname/genel/l/libnl/talimat b/talimatname/genel/l/libnl/talimat new file mode 100644 index 000000000..0855c3c59 --- /dev/null +++ b/talimatname/genel/l/libnl/talimat @@ -0,0 +1,18 @@ +# Tanım: Netlink soketleri ile ilgili uygulamalar için kitaplık +# URL: http://people.suug.ch/~tgr/libnl +# Paketçi: milisarge +# Gerekler: + +isim=libnl +surum=3.2.27 +devir=1 + +kaynak=(https://github.com/thom311/libnl/releases/download/libnl$(echo $surum|sed 's/\./_/g')/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libnotify/talimat b/talimatname/genel/l/libnotify/talimat new file mode 100644 index 000000000..76db436f7 --- /dev/null +++ b/talimatname/genel/l/libnotify/talimat @@ -0,0 +1,19 @@ +# Tanım: Masaüstü bildirim kitaplığı +# URL: http://www.galago-project.org/news/index.php +# Paketçi: milisarge +# Gerekler: gobject-introspection gdk-pixbuf gtk3 + +isim=libnotify +surum=0.7.6 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share +} + diff --git a/talimatname/genel/l/libntru/talimat b/talimatname/genel/l/libntru/talimat new file mode 100644 index 000000000..bd6b6201a --- /dev/null +++ b/talimatname/genel/l/libntru/talimat @@ -0,0 +1,16 @@ +# Tanım: NTRUEncrypt C de yazılmışı +# URL: https://github.com/tbuktu/libntru +# Paketçi: milisarge +# Gerekler: + +isim=libntru +surum=0.4.1 +devir=1 +kaynak=(https://github.com/tbuktu/libntru/archive/${surum}.tar.gz) + +derle() { + cd "${SRC}/libntru-${surum}" + make -f Makefile.linux + make -f Makefile.linux install DESTDIR="${PKG}" + rm -r "${PKG}/usr/share" +} diff --git a/talimatname/genel/l/liboauth/talimat b/talimatname/genel/l/liboauth/talimat new file mode 100644 index 000000000..cf8e7ceb9 --- /dev/null +++ b/talimatname/genel/l/liboauth/talimat @@ -0,0 +1,19 @@ +# Tanım: Http://oauth.net/ protokolünün bir POSIX-C uygulaması. LibOauth, URL'leri kodlamak ve HTTP istek verisini oAuth standardına göre imzalamak için işlevsellik sağlar. +# URL: http://sourceforge.net/projects/liboauth +# Paketçi: milisarge +# Gerekler: curl nss + +isim=liboauth +surum=1.0.3 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libodfgen/talimat b/talimatname/genel/l/libodfgen/talimat new file mode 100644 index 000000000..68efbbbf3 --- /dev/null +++ b/talimatname/genel/l/libodfgen/talimat @@ -0,0 +1,17 @@ +# Tanım: Open Document Format'da belge üretmek için kütüphane +# URL: http://sourceforge.net/p/libwpd/wiki/libodfgen/ +# Paketçi: Cihan Alkan +# Gerekler: boost doxygen libwpd libwpg librevenge + +isim=libodfgen +surum=0.1.6 +devir=1 + +kaynak=(http://sourceforge.net/projects/libwpd/files/libodfgen/libodfgen-$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libofa/libofa-0.9.3-curl-7.21.patch b/talimatname/genel/l/libofa/libofa-0.9.3-curl-7.21.patch new file mode 100644 index 000000000..d23351860 --- /dev/null +++ b/talimatname/genel/l/libofa/libofa-0.9.3-curl-7.21.patch @@ -0,0 +1,11 @@ +diff -ru libofa-0.9.3.orig//examples/protocol.cpp libofa-0.9.3//examples/protocol.cpp +--- libofa-0.9.3.orig//examples/protocol.cpp 2006-05-10 20:05:42.000000000 +0200 ++++ libofa-0.9.3//examples/protocol.cpp 2011-07-22 19:02:30.687109297 +0200 +@@ -12,7 +12,6 @@ + #include <map> + #include <expat.h> + #include <curl/curl.h> +-#include <curl/types.h> + #include <curl/easy.h> + + using namespace std; diff --git a/talimatname/genel/l/libofa/libofa-0.9.3-gcc-4.7.patch b/talimatname/genel/l/libofa/libofa-0.9.3-gcc-4.7.patch new file mode 100644 index 000000000..c5ab09876 --- /dev/null +++ b/talimatname/genel/l/libofa/libofa-0.9.3-gcc-4.7.patch @@ -0,0 +1,22 @@ +diff -up libofa-0.9.3/examples/uselame.cpp.gcc47 libofa-0.9.3/examples/uselame.cpp +--- libofa-0.9.3/examples/uselame.cpp.gcc47 2012-01-14 09:35:24.343146853 -0600 ++++ libofa-0.9.3/examples/uselame.cpp 2012-01-14 09:35:49.956826634 -0600 +@@ -12,6 +12,7 @@ + #else + #include <sys/wait.h> + #endif ++#include <unistd.h> + + AudioData *loadWaveFile(char *file); + +diff -up libofa-0.9.3/examples/wavefile.cpp.gcc47 libofa-0.9.3/examples/wavefile.cpp +--- libofa-0.9.3/examples/wavefile.cpp.gcc47 2012-01-14 09:35:24.344146841 -0600 ++++ libofa-0.9.3/examples/wavefile.cpp 2012-01-14 16:00:54.414981160 -0600 +@@ -11,6 +11,7 @@ + #include "io.h" + #endif + #include <fcntl.h> ++#include <unistd.h> + + static bool readBytes(int fd, unsigned char *buf, int size) { + int ct = 0; diff --git a/talimatname/genel/l/libofa/libofa-gcc4.3.patch b/talimatname/genel/l/libofa/libofa-gcc4.3.patch new file mode 100644 index 000000000..f68f42bfb --- /dev/null +++ b/talimatname/genel/l/libofa/libofa-gcc4.3.patch @@ -0,0 +1,35 @@ +diff -ur libofa-0.9.3.orig/examples/example.cpp libofa-0.9.3/examples/example.cpp +--- libofa-0.9.3.orig/examples/example.cpp 2006-05-10 21:05:37.000000000 +0300 ++++ libofa-0.9.3/examples/example.cpp 2008-04-16 15:51:49.000000000 +0300 +@@ -9,6 +9,8 @@ + + #include "protocol.h" + ++#include <string.h> ++ + AudioData* loadWaveFile(char *file); + AudioData* loadDataUsingLAME(char *file); + +Vain hakemistossa libofa-0.9.3/examples: example.cpp.orig +diff -ur libofa-0.9.3.orig/examples/protocol.cpp libofa-0.9.3/examples/protocol.cpp +--- libofa-0.9.3.orig/examples/protocol.cpp 2006-05-10 21:05:42.000000000 +0300 ++++ libofa-0.9.3/examples/protocol.cpp 2008-04-16 15:51:49.000000000 +0300 +@@ -8,6 +8,7 @@ + -------------------------------------------------------------------*/ + #include <stdio.h> + #include <stdlib.h> ++#include <cstring> + #include <string> + #include <map> + #include <expat.h> +diff -ur libofa-0.9.3.orig/lib/signal_op.cpp libofa-0.9.3/lib/signal_op.cpp +--- libofa-0.9.3.orig/lib/signal_op.cpp 2006-05-10 21:01:12.000000000 +0300 ++++ libofa-0.9.3/lib/signal_op.cpp 2008-04-16 15:51:49.000000000 +0300 +@@ -12,6 +12,7 @@ + // DATE CREATED: 1/12/06 + + ++#include <cstdlib> + #include <math.h> + #include "signal_op.h" + #include "AFLIB/aflibConverter.h" diff --git a/talimatname/genel/l/libofa/libofa-gcc4.5.patch b/talimatname/genel/l/libofa/libofa-gcc4.5.patch new file mode 100644 index 000000000..44f437d5b --- /dev/null +++ b/talimatname/genel/l/libofa/libofa-gcc4.5.patch @@ -0,0 +1,10 @@ +--- libofa-0.9.3/examples/example.cpp~ 2010-05-19 18:07:19.517650317 +0200 ++++ libofa-0.9.3/examples/example.cpp 2010-05-19 18:07:31.754317472 +0200 +@@ -6,6 +6,7 @@ + No rights reserved. + + -------------------------------------------------------------------*/ ++#include <cstdio> + + #include "protocol.h" + diff --git a/talimatname/genel/l/libofa/libofa-gcc4.patch b/talimatname/genel/l/libofa/libofa-gcc4.patch new file mode 100644 index 000000000..d1059bafa --- /dev/null +++ b/talimatname/genel/l/libofa/libofa-gcc4.patch @@ -0,0 +1,39 @@ +--- lib/JAMA/tnt_math_utils.h.orig 2006-06-17 01:46:22.000000000 +0300 ++++ lib/JAMA/tnt_math_utils.h 2006-06-17 01:47:02.000000000 +0300 +@@ -20,11 +20,20 @@ + namespace TNT + { + /** ++ @returns the absolute value of a real (no-complex) scalar. ++*/ ++template <class Real> ++Real abs(const Real &a) ++{ ++ return (a > 0 ? a : -a); ++} ++/** + @returns hypotenuse of real (non-complex) scalars a and b by + avoiding underflow/overflow + using (a * sqrt( 1 + (b/a) * (b/a))), rather than + sqrt(a*a + b*b). + */ ++ + template <class Real> + Real hypot(const Real &a, const Real &b) + { +@@ -56,15 +65,6 @@ + } + */ + +-/** +- @returns the absolute value of a real (no-complex) scalar. +-*/ +-template <class Real> +-Real abs(const Real &a) +-{ +- return (a > 0 ? a : -a); +-} +- + } + #endif + /* MATH_UTILS_H */ diff --git a/talimatname/genel/l/libofa/talimat b/talimatname/genel/l/libofa/talimat new file mode 100644 index 000000000..89b6c2745 --- /dev/null +++ b/talimatname/genel/l/libofa/talimat @@ -0,0 +1,31 @@ +# Tanım: MusicIP tarafından açık kaynaklı bir ses parmak izi +# URL: https://github.com/tanob/libofa +# Paketçi: Cihan_Alkan +# Gerekler: fftw +# Grup: kütüphane + +isim=libofa +surum=0.9.3 +devir=1 + +kaynak=(https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/musicip-libofa/libofa-$surum.tar.gz + libofa-gcc4.patch + libofa-gcc4.3.patch + libofa-gcc4.5.patch + libofa-0.9.3-curl-7.21.patch + libofa-0.9.3-gcc-4.7.patch) + +derle() { + + cd ${isim}-${surum} + patch -p0 -i "${SRC}/libofa-gcc4.patch" + patch -p1 -i "${SRC}/libofa-gcc4.3.patch" + patch -p1 -i "${SRC}/libofa-gcc4.5.patch" + patch -p1 -i "${SRC}/libofa-0.9.3-gcc-4.7.patch" + patch -p1 -i "${SRC}/libofa-0.9.3-curl-7.21.patch" + + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + install -D -m644 COPYING "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/l/libogg/talimat b/talimatname/genel/l/libogg/talimat new file mode 100644 index 000000000..8aadad25c --- /dev/null +++ b/talimatname/genel/l/libogg/talimat @@ -0,0 +1,22 @@ +# Tanım: Ogg bit akışı ve çerçeveleme kitaplığı +# URL: http://xiph.org/ogg/ +# Paketçi: milisarge +# Gerekler: + +isim=libogg +surum=1.3.2 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/ogg/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --docdir=/usr/share/doc/libogg-$surum \ + --disable-static + make + make DESTDIR=$PKG install +} + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/l/liboobs/talimat b/talimatname/genel/l/liboobs/talimat new file mode 100644 index 000000000..064be8673 --- /dev/null +++ b/talimatname/genel/l/liboobs/talimat @@ -0,0 +1,17 @@ +# Tanım: Sistem-araçları backend'lerine GObject tabanlı arayüz - paylaşılan kütüphane +# URL: http://libopenraw.freedesktop.org/wiki/Exempi +# Paketçi: milisarge +# Gerekler: system-tools-backends + +isim=liboobs +surum=3.0.0 +devir=1 + +kaynak=(ftp://ftp.gnome.org/pub/GNOME/sources/liboobs/3.0/$isim-$surum.tar.gz ) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libopenraw/talimat b/talimatname/genel/l/libopenraw/talimat new file mode 100644 index 000000000..e6aaccd3a --- /dev/null +++ b/talimatname/genel/l/libopenraw/talimat @@ -0,0 +1,16 @@ +# Tanım: Raw dosyalarının çözülmesi için kütüphane +# URL: http://libopenraw.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: boost libxml2 gdk-pixbuf + +isim=libopenraw +surum=0.1.0 +devir=1 +kaynak=(https://libopenraw.freedesktop.org/download/$isim-$surum.tar.bz2) + +derle() { + cd $isim-${surum} + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/liborcus/talimat b/talimatname/genel/l/liborcus/talimat new file mode 100644 index 000000000..7033c8582 --- /dev/null +++ b/talimatname/genel/l/liborcus/talimat @@ -0,0 +1,19 @@ +# Tanım: Elektronik tablo belgelerinin dosya içe aktarma filtresi kütüphanesi. +# URL: https://gitlab.com/orcus/orcus/blob/master/README.md +# Paketçi: Cihan Alkan +# Gerekler: libwpd boost mdds libixion + +isim=liborcus +surum=0.13.3 +devir=1 + +kaynak=(https://kohei.us/files/orcus/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + [ ! -f /usr/lib/pkgconfig/python3.pc ] && ln -s /usr/lib/pkgconfig/python-3.5.pc /usr/lib/pkgconfig/python3.pc + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + rm -f /usr/lib/pkgconfig/python3.pc +} diff --git a/talimatname/genel/l/libosinfo/talimat b/talimatname/genel/l/libosinfo/talimat new file mode 100644 index 000000000..2c9beaa12 --- /dev/null +++ b/talimatname/genel/l/libosinfo/talimat @@ -0,0 +1,19 @@ +# Tanım: İşletim Sistemi bilgi veritabanı +# URL: http://libosinfo.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: glib libxslt gobject-introspection intltool libsoup vala check + +isim=libosinfo +surum=1.0.0 +devir=1 + +kaynak=(https://releases.pagure.org/libosinfo/$isim-$surum.tar.gz{,.asc}) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --with-usb-ids-path=/usr/share/hwdata/usb.ids \ + --with-pci-ids-path=/usr/share/hwdata/pci.ids + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libotr/talimat b/talimatname/genel/l/libotr/talimat new file mode 100644 index 000000000..3398f6c5a --- /dev/null +++ b/talimatname/genel/l/libotr/talimat @@ -0,0 +1,18 @@ +# Tanım: OTR mesajlaşma, sohbet mesajı üzerinden özel konuşmalar yapmanıza olanak tanır. +# URL: http://www.cypherpunks.ca/otr/ +# Paketçi: milisarge +# Gerekler: libusb libgcrypt + +isim=libotr +surum=4.1.1 +devir=1 + +kaynak=( https://otr.cypherpunks.ca/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpagemaker/talimat b/talimatname/genel/l/libpagemaker/talimat new file mode 100644 index 000000000..b0fa1a1d2 --- /dev/null +++ b/talimatname/genel/l/libpagemaker/talimat @@ -0,0 +1,19 @@ +# Tanım: Aldus/Adobe PageMaker belgelerinin dosya biçimini ayrıştıran bir kitaplık +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libpagemaker +# Paketçi: Cihan Alkan +# Gerekler: librevenge boost + +isim=libpagemaker +surum=0.0.3 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + install -Dm644 COPYING $PKG/usr/share/licenses/$isim/COPYING +} diff --git a/talimatname/genel/l/libpaper/run-parts b/talimatname/genel/l/libpaper/run-parts new file mode 100644 index 000000000..e3134d216 --- /dev/null +++ b/talimatname/genel/l/libpaper/run-parts @@ -0,0 +1,48 @@ +#!/bin/sh +# run-parts: Runs all the scripts found in a directory. +# from Slackware, by Patrick J. Volkerding with ideas borrowed +# from the Red Hat and Debian versions of this utility. + +# keep going when something fails +set +e + +if [ $# -lt 1 ]; then + echo "Usage: run-parts <directory>" + exit 1 +fi + +if [ ! -d $1 ]; then + echo "Not a directory: $1" + echo "Usage: run-parts <directory>" + exit 1 +fi + +# There are several types of files that we would like to +# ignore automatically, as they are likely to be backups +# of other scripts: +IGNORE_SUFFIXES="~ ^ , .bak .new .rpmsave .rpmorig .rpmnew .swp" + +# Main loop: +for SCRIPT in $1/* ; do + # If this is not a regular file, skip it: + if [ ! -f $SCRIPT ]; then + continue + fi + # Determine if this file should be skipped by suffix: + SKIP=false + for SUFFIX in $IGNORE_SUFFIXES ; do + if [ ! "$(basename $SCRIPT $SUFFIX)" = "$(basename $SCRIPT)" ]; then + SKIP=true + break + fi + done + if [ "$SKIP" = "true" ]; then + continue + fi + # If we've made it this far, then run the script if it's executable: + if [ -x $SCRIPT ]; then + $SCRIPT || echo "$SCRIPT failed." + fi +done + +exit 0 diff --git a/talimatname/genel/l/libpaper/talimat b/talimatname/genel/l/libpaper/talimat new file mode 100644 index 000000000..09550cafd --- /dev/null +++ b/talimatname/genel/l/libpaper/talimat @@ -0,0 +1,26 @@ +# Tanım: Uygulamalar için bir sistem / kullanıcı tarafından belirtilen kağıt boyutuna dayalı işlemleri basit bir şekilde yapabilirsiniz. +# URL: http://ftp.debian.org/debian/pool/main/libp/libpaper +# Paketçi: milisarge +# Gerekler: + +isim=libpaper +surum=1.1.24 +devir=1 + +kaynak=(http://ftp.debian.org/debian/pool/main/libp/libpaper/$isim\_$surum+nmu4.tar.gz + run-parts) + +derle() { + + cd $isim-$surum+nmu4 + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static + make + make DESTDIR=$PKG install + + cp -v $SRC/run-parts $PKG/usr/bin/ + chmod -v 755 $PKG/usr/bin/run-parts + +} diff --git a/talimatname/genel/l/libpcap/libpcap.kur-kos b/talimatname/genel/l/libpcap/libpcap.kur-kos new file mode 100644 index 000000000..2255d77ac --- /dev/null +++ b/talimatname/genel/l/libpcap/libpcap.kur-kos @@ -0,0 +1 @@ +ln -s /usr/include/pcap/bpf.h /usr/include/net/bpf.h diff --git a/talimatname/genel/l/libpcap/talimat b/talimatname/genel/l/libpcap/talimat new file mode 100644 index 000000000..066f3f75e --- /dev/null +++ b/talimatname/genel/l/libpcap/talimat @@ -0,0 +1,19 @@ +# Tanım: Kullanıcı düzeyinde paket yakalamak için sistemden bağımsız bir arayüz +# URL: http://www.tcpdump.org +# Paketçi: milisarge +# Gerekler: libnl libusb + +isim=libpcap +surum=1.7.4 +devir=1 + +kaynak=(http://www.tcpdump.org/release/$isim-$surum.tar.gz +http://www.linuxfromscratch.org/patches/downloads/libpcap/$isim-$surum-enable_bluetooth-1.patch) +derle() { +cd $isim-$surum +patch -Np1 -i ../libpcap-$surum-enable_bluetooth-1.patch +./configure --prefix=/usr --enable-ipv6 +make +sed -i '/INSTALL_DATA.*libpcap.a\|RANLIB.*libpcap.a/ s/^/#/' Makefile +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpeas/libpeas.kur-kos b/talimatname/genel/l/libpeas/libpeas.kur-kos new file mode 100755 index 000000000..5078fa193 --- /dev/null +++ b/talimatname/genel/l/libpeas/libpeas.kur-kos @@ -0,0 +1 @@ +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor diff --git a/talimatname/genel/l/libpeas/talimat b/talimatname/genel/l/libpeas/talimat new file mode 100644 index 000000000..ef8d64a0c --- /dev/null +++ b/talimatname/genel/l/libpeas/talimat @@ -0,0 +1,18 @@ +# Tanım: Gobject tabanlı eklenti motoru +# URL: https://wiki.gnome.org/Projects/Libpeas +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk-doc intltool python-gobject glade gobject-introspection gnome-common gtk3 + +isim=libpeas +surum=1.20.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libpgf/talimat b/talimatname/genel/l/libpgf/talimat new file mode 100644 index 000000000..bd2e79333 --- /dev/null +++ b/talimatname/genel/l/libpgf/talimat @@ -0,0 +1,19 @@ +# Tanım: Aşamalı Grafik Dosyasının (PGF) bir uygulaması +# URL: http://www.libpgf.org +# Paketçi: milisarge +# Gerekler: dos2unix + +isim=libpgf +surum=7.15.32 +devir=1 + +kaynak=(http://sourceforge.net/projects/$isim/files/$isim/$surum-latest/libPGF-codec-and-console-src.zip) + +derle() { + cd $SRC/PGF/Codec + dos2unix configure.ac + sh ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpgm/talimat b/talimatname/genel/l/libpgm/talimat new file mode 100644 index 000000000..ebb64d7cf --- /dev/null +++ b/talimatname/genel/l/libpgm/talimat @@ -0,0 +1,19 @@ +# Tanım: OpenPGM: implementation of the Pragmatic General Multicast (PGM, RFC3208) +# URL: https://www.freshports.org/net/openpgm/ +# Paketçi: milisarge +# Gerekler: python + +isim=libpgm +surum=5.2.122 +devir=1 +kaynak=(https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/openpgm/$isim-$surum.tar.gz +) + +derle() { + cd "$SRC/$isim-$surum/openpgm/pgm" + find . -type f -exec sed -i 's/python/python2/g' {} \+ + cd "$SRC/$isim-$surum/openpgm/pgm" + ./configure --prefix=/usr + make + make prefix="$PKG/usr" install +} diff --git a/talimatname/genel/l/libpng/talimat b/talimatname/genel/l/libpng/talimat new file mode 100644 index 000000000..b04ed57ae --- /dev/null +++ b/talimatname/genel/l/libpng/talimat @@ -0,0 +1,22 @@ +# Tanım: Diğer programlar tarafından PNG dosyalarını okuma ve yazma için kullanılan kütüphaneler. +# URL: http://www.libpng.org/pub/png/libpng.html +# Paketçi: milisarge +# Gerekler: + +isim=libpng +surum=1.6.29 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum.tar.xz \ + http://downloads.sourceforge.net/project/apng/libpng/libpng16/$isim-$surum-apng.patch.gz) + +derle() { +cd $isim-$surum +gzip -cd ../$isim-$surum-apng.patch.gz | patch -p0 +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpng12/talimat b/talimatname/genel/l/libpng12/talimat new file mode 100644 index 000000000..6dcb1ccaa --- /dev/null +++ b/talimatname/genel/l/libpng12/talimat @@ -0,0 +1,21 @@ +# Tanım: PNG formatlı grafik dosyalarını oluşturmak için kullanılan bir dizi rutin +# URL: http://www.libpng.org/pub/png/libpng.html +# Paketçi: Cihan Alkan +# Gerekler: glibc + +isim=libpng12 +surum=1.2.57 +devir=1 +kaynak=(https://sourceforge.net/projects/libpng/files/libpng-$surum.tar.xz +https://sourceforge.net/projects/apng/files/libpng/libpng12/libpng-$surum-apng.patch.gz) + +derle() { + cd libpng-$surum +#patch -Np0 -i $SRC/libpng-$surum-apng.patch + ./configure --prefix='/usr' + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/{bin,include,lib/{libpng.{a,so},pkgconfig},share} + + install -Dm 644 LICENSE -t $PKG/usr/share/licenses/libpng12/ +} diff --git a/talimatname/genel/l/libproxy/talimat b/talimatname/genel/l/libproxy/talimat new file mode 100644 index 000000000..43aa2eb8a --- /dev/null +++ b/talimatname/genel/l/libproxy/talimat @@ -0,0 +1,25 @@ +# Tanım: Otomatik proxy konfigürasyon yönetimi sağlayan bir kütüphane +# URL: http://libproxy.github.io/libproxy/ +# Paketçi: milisarge +# Gerekler: cmake networkmanager python perl glib webkitgtk3 + +isim=libproxy +surum=0.4.15 +devir=1 + +kaynak=(https://github.com/libproxy/libproxy/archive/$surum.tar.gz) + +derle() { +mkdir build +cd build +cmake ../${isim}-${surum} \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIBEXEC_INSTALL_DIR=/usr/lib/libproxy \ + -DCMAKE_SKIP_RPATH=ON \ + -DPERL_VENDORINSTALL=yes \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_WEBKIT3=ON \ + -DWITH_MOZJS=ON +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpst/talimat b/talimatname/genel/l/libpst/talimat new file mode 100644 index 000000000..1dbe6f6cc --- /dev/null +++ b/talimatname/genel/l/libpst/talimat @@ -0,0 +1,18 @@ +# Tanım: Outlook .pst dosya çeviricisi +# URL: http://www.five-ten-sg.com/libpst/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: python boost libgsf + +isim=libpst +surum=0.6.67 +devir=1 + +kaynak=(http://www.five-ten-sg.com/libpst/packages/${isim}-${surum}.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --mandir=/usr/share/man \ + --disable-static --enable-libpst-shared --disable-dii +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libpwquality/talimat b/talimatname/genel/l/libpwquality/talimat new file mode 100644 index 000000000..8a19f0bb8 --- /dev/null +++ b/talimatname/genel/l/libpwquality/talimat @@ -0,0 +1,20 @@ +# Tanım: Şifre kalite kontrolü ve rastgele şifreler üreten kütüphane. +# URL: https://fedorahosted.org/libpwquality/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: python cracklib + +isim=libpwquality +surum=1.3.0 +devir=1 + +kaynak=(https://fedorahosted.org/releases/l/i/libpwquality/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +PYTHON=python2 ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --with-python-rev=2.7 +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libqmi/talimat b/talimatname/genel/l/libqmi/talimat new file mode 100644 index 000000000..f54d96c6e --- /dev/null +++ b/talimatname/genel/l/libqmi/talimat @@ -0,0 +1,19 @@ +# Tanım: WWAN modemleri ve Qualcomm MSM Arayüz protokolünü konuşan cihazlarla konuşmak için. +# URL: http://www.freedesktop.org/software/libqmi/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: glib libmbim + +isim=libqmi +surum=1.12.6 +devir=1 + +kaynak=( http://www.freedesktop.org/software/libqmi/libqmi-$surum.tar.xz) + +derle() { +cd libqmi-$surum +./configure --prefix=/usr \ + --disable-static + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libqtxdg/talimat b/talimatname/genel/l/libqtxdg/talimat new file mode 100644 index 000000000..60f67ee75 --- /dev/null +++ b/talimatname/genel/l/libqtxdg/talimat @@ -0,0 +1,21 @@ +# Tanım: Freedesktop.org'u sağlayan kütüphane Qt için XDG teknik özellikleri uygulamaları +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: cmake gtk2 +# Grup: lxqt + +isim=libqtxdg +surum=3.2.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libquvi-scripts/talimat b/talimatname/genel/l/libquvi-scripts/talimat new file mode 100644 index 000000000..a05733006 --- /dev/null +++ b/talimatname/genel/l/libquvi-scripts/talimat @@ -0,0 +1,17 @@ +# Tanım: video linklerini ayrıştıran betikler +# URL: http://quvi.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: lua + +isim=libquvi-scripts +surum=0.9.20131130 +devir=1 +kaynak=(https://downloads.sourceforge.net/sourceforge/quvi/$isim-$surum.tar.xz) + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr --mandir=/usr/man --with-nsfw --with-nlfy + make + make DESTDIR=$PKG install + rm -rf $(find $PKG/usr/share -name README) +} diff --git a/talimatname/genel/l/libquvi/talimat b/talimatname/genel/l/libquvi/talimat new file mode 100644 index 000000000..f159be62e --- /dev/null +++ b/talimatname/genel/l/libquvi/talimat @@ -0,0 +1,17 @@ +# Tanım: video linklerini ayrıştıran kütüphane +# URL: http://quvi.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libquvi-scripts lua51 libproxy +# Grup: kütüphane + +isim=libquvi +surum=0.9.4 +devir=1 +kaynak=(https://downloads.sourceforge.net/sourceforge/quvi/${isim}-${surum}.tar.xz) + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr --mandir=/usr/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/librangetree/talimat b/talimatname/genel/l/librangetree/talimat new file mode 100644 index 000000000..78beead25 --- /dev/null +++ b/talimatname/genel/l/librangetree/talimat @@ -0,0 +1,16 @@ +# Tanım: librangetree kitaplığı +# URL: https://github.com/clbr/librangetree +# Paketçi: milisarge +# Gerekler: + +isim=librangetree +surum=1.3.1 +devir=1 + +kaynak=(https://github.com/clbr/librangetree/archive/v$surum.tar.gz) + +derle() { + cd "${isim}-$surum" + make -j1 + make install DESTDIR="${PKG}" +} diff --git a/talimatname/genel/l/libraw/talimat b/talimatname/genel/l/libraw/talimat new file mode 100644 index 000000000..6f16889cc --- /dev/null +++ b/talimatname/genel/l/libraw/talimat @@ -0,0 +1,18 @@ +# Tanım: Dijital fotoğraf kameralarından elde edilen RAW dosyaları okumak için (CRW / CR2, NEF, RAF, DNG, vb.) +# URL: http://www.libraw.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libjpeg-turbo jasper lcms2 + +isim=libraw +surum=0.17.0 +devir=1 + +kaynak=(http://www.libraw.org/data/LibRaw-$surum.tar.gz) + +derle() +{ +cd LibRaw-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libre/talimat b/talimatname/genel/l/libre/talimat new file mode 100644 index 000000000..3bc384875 --- /dev/null +++ b/talimatname/genel/l/libre/talimat @@ -0,0 +1,17 @@ +# Tanım: Gerçek zamanlı iletişim için asenkron kütüphane desteği +# Url: http://www.creytiv.com/re.html +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libre +surum=0.5.6 +devir=1 +kaynak=(http://www.creytiv.com/pub/re-$surum.tar.gz) + +derle() { + cd re-$surum + make RELEASE=1 + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/librecad/talimat b/talimatname/genel/l/librecad/talimat new file mode 100644 index 000000000..b09f578e9 --- /dev/null +++ b/talimatname/genel/l/librecad/talimat @@ -0,0 +1,54 @@ +# Tanım: QCad topluluk baskısına dayalı 2D bir CAD çizim aracı +# URL: http://www.librecad.org/ +# Paketçi: Oltulu +# Gerekler: qt5 boost librsvg imagemagick +# Grup: grafik_tasarım + +isim=librecad +surum=2.1.3 +devir=1 + +kaynak=(https://github.com/LibreCAD/LibreCAD/archive/${surum}.tar.gz::$isim.$surum.tar.gz) + +derle() { + cd "${SRC}/LibreCAD-${surum}" + + # fix version string + sed -i "/^SCMREVISION/c SCMREVISION=\"${surum}\"" librecad/src/src.pro + + qmake-qt5 librecad.pro + + # fix include path... this is an issue with gcc 6.1.1 and qmake-qt5... + make qmake_all + sed -i '/INCPATH/s|-isystem /usr/include ||' librecad/src/Makefile + + make + + # executables + install -D -m0755 unix/librecad "${PKG}/usr/bin/librecad" + install -D -m0755 unix/ttf2lff "${PKG}/usr/bin/ttf2lff" + + # desktop dosyası ve man sayfası + install -D -m0644 desktop/librecad.desktop "${PKG}/usr/share/applications/librecad.desktop" + install -D -m0644 desktop/librecad.1 "${PKG}/usr/share/man/man1/librecad.1" + + # belgeler + install -D -m0644 librecad/support/doc/README "${PKG}/usr/share/doc/librecad/index.README" + install -D -m0644 librecad/support/doc/index.html "${PKG}/usr/share/doc/librecad/index.html" + install -D -m0644 librecad/support/doc/style.css "${PKG}/usr/share/doc/librecad/style.css" + install -D -m0644 librecad/support/doc/img/librecadlogo.png "${PKG}/usr/share/doc/librecad/img/librecadlogo.png" + + # simgeler + for SIZE in 16 24 32 48 64 96 128; do + convert -scale ${SIZE} \ + desktop/graphics_icons_and_splash/Icon\ LibreCAD/Icon_Librecad.svg \ + ${SRC}/librecad.png + install -D -m0644 ${SRC}/librecad.png "${PKG}/usr/share/icons/hicolor/${SIZE}x${SIZE}/apps/librecad.png" + done + install -D -m0644 desktop/graphics_icons_and_splash/Icon\ LibreCAD/Icon_Librecad.svg "${PKG}/usr/share/icons/hicolor/scalable/apps/librecad.svg" + + # kaynaklar + mkdir -p "${PKG}/usr/share/librecad/" + cp -r unix/resources/{library,patterns,fonts,qm} "${PKG}/usr/share/librecad/" + /usr/lib/qt5/bin/lrelease ${SRC}/LibreCAD-${surum}/librecad/ts/librecad_tr.ts -qm $PKG/usr/share/librecad/qm/librecad_tr.qm +} diff --git a/talimatname/genel/l/librem/talimat b/talimatname/genel/l/librem/talimat new file mode 100644 index 000000000..1d3014e2c --- /dev/null +++ b/talimatname/genel/l/librem/talimat @@ -0,0 +1,17 @@ +# Tanım: Gerçek zamanlı sesli ve video iletişim için kütüphane +# Url: http://www.creytiv.com/rem.html +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=librem +surum=0.5.2 +devir=1 +kaynak=(http://www.creytiv.com/pub/rem-$surum.tar.gz) + +derle() { + cd rem-$surum + make RELEASE=1 + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libreoffice-bin/libreoffice-bin.kur-kos b/talimatname/genel/l/libreoffice-bin/libreoffice-bin.kur-kos new file mode 100644 index 000000000..fc27cfd84 --- /dev/null +++ b/talimatname/genel/l/libreoffice-bin/libreoffice-bin.kur-kos @@ -0,0 +1,2 @@ +[ -f /usr/bin/xdg-desktop-menu ] && /usr/bin/xdg-desktop-menu forceupdate +[ -f /usr/bin/update-desktop-database ] && /usr/bin/update-desktop-database /usr/share/applications diff --git a/talimatname/genel/l/libreoffice-bin/talimat b/talimatname/genel/l/libreoffice-bin/talimat new file mode 100644 index 000000000..528058219 --- /dev/null +++ b/talimatname/genel/l/libreoffice-bin/talimat @@ -0,0 +1,57 @@ +# Tanım: Tam özellikli çapraz platform ofis paketi (ikili) +# URL: http://www.libreoffice.org +# Paketçi: milisarge +# Gerekler: cups xorg-libxaw xorg-libxcursor xorg-libxft xorg-libxinerama xorg-libxi xorg-libxrandr dbus-glib krb5 +# Grup: ofis + +isim=libreoffice-bin +isimp=libreoffice +surum=6.0.0 +devir=1 +kaynak=(http://tdf.c3sl.ufpr.br/libreoffice/stable/6.0.0/rpm/x86_64/LibreOffice_6.0.0_Linux_x86-64_rpm.tar.gz) + + +derle() { + local workd="$SRC/tmp_work" + mkdir $workd + + cd LibreOffice_${surum}*/RPMS + for rpm in *.rpm; do + bsdtar -p -o -C $workd -xf $rpm + done + + bsdtar -p -o -C $workd -xf \ + $isimp${surum%.*}*.noarch.rpm + + cd $workd + mkdir -p $PKG/usr/lib/$isimp + mv opt/$isimp*/* $PKG/usr/lib/$isimp + + cd $PKG/usr/lib/$isimp + ln -sf basis${surum%.*} basis-link + + mkdir -p $PKG/usr/bin + local programs=(sbase scalc sdraw simpress smath soffice spadmin swriter) + for program in ${programs[@]}; do + ln -sf /usr/lib/$isimp/program/$program $PKG/usr/bin/$program + done + + mkdir -p $PKG/usr/share/applications + cd $PKG/usr/lib/$isimp/share/xdg/ + + for desktop in *.desktop; do + sed -i '/^Exec=/s/libreoffice[^ ]*/soffice/' $desktop + ln -sf /usr/lib/$isimp/share/xdg/$desktop $PKG/usr/share/applications/$desktop + done + + mv $workd/usr/share/{mime,icons} $PKG/usr/share + + find $PKG \(\ + -inamep '*readme*' -o \ + -inamep '*changelog*' -o \ + -namep '*TODO*' -o \ + -inamep '*news*' -o \ + -inamep '*license*' -o \ + -inamep '*credits*' \ + \) -exec rm -rf '{}' \; || true +} diff --git a/talimatname/genel/l/libreoffice/libreoffice.kur-kos b/talimatname/genel/l/libreoffice/libreoffice.kur-kos new file mode 100644 index 000000000..f7fe3c732 --- /dev/null +++ b/talimatname/genel/l/libreoffice/libreoffice.kur-kos @@ -0,0 +1,9 @@ +_l="/etc/login.defs" +_p="/etc/passwd" +l=$(grep "^UID_MIN" $_l) +l1=$(grep "^UID_MAX" $_l) +users=(`awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $1 }' "$_p"`) +for user in "${users[@]}"; do +cp -r /tmp/libreoffice "/home/$user/.config/" +sudo chmod -R 777 /home/$user/.config/libreoffice +done diff --git a/talimatname/genel/l/libreoffice/talimat b/talimatname/genel/l/libreoffice/talimat new file mode 100644 index 000000000..d0edcde21 --- /dev/null +++ b/talimatname/genel/l/libreoffice/talimat @@ -0,0 +1,134 @@ +# Tanım: Ofis Programı +# URL: http://www.libreoffice.org/ +# Paketçi: Cihan Alkan +# Gerekler: hunspell python3 libwpd neon pango nspr clucene openjdk xmlsec libodfgen libwps libvisio libcdr libmspub libmwaw libe-book libabw libzmf libpagemaker libcmis cppunit libtommath graphite2 harfbuzz redland raptor hyphen mythes lpsolve libexttextcat liborcus beanshell libpng cairo apache-ant junit libetonyek openldap sane bluez poppler cups libatomic-ops gperf gtk2 gtk3 perl-archive-zip perl-xml-parser boost expat gstreamer-plugins-base gstreamer1-plugins-base libgsf librsvg libxml2 libxslt nss postgresql icu gsfonts dejavu-ttf npapi-sdk serf unixodbc xdg-utils desktop-file-utils +# Grup: ofis_düzenleyici + +isim=libreoffice +surum=6.0.4.2 +_surum=6.0.4 +devir=1 + +kaynak=(https://download.documentfoundation.org/libreoffice/src/${_surum}/$isim-$surum.tar.xz + https://download.documentfoundation.org/libreoffice/src/${_surum}/$isim-dictionaries-$surum.tar.xz + https://download.documentfoundation.org/libreoffice/src/${_surum}/$isim-help-$surum.tar.xz + https://download.documentfoundation.org/libreoffice/src/${_surum}/$isim-translations-$surum.tar.xz + https://kaynaklar.milislinux.org/libreofis-milis-ekler.tar.xz) + +derle() { + unset ACLOCAL + export LO_PREFIX=/usr + + #cd $SRC + #tar -xf $isim-$surum.tar.xz --no-overwrite-dir + + cd $isim-$surum + + install -dm755 external/tarballs + ln -sv $SRC/$isim-dictionaries-$surum.tar.xz external/tarballs/ + ln -sv $SRC/$isim-help-$surum.tar.xz external/tarballs/ + ln -sv $SRC/$isim-translations-$surum.tar.xz external/tarballs/ + + + sed -e "/gzip -f/d" \ + -e "s|.1.gz|.1|g" \ + -i bin/distro-install-desktop-integration + + sed -e "/distro-install-file-lists/d" -i Makefile.in + + + chmod -v +x bin/unpack-sources + +./autogen.sh --prefix=$LO_PREFIX \ + --sysconfdir=/etc \ + --with-vendor="Milis Linux" \ + --with-lang="tr" \ + --with-help \ + --with-myspell-dicts \ + --with-alloc=system \ + --without-junit \ + --without-system-dicts \ + --disable-dconf \ + --enable-odk \ + --with-jdk-home="/opt/jdk" \ + --with-ant-home="/opt/ant" \ + --disable-firebird-sdbc \ + --enable-release-build=yes \ + --enable-python=system \ + --with-system-apr \ + --with-system-boost \ + --with-system-clucene \ + --with-system-cairo \ + --with-system-curl \ + --with-system-expat \ + --with-system-icu \ + --with-system-jpeg \ + --with-system-lcms2 \ + --with-system-libatomic_ops \ + --with-system-libpng \ + --with-system-libxml \ + --with-system-libodfgen \ + --with-system-libmwaw \ + --with-system-libetonyek \ + --with-system-libvisio \ + --with-system-libcmis \ + --with-system-libmspub \ + --with-system-libexttextcat \ + --with-system-orcus \ + --with-system-liblangtag \ + --with-system-neon \ + --with-system-nss \ + --with-system-odbc \ + --with-system-openldap \ + --with-system-openssl \ + --with-system-poppler \ + --with-system-postgresql \ + --with-system-redland \ + --with-system-serf \ + --with-system-zlib \ + --with-system-beanshell \ + --with-system-cppunit\ + --with-system-graphite\ + --with-system-harfbuzz\ + --with-system-glm \ + --with-system-libwpg \ + --with-system-libwps \ + --with-system-libzmf \ + --with-system-gpgmepp \ + --with-parallelism=$(getconf _NPROCESSORS_ONLN) + make -i build-nocheck + make -i DESTDIR=$PKG distro-pack-install + + install -v -m755 -d $PKG/$LO_PREFIX/share/appdata + install -v -m644 sysui/desktop/appstream-appdata/*.xml $PKG/$LO_PREFIX/share/appdata + + # Sözlük kurulumu + chown -cR 0:0 dictionaries/ + for lang in en + do + mkdir -pv $PKG/$LO_PREFIX/lib/libreoffice/share/extensions/dict-$lang + cp -R dictionaries/$lang/* $PKG/$LO_PREFIX/lib/libreoffice/share/extensions/dict-$lang + done + + # Bu sembolik bağ, masaüstü menü girdileri için gereklidir + ln -sv -f $LO_PREFIX/lib/libreoffice/program/soffice \ + $PKG/usr/bin/libreoffice + + # Simgeler + for res in 16 32 48 128 256 + do + mkdir -p $PKG/$LO_PREFIX/share/icons/hicolor/${res}x${res}/{apps,mimetypes} + cp sysui/desktop/icons/hicolor/${res}x${res}/apps/*.png \ + $PKG/$LO_PREFIX/share/icons/hicolor/${res}x${res}/apps + cp sysui/desktop/icons/hicolor/${res}x${res}/mimetypes/*.png \ + $PKG/$LO_PREFIX/share/icons/hicolor/${res}x${res}/mimetypes + done + + rm -rf $PKG/gid* + cp -R $SRC/flat_logo.svg $PKG/usr/lib/libreoffice/program/flat_logo.svg + cp -R $SRC/intro.png $PKG/usr/lib/libreoffice/program/intro.png + cp -R $SRC/*.desktop $PKG/usr/lib/libreoffice/share/xdg/ + mkdir -p $PKG/tmp + mv $SRC/libreoffice $PKG/tmp/ +} + diff --git a/talimatname/genel/l/librep/talimat b/talimatname/genel/l/librep/talimat new file mode 100644 index 000000000..80169a2bb --- /dev/null +++ b/talimatname/genel/l/librep/talimat @@ -0,0 +1,20 @@ +# Tanım: Librep paketi bir Lisp sistemi içeriyor. +# URL: http://librep.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libffi + +isim=librep +surum=0.92.5 +devir=2 + +kaynak=(http://download.tuxfamily.org/$isim/${isim}_$surum.tar.xz) + +derle() { +export CFLAGS="$CFLAGS -std=gnu90" +cd ${isim}_$surum +./configure --prefix=/usr \ +--disable-static +make || make -j1 +make prefix=$PKG/usr install +rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/l/librest/talimat b/talimatname/genel/l/librest/talimat new file mode 100644 index 000000000..8f6590bc2 --- /dev/null +++ b/talimatname/genel/l/librest/talimat @@ -0,0 +1,21 @@ +# Tanım: "RESTful" olduğunu söyleyen internet servislerine daha kolay erişmenizi sağlar. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: libsoup gobject-introspection + +isim=librest +surum=0.8.1 +devir=1 + +kaynak=(https://git.gnome.org/browse/librest/snapshot/librest-$surum.tar.xz) + +derle() { +cd librest-$surum +NOCONFIGURE=1 ./autogen.sh +./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --with-ca-certificates=/etc/ssl/certs +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/librevenge/talimat b/talimatname/genel/l/librevenge/talimat new file mode 100644 index 000000000..31d71f755 --- /dev/null +++ b/talimatname/genel/l/librevenge/talimat @@ -0,0 +1,15 @@ +# Tanım: Librevenge, belge içe aktarma filtreleri yazmak için kullanılan bir temel kitaplıktır. +# URL: http://sf.net/p/libwpd/librevenge/ +# Paketçi: milisarge +# Gerekler: boost cppunit doxygen + +isim=librevenge +surum=0.0.4 +devir=1 +kaynak=(http://sourceforge.net/projects/libwpd/files/$isim/$isim-$surum/$isim-$surum.tar.xz) +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libringclient/talimat b/talimatname/genel/l/libringclient/talimat new file mode 100644 index 000000000..96761d057 --- /dev/null +++ b/talimatname/genel/l/libringclient/talimat @@ -0,0 +1,22 @@ +# Tanım: Client communication library for ring.cx (formerly known as SFLphone) +# URL: https://ring.cx +# Paketçi: milisarge +# Gerekler: cmake qt5 ring-daemon + +isim=libringclient +surum=git +devir=1 +kaynak=(https://github.com/savoirfairelinux/ring-lrc/archive/master.tar.gz::$isim-git-$devir.tar.gz) + +derle() { + cd "ring-lrc-master" + mkdir -p build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + + make + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/l/librsvg/librsvg.kur-kos b/talimatname/genel/l/librsvg/librsvg.kur-kos new file mode 100644 index 000000000..a08e4b155 --- /dev/null +++ b/talimatname/genel/l/librsvg/librsvg.kur-kos @@ -0,0 +1 @@ +/usr/bin/gdk-pixbuf-query-loaders --update-cache diff --git a/talimatname/genel/l/librsvg/talimat b/talimatname/genel/l/librsvg/talimat new file mode 100644 index 000000000..3ca5e30c2 --- /dev/null +++ b/talimatname/genel/l/librsvg/talimat @@ -0,0 +1,18 @@ +# Tanım: Ölçeklenebilir Vektör Grafikleri işlemek, değiştirmek ve görüntülemek için kullanılan kütüphane ve araçlar. +# URL: http://librsvg.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: gdk-pixbuf libcroco pango vala + +isim=librsvg +surum=2.40.13 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--enable-vala +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsamplerate/talimat b/talimatname/genel/l/libsamplerate/talimat new file mode 100644 index 000000000..127d313d2 --- /dev/null +++ b/talimatname/genel/l/libsamplerate/talimat @@ -0,0 +1,18 @@ +# Tanım: Secret Rabbit Code (aka libsamplerate), ses için örnek bir hız dönüştürücüsüdür. +# URL: http://www.mega-nerd.com/SRC/index.html +# Paketçi: pierre at nutyx dot org +# Gerekler: libsndfile flac + +isim=libsamplerate +surum=0.1.8 +devir=1 + +kaynak=(http://www.mega-nerd.com/SRC/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make htmldocdir=/usr/share/doc/libsamplerate-$surum \ + DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libseccomp/talimat b/talimatname/genel/l/libseccomp/talimat new file mode 100644 index 000000000..ddbdae571 --- /dev/null +++ b/talimatname/genel/l/libseccomp/talimat @@ -0,0 +1,19 @@ +# Tanım: Geliştirilmiş seccomp kitaplığı +# URL: http://sourceforge.net/projects/libseccomp/ +# Paketçi: milisarge +# Gerekler: + +isim=libseccomp +surum=2.1.1 +devir=1 + +kaynak=( +http://downloads.sourceforge.net/project/$isim/$isim-$surum/$isim-$surum.tar.gz) + + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsecp256k1/talimat b/talimatname/genel/l/libsecp256k1/talimat new file mode 100644 index 000000000..3d8230875 --- /dev/null +++ b/talimatname/genel/l/libsecp256k1/talimat @@ -0,0 +1,36 @@ +# Tanım: Optimized C library for EC operations on curve secp256k1 +# URL: https://github.com/bitcoin-core/secp256k1 +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libsecp256k1 +surum=git +devir=1 +kaynak=(https://github.com/bitcoin-core/secp256k1/archive/master.tar.gz::$isim-git-$devir.tar.gz) + +derle() { + cd "secp256k1-master" + ./autogen.sh + ./configure \ + --prefix=/usr \ + --sbindir=/usr/bin \ + --libexecdir=/usr/bin \ + --sysconfdir=/etc \ + --sharedstatedir=/usr/share/libsecp256k1 \ + --localstatedir=/var/lib/libsecp256k1 \ + --disable-static \ + --disable-benchmark \ + --disable-coverage \ + --enable-module-recovery \ + --disable-jni \ + --enable-tests \ + --enable-exhaustive-tests \ + --disable-openssl-tests \ + --with-gnu-ld + make + make check + install -Dm 644 COPYING -t "$PKG/usr/share/licenses/libsecp256k1" + install -Dm 644 README.md -t "$PKG/usr/share/doc/libsecp256k1" + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libsecret/talimat b/talimatname/genel/l/libsecret/talimat new file mode 100644 index 000000000..a85a17576 --- /dev/null +++ b/talimatname/genel/l/libsecret/talimat @@ -0,0 +1,20 @@ +# Tanım: Secret Service API'sına erişmek için GObject tabanlı kütüphane. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: intltool libxslt docbook-xsl glib gobject-introspection libgcrypt vala gtk-doc + +isim=libsecret +surum=0.18.5 +devir=1 + +kaynak=(https://git.gnome.org/browse/libsecret/snapshot/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --disable-static --enable-gtk-doc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/l/libselinux/libselinux.tmpfiles.d b/talimatname/genel/l/libselinux/libselinux.tmpfiles.d new file mode 100644 index 000000000..b2aaf2e4c --- /dev/null +++ b/talimatname/genel/l/libselinux/libselinux.tmpfiles.d @@ -0,0 +1 @@ +d /run/setrans 0755 root root diff --git a/talimatname/genel/l/libselinux/talimat b/talimatname/genel/l/libselinux/talimat new file mode 100644 index 000000000..4ad87856c --- /dev/null +++ b/talimatname/genel/l/libselinux/talimat @@ -0,0 +1,27 @@ +# Tanım: SELinux kitaplığı ve basit araçları +# URL: http://userspace.selinuxproject.org" +# Paketçi: yasarciv67@gmail.com +# Gerekler: python3 python libsepol pcre + + +isim=libselinux +surum=2.4 +devir=1 + +kaynak=(https://raw.githubusercontent.com/wiki/SELinuxProject/selinux/files/releases/20150202/${isim}-${surum}.tar.gz + libselinux.tmpfiles.d) +derle() { +cd ${isim}-${surum} + sed -i 's|pkg-config --cflags ruby|pkg-config --cflags ruby-$(RUBYLIBVER)|' src/Makefile + sed -i 's|site_ruby|vendor_ruby|' src/Makefile + #make swigify + make all + #make PYTHON=python2 pywrap + #make PYTHON=python3 pywrap + #make rubywrap +make DESTDIR=${PKG} USRBINDIR=${PKG}/usr/bin LIBDIR=${PKG}/usr/lib SHLIBDIR=${PKG}/usr/lib install +#make DESTDIR=${PKG} USRBINDIR=${PKG}/usr/bin LIBDIR=${PKG}/usr/lib SHLIBDIR=${PKG}/usr/lib PYTHON=python2 install-pywrap +#make DESTDIR=${PKG} USRBINDIR=${PKG}/usr/bin LIBDIR=${PKG}/usr/lib SHLIBDIR=${PKG}/usr/lib PYTHON=python3 install-pywrap +#make DESTDIR=${PKG} USRBINDIR=${PKG}/usr/bin LIBDIR=${PKG}/usr/lib SHLIBDIR=${PKG}/usr/lib install-rubywrap +install -Dm 0644 ${SRC}/libselinux.tmpfiles.d ${PKG}/usr/lib/tmpfiles.d/libselinux.conf +} diff --git a/talimatname/genel/l/libsepol/talimat b/talimatname/genel/l/libsepol/talimat new file mode 100644 index 000000000..949f3b84b --- /dev/null +++ b/talimatname/genel/l/libsepol/talimat @@ -0,0 +1,15 @@ +# Tanım: SELinux ikili politika manipülasyon kütüphanesi +# URL: http://userspace.selinuxproject.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: + +isim=libsepol +surum=2.4 +devir=1 + +kaynak=(https://raw.githubusercontent.com/wiki/SELinuxProject/selinux/files/releases/20150202/${isim}-${surum}.tar.gz) +derle() { + cd ${isim}-${surum} + make + make DESTDIR=${PKG} LIBDIR=${PKG}/usr/lib SHLIBDIR=${PKG}/usr/lib install +} diff --git a/talimatname/genel/l/libsexy/talimat b/talimatname/genel/l/libsexy/talimat new file mode 100644 index 000000000..f26156940 --- /dev/null +++ b/talimatname/genel/l/libsexy/talimat @@ -0,0 +1,21 @@ +# Tanım: İyi widget'lara yaramaz şeyler yapıyor. +# URL: http://chipx86.com/wiki/Libsexy +# Paketçi: Cihan_Alkan +# Gerekler: gtk2 libxml2 iso-codes +# Grup: kütüphane + +isim=libsexy +surum=0.1.11 +devir=1 + +kaynak=(http://releases.chipx86.com/libsexy/libsexy/${isim}-${surum}.tar.gz) + +derle() { + + cd ${isim}-${surum} + ./configure --prefix=/usr --disable-static + make + make DESTDIR=${PKG} install + + rm -f ${PKG}/usr/lib/libsexy.a +} diff --git a/talimatname/genel/l/libsexymm/talimat b/talimatname/genel/l/libsexymm/talimat new file mode 100644 index 000000000..a6edc85dd --- /dev/null +++ b/talimatname/genel/l/libsexymm/talimat @@ -0,0 +1,19 @@ +# Tanım: Libsexy için C ++ bağları +# URL: http://osiris.chipx86.com/projects/libsexy +# Paketçi: Cihan_Alkan +# Gerekler: libsexy gtkmm +# Grup: kütüphane + +isim=libsexymm +surum=0.1.9 +devir=1 + +kaynak=(http://releases.chipx86.com/libsexy/libsexymm/${isim}-${surum}.tar.gz) + +derle() { + + cd ${isim}-${surum} + ./configure --prefix=/usr || return 1 + make || return 1 + make DESTDIR="${PKG}" install || return 1 +} diff --git a/talimatname/genel/l/libshout/talimat b/talimatname/genel/l/libshout/talimat new file mode 100644 index 000000000..77d863bb4 --- /dev/null +++ b/talimatname/genel/l/libshout/talimat @@ -0,0 +1,17 @@ +# Tanım: Shoutcast / icecast sunucusuna erişmek için kullanılan kitaplık +# URL: http://www.icecast.org/ +# Paketçi: milisarge +# Gerekler: libvorbis libtheora speex + +isim=libshout +surum=2.4.1 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsigc++/talimat b/talimatname/genel/l/libsigc++/talimat new file mode 100644 index 000000000..4c0c3788d --- /dev/null +++ b/talimatname/genel/l/libsigc++/talimat @@ -0,0 +1,17 @@ +# Tanım: Libsigc ++ paketi, standart C ++ için tip öncesi bir geri arama sistemi uygular. +# URL: http://libsigc.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=libsigc++ +surum=2.6.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsignon-glib/talimat b/talimatname/genel/l/libsignon-glib/talimat new file mode 100644 index 000000000..05bbd3d5c --- /dev/null +++ b/talimatname/genel/l/libsignon-glib/talimat @@ -0,0 +1,22 @@ +# Tanım: Hesap kimlik doğrulamasını yürüten uygulamalar için GLib tabanlı istemci kitaplığı +# URL: https://gitlab.com/accounts-sso/libsignon-glib +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: signond python-gobject gobject-introspection + +isim=libsignon-glib +surum=1.14 +devir=1 + +PKGMK_KEEP_SOURCES="no" + +kaynak=(https://gitlab.com/accounts-sso/libsignon-glib/repository/archive.tar.gz) + +derle() { +cd libsignon-glib* + ./autogen.sh + ./configure --prefix=/usr \ + --localstatedir=/var \ + --sysconfdir=/etc + make -j1 + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsigsegv/talimat b/talimatname/genel/l/libsigsegv/talimat new file mode 100644 index 000000000..06fdd855b --- /dev/null +++ b/talimatname/genel/l/libsigsegv/talimat @@ -0,0 +1,22 @@ +# Tanım: Kullanıcı modunda sayfa hatalarını işleme. +# URL: http://ftp.debian.org/debian/pool/main/libp/libpaper +# Paketçi: milisarge +# Gerekler: + +isim=libsigsegv +surum=2.11 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/libsigsegv/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr \ + --enable-shared \ + --disable-static + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/l/libsndfile/talimat b/talimatname/genel/l/libsndfile/talimat new file mode 100644 index 000000000..753e38d3c --- /dev/null +++ b/talimatname/genel/l/libsndfile/talimat @@ -0,0 +1,19 @@ +# Tanım: Örneklenmiş ses içeren dosyaları okumak ve yazmak için bir C kütüphanesi +# URL: http://www.mega-nerd.com/libsndfile/ +# Paketçi: milisarge +# Gerekler: flac alsa-lib libogg libvorbis + +isim=libsndfile +surum=1.0.25 +devir=1 + +kaynak=( http://www.mega-nerd.com/$isim/files/$isim-$surum.tar.gz) + +derle() { +cd $isim-* +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG htmldocdir=/usr/share/doc/libsndfile-$surum install +} diff --git a/talimatname/genel/l/libsodium/talimat b/talimatname/genel/l/libsodium/talimat new file mode 100644 index 000000000..81747a801 --- /dev/null +++ b/talimatname/genel/l/libsodium/talimat @@ -0,0 +1,18 @@ +# Tanım: Sodium, şifreleme, şifre çözme, imzalar, şifre karması ve daha fazlası için modern, kullanımı kolay bir yazılım kütüphanesi. +# URL: http://doc.libsodium.org/ +# Paketçi: milisarge +# Gerekler: + +isim=libsodium +surum=master +devir=1 +kaynak=(https://github.com/jedisct1/$isim/archive/$surum.tar.gz) + +derle() { + mv $DERLEME_KAYNAKDIZIN/$surum.tar.gz $DERLEME_KAYNAKDIZIN/$isim-$surum.tar.gz + cd $isim-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libsoundio/talimat b/talimatname/genel/l/libsoundio/talimat new file mode 100644 index 000000000..dffeefc87 --- /dev/null +++ b/talimatname/genel/l/libsoundio/talimat @@ -0,0 +1,29 @@ +# Tanım: Çapraz platform ses girişi ve çıkışı sağlayan bir C99 kütüphanesi +# URL: http://www.github.com/andrewrk/libsoundio +# Paketçi: Cihan_Alkan +# Gerekler: cmake jack +# Grup: kütüphane + +isim=libsoundio +surum=1.1.0 +devir=1 +kaynak=(https://github.com/andrewrk/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + mkdir -p "$isim-$surum.build" + cd "$isim-$surum.build" + cmake \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_INSTALL_PREFIX=/usr \ + -D CMAKE_INSTALL_LIBDIR=lib \ + -D BUILD_EXAMPLE_PROGRAMS=OFF \ + -D BUILD_TESTS=OFF \ + -D BUILD_STATIC_LIBS=OFF \ + -D ENABLE_JACK=ON \ + "$SRC/$isim-$surum" + make + cd $SRC + make \ + -C "$isim-$surum.build" \ + install DESTDIR="$PKG" +} diff --git a/talimatname/genel/l/libsoup-22/talimat b/talimatname/genel/l/libsoup-22/talimat new file mode 100644 index 000000000..52e4453e6 --- /dev/null +++ b/talimatname/genel/l/libsoup-22/talimat @@ -0,0 +1,20 @@ +# Tanım: GNOME için HTTP istemci/sunucu kitaplığı +# URL: https://wiki.gnome.org/LibSoup +# Paketçi: Cihan_Alkan +# Gerekler: libxml2 glib +# Grup: kütüphane + +isim=libsoup-22 +surum=2.2.105 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/libsoup/2.2/libsoup-${surum}.tar.bz2 + update.patch) + +derle() { + cd libsoup-${surum} + patch -p1 -i ../update.patch + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/l/libsoup-22/update.patch b/talimatname/genel/l/libsoup-22/update.patch new file mode 100644 index 000000000..f65613dff --- /dev/null +++ b/talimatname/genel/l/libsoup-22/update.patch @@ -0,0 +1,526 @@ +diff -Naur old/libsoup/soup-date.h new/libsoup/soup-date.h +--- old/libsoup/soup-date.h 2017-02-10 01:35:49.989098347 -0300 ++++ new/libsoup/soup-date.h 2017-02-10 01:57:25.820430907 -0300 +@@ -7,7 +7,7 @@ + #define SOUP_DATE_H 1 + + #include <time.h> +-#include <glib/gmacros.h> ++#include <glib.h> + + G_BEGIN_DECLS + +diff -Naur old/libsoup/soup-gnutls.c new/libsoup/soup-gnutls.c +--- old/libsoup/soup-gnutls.c 2017-02-10 01:35:50.009097801 -0300 ++++ new/libsoup/soup-gnutls.c 2017-02-10 01:55:37.232919388 -0300 +@@ -31,7 +31,7 @@ + #define DH_BITS 1024 + + struct SoupSSLCredentials { +- gnutls_certificate_credentials creds; ++ gnutls_certificate_credentials_t creds; + gboolean have_ca_file; + }; + +@@ -39,7 +39,7 @@ + GIOChannel channel; + int fd; + GIOChannel *real_sock; +- gnutls_session session; ++ gnutls_session_t session; + SoupSSLCredentials *creds; + char *hostname; + gboolean established; +@@ -47,11 +47,15 @@ + } SoupGNUTLSChannel; + + static gboolean +-verify_certificate (gnutls_session session, const char *hostname, GError **err) ++verify_certificate (gnutls_session_t session, const char *hostname, GError **err) + { ++ gnutls_typed_vdata_st dns_hostname_data; + int status; + +- status = gnutls_certificate_verify_peers (session); ++ dns_hostname_data.type = GNUTLS_DT_DNS_HOSTNAME; ++ dns_hostname_data.data = hostname; ++ dns_hostname_data.size = sizeof(hostname); ++ gnutls_certificate_verify_peers (session, &dns_hostname_data, 1, &status); + + if (status == GNUTLS_E_NO_CERTIFICATE_FOUND) { + g_set_error (err, SOUP_SSL_ERROR, +@@ -97,7 +101,7 @@ + "Error initializing SSL certificate."); + return FALSE; + } +- ++ + cert_list = gnutls_certificate_get_peers ( + session, &cert_list_size); + +diff -Naur old/libsoup/soup-portability.h new/libsoup/soup-portability.h +--- old/libsoup/soup-portability.h 2017-02-10 01:35:49.922433498 -0300 ++++ new/libsoup/soup-portability.h 2017-02-10 00:36:13.098107354 -0300 +@@ -6,7 +6,7 @@ + #ifndef SOUP_PORTABILITY_H + #define SOUP_PORTABILITY_H + +-#include <glibconfig.h> ++#include <glib.h> + + #ifdef G_OS_WIN32 + +diff -Naur old/libsoup/soup-types.h new/libsoup/soup-types.h +--- old/libsoup/soup-types.h 2017-02-10 01:35:49.989098347 -0300 ++++ new/libsoup/soup-types.h 2017-02-10 01:01:39.436418562 -0300 +@@ -6,7 +6,7 @@ + #ifndef SOUP_TYPES_H + #define SOUP_TYPES_H 1 + +-#include <glib/gtypes.h> ++#include <glib.h> + #include <glib-object.h> + + #include <libsoup/soup-status.h> +diff -Naur old/tests/context-test.c new/tests/context-test.c +--- old/tests/context-test.c 2017-02-10 02:13:38.945262431 -0300 ++++ new/tests/context-test.c 2017-02-10 02:13:20.739447586 -0300 +@@ -28,7 +28,7 @@ + char *base_uri; + + static void +-dprintf (const char *format, ...) ++_dprintf (const char *format, ...) + { + va_list args; + +@@ -168,7 +168,7 @@ + { + GMainLoop *loop; + +- dprintf ("Test 1: blocking the main thread does not block other thread\n"); ++ _dprintf ("Test 1: blocking the main thread does not block other thread\n"); + + test1_cond = g_cond_new (); + test1_mutex = g_mutex_new (); +@@ -196,7 +196,7 @@ + if (g_cond_timed_wait (test1_cond, test1_mutex, &time)) + g_thread_join (thread); + else { +- dprintf (" timeout!\n"); ++ _dprintf (" timeout!\n"); + errors++; + } + +@@ -232,17 +232,17 @@ + + uri = g_build_filename (base_uri, "slow", NULL); + +- dprintf (" send_message\n"); ++ _dprintf (" send_message\n"); + msg = soup_message_new ("GET", uri); + soup_session_send_message (session, msg); + if (msg->status_code != SOUP_STATUS_OK) { +- dprintf (" unexpected status: %d %s\n", ++ _dprintf (" unexpected status: %d %s\n", + msg->status_code, msg->reason_phrase); + errors++; + } + g_object_unref (msg); + +- dprintf (" queue_message\n"); ++ _dprintf (" queue_message\n"); + msg = soup_message_new ("GET", uri); + loop = g_main_loop_new (async_context, FALSE); + g_object_ref (msg); +@@ -250,7 +250,7 @@ + g_main_loop_run (loop); + g_main_loop_unref (loop); + if (msg->status_code != SOUP_STATUS_OK) { +- dprintf (" unexpected status: %d %s\n", ++ _dprintf (" unexpected status: %d %s\n", + msg->status_code, msg->reason_phrase); + errors++; + } +@@ -279,7 +279,7 @@ + char *uri; + SoupMessage *msg; + +- dprintf ("Test 2: a session with its own context is independent of the main loop.\n"); ++ _dprintf ("Test 2: a session with its own context is independent of the main loop.\n"); + + idle = g_idle_add_full (G_PRIORITY_HIGH, idle_test2_fail, NULL, NULL); + +@@ -291,11 +291,11 @@ + + uri = g_build_filename (base_uri, "slow", NULL); + +- dprintf (" send_message\n"); ++ _dprintf (" send_message\n"); + msg = soup_message_new ("GET", uri); + soup_session_send_message (session, msg); + if (msg->status_code != SOUP_STATUS_OK) { +- dprintf (" unexpected status: %d %s\n", ++ _dprintf (" unexpected status: %d %s\n", + msg->status_code, msg->reason_phrase); + errors++; + } +@@ -311,7 +311,7 @@ + static gboolean + idle_test2_fail (gpointer user_data) + { +- dprintf (" idle ran!\n"); ++ _dprintf (" idle ran!\n"); + errors++; + return FALSE; + } +@@ -356,7 +356,7 @@ + g_free (base_uri); + g_main_context_unref (g_main_context_default ()); + +- dprintf ("\n"); ++ _dprintf ("\n"); + if (errors) { + printf ("context-test: %d error(s). Run with '-d' for details\n", + errors); +diff -Naur old/tests/header-parsing.c new/tests/header-parsing.c +--- old/tests/header-parsing.c 2017-02-10 02:13:38.871932506 -0300 ++++ new/tests/header-parsing.c 2017-02-10 02:23:46.022468627 -0300 +@@ -10,7 +10,7 @@ + gboolean debug = FALSE; + + static void +-dprintf (const char *format, ...) ++_dprintf (const char *format, ...) + { + va_list args; + +@@ -455,7 +455,7 @@ + print_header (gpointer key, gpointer value, gpointer data) + { + GSList *values = value; +- dprintf (" '%s': '%s'\n", ++ _dprintf (" '%s': '%s'\n", + (char *)key, (char*)values->data); + } + +@@ -480,11 +480,11 @@ + SoupHttpVersion version; + GHashTable *headers; + +- dprintf ("Request tests\n"); ++ _dprintf ("Request tests\n"); + for (i = 0; i < 1; i++) { + gboolean ok = TRUE; + +- dprintf ("%2d. %s (%s): ", i + 1, reqtests[i].description, ++ _dprintf ("%2d. %s (%s): ", i + 1, reqtests[i].description, + reqtests[i].method ? "should parse" : "should NOT parse"); + + headers = g_hash_table_new_full (g_str_hash, g_str_equal, +@@ -519,34 +519,34 @@ + } + + if (ok) +- dprintf ("OK!\n"); ++ _dprintf ("OK!\n"); + else { +- dprintf ("BAD!\n"); ++ _dprintf ("BAD!\n"); + errors++; + if (reqtests[i].method) { +- dprintf (" expected: '%s' '%s' 'HTTP/1.%d'\n", ++ _dprintf (" expected: '%s' '%s' 'HTTP/1.%d'\n", + reqtests[i].method, reqtests[i].path, + reqtests[i].version); + for (h = 0; reqtests[i].headers[h].name; h++) { +- dprintf (" '%s': '%s'\n", ++ _dprintf (" '%s': '%s'\n", + reqtests[i].headers[h].name, + reqtests[i].headers[h].value); + } + } else +- dprintf (" expected: parse error\n"); ++ _dprintf (" expected: parse error\n"); + if (method) { +- dprintf (" got: '%s' '%s' 'HTTP/1.%d'\n", ++ _dprintf (" got: '%s' '%s' 'HTTP/1.%d'\n", + method, path, version); + g_hash_table_foreach (headers, print_header, NULL); + } else +- dprintf (" got: parse error\n"); ++ _dprintf (" got: parse error\n"); + } + + g_free (method); + g_free (path); + g_hash_table_destroy (headers); + } +- dprintf ("\n"); ++ _dprintf ("\n"); + + return errors; + } +@@ -561,11 +561,11 @@ + SoupHttpVersion version; + GHashTable *headers; + +- dprintf ("Response tests\n"); ++ _dprintf ("Response tests\n"); + for (i = 0; i < num_resptests; i++) { + gboolean ok = TRUE; + +- dprintf ("%2d. %s (%s): ", i + 1, resptests[i].description, ++ _dprintf ("%2d. %s (%s): ", i + 1, resptests[i].description, + resptests[i].reason_phrase ? "should parse" : "should NOT parse"); + + headers = g_hash_table_new_full (g_str_hash, g_str_equal, +@@ -600,34 +600,34 @@ + } + + if (ok) +- dprintf ("OK!\n"); ++ _dprintf ("OK!\n"); + else { +- dprintf ("BAD!\n"); ++ _dprintf ("BAD!\n"); + errors++; + if (resptests[i].reason_phrase) { +- dprintf (" expected: 'HTTP/1.%d' '%03d' '%s'\n", ++ _dprintf (" expected: 'HTTP/1.%d' '%03d' '%s'\n", + resptests[i].version, + resptests[i].status_code, + resptests[i].reason_phrase); + for (h = 0; resptests[i].headers[h].name; h++) { +- dprintf (" '%s': '%s'\n", ++ _dprintf (" '%s': '%s'\n", + resptests[i].headers[h].name, + resptests[i].headers[h].value); + } + } else +- dprintf (" expected: parse error\n"); ++ _dprintf (" expected: parse error\n"); + if (reason_phrase) { +- dprintf (" got: 'HTTP/1.%d' '%03d' '%s'\n", ++ _dprintf (" got: 'HTTP/1.%d' '%03d' '%s'\n", + version, status_code, reason_phrase); + g_hash_table_foreach (headers, print_header, NULL); + } else +- dprintf (" got: parse error\n"); ++ _dprintf (" got: parse error\n"); + } + + g_free (reason_phrase); + g_hash_table_destroy (headers); + } +- dprintf ("\n"); ++ _dprintf ("\n"); + + return errors; + } +@@ -651,7 +651,7 @@ + errors = do_request_tests (); + errors += do_response_tests (); + +- dprintf ("\n"); ++ _dprintf ("\n"); + if (errors) { + printf ("header-parsing: %d error(s). Run with '-d' for details\n", + errors); +diff -Naur old/tests/ntlm-test.c new/tests/ntlm-test.c +--- old/tests/ntlm-test.c 2017-02-10 02:13:38.945262431 -0300 ++++ new/tests/ntlm-test.c 2017-02-10 02:25:13.617865774 -0300 +@@ -29,7 +29,7 @@ + gboolean debug = FALSE; + + static void +-dprintf (const char *format, ...) ++_dprintf (const char *format, ...) + { + va_list args; + +@@ -219,58 +219,58 @@ + G_CALLBACK (ntlm_response_check), &state); + + soup_session_send_message (session, msg); +- dprintf (" %-10s -> ", path); ++ _dprintf (" %-10s -> ", path); + + if (state.got_prompt) { +- dprintf (" PROMPT"); ++ _dprintf (" PROMPT"); + if (!get_prompt) { +- dprintf ("???"); ++ _dprintf ("???"); + errors++; + } + } else if (get_prompt) { +- dprintf (" no-prompt???"); ++ _dprintf (" no-prompt???"); + errors++; + } + + if (state.sent_request) { +- dprintf (" REQUEST"); ++ _dprintf (" REQUEST"); + if (!do_ntlm) { +- dprintf ("???"); ++ _dprintf ("???"); + errors++; + } + } else if (do_ntlm) { +- dprintf (" no-request???"); ++ _dprintf (" no-request???"); + errors++; + } + + if (state.got_challenge) { +- dprintf (" CHALLENGE"); ++ _dprintf (" CHALLENGE"); + if (!do_ntlm) { +- dprintf ("???"); ++ _dprintf ("???"); + errors++; + } + } else if (do_ntlm) { +- dprintf (" no-challenge???"); ++ _dprintf (" no-challenge???"); + errors++; + } + + if (state.sent_response) { +- dprintf (" RESPONSE"); ++ _dprintf (" RESPONSE"); + if (!do_ntlm) { +- dprintf ("???"); ++ _dprintf ("???"); + errors++; + } + } else if (do_ntlm) { +- dprintf (" no-response???"); ++ _dprintf (" no-response???"); + errors++; + } + +- dprintf (" -> %s", msg->reason_phrase); ++ _dprintf (" -> %s", msg->reason_phrase); + if (msg->status_code != status_code) { +- dprintf ("???"); ++ _dprintf ("???"); + errors++; + } +- dprintf ("\n"); ++ _dprintf ("\n"); + + g_object_unref (msg); + return errors; +@@ -327,11 +327,11 @@ + { + int errors = 0; + +- dprintf ("Round 1: Non-NTLM Connection\n"); ++ _dprintf ("Round 1: Non-NTLM Connection\n"); + errors += do_ntlm_round (base_uri, NULL); +- dprintf ("Round 2: NTLM Connection, user=alice\n"); ++ _dprintf ("Round 2: NTLM Connection, user=alice\n"); + errors += do_ntlm_round (base_uri, "alice"); +- dprintf ("Round 3: NTLM Connection, user=bob\n"); ++ _dprintf ("Round 3: NTLM Connection, user=bob\n"); + errors += do_ntlm_round (base_uri, "bob"); + + return errors; +@@ -397,7 +397,7 @@ + g_hash_table_destroy (connections); + g_main_context_unref (g_main_context_default ()); + +- dprintf ("\n"); ++ _dprintf ("\n"); + if (errors) { + printf ("ntlm-test: %d error(s). Run with '-d' for details\n", + errors); +diff -Naur old/tests/uri-parsing.c new/tests/uri-parsing.c +--- old/tests/uri-parsing.c 2017-02-10 02:13:38.871932506 -0300 ++++ new/tests/uri-parsing.c 2017-02-10 02:26:01.758934976 -0300 +@@ -10,7 +10,7 @@ + gboolean debug = FALSE; + + static void +-dprintf (const char *format, ...) ++_dprintf (const char *format, ...) + { + va_list args; + +@@ -113,21 +113,21 @@ + char *uri_string; + + if (base_uri) { +- dprintf ("<%s> + <%s> = <%s>? ", base_str, in_uri, ++ _dprintf ("<%s> + <%s> = <%s>? ", base_str, in_uri, + out_uri ? out_uri : "ERR"); + uri = soup_uri_new_with_base (base_uri, in_uri); + } else { +- dprintf ("<%s> => <%s>? ", in_uri, ++ _dprintf ("<%s> => <%s>? ", in_uri, + out_uri ? out_uri : "ERR"); + uri = soup_uri_new (in_uri); + } + + if (!uri) { + if (out_uri) { +- dprintf ("ERR\n Could not parse %s\n", in_uri); ++ _dprintf ("ERR\n Could not parse %s\n", in_uri); + return FALSE; + } else { +- dprintf ("OK\n"); ++ _dprintf ("OK\n"); + return TRUE; + } + } +@@ -136,18 +136,18 @@ + soup_uri_free (uri); + + if (!out_uri) { +- dprintf ("ERR\n Got %s\n", uri_string); ++ _dprintf ("ERR\n Got %s\n", uri_string); + return FALSE; + } + + if (strcmp (uri_string, out_uri) != 0) { +- dprintf ("NO\n Unparses to <%s>\n", uri_string); ++ _dprintf ("NO\n Unparses to <%s>\n", uri_string); + g_free (uri_string); + return FALSE; + } + g_free (uri_string); + +- dprintf ("OK\n"); ++ _dprintf ("OK\n"); + return TRUE; + } + +@@ -169,14 +169,14 @@ + } + } + +- dprintf ("Absolute URI parsing\n"); ++ _dprintf ("Absolute URI parsing\n"); + for (i = 0; i < num_abs_tests; i++) { + if (!do_uri (NULL, NULL, abs_tests[i].uri_string, + abs_tests[i].result)) + errs++; + } + +- dprintf ("\nRelative URI parsing\n"); ++ _dprintf ("\nRelative URI parsing\n"); + base_uri = soup_uri_new (base); + if (!base_uri) { + fprintf (stderr, "Could not parse %s!\n", base); +@@ -198,7 +198,7 @@ + } + soup_uri_free (base_uri); + +- dprintf ("\n"); ++ _dprintf ("\n"); + if (errs) { + printf ("uri-parsing: %d error(s). Run with '-d' for details\n", + errs); diff --git a/talimatname/genel/l/libsoup/talimat b/talimatname/genel/l/libsoup/talimat new file mode 100644 index 000000000..d23d3fd4c --- /dev/null +++ b/talimatname/genel/l/libsoup/talimat @@ -0,0 +1,18 @@ +# Tanım: Libsoup, GNOME için bir HTTP istemci / sunucu kitaplığıdır. +# URL: https://wiki.gnome.org/Projects/libsoup +# Paketçi: milisarge +# Gerekler: glib-networking libxml2 gobject-introspection vala sqlite + +isim=libsoup +surum=2.52.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libspectre/libspectre-0.2.7-ghostscript-9.18-1.patch b/talimatname/genel/l/libspectre/libspectre-0.2.7-ghostscript-9.18-1.patch new file mode 100644 index 000000000..13ab261c7 --- /dev/null +++ b/talimatname/genel/l/libspectre/libspectre-0.2.7-ghostscript-9.18-1.patch @@ -0,0 +1,41 @@ +Fixed error namespace for >=ghostscript-gpl-9.18 + +https://bugs.gentoo.org/563540 + +--- libspectre-0.2.7/libspectre/spectre-gs.c ++++ libspectre-0.2.7/libspectre/spectre-gs.c +@@ -43,12 +43,12 @@ + + if (code <= -100) { + switch (code) { +- case e_Fatal: ++ case gs_error_Fatal: + fprintf (stderr, "fatal internal error %d", code); + return TRUE; + break; + +- case e_ExecStackUnderflow: ++ case gs_error_ExecStackUnderflow: + fprintf (stderr, "stack overflow %d", code); + return TRUE; + break; +@@ -109,9 +109,9 @@ + set = _spectre_strdup_printf ("%d %d translate\n", -x, -y); + error = gsapi_run_string_continue (ghostscript_instance, set, strlen (set), + 0, &exit_code); +- error = error == e_NeedInput ? 0 : error; ++ error = error == gs_error_NeedInput ? 0 : error; + free (set); +- if (error != e_NeedInput && critic_error_code (error)) { ++ if (error != gs_error_NeedInput && critic_error_code (error)) { + fclose (fd); + return FALSE; + } +@@ -126,7 +126,7 @@ + read = fread (buf, sizeof (char), to_read, fd); + error = gsapi_run_string_continue (ghostscript_instance, + buf, read, 0, &exit_code); +- error = error == e_NeedInput ? 0 : error; ++ error = error == gs_error_NeedInput ? 0 : error; + left -= read; + } diff --git a/talimatname/genel/l/libspectre/talimat b/talimatname/genel/l/libspectre/talimat new file mode 100644 index 000000000..b047abdea --- /dev/null +++ b/talimatname/genel/l/libspectre/talimat @@ -0,0 +1,22 @@ +# Tanım: Postscript belgeler için yapılmış kütüphane +# URL: http://libspectre.freedesktop.org/wiki/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: ghostscript + +isim=libspectre +surum=0.2.7 +devir=1 + +kaynak=(http://libspectre.freedesktop.org/releases/$isim-$surum.tar.gz + libspectre-$surum-ghostscript-9.18-1.patch) + +derle() { +cd $isim-$surum + patch -Np1 -i ../libspectre-$surum-ghostscript-9.18-1.patch + ./configure --prefix=/usr \ + --disable-static + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/libspiro/talimat b/talimatname/genel/l/libspiro/talimat new file mode 100644 index 000000000..02f22f7a2 --- /dev/null +++ b/talimatname/genel/l/libspiro/talimat @@ -0,0 +1,19 @@ +# Tanım: Eğrilerin çizimini basitleştiren kütüphane +# URL: https://github.com/fontforge/libspiro +# Paketçi: milisarge +# Gerekler: + +isim=libspiro +surum=0.5.20150702 +devir=1 +kaynak=(https://github.com/fontforge/libspiro/archive/${surum}.tar.gz) + +derle() { + cd $isim-${surum} + autoreconf -i + automake --foreign -Wall + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + install -Dm644 libspiro.pc "${PKG}"/usr/lib/pkgconfig/libspiro.pc +} diff --git a/talimatname/genel/l/libspotify/talimat b/talimatname/genel/l/libspotify/talimat new file mode 100644 index 000000000..76629cefb --- /dev/null +++ b/talimatname/genel/l/libspotify/talimat @@ -0,0 +1,25 @@ +# Tanım: C API spotify için. +# URL: https://developer.spotify.com/technologies/libspotify/ +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libspotify +surum=12.1.51 +devir=1 +kaynak=(http://developer.spotify.com/download/libspotify/libspotify-${surum}-Linux-x86_64-release.tar.gz) + +derle() { + cd "$SRC/$isim-$surum-Linux-x86_64-release" + sed -i 's/ldconfig//' Makefile + make prefix="$PKG/usr" install + cp -R share "$PKG"/usr/share + mkdir -p "$PKG"/usr/share/man + mv "$PKG"/usr/share/man3 "$PKG"/usr/share/man/man3 + sed -e s:PKG_PREFIX:/usr:g \ + < lib/pkgconfig/libspotify.pc \ + > "$PKG"/usr/lib/pkgconfig/libspotify.pc + install -Dm644 LICENSE licenses.xhtml "$PKG"/usr/share/doc/libspotify + mkdir -p "$PKG"/usr/share/licenses/libspotify + ln -s ../../doc/libspotify/LICENSE "$PKG"/usr/share/licenses/libspotify/LICENSE +} diff --git a/talimatname/genel/l/libspoton/talimat b/talimatname/genel/l/libspoton/talimat new file mode 100644 index 000000000..50c290e85 --- /dev/null +++ b/talimatname/genel/l/libspoton/talimat @@ -0,0 +1,19 @@ +# Tanım: Spot-On bağlam kütüphanesi +# URL: http://spot-on.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: sqlite unzip libgcrypt libntru + +isim=libspoton +surum=2017.01.20 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/spot-on/Version%20${surum}/Spot-On-Src.d.zip?r=) + +derle() { + unzip $SRC/Spot* + cd "$SRC/spot-on.d/libSpotOn" + make + install -dm755 -- "$PKG/usr/lib" + install -m755 -- libspoton.so "$PKG/usr/lib/libspoton.so" + install -dm755 -- "$PKG/usr/include" + install -m755 -- libspoton.h "$PKG/usr/include/libspoton.h" +} diff --git a/talimatname/genel/l/libsrtp/talimat b/talimatname/genel/l/libsrtp/talimat new file mode 100644 index 000000000..97d54459b --- /dev/null +++ b/talimatname/genel/l/libsrtp/talimat @@ -0,0 +1,19 @@ +# Tanım: Güvenli gerçek zamanlı taşıyıcı protokolü +# URL: https://github.com/cisco/libsrtp +# Paketçi: milisarge +# Gerekler: + +isim=libsrtp +surum=1.5.4 +devir=1 +kaynak=(https://github.com/cisco/libsrtp/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + autoreconf -fvi + ./configure --prefix=/usr + #./configure --prefix=/usr + make libsrtp.a shared_library + make DESTDIR="$PKG" install + install -Dm0644 LICENSE "${PKG}"/usr/share/licenses/${isim}/LICENSE +} diff --git a/talimatname/genel/l/libssh/talimat b/talimatname/genel/l/libssh/talimat new file mode 100644 index 000000000..78cf89c95 --- /dev/null +++ b/talimatname/genel/l/libssh/talimat @@ -0,0 +1,18 @@ +# Tanım: C kitaplıkları aracılığıyla ssh istemci servislerine erişmek için kütüphane +# URL: http://www.libssh.org/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: doxygen cmake + +isim=libssh +surum=0.7.5 +devir=1 + +kaynak=( https://git.libssh.org/projects/libssh.git/snapshot/$isim-$surum.tar.gz) + +derle() { + cd $SRC/ + cmake $isim-$surum/ -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libssh2/talimat b/talimatname/genel/l/libssh2/talimat new file mode 100644 index 000000000..d8430ce49 --- /dev/null +++ b/talimatname/genel/l/libssh2/talimat @@ -0,0 +1,18 @@ +# Tanım: ssh2 kütüphanesi +# URL: http://www.libssh2.org/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: doxygen cmake + +isim=libssh2 +surum=1.8.0 +devir=1 + +kaynak=(https://www.libssh2.org/download/$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + install -Dm644 COPYING "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/l/libstatgrab/talimat b/talimatname/genel/l/libstatgrab/talimat new file mode 100644 index 000000000..b10fea220 --- /dev/null +++ b/talimatname/genel/l/libstatgrab/talimat @@ -0,0 +1,22 @@ +# Tanım: Libstatgrab, çalıştırıldığı sistemle ilgili istatistiklere çapraz platform erişimi sağlayan bir kitaplıktır. +# URL: http://www.i-scream.org/libstatgrab/ +# Paketçi: milisarge +# Gerekler: + +isim=libstatgrab +surum=0.91 +devir=1 + +kaynak=(http://www.mirrorservice.org/sites/ftp.i-scream.org/pub/i-scream/libstatgrab/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr \ + --disable-static \ + --docdir=/usr/share/doc/libstatgrab-0.91 + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/l/libstroke/libgstroke-Makefile.am.patch b/talimatname/genel/l/libstroke/libgstroke-Makefile.am.patch new file mode 100644 index 000000000..b3251f354 --- /dev/null +++ b/talimatname/genel/l/libstroke/libgstroke-Makefile.am.patch @@ -0,0 +1,11 @@ +--- libstroke-0.5.1/libgstroke/Makefile.am.orig 2008-06-11 13:01:29.000000000 +0400 ++++ libstroke-0.5.1/libgstroke/Makefile.am 2008-06-11 13:01:44.000000000 +0400 +@@ -21,7 +21,7 @@ + INCLUDES = @GTK_CFLAGS@ + LDADD = @GTK_LIBS@ + +-EXTRA_DIST = ++#EXTRA_DIST = + + MOSTLYCLEANFILES = core *~ + CLEANFILES = core *~ diff --git a/talimatname/genel/l/libstroke/libstroke-0.5.1-m4_syntax.patch b/talimatname/genel/l/libstroke/libstroke-0.5.1-m4_syntax.patch new file mode 100644 index 000000000..70bb720ee --- /dev/null +++ b/talimatname/genel/l/libstroke/libstroke-0.5.1-m4_syntax.patch @@ -0,0 +1,58 @@ +--- libstroke-0.5.1/libstroke.m4 {cset 02bc4a5e-e9e6-4055-a406-5007a0ac3e55} ++++ libstroke-0.5.1/libstroke.m4 {local clone} +@@ -26,7 +26,7 @@ + dnl if different from name + dnl description (optional) used to construct help string + dnl +-AC_DEFUN(smr_ARG_WITHLIB, [ ++AC_DEFUN([smr_ARG_WITHLIB], [ + + ifelse($2, , smr_lib=[$1], smr_lib=[$2]) + +@@ -74,7 +74,7 @@ + dnl extra-flags (optional) flags required when compiling the + dnl header, typically more includes; for ex. X_CFLAGS + dnl +-AC_DEFUN(smr_ARG_WITHINCLUDES, [ ++AC_DEFUN([smr_ARG_WITHINCLUDES], [ + + AC_ARG_WITH([$1]-includes, + [ --with-$1-includes=DIR set directory for $1 headers], +@@ -116,7 +116,7 @@ + dnl x-libs (optional) extra libraries, if needed to link with lib + dnl x-flags (optional) extra flags, if needed to include header files + dnl +-AC_DEFUN(smr_CHECK_LIB, ++AC_DEFUN([smr_CHECK_LIB], + [ + ifelse($2, , smr_lib=[$1], smr_lib=[$2]) + ifelse($5, , , smr_header=[$5]) +--- libstroke-0.5.1/libgstroke.m4 2011-09-10 02:59:55.000000000 -0400 ++++ libstroke-0.5.1/libgstroke.m4 2011-09-10 03:01:14.000000000 -0400 +@@ -26,7 +26,7 @@ + dnl if different from name + dnl description (optional) used to construct help string + dnl +-AC_DEFUN(smr_ARG_WITHLIB, [ ++AC_DEFUN([smr_ARG_WITHLIB], [ + + ifelse($2, , smr_lib=[$1], smr_lib=[$2]) + +@@ -74,7 +74,7 @@ + dnl extra-flags (optional) flags required when compiling the + dnl header, typically more includes; for ex. X_CFLAGS + dnl +-AC_DEFUN(smr_ARG_WITHINCLUDES, [ ++AC_DEFUN([smr_ARG_WITHINCLUDES], [ + + AC_ARG_WITH([$1]-includes, + [ --with-$1-includes=DIR set directory for $1 headers], +@@ -116,7 +116,7 @@ + dnl x-libs (optional) extra libraries, if needed to link with lib + dnl x-flags (optional) extra flags, if needed to include header files + dnl +-AC_DEFUN(smr_CHECK_LIB, ++AC_DEFUN([smr_CHECK_LIB], + [ + ifelse($2, , smr_lib=[$1], smr_lib=[$2]) + ifelse($5, , , smr_header=[$5]) diff --git a/talimatname/genel/l/libstroke/libstroke-0.5.1-no_gtk1.patch b/talimatname/genel/l/libstroke/libstroke-0.5.1-no_gtk1.patch new file mode 100644 index 000000000..a099fb991 --- /dev/null +++ b/talimatname/genel/l/libstroke/libstroke-0.5.1-no_gtk1.patch @@ -0,0 +1,33 @@ +--- libstroke-0.5.1/configure.in 2001-08-07 07:08:05.000000000 +0100 ++++ libstroke-0.5.1b/configure.in 2006-11-28 01:49:26.000000000 +0000 +@@ -81,16 +81,9 @@ + [ --with-mouse-footprints Draw mouse footprints in X], + [AC_DEFINE(STROKE_MOUSE_FOOTPRINTS)]) + +-dnl check for GTK +-dnl we won't build libgstroke if it's not found +-AC_MSG_CHECKING(gtk+ library) +-AM_PATH_GTK(1.2.7, HAVE_LIBGTK=yes +- AC_DEFINE(HAVE_LIBGTK, 1, [Define if libgtk is available]), +- AC_MSG_WARN( +-***** NOTE: The GNOME stroke support won't be built +-) +- HAVE_LIBGTK=no, +-) ++GTK_CFLAGS="" ++AC_SUBST(GTK_CFLAGS) ++HAVE_LIBGTK=no + AM_CONDITIONAL(HAVE_LIBGTK, test "x$HAVE_LIBGTK" = "xyes") + + +--- libstroke-0.5.1/Makefile.am 2001-08-07 07:03:12.000000000 +0100 ++++ libstroke-0.5.1b/Makefile.am 2006-11-28 02:00:55.000000000 +0000 +@@ -10,7 +10,7 @@ + EXTRA_DIST = COPYRIGHT CREDITS README.javastroke README.libgstroke + + m4datadir=$(datadir)/aclocal +-m4data_DATA=libstroke.m4 libgstroke.m4 ++m4data_DATA=libstroke.m4 + + MOSTLYCLEANFILES = core *~ + CLEANFILES = core *~ diff --git a/talimatname/genel/l/libstroke/libstroke-Makefile.am.patch b/talimatname/genel/l/libstroke/libstroke-Makefile.am.patch new file mode 100644 index 000000000..98707faf0 --- /dev/null +++ b/talimatname/genel/l/libstroke/libstroke-Makefile.am.patch @@ -0,0 +1,15 @@ +--- libstroke-0.5.1/libstroke/Makefile.am.orig 2008-06-11 13:01:54.000000000 +0400 ++++ libstroke-0.5.1/libstroke/Makefile.am 2008-06-11 13:02:02.000000000 +0400 +@@ -5,10 +5,10 @@ + # level Makefile. + AUTOMAKE_OPTIONS = foreign + +-EXTRA_DIST = ++#EXTRA_DIST = + + #tclpath:: +- #echo ${ENABLE_TCL} ++# echo ${ENABLE_TCL} + + #if ENABLE_TCL + #SEL_BIB = libstroke.la libstroke_tcl.la diff --git a/talimatname/genel/l/libstroke/talimat b/talimatname/genel/l/libstroke/talimat new file mode 100644 index 000000000..5052e16b3 --- /dev/null +++ b/talimatname/genel/l/libstroke/talimat @@ -0,0 +1,25 @@ +# Tanım: A stroke (mouse gesture) translation library +# URL: http://etla.net/libstroke/ +# Paketçi: milisarge +# Gerekler: xorg-libx11 + +isim=libstroke +surum=0.5.1 +devir=1 +kaynak=(http://www.etla.net/libstroke/libstroke-${surum}fvwm.tar.gz + libgstroke-Makefile.am.patch + libstroke-Makefile.am.patch + libstroke-0.5.1-m4_syntax.patch + libstroke-0.5.1-no_gtk1.patch) + +derle() { + cd ${pkgname}-${pkgver} + patch -p1 -i "${srcdir}/libgstroke-Makefile.am.patch" + patch -p1 -i "${srcdir}/libstroke-Makefile.am.patch" + patch -p1 -i "${srcdir}/libstroke-0.5.1-m4_syntax.patch" + patch -p1 -i "${srcdir}/libstroke-0.5.1-no_gtk1.patch" + autoreconf --force --install + ./configure --prefix=/usr + make + make DESTDIR="${pkgdir}" install +} diff --git a/talimatname/genel/l/libsysstat/talimat b/talimatname/genel/l/libsysstat/talimat new file mode 100644 index 000000000..2d391a20b --- /dev/null +++ b/talimatname/genel/l/libsysstat/talimat @@ -0,0 +1,20 @@ +# Tanım: Sistem istatistiklerini sorgulamak için kütüphane (net, kaynak kullanımı, ...) +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: cmake qt5 lxqt-build-tools +# Grup: lxqt + +isim=libsysstat +surum=0.4.1 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -p build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libt3config/talimat b/talimatname/genel/l/libt3config/talimat new file mode 100644 index 000000000..686873dda --- /dev/null +++ b/talimatname/genel/l/libt3config/talimat @@ -0,0 +1,18 @@ +# Tanım: Yapılandırma dosyalarını okumak ve yazmak için bir kütüphane. +# URL: http://os.ghalkes.nl/t3/libt3key.html +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup:kütüphane + +isim=libt3config +surum=0.2.10 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr CFLAGS="-O2 -D_POSIX_C_SOURCE=200809L" + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" +} diff --git a/talimatname/genel/l/libt3highlight/talimat b/talimatname/genel/l/libt3highlight/talimat new file mode 100644 index 000000000..1140f2bd8 --- /dev/null +++ b/talimatname/genel/l/libt3highlight/talimat @@ -0,0 +1,18 @@ +# Tanım: syntax highlighting kütüphanesi. +# URL: http://os.ghalkes.nl/t3/libt3highlight.html +# Paketçi: Cihan_Alkan +# Gerekler: libt3config +# Grup: kütüphane + +isim=libt3highlight +surum=0.4.2 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr CFLAGS="-O2 -D_POSIX_C_SOURCE=200809L" + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" +} diff --git a/talimatname/genel/l/libt3key/talimat b/talimatname/genel/l/libt3key/talimat new file mode 100644 index 000000000..346fb184b --- /dev/null +++ b/talimatname/genel/l/libt3key/talimat @@ -0,0 +1,18 @@ +# Tanım: Terminal anahtar dizisi veritabanı kitaplığı. +# URL: http://os.ghalkes.nl/t3/libt3key.html +# Paketçi: Cihan_Alkan +# Gerekler: libt3config libxcb +# Grup: kütüphane + +isim=libt3key +surum=0.2.6 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr CFLAGS="-O2 -D_POSIX_C_SOURCE=200809L" + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" +} diff --git a/talimatname/genel/l/libt3widget/talimat b/talimatname/genel/l/libt3widget/talimat new file mode 100644 index 000000000..f8f0d192c --- /dev/null +++ b/talimatname/genel/l/libt3widget/talimat @@ -0,0 +1,18 @@ +# Tanım: C ++ terminal iletişim araç kiti. +# URL: http://os.ghalkes.nl/t3/libt3widget.html +# Paketçi: Cihan_Alkan +# Gerekler: libsigc++ libxcb libt3window libt3key +# Grup: kütüphane + +isim=libt3widget +surum=0.5.2 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + CXXFLAGS="-O2 -std=c++11" ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" +} diff --git a/talimatname/genel/l/libt3window/talimat b/talimatname/genel/l/libt3window/talimat new file mode 100644 index 000000000..70f6d1a0d --- /dev/null +++ b/talimatname/genel/l/libt3window/talimat @@ -0,0 +1,18 @@ +# Tanım: pencere tabanlı konsol uygulamalrı oluşturmak için kütüphane +# URL: http://os.ghalkes.nl/t3/libt3window.html +# Paketçi: milisarge +# Gerekler: libtranscript libunistring +# Grup: kütüphane + +isim=libt3window +surum=0.2.3 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/libt3window-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr CFLAGS="-O2 -D_POSIX_C_SOURCE=200809L" + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" +} diff --git a/talimatname/genel/l/libtasn1/talimat b/talimatname/genel/l/libtasn1/talimat new file mode 100644 index 000000000..1c2399d03 --- /dev/null +++ b/talimatname/genel/l/libtasn1/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir ASN.1 şemasını takiben DER/BER verilerini kodlayan ve çözen son derece taşınabilir C kütüphanesi. +# URL: http://www.gnu.org/software/gnutls/ +# Paketçi: milisarge +# Gerekler: + +isim=libtasn1 +surum=4.9 +devir=1 + +kaynak=( http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libthai/talimat b/talimatname/genel/l/libthai/talimat new file mode 100644 index 000000000..964c3744f --- /dev/null +++ b/talimatname/genel/l/libthai/talimat @@ -0,0 +1,23 @@ +# Tanım: Tay dili destek rutinleri +# URL: http://linux.thai.net/projects/libthai +# Paketçi: milisarge +# Gerekler: libdatrie + +isim=libthai +surum=0.1.24 +devir=1 + +kaynak=(https://mirrors.kernel.org/debian/pool/main/libt/${isim}/${isim}_${surum}.orig.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --disable-static \ + --disable-doxygen-doc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} + diff --git a/talimatname/genel/l/libtheora/talimat b/talimatname/genel/l/libtheora/talimat new file mode 100644 index 000000000..6b6cf7089 --- /dev/null +++ b/talimatname/genel/l/libtheora/talimat @@ -0,0 +1,17 @@ +# Tanım: Xiph.org tarafından geliştirilen açık bir video codec bileşeni +# URL: http://www.xiph.org +# Paketçi: milisarge +# Gerekler: libogg libvorbis + +isim=libtheora +surum=1.1.1 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/theora/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +sed -i 's/png_\(sizeof\)/\1/g' examples/png2theora.c +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libtiff/talimat b/talimatname/genel/l/libtiff/talimat new file mode 100644 index 000000000..9edd8299b --- /dev/null +++ b/talimatname/genel/l/libtiff/talimat @@ -0,0 +1,21 @@ +# Tanım: TIFF görüntüleri manipüle etmek için kütüphane +# URL: http://www.remotesensing.org/libtiff/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo + +isim=libtiff +surum=4.0.6 +devir=1 + +kaynak=(http://download.osgeo.org/libtiff/tiff-$surum.tar.gz) + + +derle() { +cd tiff-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libtimezonemap/talimat b/talimatname/genel/l/libtimezonemap/talimat new file mode 100644 index 000000000..f238cc5de --- /dev/null +++ b/talimatname/genel/l/libtimezonemap/talimat @@ -0,0 +1,20 @@ +# Tanım: GTK+3 saat dilimi haritası aracı +# URL: https://launchpad.net/timezonemap +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gtk3 json-glib vala gobject-introspection libsoup + +isim=libtimezonemap +surum=0.4.5 +devir=1 + + +kaynak=( https://launchpad.net/ubuntu/+archive/primary/+files/libtimezonemap_0.4.5.tar.gz) + +derle() { +cd $isim-$surum + autoreconf -vfi + ./configure --prefix=/usr --enable-introspection --with-gtk=3 + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libtins/talimat b/talimatname/genel/l/libtins/talimat new file mode 100644 index 000000000..fc205bfb8 --- /dev/null +++ b/talimatname/genel/l/libtins/talimat @@ -0,0 +1,20 @@ +# Tanım: Yüksek seviye ağ paket koklama ve işleme c++ kütüphanesi +# URL: http://libtins.github.io/ +# Paketçi: milisarge +# Gerekler: cmake libpcap + +isim=libtins +surum=3.5 +devir=1 +kaynak=(https://github.com/mfontanini/libtins/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/libtins-${surum}" + mkdir build + cd build + cmake -D CMAKE_INSTALL_PREFIX=/usr -D LIBTINS_ENABLE_CXX11=yes ../ + make + make DESTDIR="${PKG}" install + install -Dm644 ../LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" + rm -R "${PKG}/usr/CMake/" +} diff --git a/talimatname/genel/l/libtirpc/talimat b/talimatname/genel/l/libtirpc/talimat new file mode 100644 index 000000000..a3ca72bd7 --- /dev/null +++ b/talimatname/genel/l/libtirpc/talimat @@ -0,0 +1,30 @@ +# Tanım: Transport Independent RPC library (SunRPC replacement) +# URL: http://downloads.sourceforge.net/project/libtirpc +# Paketçi: milisarge +# Gerekler: + +isim=libtirpc +surum=0.3.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/libtirpc/libtirpc/$surum/libtirpc-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-api_fixes-1.patch) + +derle() +{ +cd libtirpc-$surum + +patch -Np1 -i ../libtirpc-$surum-api_fixes-1.patch + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --disable-gssapi + +make +make pkgconfigdir=/usr/lib/pkgconfig DESTDIR=$PKG install +chown -R root:root $PKG +mkdir -p $PKG/lib +mv -v $PKG/usr/lib/libtirpc.so.* $PKG/lib +ln -sfv ../../lib/libtirpc.so.1.0.10 $PKG/usr/lib/libtirpc.so +} diff --git a/talimatname/genel/l/libtommath/talimat b/talimatname/genel/l/libtommath/talimat new file mode 100644 index 000000000..0e8dbb1f0 --- /dev/null +++ b/talimatname/genel/l/libtommath/talimat @@ -0,0 +1,17 @@ +# Tanım: Tamsayılı temelli sayısal teorik uygulamalar için yüksek seviyede optimize edilmiş ve taşınabilir rutinler +# URL: http://www.libtom.org/ +# Paketçi: Cihan Alkan +# Gerekler: + +isim=libtommath +surum=1.0.1 +devir=1 + +kaynak=(https://github.com/libtom/libtommath/releases/download/v$surum/ltm-$surum.tar.xz) + +derle() { + cd $isim-$surum + make -f makefile.shared IGNORE_SPEED=1 + make -f makefile.shared PREFIX=/usr DESTDIR=$PKG INSTALL_GROUP=root install + install -Dm644 LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/l/libtorrent-rasterbar/libtorrent-boost-1.65.patch b/talimatname/genel/l/libtorrent-rasterbar/libtorrent-boost-1.65.patch new file mode 100644 index 000000000..19f951b10 --- /dev/null +++ b/talimatname/genel/l/libtorrent-rasterbar/libtorrent-boost-1.65.patch @@ -0,0 +1,34 @@ +From 7eb3cf6bc6dbada3fa7bb7ff4d5981182813a0e2 Mon Sep 17 00:00:00 2001 +From: arvidn <arvid@cs.umu.se> +Date: Tue, 11 Jul 2017 23:16:50 -0700 +Subject: [PATCH] use the official boost.config header + +--- + include/libtorrent/export.hpp | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +diff --git a/include/libtorrent/export.hpp b/include/libtorrent/export.hpp +index 87536af2a2..503afe27a3 100644 +--- a/include/libtorrent/export.hpp ++++ b/include/libtorrent/export.hpp +@@ -33,19 +33,7 @@ POSSIBILITY OF SUCH DAMAGE. + #ifndef TORRENT_EXPORT_HPP_INCLUDED + #define TORRENT_EXPORT_HPP_INCLUDED + +-#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) +-# include <boost/config/select_compiler_config.hpp> +-#endif +-#ifdef BOOST_COMPILER_CONFIG +-# include BOOST_COMPILER_CONFIG +-#endif +- +-#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) +-# include <boost/config/select_platform_config.hpp> +-#endif +-#ifdef BOOST_PLATFORM_CONFIG +-# include BOOST_PLATFORM_CONFIG +-#endif ++#include <boost/config.hpp> + + // backwards compatibility with older versions of boost + #if !defined BOOST_SYMBOL_EXPORT && !defined BOOST_SYMBOL_IMPORT diff --git a/talimatname/genel/l/libtorrent-rasterbar/talimat b/talimatname/genel/l/libtorrent-rasterbar/talimat new file mode 100644 index 000000000..fb32db7e2 --- /dev/null +++ b/talimatname/genel/l/libtorrent-rasterbar/talimat @@ -0,0 +1,47 @@ +# Tanım: Bir C ++ bittorrent kitaplığı. +# URL: http://www.rasterbar.com/products/libtorrent/ +# Paketçi: milisarge +# Gerekler: boost + +isim=libtorrent-rasterbar +surum=1.1.4 +_surum=1_1_4 +devir=1 +kaynak=(https://github.com/arvidn/libtorrent/archive/libtorrent-$_version.tar.gz::$isim-$surum.tar.gz + libtorrent-boost-1.65.patch) + +derle() { + cd libtorrent-libtorrent-$_version + ./autotool.sh + patch -p1 -i $SRC/libtorrent-boost-1.65.patch + + #CONFIG_SHELL=/bin/bash \ + ./configure \ + --prefix=/usr \ + --enable-shared=yes \ + --enable-static=no \ + --enable-fast-install=yes \ + --enable-largefile \ + --enable-logging \ + --disable-debug \ + --enable-dht \ + --enable-encryption \ + --enable-deprecated-functions \ + --enable-examples \ + --disable-tests \ + --enable-python-binding \ + --with-libiconv + make + + # build python2 bindings (python3 bindings are built during 'make') + python2 setup.py build + make DESTDIR=$PKG install + python2 setup.py install --root="$PKG" --optimize=1 + + # license + install -D -m644 COPYING "${PKG}/usr/share/licenses/${isim}/LICENSE" + + # remove most example binaries + rm "$PKG"/usr/bin/{*_test,*_tester,simple_client,stats_counters} + +} diff --git a/talimatname/genel/l/libtorrent/talimat b/talimatname/genel/l/libtorrent/talimat new file mode 100644 index 000000000..d5c68d6ce --- /dev/null +++ b/talimatname/genel/l/libtorrent/talimat @@ -0,0 +1,21 @@ +# Tanım: Torrent kitaplığı +# URL: https://rakshasa.github.io/rtorrent +# Paketçi: milisarge +# Gerekler: libsigc++ + +isim=libtorrent +surum=0.13.6 +devir=1 +kaynak=(http://rtorrent.net/downloads/libtorrent-$surum.tar.gz) + +derle() { + cd $isim-$surum + + # remove cppunit dependency + sed -i '/AM_PATH_CPPUNIT(.*)/d' configure.ac + ./autogen.sh + + ./configure --prefix=/usr --enable-debug=no + make + make install DESTDIR=$PKG +} diff --git a/talimatname/genel/l/libtranscript/talimat b/talimatname/genel/l/libtranscript/talimat new file mode 100644 index 000000000..b7215eee4 --- /dev/null +++ b/talimatname/genel/l/libtranscript/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir karakter kümesi dönüştürme kitaplığı. +# URL: http://os.ghalkes.nl/libtranscript.html +# Paketçi: Cihan Alkan +# Gerekler: gettext +# Grup: kütüphane + +isim=libtranscript +surum=0.3.2 +devir=1 + +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr --with-ucm2ltc CFLAGS="-O2 -D_POSIX_C_SOURCE=200809L" + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}/usr/share/doc/$isim/API" + +} diff --git a/talimatname/genel/l/libuecc/talimat b/talimatname/genel/l/libuecc/talimat new file mode 100644 index 000000000..1a11aa0ff --- /dev/null +++ b/talimatname/genel/l/libuecc/talimat @@ -0,0 +1,18 @@ +# Tanım: Çok küçük Elliptic Curve Cryptography kütüphanesi +# URL: http://git.universe-factory.net/libuecc/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=libuecc +surum=7 +devir=1 + +kaynak=(https://projects.universe-factory.net/attachments/download/85/${isim}-${surum}.tar.xz) + +derle() { + mkdir -p "build-${surum}" + cd "build-${surum}" + cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr "../${isim}-${surum}" + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libunique/talimat b/talimatname/genel/l/libunique/talimat new file mode 100644 index 000000000..8a04be384 --- /dev/null +++ b/talimatname/genel/l/libunique/talimat @@ -0,0 +1,18 @@ +# Tanım: GTK3 için tekli örnek uygulamaları yazan kütüphane +# URL: http://live.gnome.org/LibUnique +# Paketçi: milisarge +# Gerekler: gtk3 gobject-introspection + +isim=libunique +surum=3.0.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +rm -r $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/l/libunique1/talimat b/talimatname/genel/l/libunique1/talimat new file mode 100644 index 000000000..8d750ab1a --- /dev/null +++ b/talimatname/genel/l/libunique1/talimat @@ -0,0 +1,25 @@ +# Tanım: Libunique paketi, tekli örnek uygulamaları yazmak için bir kütüphane içerir. +# URL: http://live.gnome.org/LibUnique +# Paketçi: milisarge +# Gerekler: gtk2 + +_isim=libunique + +isim=libunique1 +surum=1.1.6 +devir=2 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/${_name}/${surum%.*}-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/blfs/svn/libunique-$surum-upstream_fixes-1.patch) + +derle() { +cd ${_name}-$surum +patch -Np1 -i ../libunique-$surum-upstream_fixes-1.patch +autoreconf -fi +./configure --prefix=/usr --disable-static \ +--disable-dbus +make +make DESTDIR=$PKG install +rm -r $PKG/usr/share/gtk-doc +} + diff --git a/talimatname/genel/l/libunique3/talimat b/talimatname/genel/l/libunique3/talimat new file mode 100644 index 000000000..d303e3c69 --- /dev/null +++ b/talimatname/genel/l/libunique3/talimat @@ -0,0 +1,28 @@ +# Tanım: GTK3 için tekli örnek uygulamaları yazan kütüphane +# URL: http://live.gnome.org/LibUnique +# Paketçi: Cihan_Alkan +# Gerekler: gtk3 gobject-introspection +# Grup: kütüphane + +isim=libunique3 +surum=3.0.2 +devir=1 +kaynak=(https://archive.archlinux.org/repos/2014/07/01/extra/os/x86_64/libunique3-3.0.2-3-x86_64.pkg.tar.xz) + +derle() { + + cd "$SRC/" + install -Dm644 "usr/include/unique-3.0/unique/unique.h" "$PKG/usr/include/unique-3.0/unique/unique.h" + install -Dm644 "usr/include/unique-3.0/unique/uniqueapp.h" "$PKG/usr/include/unique-3.0/unique/uniqueapp.h" + install -Dm644 "usr/include/unique-3.0/unique/uniquebackend.h" "$PKG/usr/include/unique-3.0/unique/uniquebackend.h" + install -Dm644 "usr/include/unique-3.0/unique/uniqueenumtypes.h" "$PKG/usr/include/unique-3.0/unique/uniqueenumtypes.h" + install -Dm644 "usr/include/unique-3.0/unique/uniquemessage.h" "$PKG/usr/include/unique-3.0/unique/uniquemessage.h" + install -Dm644 "usr/include/unique-3.0/unique/uniqueversion.h" "$PKG/usr/include/unique-3.0/unique/uniqueversion.h" + install -Dm644 "usr/lib/girepository-1.0/Unique-3.0.typelib" "$PKG/usr/lib/girepository-1.0/Unique-3.0.typelib" + install -Dm644 "usr/lib/pkgconfig/unique-3.0.pc" "$PKG/usr/lib/pkgconfig/unique-3.0.pc" + install -Dm644 "usr/share/gir-1.0/Unique-3.0.gir" "$PKG/usr/share/gir-1.0/Unique-3.0.gir" + install -Dm755 "usr/lib/libunique-3.0.so.0.0.2" "$PKG/usr/lib/libunique-3.0.so.0.0.2" + cd "$PKG/usr/lib/" + ln -s "libunique-3.0.so.0.0.2" "libunique-3.0.so.0" + ln -s "libunique-3.0.so.0.0.2" "libunique-3.0.so" +} diff --git a/talimatname/genel/l/libunistring/talimat b/talimatname/genel/l/libunistring/talimat new file mode 100644 index 000000000..ac80bf874 --- /dev/null +++ b/talimatname/genel/l/libunistring/talimat @@ -0,0 +1,18 @@ +# Tanım: Libunistring, Unicode dizelerinin değiştirilmesi için işlevler sağlayan bir kitaplıktır +# URL: http://www.gnu.org/software/bison/ +# Paketçi: milisarge +# Gerekler: + +isim=libunistring +surum=0.9.6 +devir=1 + +kaynak=(ftp://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr -disable-static +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/l/libunwind/talimat b/talimatname/genel/l/libunwind/talimat new file mode 100644 index 000000000..6e29f9a19 --- /dev/null +++ b/talimatname/genel/l/libunwind/talimat @@ -0,0 +1,19 @@ +# Tanım: Bir programın çağrı zincirini belirlemek için taşınabilir ve verimli bir C API'yi tanımlayın. +# URL: http://www.nongnu.org/libunwind/ +# Paketçi: milisarge +# Gerekler: + +isim=libunwind +surum=1.1 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum/ + ./configure --prefix=/usr --mandir=/usr/man/ + make + make -j1 DESTDIR=$PKG PREFIX=/usr install + +} diff --git a/talimatname/genel/l/libupnp/talimat b/talimatname/genel/l/libupnp/talimat new file mode 100644 index 000000000..533c836bf --- /dev/null +++ b/talimatname/genel/l/libupnp/talimat @@ -0,0 +1,22 @@ +# Tanım: Portatif bir Açık Kaynak UPnP Geliştirme Seti. +# URL: http://pupnp.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=libupnp +surum=1.6.19 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/pupnp/pupnp/libUPnP%20$surum/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --disable-static \ + --disable-dependency-tracking + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/liburcu/talimat b/talimatname/genel/l/liburcu/talimat new file mode 100644 index 000000000..18d9143e4 --- /dev/null +++ b/talimatname/genel/l/liburcu/talimat @@ -0,0 +1,17 @@ +# Tanım: LGPLv2.1 userspace RCU (read-copy-update) library +# URL: http://lttng.org/urcu +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=liburcu +surum=0.10.1 +devir=1 +kaynak=(https://lttng.org/files/urcu/userspace-rcu-${surum}.tar.bz2) + +derle() { + cd "$SRC"/userspace-rcu-${surum} + ./configure --prefix=/usr + make + make install DESTDIR="$PKG" +} diff --git a/talimatname/genel/l/libusb-compat/talimat b/talimatname/genel/l/libusb-compat/talimat new file mode 100644 index 000000000..ebb275eba --- /dev/null +++ b/talimatname/genel/l/libusb-compat/talimat @@ -0,0 +1,19 @@ +# Tanım: Libusb-compat paketi libusb-0.1 gibi görünme, hissetme ve davranmayı amaçlamaktadır. +# URL: https://sourceforge.net/p/libusb/wiki/Home/ +# Paketçi: milisarge +# Gerekler: libusb + +isim=libusb-compat +surum=0.1.5 +devir=1 + +kaynak=( http://sourceforge.net/projects/libusb/files/libusb-compat-0.1/libusb-compat-$surum/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libusb/talimat b/talimatname/genel/l/libusb/talimat new file mode 100644 index 000000000..028b4fec4 --- /dev/null +++ b/talimatname/genel/l/libusb/talimat @@ -0,0 +1,20 @@ +# Tanım: Libusb paketi, bazı uygulamalar tarafından USB aygıt erişimi için kullanılan bir kitaplık içerir. +# URL: http://libusb.wiki.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=libusb +surum=1.0.20 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr\ + --disable-build-docs\ + --mandir=/usr/share/man\ + --infodir=/usr/share/info + make -j1 + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libutempter/talimat b/talimatname/genel/l/libutempter/talimat new file mode 100644 index 000000000..41b6dd110 --- /dev/null +++ b/talimatname/genel/l/libutempter/talimat @@ -0,0 +1,19 @@ +# Tanım: Kullanıcı oturumlarını utmp ve wtmp dosyalarına kaydetmek için terminal öykünücüsü için arabirim. +# URL: ftp://ftp.altlinux.org/pub/people/ldv/utempter +# Paketçi: milisarge +# Gerekler: + +isim=libutempter +surum=1.1.6 +devir=1 + +kaynak=(http://ftp.altlinux.org/pub/people/ldv/utempter/$isim-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + RPM_OPT_FLAGS="$CFLAGS" make + make + make DESTDIR=$PKG install + chown root:utmp $PKG/usr/lib/utempter/utempter + chmod 2755 $PKG/usr/lib/utempter/utempter +} diff --git a/talimatname/genel/l/libuv/talimat b/talimatname/genel/l/libuv/talimat new file mode 100644 index 000000000..49a790cd6 --- /dev/null +++ b/talimatname/genel/l/libuv/talimat @@ -0,0 +1,19 @@ +# Tanım: Multi-platform support library with a focus on asynchronous I/O +# URL: https://github.com/libuv/libuv +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=libuv +surum=1.18.0 +devir=1 +kaynak=(https://github.com/libuv/libuv/archive/v1.18.0/libuv-$surum.tar.gz::libuv-$surum.tar.gz) + +derle() { + cd "$SRC"/$isim-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make check + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libva/talimat b/talimatname/genel/l/libva/talimat new file mode 100644 index 000000000..2990996c4 --- /dev/null +++ b/talimatname/genel/l/libva/talimat @@ -0,0 +1,21 @@ +# Tanım: Video Acceleration API to enable hardware accelerated video decode/encode. +# URL: http://freedesktop.org/wiki/Software/vaapi +# Paketçi: milisarge +# Gerekler: xorg-mesa + +isim=libva +surum=1.8.2 +devir=1 +kaynak=(https://www.freedesktop.org/software/vaapi/releases/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --disable-wayland \ + --disable-dependency-tracking + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libvdpau-va-gl/talimat b/talimatname/genel/l/libvdpau-va-gl/talimat new file mode 100644 index 000000000..b37e25640 --- /dev/null +++ b/talimatname/genel/l/libvdpau-va-gl/talimat @@ -0,0 +1,16 @@ +# Tanım: OpenGL/VAAPI destekli VDPAU sürücüleri +# URL: https://github.com/i-rinat/libvdpau-va-gl +# Paketçi: milisarge +# Gerekler: cmake libvdpau libva ffmpeg xorg-glu + +isim=libvdpau-va-gl +surum=0.4.2 +devir=1 +kaynak=(https://github.com/i-rinat/libvdpau-va-gl/archive/v0.4.2.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/libvdpau/talimat b/talimatname/genel/l/libvdpau/talimat new file mode 100644 index 000000000..ecc52acc4 --- /dev/null +++ b/talimatname/genel/l/libvdpau/talimat @@ -0,0 +1,22 @@ +# Tanım: video çözücü apisi +# URL: http://cgit.freedesktop.org/vdpau/libvdpau +# Paketçi: milisarge +# Gerekler: xorg-libxext xorg-dri2proto +# Grup: kütüphane + +isim=libvdpau +surum=1.1.1 +devir=2 +kaynak=(http://people.freedesktop.org/~aplattner/vdpau/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --disable-dependency-tracking \ + --disable-documentation + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libvisio/talimat b/talimatname/genel/l/libvisio/talimat new file mode 100644 index 000000000..1de18ad1b --- /dev/null +++ b/talimatname/genel/l/libvisio/talimat @@ -0,0 +1,17 @@ +# Tanım: Visio diyagramlarını yorumlama ve içe aktarma kabiliyeti sağlayan kitaplık +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libvisio +# Paketçi: Cihan Alkan +# Gerekler: doxygen libwpd boost librevenge icu libxml2 doxygen + +isim=libvisio +surum=0.1.5 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libvlc/lua53_compat.patch b/talimatname/genel/l/libvlc/lua53_compat.patch new file mode 100644 index 000000000..aeff7b2fd --- /dev/null +++ b/talimatname/genel/l/libvlc/lua53_compat.patch @@ -0,0 +1,30 @@ +commit 41caaa08cde60c4fec4bf2e5f9610e2a1b9e6a23 +Author: Vinson Lee <vlee@freedesktop.org> +Date: Thu Feb 5 14:48:53 2015 -0800 + + lua: Define LUA_COMPAT_APIINTCASTS for Lua >= 5.3.0 compatibility. + + In Lua 5.3.0, luaL_checkint was deprecated. + + This patch fixes this build error with Lua 5.3.0. + + lua/demux.c: In function ‘vlclua_demux_peek’: + lua/demux.c:55:5: error: implicit declaration of function ‘luaL_checkint’ [-Werror=implicit-function-declaration] + int n = luaL_checkint( L, 1 ); + ^ + + Signed-off-by: Vinson Lee <vlee@freedesktop.org> + Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org> + +diff --git a/modules/lua/vlc.h b/modules/lua/vlc.h +index efd94f1..85c7fc1 100644 +--- a/modules/lua/vlc.h ++++ b/modules/lua/vlc.h +@@ -38,6 +38,7 @@ + #include <vlc_stream.h> + #include <vlc_demux.h> + ++#define LUA_COMPAT_APIINTCASTS + #define LUA_COMPAT_MODULE + #include <lua.h> /* Low level lua C API */ + #include <lauxlib.h> /* Higher level C API */ diff --git a/talimatname/genel/l/libvlc/talimat b/talimatname/genel/l/libvlc/talimat new file mode 100644 index 000000000..15ccefed9 --- /dev/null +++ b/talimatname/genel/l/libvlc/talimat @@ -0,0 +1,29 @@ +# Tanım: Vlc'den kütüphane +# URL: http://www.slackware.com/~alien/slackbuilds/vlc/ +# Paketçi: milisarge +# Gerekler: libbluray opus qt5 x264 flac libmad glib librsvg alsa-lib xorg-libxinerama xorg-libxpm libvpx libcdio vcdimager live libdvdcss libdvdread libdvdnav libogg libtheora lame faac libvorbis ffmpeg faad2 liba52 libmpeg2 libmpcdec fribidi lua libdv speex + +isim=libvlc +surum=3.0.0 +devir=20160606 + +kaynak=( http://anduin.linuxfromscratch.org/BLFS/vlc/vlc-$surum-$devir.tar.xz + lua53_compat.patch) + +derle() { + +cd vlc-$surum-$devir + +sed -i '/seems to be moved/s/^/#/' autotools/ltmain.sh + +BUILDCC=gcc \ +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --enable-bluray \ + --enable-opus \ + RCC=/usr/bin/rcc-qt5 + +make +make DESTDIR=$PKG install +rm -r $PKG/usr/{lib/vlc,share,bin} +} diff --git a/talimatname/genel/l/libvncserver/talimat b/talimatname/genel/l/libvncserver/talimat new file mode 100644 index 000000000..a11fe1f0a --- /dev/null +++ b/talimatname/genel/l/libvncserver/talimat @@ -0,0 +1,17 @@ +# Tanım: VNC sunucusunu kolayca uygulamanıza olanak tanıyan çapraz platform C kütüphaneleri +# URL: https://libvnc.github.io/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo libpng gnutls libgcrypt sdl + +isim=libvncserver +surum=0.9.11 +devir=1 + +kaynak=(https://github.com/LibVNC/libvncserver/archive/LibVNCServer-${surum}.tar.gz) +derle() { + cd $isim-LibVNCServer-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libvorbis/talimat b/talimatname/genel/l/libvorbis/talimat new file mode 100644 index 000000000..00af20bb4 --- /dev/null +++ b/talimatname/genel/l/libvorbis/talimat @@ -0,0 +1,18 @@ +# Tanım: Ücretsiz, açık ve patentsiz ses codec'i, kabaca diğer formatlarla karşılaştırılabilir. +# URL: http://www.vorbis.com/ +# Paketçi: milisarge +# Gerekler: libogg doxygen +isim=libvorbis +surum=1.3.5 +devir=1 + +kaynak=( http://downloads.xiph.org/releases/vorbis/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +install -v -m644 doc/Vorbis* $PKG/usr/share/doc/libvorbis-$surum +} diff --git a/talimatname/genel/l/libvpx/talimat b/talimatname/genel/l/libvpx/talimat new file mode 100644 index 000000000..427b3d16c --- /dev/null +++ b/talimatname/genel/l/libvpx/talimat @@ -0,0 +1,25 @@ +# Tanım: VP8 Codec SDK'sı +# URL: http://webm.googlecode.com/files/libvpx-v1.1.0.tar.bz2 +# Paketçi: milisarge +# Gerekler: yasm + +isim=libvpx +surum=1.5.0 +devir=1 + +kaynak=(http://storage.googleapis.com/downloads.webmproject.org/releases/webm/libvpx-$surum.tar.bz2) +derle() { +cd $isim-$surum +sed -e 's/cp -p/cp/' \ + -i build/make/Makefile +chmod -v 644 vpx/*.h +mkdir ../libvpx-build +cd ../libvpx-build +../libvpx-$surum/configure --prefix=/usr \ +--enable-shared --disable-static \ +--disable-install-docs \ +--disable-install-srcs +make + +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwacom/talimat b/talimatname/genel/l/libwacom/talimat new file mode 100644 index 000000000..01a4d4bdf --- /dev/null +++ b/talimatname/genel/l/libwacom/talimat @@ -0,0 +1,17 @@ +# Tanım: Wacom tabletlerini ve özelliklerini belirlemek için Kütüphane +# URL: http://linuxwacom.sourceforge.net/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: glib libgudev + +isim=libwacom +surum=0.21 +devir=1 + +kaynak=(http://sourceforge.net/projects/linuxwacom/files/libwacom/libwacom-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwebp/talimat b/talimatname/genel/l/libwebp/talimat new file mode 100644 index 000000000..e69f5696e --- /dev/null +++ b/talimatname/genel/l/libwebp/talimat @@ -0,0 +1,23 @@ +# Tanım: WebP kütüphanesi ve dönüştürme araçları +# URL: https://developers.google.com/speed/webp/ +# Paketçi: milisarge +# Gerekler: libpng libjpeg-turbo libtiff + +isim=libwebp +surum=0.5.0 +devir=1 + +kaynak=(http://downloads.webmproject.org/releases/webp/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--enable-libwebpmux \ +--enable-libwebpdemux \ +--enable-libwebpdecoder \ +--enable-libwebpextras \ +--enable-swap-16bit-csp \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwebsockets/talimat b/talimatname/genel/l/libwebsockets/talimat new file mode 100644 index 000000000..ea6ecad4d --- /dev/null +++ b/talimatname/genel/l/libwebsockets/talimat @@ -0,0 +1,21 @@ +# Tanım: Websocket istemcileri ve sunucuları için C kütüphanesi +# URL: https://libwebsockets.org +# Paketçi: Cihan Alkan +# Gerekler: cmake +# Grup: kütüphane + +isim=libwebsockets +surum=2.4.1 +devir=1 +kaynak=(https://github.com/warmcat/libwebsockets/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + mkdir build && cd build + # http2 support -DLWS_WITH_HTTP2=1 + cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=/usr .. + make + make DESTDIR="${PKG}" install + cd .. + install -Dm644 LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/l/libwlocate/talimat b/talimatname/genel/l/libwlocate/talimat new file mode 100644 index 000000000..65f7c04d0 --- /dev/null +++ b/talimatname/genel/l/libwlocate/talimat @@ -0,0 +1,19 @@ +# Tanım: Konum tabanlı hizmetler için kullanılabilen paylaşılan bir kütüphane. +# URL: http://sourceforge.net/projects/libwlocate +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: wireless-tools + +isim=libwlocate +surum=0.1 +devir=1 + +kaynak=( https://github.com/openwifi-su/lwlocate/archive/v$surum.tar.gz) + +derle() { + cd lwlocate-$surum/master + make -f Makelib + make + install -Dm644 libwlocate.so $PKG/usr/lib/libwlocate.so + install -Dm644 libwlocate.h $PKG/usr/include/libwlocate.h + install -Dm755 lwtrace $PKG/usr/bin/lwtrace +} diff --git a/talimatname/genel/l/libwmf/libwmf.0.2.8.4-libpng-1.5.patch b/talimatname/genel/l/libwmf/libwmf.0.2.8.4-libpng-1.5.patch new file mode 100644 index 000000000..7d40bbe89 --- /dev/null +++ b/talimatname/genel/l/libwmf/libwmf.0.2.8.4-libpng-1.5.patch @@ -0,0 +1,12 @@ +diff -urN libwmf-0.2.8.4.old/src/ipa/ipa/bmp.h libwmf-0.2.8.4/src/ipa/ipa/bmp.h +--- libwmf-0.2.8.4.old/src/ipa/ipa/bmp.h 2011-05-23 19:14:23.000000000 +0200 ++++ libwmf-0.2.8.4/src/ipa/ipa/bmp.h 2011-05-23 19:15:11.000000000 +0200 +@@ -66,7 +66,7 @@ + return; + } + +- if (setjmp (png_ptr->jmpbuf)) ++ if (setjmp(png_jmpbuf(png_ptr))) + { WMF_DEBUG (API,"Failed to write bitmap as PNG! (setjmp failed)"); + png_destroy_write_struct (&png_ptr,&info_ptr); + wmf_free (API,buffer); \ No newline at end of file diff --git a/talimatname/genel/l/libwmf/libwmf.0.2.8.4-useafterfree.patch b/talimatname/genel/l/libwmf/libwmf.0.2.8.4-useafterfree.patch new file mode 100644 index 000000000..0d1463ace --- /dev/null +++ b/talimatname/genel/l/libwmf/libwmf.0.2.8.4-useafterfree.patch @@ -0,0 +1,10 @@ +--- libwmf-0.2.8.4/src/extra/gd/gd_clip.c.CVE-2009-1364-im-clip-list 2009-04-24 04:06:44.000000000 -0400 ++++ libwmf-0.2.8.4/src/extra/gd/gd_clip.c 2009-04-24 04:08:30.000000000 -0400 +@@ -70,6 +70,7 @@ void gdClipSetAdd(gdImagePtr im,gdClipRe + { more = gdRealloc (im->clip->list,(im->clip->max + 8) * sizeof (gdClipRectangle)); + if (more == 0) return; + im->clip->max += 8; ++ im->clip->list = more; + } + im->clip->list[im->clip->count] = (*rect); + im->clip->count++; \ No newline at end of file diff --git a/talimatname/genel/l/libwmf/libwmf.kur-kos b/talimatname/genel/l/libwmf/libwmf.kur-kos new file mode 100644 index 000000000..22c2f7f9a --- /dev/null +++ b/talimatname/genel/l/libwmf/libwmf.kur-kos @@ -0,0 +1,4 @@ +if [ -x /usr/bin/gdk-pixbuf-query-loaders ]; then + install -d /etc/gtk-2.0 + gdk-pixbuf-query-loaders > /etc/gtk-2.0/gdk-pixbuf.loaders +fi diff --git a/talimatname/genel/l/libwmf/talimat b/talimatname/genel/l/libwmf/talimat new file mode 100644 index 000000000..7872d6760 --- /dev/null +++ b/talimatname/genel/l/libwmf/talimat @@ -0,0 +1,27 @@ +# Tanım: Microsoft'un yerli Windows Meta Dosyası Biçimi (WMF) içindeki vektör görüntülerini okumak için bir kütüphane +# URL: http://wvware.sourceforge.net/libwmf.html +# Paketçi: milisarge +# Gerekler: gsfonts libjpeg-turbo xorg-libx11 gdk-pixbuf gtk2 xorg-libxt + +isim=libwmf +surum=0.2.8.4 +devir=1 + +kaynak=( +http://downloads.sourceforge.net/sourceforge/wvware/$isim-$surum.tar.gz +libwmf.0.2.8.4-libpng-1.5.patch +libwmf.0.2.8.4-useafterfree.patch) + +derle(){ + cd $isim-$surum + patch -p1 -i $SRC/libwmf.0.2.8.4-libpng-1.5.patch + patch -p1 -i $SRC/libwmf.0.2.8.4-useafterfree.patch + ./configure --prefix=/usr \ + --with-gsfontdir=/usr/share/fonts/Type1 \ + --with-fontdir=/usr/share/fonts/Type1 \ + --with-gsfontmap=/usr/share/ghostscript/9.14/Resource/Init/Fontmap.GS + make + make DESTDIR=$PKG install + # rm fonts already in gsfonts packages + rm -rf $PKG/usr/share/fonts +} diff --git a/talimatname/genel/l/libwnck/talimat b/talimatname/genel/l/libwnck/talimat new file mode 100644 index 000000000..96c029207 --- /dev/null +++ b/talimatname/genel/l/libwnck/talimat @@ -0,0 +1,16 @@ +# Tanım: Windows navigator inşaat kiti içerir +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: xorg-libxres gtk2 intltool gobject-introspection startup-notification gtk-doc + +isim=libwnck +surum=2.31.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) +derle() { + cd $isim-$surum + ./configure --prefix=/usr --program-suffix=-1 + make GETTEXT_PACKAGE=libwnck-1 + make DESTDIR=$PKG GETTEXT_PACKAGE=libwnck-1 install +} diff --git a/talimatname/genel/l/libwnck3/talimat b/talimatname/genel/l/libwnck3/talimat new file mode 100644 index 000000000..6958a7012 --- /dev/null +++ b/talimatname/genel/l/libwnck3/talimat @@ -0,0 +1,16 @@ +# Tanım: Pencere Gezgini İnşaat Takımı (GTK + 3). +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: gtk3 perl-xml-parser xorg-libxt xorg-libxres startup-notification xorg-libxinerama xorg-libxrandr xorg-libxcursor xorg-libxdamage intltool gobject-introspection + +isim=libwnck3 +surum=3.14.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/libwnck/${surum%.*}/libwnck-$surum.tar.xz) +derle() { +cd libwnck-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwpd/talimat b/talimatname/genel/l/libwpd/talimat new file mode 100644 index 000000000..9d7af1701 --- /dev/null +++ b/talimatname/genel/l/libwpd/talimat @@ -0,0 +1,17 @@ +# Tanım: WordPerfect (tm) belgelerini içe aktarmak için kitaplık +# URL: http://libwpd.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libgsf librevenge + +isim=libwpd +surum=0.10.0 +devir=1 + +kaynak=(http://prdownloads.sourceforge.net/libwpd/libwpd-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwpg/talimat b/talimatname/genel/l/libwpg/talimat new file mode 100644 index 000000000..a6c0242e7 --- /dev/null +++ b/talimatname/genel/l/libwpg/talimat @@ -0,0 +1,17 @@ +# Tanım: Corel WordPerfect (tm) Grafik görüntülerini içe aktarmak ve dönüştürmek için kullanılan kitaplık. +# URL: http://libwpg.sourceforge.net/libwpg.htm +# Paketçi: milisarge +# Gerekler: libwpd + +isim=libwpg +surum=0.3.0 +devir=1 + +kaynak=(http://sourceforge.net/projects/libwpg/files/libwpg/libwpg-$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --without-docs + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libwps/talimat b/talimatname/genel/l/libwps/talimat new file mode 100644 index 000000000..5ff56ea85 --- /dev/null +++ b/talimatname/genel/l/libwps/talimat @@ -0,0 +1,17 @@ +# Tanım: Microsoft Works dosya sözcük işlemci biçimi içe aktarma filtre kitaplığı +# URL: https://sourceforge.net/projects/libwps/ +# Paketçi: Cihan Alkan +# Gerekler: doxygen libwpd boost librevenge + +isim=libwps +surum=0.4.7 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/libwps/$isim/$isim-$surum/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static + make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libxcb/libxcb-1.1-no-pthread-stubs.patch b/talimatname/genel/l/libxcb/libxcb-1.1-no-pthread-stubs.patch new file mode 100644 index 000000000..3580aa4e0 --- /dev/null +++ b/talimatname/genel/l/libxcb/libxcb-1.1-no-pthread-stubs.patch @@ -0,0 +1,11 @@ +--- libxcb-1.8.1/configure.ac 2012-03-09 15:38:38.000000000 +0100 ++++ libxcb-1.8.1/configure.ac.new 2012-03-09 16:50:40.107109896 +0100 +@@ -43,7 +43,7 @@ + + # Checks for pkg-config packages + PKG_CHECK_MODULES(XCBPROTO, xcb-proto >= 1.12) +-NEEDED="pthread-stubs xau >= 0.99.2" ++NEEDED="xau >= 0.99.2" + PKG_CHECK_MODULES(NEEDED, $NEEDED) + + have_xdmcp="no" diff --git a/talimatname/genel/l/libxcb/python-35x-fixes.patch b/talimatname/genel/l/libxcb/python-35x-fixes.patch new file mode 100644 index 000000000..88de25268 --- /dev/null +++ b/talimatname/genel/l/libxcb/python-35x-fixes.patch @@ -0,0 +1,42 @@ +diff --git a/src/c_client.py b/src/c_client.py +index 57de3fb..043338d 100644 +--- a/src/c_client.py ++++ b/src/c_client.py +@@ -1364,7 +1364,7 @@ def _c_serialize(context, self): + _c(' unsigned int xcb_align_to = 0;') + if self.is_switch: + _c(' unsigned int xcb_padding_offset = %d;', +- self.get_align_offset() ) ++ self.get_align_offset() ) + prefix = [('_aux', '->', self)] + aux_ptr = 'xcb_out' + +@@ -1390,7 +1390,7 @@ def _c_serialize(context, self): + _c(' unsigned int xcb_align_to = 0;') + if self.is_switch: + _c(' unsigned int xcb_padding_offset = %d;', +- self.get_align_offset() ) ++ self.get_align_offset() ) + + elif 'sizeof' == context: + param_names = [p[2] for p in params] +@@ -1930,14 +1930,14 @@ def _c_accessors_list(self, field): + # from the request size and divide that by the member size + return '(((R->length * 4) - sizeof('+ self.c_type + '))/'+'sizeof('+field.type.member.c_wiretype+'))' + else: +- # use the accessor to get the start of the list, then +- # compute the length of it by subtracting it from ++ # use the accessor to get the start of the list, then ++ # compute the length of it by subtracting it from + # the adress of the first byte after the end of the + # request +- after_end_of_request = '(((char*)R) + R->length * 4)' +- start_of_list = '%s(R)' % (field.c_accessor_name) ++ after_end_of_request = '(((char*)R) + R->length * 4)' ++ start_of_list = '%s(R)' % (field.c_accessor_name) + bytesize_of_list = '%s - (char*)(%s)' % (after_end_of_request, start_of_list) +- return '(%s) / sizeof(%s)' % (bytesize_of_list, field.type.member.c_wiretype) ++ return '(%s) / sizeof(%s)' % (bytesize_of_list, field.type.member.c_wiretype) + else: + raise Exception( + "lengthless lists with varsized members are not supported. Fieldname '%s'" diff --git a/talimatname/genel/l/libxcb/talimat b/talimatname/genel/l/libxcb/talimat new file mode 100644 index 000000000..467e0aac5 --- /dev/null +++ b/talimatname/genel/l/libxcb/talimat @@ -0,0 +1,30 @@ +# Tanım: Geçerli Xlib arabirimini değiştiren X Pencere Sistem protokolüne arabirim. +# URL: http://xcb.freedesktop.org +# Paketçi: milisarge +# Gerekler: xcb-proto xorg-libxdmcp xorg-libxau libxslt xorg-util-macros + +isim=libxcb +surum=1.12 +devir=2 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2 + libxcb-1.1-no-pthread-stubs.patch + python-35x-fixes.patch) + +derle() { +cd $isim-$surum +patch -Np1 -i ../libxcb-1.1-no-pthread-stubs.patch +patch -Np1 -i ../python-35x-fixes.patch + +autoreconf -vfi + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --docdir='${datadir}'/doc/libxcb-$surum \ + --enable-xinput \ + --enable-xkb \ + --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libxdg-basedir/talimat b/talimatname/genel/l/libxdg-basedir/talimat new file mode 100644 index 000000000..0c139442c --- /dev/null +++ b/talimatname/genel/l/libxdg-basedir/talimat @@ -0,0 +1,18 @@ +# Tanım: XDG Temel Dizini teknik özelliklerinin bir uygulaması. +# URL: https://github.com/devnev/libxdg-basedir +# Paketçi: milisarge +# Gerekler: + +isim=libxdg-basedir +surum=1.2.0 +devir=1 +kaynak=(https://github.com/devnev/libxdg-basedir/archive/$isim-$surum.tar.gz) + +derle() { + cd $isim-$isim-$surum + + ./autogen.sh --prefix=/usr + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libxfcegui4/libxfcegui4-4.10.0-no-xfce_setenv.patch b/talimatname/genel/l/libxfcegui4/libxfcegui4-4.10.0-no-xfce_setenv.patch new file mode 100644 index 000000000..ffb216082 --- /dev/null +++ b/talimatname/genel/l/libxfcegui4/libxfcegui4-4.10.0-no-xfce_setenv.patch @@ -0,0 +1,14 @@ +http://bugs.gentoo.org/513568 +http://bugzilla.xfce.org/show_bug.cgi?id=10974 + +--- libxfcegui4/xfce-exec.c ++++ libxfcegui4/xfce-exec.c +@@ -79,7 +79,7 @@ + #ifndef G_OS_WIN32 + gchar *dpyname = user_data; + +- xfce_setenv ("DISPLAY", dpyname, TRUE); ++ g_setenv ("DISPLAY", dpyname, TRUE); + #endif + } + diff --git a/talimatname/genel/l/libxfcegui4/talimat b/talimatname/genel/l/libxfcegui4/talimat new file mode 100644 index 000000000..dba044609 --- /dev/null +++ b/talimatname/genel/l/libxfcegui4/talimat @@ -0,0 +1,26 @@ +# Tanım: Xfce4 için çeşitli Gtk widget'ları (Kullanımdan kaldırılmış kitaplık) +# URL: http://www.xfce.org/ +# Paketçi: Cihan Alkan +# Gerekler: startup-notification xfce4-conf libglade xorg-libsm hicolor-icon-theme +# Grup: xfce + +isim=libxfcegui4 +surum=4.10.0 +devir=1 +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2 + libxfcegui4-4.10.0-no-xfce_setenv.patch) + + +derle() { +cd $isim-$surum + patch -Np0 -i $SRC/libxfcegui4-4.10.0-no-xfce_setenv.patch + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libxkbcommon/talimat b/talimatname/genel/l/libxkbcommon/talimat new file mode 100644 index 000000000..6567a08f9 --- /dev/null +++ b/talimatname/genel/l/libxkbcommon/talimat @@ -0,0 +1,18 @@ +# Tanım: XKB belirtimiyle tanımlanan anahtar dizinlerinin daha düşük bir alt kümesini işleyen bir kitaplık +# URL: http://xkbcommon.org/ +# Paketçi: milisarge +# Gerekler: xorg-xkeyboard-config libxcb doxygen xorg-util-macros + +isim=libxkbcommon +surum=0.5.0 +devir=1 + +kaynak=(http://xkbcommon.org/download/libxkbcommon-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libxml++26/talimat b/talimatname/genel/l/libxml++26/talimat new file mode 100644 index 000000000..d74b53d78 --- /dev/null +++ b/talimatname/genel/l/libxml++26/talimat @@ -0,0 +1,19 @@ +# Tanım: XML dosyalarını ayrıştırmak için kullanılan kitaplıklar ve yardımcı programlar. +# URL: http://libxmlplusplus.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libxml2 glibmm + +isim=libxml++26 +surum=2.40.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/GNOME/sources/libxml++/${version:0:4}/libxml++-${surum}.tar.xz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/libxml++-${surum}" + ./configure --prefix=/usr + + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/l/libxml2/talimat b/talimatname/genel/l/libxml2/talimat new file mode 100644 index 000000000..2b886fc78 --- /dev/null +++ b/talimatname/genel/l/libxml2/talimat @@ -0,0 +1,19 @@ +# Tanım: XML dosyalarını ayrıştırmak için kullanılan kitaplıklar ve yardımcı programlar. +# URL: http://xmlsoft.org/ +# Paketçi: milisarge +# Gerekler: python + +isim=libxml2 +surum=2.9.5 +devir=1 + +kaynak=(ftp://xmlsoft.org/libxml2/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static --with-history + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/l/libxslt/talimat b/talimatname/genel/l/libxslt/talimat new file mode 100644 index 000000000..513e2d9b6 --- /dev/null +++ b/talimatname/genel/l/libxslt/talimat @@ -0,0 +1,17 @@ +# Tanım: XSLT kitaplıkları, XSLT dosyalarını desteklemek için libxml2 kitaplıklarını genişletmek için kullanılır. +# URL: http://xmlsoft.org/XSLT/ +# Paketçi: milisarge +# Gerekler: libxml2 libgcrypt + +isim=libxslt +surum=1.1.28 +devir=1 + +kaynak=( ftp://xmlsoft.org/libxml2/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libyubikey/libyubikey.70-yubikey.rules b/talimatname/genel/l/libyubikey/libyubikey.70-yubikey.rules new file mode 100644 index 000000000..e1ddb940a --- /dev/null +++ b/talimatname/genel/l/libyubikey/libyubikey.70-yubikey.rules @@ -0,0 +1,4 @@ +# 70-yubikey.rules +# give the yubico key device mode 0664 and group yubikey + +ACTION=="add|change", SUBSYSTEM=="usb", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010", MODE="0664", GROUP="yubikey" diff --git a/talimatname/genel/l/libyubikey/talimat b/talimatname/genel/l/libyubikey/talimat new file mode 100644 index 000000000..4e7e52964 --- /dev/null +++ b/talimatname/genel/l/libyubikey/talimat @@ -0,0 +1,20 @@ +# Tanım: Yubico C düşük seviye Kütüphane: Yubico YubiKey Tek İşlemli Parolaları (OTP'ler) işlemek için kullanılan C kütüphanesi +# URL: http://www.yubico.com/ +# Paketçi: milisarge +# Gerekler: libusb asciidoc + +isim=libyubikey +surum=1.13 +devir=1 + +kaynak=(https://github.com/Yubico/yubico-c/archive/libyubikey-$surum.tar.gz + libyubikey.70-yubikey.rules) +derle() +{ +cd yubico-c-libyubikey-$surum +autoreconf --install +./configure --prefix=/usr +make +make DESTDIR="${PKG}/" install +install -D -m0644 "${SRC}/libyubikey.70-yubikey.rules" "${PKG}/lib/udev/rules.d/70-yubikey.rules" +} diff --git a/talimatname/genel/l/libzeitgeist/talimat b/talimatname/genel/l/libzeitgeist/talimat new file mode 100644 index 000000000..ffe002eaa --- /dev/null +++ b/talimatname/genel/l/libzeitgeist/talimat @@ -0,0 +1,18 @@ +# Tanım: C ve Vala'dan Zeitgeist olay günlüğüne erişmek ve yönetmek için kullanılan istemci kitaplığı. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: glib + +isim=libzeitgeist +surum=0.3.18 +devir=1 + +kaynak=(http://launchpad.net/$isim/${surum%.*}/$surum/+download/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/libzen/talimat b/talimatname/genel/l/libzen/talimat new file mode 100644 index 000000000..7e488c941 --- /dev/null +++ b/talimatname/genel/l/libzen/talimat @@ -0,0 +1,34 @@ +# Tanım: Libmediainfo ve mediainfo için paylaşılan kütüphane +# URL: http://mediainfo.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=libzen +surum=0.4.31 +devir=1 + +kaynak=( +http://downloads.sourceforge.net/zenlib/${isim}_${surum}.tar.bz2) + +derle(){ + cd $SRC/ZenLib/Project/GNU/Library + sh ./autogen + ./configure --prefix=/usr \ + --enable-shared + make clean + make + make DESTDIR=$PKG install + + install -dm755 $PKG/usr/include/ZenLib + install -m644 $SRC/ZenLib/Source/ZenLib/*.h $PKG/usr/include/ZenLib + for i in HTTP_Client Format/Html Format/Http; do + install -dm0755 $PKG/usr/include/ZenLib/$i + install -m0644 $SRC/ZenLib/Source/ZenLib/$i/*.h \ + $PKG/usr/include/ZenLib/$i + done + install -dm755 $PKG/usr/lib/pkgconfig + install -m644 $SRC/ZenLib/Project/GNU/Library/libzen.pc \ + $PKG/usr/lib/pkgconfig + sed -i -e 's|Version: |Version: '$surum'|g' \ + $PKG/usr/lib/pkgconfig/libzen.pc +} diff --git a/talimatname/genel/l/libzip/talimat b/talimatname/genel/l/libzip/talimat new file mode 100644 index 000000000..0ecdbc139 --- /dev/null +++ b/talimatname/genel/l/libzip/talimat @@ -0,0 +1,20 @@ +# Tanım: Zip arşivlerini okumak, oluşturmak ve değiştirmek için bir C kütüphanesi +# URL: http://www.nih.at/libzip/index.html +# Paketçi: milisarge +# Gerekler: + +isim=libzip +surum=1.0.1 +devir=1 + +kaynak=(http://www.nih.at/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install + +ln -s /usr/lib/libzip/include/zipconf.h $PKG/usr/include/zipconf.h +install -Dm644 LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/l/libzmf/talimat b/talimatname/genel/l/libzmf/talimat new file mode 100644 index 000000000..d5033de61 --- /dev/null +++ b/talimatname/genel/l/libzmf/talimat @@ -0,0 +1,19 @@ +# Tanım: Zoner çizim ve bitmap dosyalarını içe aktarmak için bir kütüphane +# URL: https://wiki.documentfoundation.org/DLP/Libraries/libzmf +# Paketçi: Cihan Alkan +# Gerekler: librevenge boost libpng doxygen + +isim=libzmf +surum=0.0.1 +devir=1 + +kaynak=(https://dev-www.libreoffice.org/src/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr --disable-werror + make + make DESTDIR=$PKG install + install -Dm644 COPYING $PKG/usr/share/licenses/$isim/COPYING +} diff --git a/talimatname/genel/l/lightdm-gtk-greeter-settings/lightdm-gtk-greeter-settings-tr.po b/talimatname/genel/l/lightdm-gtk-greeter-settings/lightdm-gtk-greeter-settings-tr.po new file mode 100644 index 000000000..1ccb3f133 --- /dev/null +++ b/talimatname/genel/l/lightdm-gtk-greeter-settings/lightdm-gtk-greeter-settings-tr.po @@ -0,0 +1,910 @@ +# Turkish translation for lightdm-gtk-greeter-settings +# Copyright (c) 2016 Rosetta Contributors and Canonical Ltd 2016 +# This file is distributed under the same license as the lightdm-gtk-greeter-settings package. +# Cihan Alkan <cihanalk@gmail.com>, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: lightdm-gtk-greeter-settings\n" +"Report-Msgid-Bugs-To: Cihan Alkan <cihanalk@gmail.com>\n" +"POT-Creation-Date: 2015-05-20 21:22-0400\n" +"PO-Revision-Date: 2016-02-09 23:31+0000\n" +"Last-Translator: Cihan Alkan <cihanalk@gmail.com>\n" +"Language-Team: Turkish <el@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2017-09-20 09:52+0000\n" +"X-Generator: Launchpad (build 18449)\n" + +#: ../lightdm-gtk-greeter-settings.desktop.in.h:1 +msgid "LightDM GTK+ Greeter settings" +msgstr "LightDM GTK+ Karşılama Ayarları" + +#: ../lightdm-gtk-greeter-settings.desktop.in.h:2 +msgid "Configure LightDM GTK+ Greeter" +msgstr "LightDM GTK+ Karşılama Ayarları" + +#: ../data/GtkGreeterSettingsWindow.ui.h:1 +msgid "LightDM GTK+ Greeter: settings" +msgstr "LightDM GTK+ Karşılama: ayarları" + +#: ../data/GtkGreeterSettingsWindow.ui.h:2 +msgctxt "option|greeter|xft-rgba" +msgid "None" +msgstr "Hiçbiri" + +#: ../data/GtkGreeterSettingsWindow.ui.h:3 +msgctxt "option|greeter|xft-rgba" +msgid "RGB" +msgstr "RGB" + +#: ../data/GtkGreeterSettingsWindow.ui.h:4 +msgctxt "option|greeter|xft-rgba" +msgid "BGR" +msgstr "BGR" + +#: ../data/GtkGreeterSettingsWindow.ui.h:5 +msgctxt "option|greeter|xft-rgba" +msgid "Vertical RGB" +msgstr "Dikey RGB" + +#: ../data/GtkGreeterSettingsWindow.ui.h:6 +msgctxt "option|greeter|xft-rgba" +msgid "Vertical BGR" +msgstr "Dikey BGR" + +#: ../data/GtkGreeterSettingsWindow.ui.h:7 +msgctxt "option|greeter|xft-hintstyle" +msgid "None" +msgstr "Hiçbiri" + +#: ../data/GtkGreeterSettingsWindow.ui.h:8 +msgctxt "option|greeter|xft-hintstyle" +msgid "Slight" +msgstr "Ελαφρύ" + +#: ../data/GtkGreeterSettingsWindow.ui.h:9 +msgctxt "option|greeter|xft-hintstyle" +msgid "Medium" +msgstr "Ortala" + +#: ../data/GtkGreeterSettingsWindow.ui.h:10 +msgctxt "option|greeter|xft-hintstyle" +msgid "Full" +msgstr "Tam" + +#: ../data/GtkGreeterSettingsWindow.ui.h:11 +msgctxt "option|greeter|xft-antialias" +msgid "Antialias" +msgstr "Yumuşat" + +#: ../data/GtkGreeterSettingsWindow.ui.h:12 +msgid "Enable this option to override system defaults" +msgstr "Sistem varsayılanlarını geçersiz kılmak için bu seçeneği etkinleştirin" + +#: ../data/GtkGreeterSettingsWindow.ui.h:13 +msgctxt "option|greeter|xft-dpi" +msgid "DPI" +msgstr "DPI" + +#: ../data/GtkGreeterSettingsWindow.ui.h:14 +msgctxt "option|greeter|xft-rgba" +msgid "Subpixel rendering" +msgstr "Altpixel oluşturma" + +#: ../data/GtkGreeterSettingsWindow.ui.h:15 +msgctxt "option|greeter|xft-hintstyle" +msgid "Hinting" +msgstr "İmalı" + +#: ../data/GtkGreeterSettingsWindow.ui.h:16 +msgid "Additional font options" +msgstr "Ek yazı tipi seçenekleri" + +#: ../data/GtkGreeterSettingsWindow.ui.h:17 +msgctxt "option|greeter|background" +msgid "Background" +msgstr "Arkaplan" + +#: ../data/GtkGreeterSettingsWindow.ui.h:18 +msgctxt "option|multihead" +msgid "" +" <i>(veya <a href=\"\">bireysel monitörler için</a> çoklu ayar kurulumunu kullanın)</i>" +msgstr "" + +#: ../data/GtkGreeterSettingsWindow.ui.h:19 +#: ../data/MultiheadSetupDialog.ui.h:9 +msgctxt "option|greeter|background" +msgid "Color" +msgstr "Renk" + +#: ../data/GtkGreeterSettingsWindow.ui.h:20 +#: ../data/MultiheadSetupDialog.ui.h:8 +msgctxt "option|greeter|background" +msgid "Image" +msgstr "Resim" + +#: ../data/GtkGreeterSettingsWindow.ui.h:21 +msgctxt "option|greeter|theme-name" +msgid "Theme" +msgstr "Tema" + +#: ../data/GtkGreeterSettingsWindow.ui.h:22 +msgctxt "option|greeter|icon-theme-name" +msgid "Icons" +msgstr "Simgeler" + +#: ../data/GtkGreeterSettingsWindow.ui.h:23 +msgctxt "option|greeter|font-name" +msgid "Font" +msgstr "Yaz Tipi" + +#: ../data/GtkGreeterSettingsWindow.ui.h:24 +msgctxt "option|greeter|hide-user-image" +msgid "User image" +msgstr "Kullanıcı Resmi" + +#: ../data/GtkGreeterSettingsWindow.ui.h:25 +msgctxt "option|greeter|default-user-image" +msgid "Default user image" +msgstr "Varsayılan kullanıcı resmi" + +#: ../data/GtkGreeterSettingsWindow.ui.h:26 +#: ../data/MultiheadSetupDialog.ui.h:11 +msgctxt "option|greeter|user-background" +msgid "Use user wallpaper if available" +msgstr "Varsa kullanıcı duvar kağıdını kullan" + +#: ../data/GtkGreeterSettingsWindow.ui.h:27 +msgctxt "tabs" +msgid "Appearance" +msgstr "Görünüm" + +#: ../data/GtkGreeterSettingsWindow.ui.h:29 +#, no-c-format +msgctxt "option|greeter|clock-format" +msgid "" +"%H %I - hours, %M - minutes, %S - seconds\n" +"%d - day, %m - month, %y %Y - year\n" +"%a %A - day of the week, %b %B - month name" +msgstr "" +"%H %I - saat, %M - dakika, %S - saniye\n" +"%d - gün, %m - ay, %y %Y - yıl\n" +"%a %A - haftanın günü, %b %B - ay adı" + +#: ../data/GtkGreeterSettingsWindow.ui.h:32 +msgctxt "option|greeter|indicators" +msgid "Add indicator to list" +msgstr "Listeye gösterge ekle" + +#: ../data/GtkGreeterSettingsWindow.ui.h:33 +msgctxt "option|greeter|indicators" +msgid "Add" +msgstr "Ekle" + +#: ../data/GtkGreeterSettingsWindow.ui.h:34 +msgctxt "option|greeter|indicators" +msgid "Remove indicator from list" +msgstr "Listeden gösterge sil" + +#: ../data/GtkGreeterSettingsWindow.ui.h:35 +msgctxt "option|greeter|indicators" +msgid "Remove" +msgstr "Sil" + +#: ../data/GtkGreeterSettingsWindow.ui.h:36 +msgctxt "option|greeter|indicators" +msgid "Move up" +msgstr "Yukarı al" + +#: ../data/GtkGreeterSettingsWindow.ui.h:37 +msgctxt "option|greeter|indicators" +msgid "Up" +msgstr "Yukarı" + +#: ../data/GtkGreeterSettingsWindow.ui.h:38 +msgctxt "option|greeter|indicators" +msgid "Move down" +msgstr "Aşağı Al" + +#: ../data/GtkGreeterSettingsWindow.ui.h:39 +msgctxt "option|greeter|indicators" +msgid "Down" +msgstr "Aşağı" + +#: ../data/GtkGreeterSettingsWindow.ui.h:40 +msgctxt "option|greeter|indicators" +msgid "Templates" +msgstr "Şablonlar" + +#: ../data/GtkGreeterSettingsWindow.ui.h:41 +msgctxt "option|greeter|clock-format" +msgid "Clock format:" +msgstr "Saat biçimi" + +#: ../data/GtkGreeterSettingsWindow.ui.h:42 +msgctxt "option|greeter|indicators" +msgid "Redefine indicators" +msgstr "Göstergeleri yeniden tanımla" + +#: ../data/GtkGreeterSettingsWindow.ui.h:43 +msgctxt "tabs" +msgid "Panel" +msgstr "Panel" + +#: ../data/GtkGreeterSettingsWindow.ui.h:44 +msgctxt "option|greeter|position" +msgid "Horizontal" +msgstr "Yatay" + +#: ../data/GtkGreeterSettingsWindow.ui.h:45 +msgctxt "option|greeter|position" +msgid "Vertical" +msgstr "Dikey" + +#: ../data/GtkGreeterSettingsWindow.ui.h:47 +#, no-c-format +msgctxt "option|greeter|position" +msgid "in %" +msgstr "içerde %" + +#: ../data/GtkGreeterSettingsWindow.ui.h:48 +msgctxt "option|greeter|position" +msgid "from right" +msgstr "Sağdan" + +#: ../data/GtkGreeterSettingsWindow.ui.h:49 +msgctxt "option|greeter|position" +msgid "from bottom" +msgstr "Alttan" + +#: ../data/GtkGreeterSettingsWindow.ui.h:50 +msgctxt "option|greeter|position" +msgid "Select base point and its position." +msgstr "Taban noktasını ve konumunu seçin." + +#: ../data/GtkGreeterSettingsWindow.ui.h:51 +msgctxt "tabs" +msgid "Window position" +msgstr "Pencere pozisyonu" + +#: ../data/GtkGreeterSettingsWindow.ui.h:52 +msgctxt "option|greeter|screensaver-timeout" +msgid "Never" +msgstr "Asla" + +#: ../data/GtkGreeterSettingsWindow.ui.h:53 +msgid "Accessibility" +msgstr "Ulaşılabilirlik" + +#: ../data/GtkGreeterSettingsWindow.ui.h:54 +msgctxt "option|greeter|reader" +msgid "Select path to reader..." +msgstr "Okuyucunun yolunu seç..." + +#: ../data/GtkGreeterSettingsWindow.ui.h:55 +msgctxt "option|greeter|reader" +msgid "Command to launch screen reader" +msgstr "Ekran okuyucuyu başlatmak için komut" + +#: ../data/GtkGreeterSettingsWindow.ui.h:56 +msgctxt "option|greeter|keyboard" +msgid "Select path to keyboard..." +msgstr "Klavyeden yolu seç..." + +#: ../data/GtkGreeterSettingsWindow.ui.h:57 +msgctxt "option|greeter|keyboard" +msgid "Command to launch on-screen keyboard" +msgstr "Ekran klavyesi başlatmak için komut" + +#: ../data/GtkGreeterSettingsWindow.ui.h:58 +msgctxt "option|greeter|a11y-states" +msgid "Disabled at start" +msgstr "Başlangıçta devre dışı bırakıldı" + +#: ../data/GtkGreeterSettingsWindow.ui.h:59 +msgctxt "option|greeter|a11y-states" +msgid "Enabled at start" +msgstr "ΕBaşlangıçta etkinleştirildi" + +#: ../data/GtkGreeterSettingsWindow.ui.h:60 +msgctxt "option|greeter|a11y-states" +msgid "Save state between launches" +msgstr "Başlangıçta ki yere kaydedin" + +#: ../data/GtkGreeterSettingsWindow.ui.h:61 +msgctxt "option|greeter|a11y-theme" +msgid "Contrast theme" +msgstr "Kontrast teması" + +#: ../data/GtkGreeterSettingsWindow.ui.h:62 +msgctxt "option|greeter|a11y-font" +msgid "Large font" +msgstr "Büyük font" + +#: ../data/GtkGreeterSettingsWindow.ui.h:63 +msgctxt "greeter|option|reader" +msgid "Reader" +msgstr "Okuyucu" + +#: ../data/GtkGreeterSettingsWindow.ui.h:64 +msgctxt "greeter|option|keyboard" +msgid "Keyboard" +msgstr "Klavya" + +#: ../data/GtkGreeterSettingsWindow.ui.h:65 +msgctxt "option|greeter|screensaver-timeout" +msgid "Timeout until the screen blanks " +msgstr "Ekran boşluklarına kadar zaman aşımı " + +#: ../data/GtkGreeterSettingsWindow.ui.h:66 +msgctxt "greeter|option|allow-debugging" +msgid "Debugging mode" +msgstr "Hata ayıklama modu" + +#: ../data/GtkGreeterSettingsWindow.ui.h:67 +msgctxt "greeter|option|allow-debugging" +msgid "" +"Enable keys to launch GtkInspector\n" +"More informative log" +msgstr "" +"GtkInspector'ı başlatmak için tuşları etkinleştir\n" +"Daha bilgilendirici günlüğü" + +#: ../data/GtkGreeterSettingsWindow.ui.h:69 +msgctxt "tabs" +msgid "Misc." +msgstr "Çeşitli" + +#: ../data/GtkGreeterSettingsWindow.ui.h:70 +#: ../data/IndicatorPropertiesDialog.ui.h:3 +msgctxt "button" +msgid "_Close" +msgstr "_Kapat" + +#: ../data/GtkGreeterSettingsWindow.ui.h:71 +msgctxt "button" +msgid "_Save" +msgstr "_Kaydet" + +#: ../data/GtkGreeterSettingsWindow.ui.h:72 +msgctxt "button" +msgid "_Reload" +msgstr "_Yeniden Yükla" + +#: ../data/GtkGreeterSettingsWindow.ui.h:73 +msgid "Read configuration file" +msgstr "Yapılandırma dosyasını oku" + +#: ../data/IconChooserDialog.ui.h:1 +msgctxt "icon-dialog" +msgid "Select icon" +msgstr "Simge seç" + +#: ../data/IconChooserDialog.ui.h:2 +msgctxt "button" +msgid "_Cancel" +msgstr "_İptal" + +#: ../data/IconChooserDialog.ui.h:3 ../data/IndicatorPropertiesDialog.ui.h:4 +#: ../data/MultiheadSetupDialog.ui.h:14 +msgctxt "button" +msgid "_OK" +msgstr "_Tamam" + +#: ../data/IconChooserDialog.ui.h:4 +msgid "Add selected indicator to the list and close this window" +msgstr "Seçilen göstergeyi listeye ekle ve bu pencereyi kapat" + +#: ../data/IconChooserDialog.ui.h:5 +msgctxt "icon-dialog" +msgid "Icon _name:" +msgstr "Simge adı:" + +#: ../data/IconChooserDialog.ui.h:6 +msgctxt "icon-dialog" +msgid "_Contexts:" +msgstr "İçerik" + +#: ../data/IconChooserDialog.ui.h:7 +msgctxt "icon-dialog" +msgid "_Icon names:" +msgstr "Simge adı:" + +#: ../data/IconChooserDialog.ui.h:8 +msgctxt "icon-dialog" +msgid "List _standard icons only" +msgstr "Yalnızca standart simgeleri listele" + +#: ../data/ImageChooserDialog.ui.h:1 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:264 +msgid "_Cancel" +msgstr "_İptal" + +#: ../data/ImageChooserDialog.ui.h:2 +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:263 +msgid "_OK" +msgstr "_Tamam" + +#: ../data/IndicatorPropertiesDialog.ui.h:1 +msgctxt "option-entry|indicators" +msgid "Select file..." +msgstr "Dosya seç..." + +#: ../data/IndicatorPropertiesDialog.ui.h:2 +msgctxt "option-entry|indicators" +msgid "Indicator properties" +msgstr "Ιδιότητες δείκτη" + +#: ../data/IndicatorPropertiesDialog.ui.h:5 +msgctxt "button" +msgid "_Add" +msgstr "_Ekle" + +#: ../data/IndicatorPropertiesDialog.ui.h:6 +msgctxt "option-entry|indicators" +msgid "Indicator" +msgstr "Δείκτης" + +#: ../data/IndicatorPropertiesDialog.ui.h:7 +msgctxt "option-entry|indicators" +msgid "Display label" +msgstr "Ekran etiketi" + +#: ../data/IndicatorPropertiesDialog.ui.h:8 +msgctxt "option-entry|indicators" +msgid "Leave empty to use default value" +msgstr "" + +#: ../data/IndicatorPropertiesDialog.ui.h:9 +msgctxt "option-entry|indicators" +msgid "Display image" +msgstr "Resmi görüntüle" + +#: ../data/IndicatorPropertiesDialog.ui.h:10 +msgctxt "option-entry|indicators" +msgid "Indicator library/service:" +msgstr "Gösterge kütüphane/servis" + +#: ../data/IndicatorPropertiesDialog.ui.h:11 +msgctxt "option-entry|indicators" +msgid "Hide disabled power actions" +msgstr "Devre dışı bırakılan güç eylemlerini gizle" + +#: ../data/IndicatorPropertiesDialog.ui.h:12 +msgctxt "option-entry|indicators" +msgid "Text to display:" +msgstr "Görüntülenecek metin:" + +#: ../data/IndicatorPropertiesDialog.ui.h:13 +msgctxt "option-entry|indicators" +msgid "Spacer - fills the maximum available space" +msgstr "Spacer - maksimum kullanılabilir alanı doldurur" + +#: ../data/IndicatorPropertiesDialog.ui.h:14 +msgctxt "option-entry|indicators" +msgid "Separator - draw a separator" +msgstr "Ayırıcı - bir ayırıcı çizin" + +#: ../data/MultiheadSetupDialog.ui.h:1 +msgctxt "option|multihead" +msgid "Multihead setup" +msgstr "çoklubaşlık kurulumu" + +#: ../data/MultiheadSetupDialog.ui.h:2 +msgctxt "option|multihead" +msgid "Add configuration" +msgstr "Yapılandırma ekle" + +#: ../data/MultiheadSetupDialog.ui.h:3 +msgctxt "option|multihead" +msgid "No configured monitors found" +msgstr "Yapılandırılmış monitör bulunamadı" + +#: ../data/MultiheadSetupDialog.ui.h:4 +msgctxt "option|multihead" +msgid "Monitor name:" +msgstr "Ekran adı:" + +#: ../data/MultiheadSetupDialog.ui.h:5 +msgid "Don't leave empty" +msgstr "Boş bırakmayın" + +#: ../data/MultiheadSetupDialog.ui.h:6 +msgctxt "option|multihead" +msgid "Add new monitor configuration" +msgstr "Yeni monitör yapılandırması ekle" + +#: ../data/MultiheadSetupDialog.ui.h:7 +msgctxt "option|multihead" +msgid "Overwrite default \"background\" option" +msgstr "Varsayılan \"arka plan \" seçeneğinin üzerine yaz" + +#: ../data/MultiheadSetupDialog.ui.h:10 +msgctxt "option|multihead" +msgid "Overwrite default \"user-background\" option" +msgstr "Varsayılan \"kullanıcı arka planı \" seçeneğinin üzerine yaz" + +#: ../data/MultiheadSetupDialog.ui.h:12 +msgctxt "option|multihead" +msgid "Overwrite default \"laptop\" option" +msgstr "Varsayılan \"dizüstü \" seçeneğinin üzerine yaz" + +#: ../data/MultiheadSetupDialog.ui.h:13 +msgctxt "option|greeter|laptop" +msgid "This monitor is laptop display (detect lid closing)" +msgstr "Bu monitör dizüstü bilgisayar ekranıdır (kapağın kapanmasını algılar)" + +#: ../data/MultiheadSetupDialog.ui.h:15 +msgctxt "option|multihead" +msgid "" +"<i>Note: greeter does not set monitor geometry.\n" +"You need to configure it manually.</i>" +msgstr "" +"<i>Not: Greeter, monitör geometrisini ayarlamaz.\n" +"Manuel olarak yapılandırmanız gerekiyor.</i>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:179 +msgid "You don't have permissions to change greeter configuration" +msgstr "Selamlayıcı yapılandırmayı değiştirmek için izinleriniz yok" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:183 +msgid "No permissions to save configuration" +msgstr "Yapılandırmayı kaydetmek için izin yok" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:185 +#, python-brace-format +msgid "" +"It seems that you don't have permissions to write to file:\n" +"{path}\n" +"\n" +"Try to run this program using \"sudo\" or \"pkexec\"" +msgstr "" +"Dosyaya yazma izniniz yok gibi görünüyor:\n" +"{path}\n" +"\n" +"\"sudo\" veya \"pkexec\" kullanarak bu programı çalıştırmayı deneyin" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:373 +msgid "<i>disabled</i>" +msgstr "<i>pasif edildi</i>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:375 +msgid "<i>empty string</i>" +msgstr "<i>boş dize</i>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:377 +msgid "<i>None</i>" +msgstr "<i>Hiçbiri</i>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:401 +#, python-brace-format +msgid "Value defined in file: {path}" +msgstr "Dosyada tanımlanmış değer: {path}" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:438 +#, python-brace-format +msgid "Reset to initial value: <b>{value}</b>" +msgstr "İlk değere sıfırla: <b>{value}</b>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:450 +#, python-brace-format +msgid "Reset to default value: <b>{value}</b>" +msgstr "ΕVarsayılan değere sıfırla: <b>{value}</b>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:471 +#, python-brace-format +msgid "Reset to value: <b>{value}</b>" +msgstr "Değere sıfırla: <b>{value}</b>" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:493 +#, python-brace-format +msgctxt "option|greeter|screensaver-timeout" +msgid "{count} min" +msgstr "{count} min" + +#: ../lightdm_gtk_greeter_settings/GtkGreeterSettingsWindow.py:556 +#, python-brace-format +msgctxt "option|greeter|allow-debugging" +msgid "" +"GtkInspector is not available on your system\n" +"Gtk version: {current} < {minimal}" +msgstr "" +"GtkInspector sisteminizde mevcut değildir\n" +"Gtk sürümü : {current} < {minimal}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:175 +#, python-brace-format +msgid "File not found: {path}" +msgstr "Dosya bulunamadı: {path}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:199 +#, python-brace-format +msgid "Failed to check permissions: {error}" +msgstr "İzinler kontrol edilemedi: {error}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:202 +#, python-brace-format +msgid "Directory is not readable: {path}" +msgstr "ΟDizin okunamıyor: {path}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:205 +#: ../lightdm_gtk_greeter_settings/helpers.py:208 +#: ../lightdm_gtk_greeter_settings/helpers.py:210 +#, python-brace-format +msgid "LightDM does not have permissions to read path: {path}" +msgstr "LightDM yolunu okumak için izinlere sahip değil: {path}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:216 +#, python-brace-format +msgid "Path is not a regular file: {path}" +msgstr "Yol normal bir dosya değil: {path}" + +#: ../lightdm_gtk_greeter_settings/helpers.py:222 +#: ../lightdm_gtk_greeter_settings/helpers.py:226 +#: ../lightdm_gtk_greeter_settings/helpers.py:229 +#, python-brace-format +msgid "LightDM does not have permissions to execute file: {path}" +msgstr "LightDM dosyasının yürütülmesi için izinlere sahip değil: {path}" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:200 +msgctxt "icon-dialog" +msgid "All contexts" +msgstr "Tüm İçerik" + +#. separator +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:202 +msgctxt "icon-dialog" +msgid "Actions" +msgstr "Eylemler" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:203 +msgctxt "icon-dialog" +msgid "Applications" +msgstr "Uygulamalar" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:204 +msgctxt "icon-dialog" +msgid "Categories" +msgstr "Kategoriler" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:205 +msgctxt "icon-dialog" +msgid "Devices" +msgstr "Aygıtlar" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:206 +msgctxt "icon-dialog" +msgid "Emblems" +msgstr "Εμβλήματα" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:207 +msgctxt "icon-dialog" +msgid "Emoticons" +msgstr "Εικονίδια διάθεσης" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:208 +msgctxt "icon-dialog" +msgid "International" +msgstr "Uluslararası" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:209 +msgctxt "icon-dialog" +msgid "MIME Types" +msgstr "MIME Türü" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:210 +msgctxt "icon-dialog" +msgid "Places" +msgstr "Yerler" + +#: ../lightdm_gtk_greeter_settings/IconChooserDialog.py:211 +msgctxt "icon-dialog" +msgid "Status" +msgstr "Durum" + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:85 +#, python-brace-format +msgctxt "option-entry|icon" +msgid "Unrecognized value: {value}" +msgstr "Tanınmayan değer: {value}" + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:104 +msgctxt "option-entry|icon" +msgid "Select icon name..." +msgstr "Simge adı seç..." + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:106 +#, python-brace-format +msgctxt "option-entry|icon" +msgid "<b>Icon: {icon}</b>" +msgstr "<b>Simge: {icon}</b>" + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:126 +msgctxt "option-entry|icon" +msgid "Select file..." +msgstr "Dosya seç..." + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:129 +#, python-brace-format +msgctxt "option-entry|icon" +msgid "<b>File: {path}</b>" +msgstr "<b>Dosya: {path}</b>" + +#: ../lightdm_gtk_greeter_settings/IconEntry.py:131 +#, python-brace-format +msgctxt "option-entry|icon" +msgid "<b>File: {path}</b> (failed to load)" +msgstr "<b>Αρχείο {path}</b> (αδυναμία φόρτωσης)" + +#: ../lightdm_gtk_greeter_settings/IndicatorPropertiesDialog.py:79 +msgctxt "option-entry|indicators" +msgid "Use default value..." +msgstr "Varsayılan değeri kullan..." + +#: ../lightdm_gtk_greeter_settings/IndicatorPropertiesDialog.py:81 +msgctxt "option-entry|indicators" +msgid "<b>Using default value</b>" +msgstr "<b>Varsayılan değeri kullanma</b>" + +#: ../lightdm_gtk_greeter_settings/IndicatorPropertiesDialog.py:233 +msgctxt "option-entry|indicators" +msgid "Path/Service field is not filled" +msgstr "Yol/Servis alanı doldurulmadı" + +#: ../lightdm_gtk_greeter_settings/IndicatorPropertiesDialog.py:237 +#, python-brace-format +msgctxt "option-entry|indicators" +msgid "" +"Indicator \"{name}\" is already in the list.\n" +"It will be overwritten." +msgstr "" +"Gösterge \"{name}\" zaten listede.\n" +"ΘÜzerine yazılacak." + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:131 +msgctxt "option-entry|indicators|name" +msgid "External library/service" +msgstr "Harici kütüphane/servis" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:132 +msgctxt "option-entry|indicators|name" +msgid "Spacer" +msgstr "Spacer" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:133 +msgctxt "option-entry|indicators|name" +msgid "Separator" +msgstr "Ayırıcı" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:134 +msgctxt "option-entry|indicators|name" +msgid "Text" +msgstr "Metin" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:135 +msgctxt "option-entry|indicators|name" +msgid "Clock" +msgstr "Saat" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:136 +msgctxt "option-entry|indicators|name" +msgid "Host name" +msgstr "Bilgisayar adı" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:137 +msgctxt "option-entry|indicators|name" +msgid "Keyboard layout" +msgstr "Klavye modeli" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:138 +msgctxt "option-entry|indicators|name" +msgid "Sessions menu" +msgstr "Oturum menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:139 +msgctxt "option-entry|indicators|name" +msgid "Languages menu" +msgstr "Dil menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:140 +msgctxt "option-entry|indicators|name" +msgid "Accessibility menu" +msgstr "Erişilebilirlik menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:141 +msgctxt "option-entry|indicators|name" +msgid "Power menu" +msgstr "Güç menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:148 +msgctxt "option-entry|indicators|tooltip" +msgid "Spacer" +msgstr "Spacer" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:149 +msgctxt "option-entry|indicators|tooltip" +msgid "Separator" +msgstr "Ayırıcı" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:150 +msgctxt "option-entry|indicators|tooltip" +msgid "Custom text or/and image" +msgstr "Özel metin veya/ve görüntü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:151 +msgctxt "option-entry|indicators|tooltip" +msgid "Host name" +msgstr "Bilgisayar adı" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:152 +msgctxt "option-entry|indicators|tooltip" +msgid "Clock" +msgstr "Saat" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:153 +msgctxt "option-entry|indicators|tooltip" +msgid "Layout indicator" +msgstr "Yer göstergesi" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:155 +msgctxt "option-entry|indicators|tooltip" +msgid "Sessions menu (xfce, unity, gnome etc.)" +msgstr "Oturum menüsü (xfce, cinnamon, gnome vb.)" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:156 +msgctxt "option-entry|indicators|tooltip" +msgid "Languages menu" +msgstr "Dil menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:157 +msgctxt "option-entry|indicators|tooltip" +msgid "Accessibility menu" +msgstr "Erişilebilirlik menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:158 +msgctxt "option-entry|indicators|tooltip" +msgid "Power menu" +msgstr "Güç menüsü" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:583 +msgctxt "option-entry|indicators" +msgid "Reset to _defaults" +msgstr "Varsayılanlara dön" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:585 +msgctxt "option-entry|indicators" +msgid "Display _label" +msgstr "Ekran etiketi" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:587 +msgctxt "option-entry|indicators" +msgid "Display _image" +msgstr "Resmi görüntüle" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:589 +msgctxt "option-entry|indicators" +msgid "_Remove" +msgstr "_Çıkar" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:689 +msgctxt "option-entry|indicators" +msgid "Show unused items" +msgstr "Kullanılmayan öğeleri göster" + +#: ../lightdm_gtk_greeter_settings/IndicatorsEntry.py:693 +msgctxt "option-entry|indicators" +msgid "Predefined templates:" +msgstr "Öntanımlı şablonlar:" + +#: ../lightdm_gtk_greeter_settings/OptionEntry.py:265 +msgctxt "option|StringPathEntry" +msgid "Select path" +msgstr "Yol seç" + +#: ../com.ubuntu.pkexec.lightdm-gtk-greeter-settings.policy.in.h:1 +msgid "" +"Authentication is required to run Settings editor for LightDM GTK+ Greeter" +msgstr "" +"LightDM GTK + Greeter için Ayarlar düzenleyicisini çalıştırmak için kimlik doğrulaması gerekiyor" diff --git a/talimatname/genel/l/lightdm-gtk-greeter-settings/talimat b/talimatname/genel/l/lightdm-gtk-greeter-settings/talimat new file mode 100644 index 000000000..2dec72b79 --- /dev/null +++ b/talimatname/genel/l/lightdm-gtk-greeter-settings/talimat @@ -0,0 +1,18 @@ +# Tanım: LightDM GTK+ Greeter için ayar düzenleyici +# URL: https://launchpad.net/lightdm-gtk-greeter-settings +# Paketçi: yasarciv +# Gerekler: python3 python3-distutils-extra gtk3 python3-gobject gtk-update-icon-cache desktop-file-utils lightdm-gtk-greeter +# Grup: sistem + +isim=lightdm-gtk-greeter-settings +surum=1.2.2 +devir=1 +kaynak=(https://launchpad.net/lightdm-gtk-greeter-settings/${surum%.*}/$surum/+download/$isim-$surum.tar.gz + http://kaynaklar.milislinux.org/lightdm-gtk-greeter-settings-tr.po) + +derle() { + cd "$SRC/$isim-$surum" + mv ${SRC}/lightdm-gtk-greeter-settings-tr.po po/tr.po + python3 setup.py build + python3 setup.py install --root="$PKG" --optimize=1 --xfce-integration +} diff --git a/talimatname/genel/l/lightdm-gtk-greeter/cinnamon_badge_symbolic.svg b/talimatname/genel/l/lightdm-gtk-greeter/cinnamon_badge_symbolic.svg new file mode 100644 index 000000000..1f0190a89 --- /dev/null +++ b/talimatname/genel/l/lightdm-gtk-greeter/cinnamon_badge_symbolic.svg @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg2" + version="1.1" + inkscape:version="0.48.5 r10040" + width="16" + height="16" + sodipodi:docname="cinnamon2d_badge-symbolic.png"> + <metadata + id="metadata8"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs6" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="640" + inkscape:window-height="483" + id="namedview4" + showgrid="false" + inkscape:zoom="14.75" + inkscape:cx="8" + inkscape:cy="7.8644068" + inkscape:window-x="276" + inkscape:window-y="177" + inkscape:window-maximized="0" + inkscape:current-layer="svg2" /> + <image + width="16" + height="16" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hA \ +AAABHNCSVQICAgIfAhkiAAAAcxJREFU \ +OI2tk72qGlEUhb+jHp0RdUQQwYi2l2vEELAO8RHyDEmbFwghdV4njdg4lZVIYhoDEkgxghjxB39m \ +RufOTqGG603kpsiCDQf2Wd/axd6q0+kIcK1CwOcoAX4APRH52Gw2vwNETk11ekeBGKCBOGAA1qmy \ +wDPgjVLqs23brwDUaQIAotEolmWxWq24u7vjEa2VUrcRpdRLEXkLBKZpUq/XMU3zMTNAWkTeK5Hj \ +ALZtD1Op1E2j0aDX67HZbDAMg0qlgtaa8XiMZVlks1kcx2E2mwF8jd0jrh5GVKtV0uk0YRiSz+cB \ +CIKAWq12DrmNPDSdlUwmyWQyDIdD+v0+AI7j0O12ORwOFAoFgNhVgGEYALiui+u6AHieRxiG+L7/ \ +u38V8K/6r4DD/YbneTiOw36/R0RwHIf1en0dICLfzp9TqRS73Y7RaITneYgIo9GI5XJJJBIhkUgQ \ +BAFwXFsAlFK9/X7/erFYUC6XcV0X3/cv0rTWlEoltNZMJpOj77xIrVYrYRjGl1wud1OtVonFYlzT \ +fD5nMBhcAgA6nc5zpdQnrfWTYrH4B0RE2G63TKdTTr6fFwCAdrudi8fjH4AXwFOOF/o3TZVS734B \ +6IDRhG8yhb8AAAAASUVORK5CYII= ++" + id="image10" + x="0" + y="0" /> + <path + style="fill:#000000" + d="" + id="path2987" + inkscape:connector-curvature="0" /> +</svg> diff --git a/talimatname/genel/l/lightdm-gtk-greeter/talimat b/talimatname/genel/l/lightdm-gtk-greeter/talimat new file mode 100644 index 000000000..7a935a751 --- /dev/null +++ b/talimatname/genel/l/lightdm-gtk-greeter/talimat @@ -0,0 +1,43 @@ +# Tanım: Lightdm için GTK karşılayıcı +# URL: https://launchpad.net/lightdm-gtk-greeter +# Paketçi: milisarge +# Gerekler: gtk3 lightdm exo gobject-introspection intltool +# Grup: sistem + +isim=lightdm-gtk-greeter +surum=2.0.5 +devir=1 + +kaynak=(https://launchpad.net/lightdm-gtk-greeter/${surum%.*}/$surum/+download/lightdm-gtk-greeter-$surum.tar.gz + cinnamon_badge_symbolic.svg) + +derle() { + cd $isim-$surum + + CFLAGS="-Wno-declaration-after-statement" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib \ + --libexecdir=/usr/lib/lightdm \ + --sbindir=/usr/bin \ + --sysconfdir=/etc \ + --with-libxklavier \ + --disable-libido \ + --disable-libindicator \ + --disable-at-spi-command \ + --disable-indicator-services-command \ + --disable-static + + make + make install DESTDIR=$PKG + + # If user has no avatar, use milis logo + mkdir -p $PKG/usr/share/lightdm-gtk-greeter + cp /sources/milis.git/ayarlar/milislogo.png $PKG/usr/share/lightdm-gtk-greeter + echo "default-user-image = /usr/share/lightdm-gtk-greeter/milislogo.png" >> $PKG/etc/lightdm/lightdm-gtk-greeter.conf + + # Add Cinnamon logo + cp $SRC/cinnamon_badge_symbolic.svg $PKG/usr/share/icons/hicolor/scalable/places/cinnamon_badge-symbolic.svg + cp $SRC/cinnamon_badge_symbolic.svg $PKG/usr/share/icons/hicolor/scalable/places/cinnamon2d_badge-symbolic.svg + +} diff --git a/talimatname/genel/l/lightdm/Xsession b/talimatname/genel/l/lightdm/Xsession new file mode 100644 index 000000000..4614f478b --- /dev/null +++ b/talimatname/genel/l/lightdm/Xsession @@ -0,0 +1,25 @@ +#!/bin/sh +# +# LightDM wrapper to run around X sessions. + +echo "Running X session wrapper" + +# Load profile +for file in "/etc/profile" "$HOME/.profile" "/etc/xprofile" "$HOME/.xprofile"; do + if [ -f "$file" ]; then + echo "Loading profile from $file"; + . "$file" + fi +done + +# Run user xsession shell script +script="$HOME/.xsession" +if [ -x "$script" -a ! -d "$script" ]; then + echo "Loading xsession script $script" + . "$script" +fi + +echo "X session wrapper complete, running session $@" + +exec $@ + diff --git a/talimatname/genel/l/lightdm/lightdm.kur-kos b/talimatname/genel/l/lightdm/lightdm.kur-kos new file mode 100644 index 000000000..00b766515 --- /dev/null +++ b/talimatname/genel/l/lightdm/lightdm.kur-kos @@ -0,0 +1,8 @@ +sed -i "s/^id:[3-5]/id:5/" /etc/inittab +userdel lightdm +groupdel lightdm +groupadd -g 800 lightdm +useradd -d /var/lib/lightdm -s /bin/false -u 800 -g 800 lightdm +[ -d /var/lib/lightdm ] && chown lightdm:lightdm /var/lib/lightdm +[ -d /var/lib/lightdm-data ] && chown lightdm:lightdm /var/lib/lightdm-data +[ `mps -kk slim` = "kurulu" ] && mps sil slim diff --git a/talimatname/genel/l/lightdm/talimat b/talimatname/genel/l/lightdm/talimat new file mode 100644 index 000000000..aa2ae92cd --- /dev/null +++ b/talimatname/genel/l/lightdm/talimat @@ -0,0 +1,67 @@ +# Tanım: Hafif bir giriş yönetici +# URL: https://launchpad.net/lightdm +# Paketçi: milisarge +# Gerekler: glib gobject-introspection intltool itstool libgcrypt xorg-libxi xorg-libx11 libxcb xorg-libxdmcp xorg-libxklavier pam polkit vala +# Grup: sistem + +isim=lightdm +surum=1.26.0 +devir=1 + +kaynak=(https://github.com/CanonicalLtd/lightdm/releases/download/${surum}/lightdm-${surum}.tar.xz + Xsession) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib \ + --libexecdir=/usr/lib/lightdm \ + --localstatedir=/var \ + --sbindir=/usr/bin \ + --sysconfdir=/etc \ + --mandir=/usr/man \ + --with-greeter-session=lightdm-gtk-greeter \ + --with-greeter-user=lightdm \ + --disable-static \ + --disable-tests \ + --disable-liblightdm-qt \ + --disable-liblightdm-qt5 + + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/man + rm -rf $PKG/usr/share/gtk-doc + rm -rf $PKG/usr/share/help + + cat $SRC/Xsession > $PKG/etc/lightdm/Xsession + chmod 755 $PKG/etc/lightdm/Xsession + + rm -rf $PKG/etc/apparmor.d + rm -rf $PKG/etc/init + + #mv $PKG/etc/lightdm/lightdm.conf $PKG/etc/lightdm/lightdm.conf.new + #mv $PKG/etc/lightdm/users.conf $PKG/etc/lightdm/users.conf.new + #mv $PKG/etc/lightdm/keys.conf $PKG/etc/lightdm/keys.conf.new + + #mv $PKG/etc/pam.d/lightdm $PKG/etc/pam.d/lightdm.new + #mv $PKG/etc/pam.d/lightdm-autologin $PKG/etc/pam.d/lightdm-autologin.new + #mv $PKG/etc/pam.d/lightdm-greeter $PKG/etc/pam.d/lightdm-greeter.new + + # Remove systemd entries from pam files + sed -i 's@^.*pam_systemd.so.*$@@' $PKG/etc/pam.d/lightdm + sed -i 's@^.*pam_systemd.so.*$@@' $PKG/etc/pam.d/lightdm-autologin + sed -i 's@^.*pam_systemd.so.*$@@' $PKG/etc/pam.d/lightdm-greeter + + # Fix session-wrapper in config + sed -i 's@^.*session-wrapper.*$@session-wrapper=/etc/lightdm/Xsession@' $PKG/etc/lightdm/lightdm.conf + + mkdir -p $PKG/var/lib/lightdm + + mkdir -p $PKG/var/lib/lightdm-data + + # servis kurulması + cd /sources/milis.git/ayarlar/servisler + make DESTDIR=$PKG kur-lightdm +} diff --git a/talimatname/genel/l/lighttpd/lighttpd.conf b/talimatname/genel/l/lighttpd/lighttpd.conf new file mode 100644 index 000000000..e112f77b5 --- /dev/null +++ b/talimatname/genel/l/lighttpd/lighttpd.conf @@ -0,0 +1,204 @@ +# +# /etc/lighttpd.conf: lighttpd(1) configuration +# + +# to use mod_rewrite you have to compile lighttpd with libpcre installed +server.modules = ("mod_accesslog") + +server.port = 80 +server.username = "lighttpd" +server.groupname = "lighttpd" +server.pid-file = "/var/run/lighttpd.pid" + +# ssl support +#server.port = 443 +#ssl.engine = "enable" +#ssl.pemfile = "/etc/ssl/certs/lighttpd.pem" + +# chrooted operation +server.chroot = "/var/www" +server.document-root = "/htdocs" +server.errorlog = "/logs/error_log" +accesslog.filename = "/logs/access_log" + +# non-chrooted operation +#server.document-root = "/var/www/htdocs" +#server.errorlog = "/var/www/logs/error_log" +#accesslog.filename = "/var/www/logs/access_log" + +server.dir-listing = "enable" +server.indexfiles = ("index.html", "index.htm", "default.htm") + +mimetype.assign = ( + ".ai" => "application/postscript", + ".aif" => "audio/x-aiff", + ".aifc" => "audio/x-aiff", + ".aiff" => "audio/x-aiff", + ".arj" => "application/x-arj-compressed", + ".asc" => "text/plain", + ".atom" => "application/atom+xml", + ".au" => "audio/ulaw", + ".avi" => "video/x-msvideo", + ".bat" => "application/x-msdos-program", + ".bcpio" => "application/x-bcpio", + ".bin" => "application/octet-stream", + ".bmp" => "image/bmp", + ".cdf" => "application/x-netcdf", + ".cgm" => "image/cgm", + ".class" => "application/octet-stream", + ".com" => "application/x-msdos-program", + ".cpio" => "application/x-cpio", + ".cpt" => "application/mac-compactpro", + ".csh" => "application/x-csh", + ".css" => "text/css", + ".dcr" => "application/x-director", + ".deb" => "application/x-debian-package", + ".dir" => "application/x-director", + ".djv" => "image/vnd.djvu", + ".djvu" => "image/vnd.djvu", + ".dl" => "video/dl", + ".dll" => "application/octet-stream", + ".dmg" => "application/octet-stream", + ".dms" => "application/octet-stream", + ".doc" => "application/msword", + ".dtd" => "application/xml-dtd", + ".dvi" => "application/x-dvi", + ".dxr" => "application/x-director", + ".eps" => "application/postscript", + ".etx" => "text/x-setext", + ".exe" => "application/x-msdos-program", + ".ez" => "application/andrew-inset", + ".fli" => "video/fli", + ".gif" => "image/gif", + ".gl" => "video/gl", + ".gram" => "application/srgs", + ".grxml" => "application/srgs+xml", + ".gtar" => "application/x-gtar", + ".tar.gz" => "application/x-tar-gz", + ".gz" => "application/x-gunzip", + ".hdf" => "application/x-hdf", + ".hqx" => "application/mac-binhex40", + ".htm" => "text/html", + ".html" => "text/html", + ".ice" => "x-conference/x-cooltalk", + ".ico" => "image/x-icon", + ".ics" => "text/calendar", + ".ief" => "image/ief", + ".ifb" => "text/calendar", + ".iges" => "model/iges", + ".igs" => "model/iges", + ".jpe" => "image/jpeg", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".js" => "application/x-javascript", + ".kar" => "audio/midi", + ".latex" => "application/x-latex", + ".lha" => "application/octet-stream", + ".lzh" => "application/octet-stream", + ".m3u" => "audio/x-mpegurl", + ".m4u" => "video/vnd.mpegurl", + ".man" => "application/x-troff-man", + ".mathml" => "application/mathml+xml", + ".me" => "application/x-troff-me", + ".mesh" => "model/mesh", + ".mid" => "audio/midi", + ".midi" => "audio/midi", + ".mif" => "application/x-mif", + ".mov" => "video/quicktime", + ".movie" => "video/x-sgi-movie", + ".mp2" => "video/mpeg", + ".mp3" => "audio/mpeg", + ".mpe" => "video/mpeg", + ".mpeg" => "video/mpeg", + ".mpg" => "video/mpeg", + ".mpga" => "audio/mpeg", + ".ms" => "application/x-troff-ms", + ".msh" => "model/mesh", + ".mxu" => "video/vnd.mpegurl", + ".nc" => "application/x-netcdf", + ".oda" => "application/oda", + ".ogg" => "application/ogg", + ".pbm" => "image/x-portable-bitmap", + ".pdb" => "chemical/x-pdb", + ".pdf" => "application/pdf", + ".pgm" => "image/x-portable-graymap", + ".pgn" => "application/x-chess-pgn", + ".pgp" => "application/pgp", + ".pl" => "application/x-perl", + ".pm" => "application/x-perl", + ".png" => "image/png", + ".pnm" => "image/x-portable-anymap", + ".ppm" => "image/x-portable-pixmap", + ".ppt" => "application/vnd.ms-powerpoint", + ".ps" => "application/postscript", + ".qt" => "video/quicktime", + ".ra" => "audio/x-pn-realaudio", + ".ram" => "audio/x-pn-realaudio", + ".rar" => "application/x-rar-compressed", + ".ras" => "image/x-cmu-raster", + ".rdf" => "application/rdf+xml", + ".rgb" => "image/x-rgb", + ".rm" => "application/vnd.rn-realmedia", + ".roff" => "application/x-troff", + ".rtf" => "application/rtf", + ".rtx" => "text/richtext", + ".sgm" => "text/sgml", + ".sgml" => "text/sgml", + ".sh" => "application/x-sh", + ".shar" => "application/x-shar", + ".silo" => "model/mesh", + ".sit" => "application/x-stuffit", + ".skd" => "application/x-koan", + ".skm" => "application/x-koan", + ".skp" => "application/x-koan", + ".skt" => "application/x-koan", + ".smi" => "application/smil", + ".smil" => "application/smil", + ".snd" => "audio/basic", + ".so" => "application/octet-stream", + ".spl" => "application/x-futuresplash", + ".src" => "application/x-wais-source", + ".sv4cpio" => "application/x-sv4cpio", + ".sv4crc" => "application/x-sv4crc", + ".svg" => "image/svg+xml", + ".swf" => "application/x-shockwave-flash", + ".t" => "application/x-troff", + ".tar" => "application/x-tar", + ".tcl" => "application/x-tcl", + ".tex" => "application/x-tex", + ".texi" => "application/x-texinfo", + ".texinfo" => "application/x-texinfo", + ".tgz" => "application/x-tar-gz", + ".tif" => "image/tiff", + ".tiff" => "image/tiff", + ".tr" => "application/x-troff", + ".tsv" => "text/tab-separated-values", + ".txt" => "text/plain", + ".ustar" => "application/x-ustar", + ".vcd" => "application/x-cdlink", + ".vrm" => "x-world/x-vrml", + ".vrml" => "x-world/x-vrml", + ".vxml" => "application/voicexml+xml", + ".wav" => "audio/x-wav", + ".wbmp" => "image/vnd.wap.wbmp", + ".wbxml" => "application/vnd.wap.wbxml", + ".wml" => "text/vnd.wap.wml", + ".wmlc" => "application/vnd.wap.wmlc", + ".wmls" => "text/vnd.wap.wmlscript", + ".wmlsc" => "application/vnd.wap.wmlscriptc", + ".wrl" => "x-world/x-vrml", + ".xbm" => "image/x-xbitmap", + ".xht" => "application/xhtml+xml", + ".xhtml" => "application/xhtml+xml", + ".xls" => "application/excel", + ".xml" => "application/xml", + ".xpm" => "image/x-xpixmap", + ".xsl" => "application/xml", + ".xslt" => "application/xslt+xml", + ".xul" => "application/vnd.mozilla.xul+xml", + ".xwd" => "image/x-xwindowdump", + ".xyz" => "chemical/x-xyz", + ".zip" => "application/x-zip-compressed" +) + +# End of file diff --git a/talimatname/genel/l/lighttpd/talimat b/talimatname/genel/l/lighttpd/talimat new file mode 100644 index 000000000..7b20207cb --- /dev/null +++ b/talimatname/genel/l/lighttpd/talimat @@ -0,0 +1,28 @@ +# Tanım: Hızlı,güvenli ve esnek web sunucu uygulaması +# URL: http://www.lighttpd.net/ +# Paketçi: milisarge +# Gerekler: pcre + +isim=lighttpd +surum=1.4.45 +devir=1 +kaynak=(http://download.$isim.net/$isim/releases-1.4.x/$isim-$surum.tar.xz \ + $isim.conf ) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --libdir=/usr/lib/$isim --with-openssl \ + --mandir=/usr/man --with-pcre + make + make DESTDIR=$PKG install + + install -D -m 644 $SRC/$isim.conf $PKG/etc/$isim.conf + install -d $PKG/var/www/{htdocs,logs} + install -d $PKG/var/run + install -d $PKG/etc/ssl/certs + #touch $PKG/var/run/lighttpd.pid + touch $PKG/etc/ssl/certs/lighttpd.pem + chmod 0600 $PKG/etc/ssl/certs/lighttpd.pem + cd /sources/milis.git/ayarlar/servisler + make DESTDIR=$PKG kur-lighttpd +} diff --git a/talimatname/genel/l/lila-hd-icon-theme/lila-hd-icon-theme.kur-kos b/talimatname/genel/l/lila-hd-icon-theme/lila-hd-icon-theme.kur-kos new file mode 100644 index 000000000..35dba1531 --- /dev/null +++ b/talimatname/genel/l/lila-hd-icon-theme/lila-hd-icon-theme.kur-kos @@ -0,0 +1,7 @@ +gtk-update-icon-cache -f /usr/share/icons/Lila_HD +gtk-update-icon-cache -f /usr/share/icons/Lila_HD_Kaki +gtk-update-icon-cache -f /usr/share/icons/Lila_HD_Blue +gtk-update-icon-cache -f /usr/share/icons/Lila_HD_Dark +gtk-update-icon-cache -f /usr/share/icons/Lila_HD_Green +gtk-update-icon-cache -f /usr/share/icons/Lila_HD_Light-Grey +gtk-update-icon-cache -f /usr/share/icons/Lila_HD/default diff --git a/talimatname/genel/l/lila-hd-icon-theme/talimat b/talimatname/genel/l/lila-hd-icon-theme/talimat new file mode 100644 index 000000000..b99b73cec --- /dev/null +++ b/talimatname/genel/l/lila-hd-icon-theme/talimat @@ -0,0 +1,19 @@ +# Tanım: Linux için Lila simge seti +# URL: https://github.com/ilnanny/Lila-HD-icon-theme +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk-update-icon-cache + +isim=lila-hd-icon-theme +_isim=Lila-HD-icon-theme +surum=1 +devir=1 +kaynak=() + +derle() { + git clone https://github.com/ilnanny/$_name.git + cd "${_name}" + rm {credits,icon-theme.cache,lila-hd-32-px.png,Lila-HD-Icon-theme-3.0-Preview.png,README.md,install,SupportMe} + install -d "$PKG/usr/share/icons/" + cp -a * "$PKG/usr/share/icons/" + + } diff --git a/talimatname/genel/l/links/talimat b/talimatname/genel/l/links/talimat new file mode 100644 index 000000000..c26deadd7 --- /dev/null +++ b/talimatname/genel/l/links/talimat @@ -0,0 +1,21 @@ +# Tanım: Metin ve grafik modu WWW tarayıcı. Tablolar ve çerçeveler oluşturma desteği içerir +# URL: http://links.twibright.com/ +# Paketçi: milisarge +# Gerekler: gpm libpng libtiff libjpeg-turbo +# Grup: ağ + +isim=links +surum=2.16 +devir=1 + +kaynak=(http://links.twibright.com/download/links-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr --enable-graphics \ +--mandir=/usr/share/man +make +make DESTDIR=$PKG install +mkdir -p $PKG/usr/share/doc/$isim-$surum +install -v -m644 doc/links_cal/* KEYS BRAILLE_HOWTO \ +$PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/l/linux-firmware/microcode_amd_fam17h.bin.xz b/talimatname/genel/l/linux-firmware/microcode_amd_fam17h.bin.xz new file mode 100644 index 0000000000000000000000000000000000000000..994b9c26a5db20270f29534b790da964b7a44634 GIT binary patch literal 1988 zcmV;#2Rr!vH+ooF000E$*0e?f03iVu0001VFXf})46_G=T>v5zL?In)_WkbxE03z( z6-OP`$mutC<Z&6|9tmF(lLoG&T759>^me5NDR9Lio*rR>W(sl4HX~hd#vG5OzMd2y zJ4%gf|F&2sM%qFu%>0{A5{*?sl`-tfD(RUC4GB}rBM{t+4VLT5do;0L%G81A+s+^R z1#X5;iv>3(E~fVLp?ulrko1$(u%NX9--Ois)o9f8$vB6AS>VP_+xvbz48oF(nsEPs z6P+1SgshTQB)JMA#f+e@tA~zA^{9NBb|eX;RM^k9$D7+pnmIBQi3fv>@x$ia^lJwP z+<_%vb98}n=LMu0e(0}AN|Au24lCi8R$5Gma2lKG*l^c8<N;i^J@ygp3++JLdR%L{ zhnVVWx?906#W)V&?`gcTzly(SrJd7Q_dO2`Z`s;1x^ue{Rcfaux7mz|M-*w$+D>S$ z{r2X$wnWXRJo~U>07(RjoG~%2F7-kP{pwzZN8%Ak8j}x^I5uf>H@r046_TMPGy@(f z$Cs}@k_YJbW%D;wN#nc3u8jJ(Clc>CE8H@8y_HP>wYCBYI|2V&5RBl=ml8|N_#j-f zL>ym8vqmrceD6Odx2+yFNY&beQf%(#YnRf-Ie|jq{3aetX|2CNRD8;_*~6z6_>fvT z6dklzXv$s%6d_<-kUt8<&fcxm!>o8CgMUb$bb*6zy#MBpnohh))<?XFZ@x-9S%YK1 z-mh9FY-|2V8-*x4gbJ1kyf`;)km$obUo3hcJum?}(kV$}Tm&;Y@kaKI3#e%*SR$v# zw;bPUwZ~NM!Y5gZR+zK9@}54__4Y=}Db$nR1cue|AV<g~w<d(zB>=EC>aFl&tdKDQ zo}M-rbk~wIv56RQHmLZ3F7>&#vf01qp)>E1IuriO=*SMV+!K<|qkF%`8G=N64~-N~ zg!fdvX7(f;WU!idxF(aVmIaIV{}s0i0PySs?~U)hL2Gf%5i)n4lUr@>#3N7Ag)8GN zj2Y`KO2~H)$^$$%h;*%MVyyEO*Yr!Ve9M>ow#)yqU(r(=ZDjhX*J(W*`d($VZH=`} z%Tvr*s4=5~bgsEPdR~{hb<X_{WHd&1jGa{yPpYMZ8HEnTj*h&69qjv8H=NlENNl5t znqRc{ifw0GwuS}K(gIGmfcIdls8soJLl=sU)?tbcb9kRNV*=?Bk7&YlU|e+zjZel! zy1pNnvykQg`2t!8vNo;4<|Y$@P-vOz_Y{g(v}nP?O|ob*R`8wuis38}*0dauqfD%n z@S}r?-%W#5wcNLc+mkzy)$&wXY8n<D<PDX?>%Cs_?1>MI^;bI-q+`UsD(E(Bx=<Z9 zeog2flek+p1|4)>l~4%t;aNX~;o*oj?Iyo)MO3~?Tq0aHR!&z7i{_D}SY|xT&R;-| zY6Vc>7X(Zs)k`gROb!sv0D2&L-maCKu4S==FSX-I%vs$?-NSwEgC#^$u5czS-b$wh zX*G0+1g^z+C`0+4z`RmL#}xBqYh}KG%6L-pfojdqVgnsIzFutH!LXwOfTcxTkGW!u zGScS7RVHj@jt9Rp`#cdp3<#IG{z)+~pk~WH?via8tDtZLacro3-|iWgPNbM~(*zCb z#y=vGqeKRFqhi>2Kv4B)9AR-1?=Y#`_8?DJ;*!F3G4(_z0ni)si5yNHtK1@Qc)eCP z{#1E+&E-dOsln#^cX`sCSL`wrQKR5xhP=?t96n%%SihC<g#Tp7r5!tMJt6)=CX~gY zmJAw$g{nAvT3(RuirX$`A1oVVV@>{m0d0~VBJMU3IjAOytD}vnWYhro0mc804;v%^ zD>uM3PS{AUB!y;3=bB^#)E)igNj_1#k?%P{ZoC)*<i71x^akG}Vsydw-qZ*6w9KTw zwpnuyv2@>zJ7!zHmGF;kpRb%-HyeZio2c(<O^p+$!^Ot@a`u$b|4s3t@Q{fgaL)P8 zTlP}w-r#w;XFn9%HXBT`H<lOa=-kzE0&;JMfhM|G-CrrnxrnxVIWSwaM}TVx@F|g# zDgfV1@6T;V7K<EzzOKy#nZWxy7e;tFhRrooR+e^=7p8Q+gJHN_I(E9;eEURlmtg}6 z9P_iRyl6nefcWgAZNS0~t%lE~(!@`{ND%L{n^hp4SBz;f=p4IWAJ1LvDr2bU3Ez8E zaX&s@u!jrDzhP5u$7TR(Y+|rw9(e2@lwh&p=aLQEN4H{R{}K-ODFRWeWqzTV*9_WZ z?Eh_lnli|`k-pUPB4Js=jCG<q-ZBvCDC_<0>%{8>A}+TuAe9(45S^1>iDYaDK&Ssq zdKhmT%*3lnd82;n%ELS0pbVu;>cwj#R5sPryFDDVOV_2IbYDeXxMs&T4k8K~)&<4j zdrZ*Q_y=K{fk^}iPB|_7CIpk~7Q!yWkIi{_M9W`rI0dB%+k>;XeqWs}DN4~~B|vt0 z|BoceXpVkE3VMd9wG&u?swf2@6`Hf>22qMK&F0(ok-|i4yppj)5g9Wh32L^AsGR(P zGEPpAEG!QK`*{I+t!c~%RdKzu%5C_X`I#!#4LvlszkQwRiU0t2(~46nnK&x|0iO@F W82|vNrqV32#Ao{g000001X)^RW6Ea$ literal 0 HcmV?d00001 diff --git a/talimatname/genel/l/linux-firmware/talimat b/talimatname/genel/l/linux-firmware/talimat new file mode 100644 index 000000000..ca17e556e --- /dev/null +++ b/talimatname/genel/l/linux-firmware/talimat @@ -0,0 +1,46 @@ +# Tanım: Kernel için firmware ikilileri +# URL: https://git.kernel.org/?p=linux/kernel/git/firmware/linux-firmware.git;a=summary +# Paketçi: milisarge +# Gerekler: b43-fwcutter git +# Grup: sürücüler + +isim=linux-firmware +surum=20180119 +_b43=5.100.138 +_legacy=3.130.20.0 +devir=1 +kaynak=(http://mirror2.openwrt.org/sources/broadcom-wl-${_b43}.tar.bz2 + http://downloads.openwrt.org/sources/wl_apsta-${_legacy}.o + microcode_amd_fam17h.bin.xz) + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + unxz $SRC/microcode_amd_fam17h.bin.xz + # Build/Package + make DESTDIR=$PKG FIRMWAREDIR=/lib/firmware install + + # Cleanup + rm $PKG/lib/firmware/{Makefile,README,configure,GPL-{2,3}} + + install -d ${PKG}/usr/share/licenses/${isim} + install -Dm644 LICEN* WHENCE ${PKG}/usr/share/licenses/linux-firmware/ + + # install b43-firmware + b43-fwcutter -w ${PKG}/lib/firmware/ ${SRC}/broadcom-wl-${_b43}/linux/wl_apsta.o + + # install b43-legacy-firmware + b43-fwcutter -w ${PKG}/lib/firmware/ ${SRC}/wl_apsta-${_legacy}.o + + # temporary manually add latest amd firmware + cd .. + install -Dm644 microcode_amd_fam17h.bin ${PKG}/lib/firmware/amd-ucode/ + +} diff --git a/talimatname/genel/l/lirc/lirc.logrotate b/talimatname/genel/l/lirc/lirc.logrotate new file mode 100644 index 000000000..623c4f328 --- /dev/null +++ b/talimatname/genel/l/lirc/lirc.logrotate @@ -0,0 +1,5 @@ +/var/log/lircd { + missingok + notifempty + delaycompress +} diff --git a/talimatname/genel/l/lirc/lirc.tmpfiles b/talimatname/genel/l/lirc/lirc.tmpfiles new file mode 100644 index 000000000..0b80e2e47 --- /dev/null +++ b/talimatname/genel/l/lirc/lirc.tmpfiles @@ -0,0 +1 @@ +d /run/lirc 0755 root root - diff --git a/talimatname/genel/l/lirc/talimat b/talimatname/genel/l/lirc/talimat new file mode 100644 index 000000000..657bbdc1a --- /dev/null +++ b/talimatname/genel/l/lirc/talimat @@ -0,0 +1,30 @@ +# Tanım: Linux Kızılötesi Uzaktan Kumanda programları +# URL: http://www.lirc.org/ +# Paketçi: Cihan_Alkan +# Gerekler: alsa-lib xorg-libx11 libftdi libusb-compat help2man libxslt python3 python3-setuptools +# Grup: sistem + +isim=lirc +surum=0.10.1 +devir=1 + +kaynak=(https://sourceforge.net/projects/lirc/files/LIRC/0.10.1/lirc-$surum.tar.gz + lirc.logrotate + lirc.tmpfiles) + +derle() { + + cd "${SRC}/lirc-$surum" + + HAVE_UINPUT=1 ./configure --prefix=/usr --sbindir=/usr/bin --sysconfdir=/etc --localstatedir=/var + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="${PKG}" -j1 install + + install -Dm644 "${SRC}"/lirc.tmpfiles "${PKG}"/usr/lib/tmpfiles.d/lirc.conf + install -Dm644 "${SRC}"/lirc.logrotate "${PKG}"/etc/logrotate.d/lirc + + rmdir "${PKG}"/var/{run/lirc/,run/} + rm -rf ${PKG}/usr/share/doc + rm -rf ${PKG}/usr/share/man +} diff --git a/talimatname/genel/l/live/talimat b/talimatname/genel/l/live/talimat new file mode 100644 index 000000000..9107579cf --- /dev/null +++ b/talimatname/genel/l/live/talimat @@ -0,0 +1,36 @@ +# Tanım: Multimedya akışı için bir dizi C ++ kütüphanesi +# URL: http://www.live555.com/liveMedia/ +# Paketçi: milisarge +# Gerekler: + +isim=live +surum=2014.07.04 +devir=1 + +kaynak=(http://downloads.nutyx.org/files/$isim.$surum.tar.gz) + +derle() { +cd $SRC/live + + sed \ + -e 's/$(INCLUDES) -I. -O2 -DSOCKLEN_T/$(INCLUDES) -I. -O2 -I. -fPIC -DRTSPCLIENT_SYNCHRONOUS_INTERFACE=1 -DSOCKLEN_T/g' \ + -e 's/\(LIBRARY_LINK =\).*/\1 $(LD) -o/g' \ + -e 's/\(LIBRARY_LINK_OPTS =\).*/\1 $(LINK_OPTS) -r -Bstatic/g' \ + -i config.linux + ./genMakefiles linux + make + + + for dir in BasicUsageEnvironment groupsock liveMedia UsageEnvironment; do + install -dm755 $PKG/usr/{bin,lib,include/${dir}} + install -m644 ${dir}/*.a $PKG/usr/lib + install -m644 ${dir}/include/*.h* $PKG/usr/include/${dir} + done + + for testprog in `find testProgs -type f -perm 755`; do + install ${testprog} $PKG/usr/bin + done + +} + + diff --git a/talimatname/genel/l/lld/0003-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch b/talimatname/genel/l/lld/0003-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch new file mode 100644 index 000000000..58581b2a8 --- /dev/null +++ b/talimatname/genel/l/lld/0003-CMake-Fix-pthread-handling-for-out-of-tree-builds.patch @@ -0,0 +1,78 @@ +From 548cd5eb4f45de4ec71b3421a98c9462aed75c91 Mon Sep 17 00:00:00 2001 +From: Eric Fiselier <eric@efcs.ca> +Date: Fri, 10 Feb 2017 01:59:20 +0000 +Subject: [PATCH] [CMake] Fix pthread handling for out-of-tree builds + +LLVM defines `PTHREAD_LIB` which is used by AddLLVM.cmake and various projects +to correctly link the threading library when needed. Unfortunately +`PTHREAD_LIB` is defined by LLVM's `config-ix.cmake` file which isn't installed +and therefore can't be used when configuring out-of-tree builds. This causes +such builds to fail since `pthread` isn't being correctly linked. + +This patch attempts to fix that problem by renaming and exporting +`LLVM_PTHREAD_LIB` as part of`LLVMConfig.cmake`. I renamed `PTHREAD_LIB` +because It seemed likely to cause collisions with downstream users of +`LLVMConfig.cmake`. + + +git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@294690 91177308-0d34-0410-b5e6-96231b3b80d8 +--- + COFF/CMakeLists.txt | 2 +- + ELF/CMakeLists.txt | 2 +- + lib/ReaderWriter/MachO/CMakeLists.txt | 2 +- + unittests/CoreTests/CMakeLists.txt | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/COFF/CMakeLists.txt b/COFF/CMakeLists.txt +index 0eebe9348..8f24e36c0 100644 +--- a/COFF/CMakeLists.txt ++++ b/COFF/CMakeLists.txt +@@ -43,7 +43,7 @@ add_lld_library(lldCOFF + + LINK_LIBS + lldCore +- ${PTHREAD_LIB} ++ ${LLVM_PTHREAD_LIB} + + DEPENDS + COFFOptionsTableGen +diff --git a/ELF/CMakeLists.txt b/ELF/CMakeLists.txt +index 5652b9351..0d1e5b214 100644 +--- a/ELF/CMakeLists.txt ++++ b/ELF/CMakeLists.txt +@@ -54,7 +54,7 @@ add_lld_library(lldELF + LINK_LIBS + lldConfig + lldCore +- ${PTHREAD_LIB} ++ ${LLVM_PTHREAD_LIB} + + DEPENDS + ELFOptionsTableGen +diff --git a/lib/ReaderWriter/MachO/CMakeLists.txt b/lib/ReaderWriter/MachO/CMakeLists.txt +index 3b0698525..5a96d87f1 100644 +--- a/lib/ReaderWriter/MachO/CMakeLists.txt ++++ b/lib/ReaderWriter/MachO/CMakeLists.txt +@@ -28,7 +28,7 @@ add_lld_library(lldMachO + LINK_LIBS + lldCore + lldYAML +- ${PTHREAD_LIB} ++ ${LLVM_PTHREAD_LIB} + ) + + include_directories(.) +diff --git a/unittests/CoreTests/CMakeLists.txt b/unittests/CoreTests/CMakeLists.txt +index 98405d5c7..72e7c443f 100644 +--- a/unittests/CoreTests/CMakeLists.txt ++++ b/unittests/CoreTests/CMakeLists.txt +@@ -3,5 +3,5 @@ add_lld_unittest(CoreTests + ) + + target_link_libraries(CoreTests +- ${PTHREAD_LIB} ++ ${LLVM_PTHREAD_LIB} + ) +-- +2.12.2 + diff --git a/talimatname/genel/l/lld/talimat b/talimatname/genel/l/lld/talimat new file mode 100644 index 000000000..b8becb61e --- /dev/null +++ b/talimatname/genel/l/lld/talimat @@ -0,0 +1,24 @@ +# Tanım: LLVM linker +# URL: http://llvm.org/ +# Paketçi: milisarge +# Gerekler: llvm cmake + +isim=lld +surum=4.0.0 +devir=1 +kaynak=(http://releases.llvm.org/$surum/lld-$surum.src.tar.xz) + +derle() { + + cd $isim-$surum.src + mkdir build + cd build + cmake ../ + make -C tools/lld DESTDIR=$PKG install + cd lib + install -d $PKG/usr/lib/ + cp *.a $PKG/usr/lib/ + cp -r $SRC/$isim-$surum.src/include $PKG/usr/ + mv $PKG/usr/local/* $PKG/usr/ + rm -r $PKG/usr/local +} diff --git a/talimatname/genel/l/llvm/llvm-config.h b/talimatname/genel/l/llvm/llvm-config.h new file mode 100644 index 000000000..ccc313fbf --- /dev/null +++ b/talimatname/genel/l/llvm/llvm-config.h @@ -0,0 +1,12 @@ +/* llvm-config.h stub */ + +#ifndef __STUB__LLVMCONFIG_H__ +#define __STUB__LLVMCONFIG_H__ + +#if defined(__x86_64__) +#include "llvm-config-64.h" +#else +#include "llvm-config-32.h" +#endif + +#endif diff --git a/talimatname/genel/l/llvm/talimat b/talimatname/genel/l/llvm/talimat new file mode 100644 index 000000000..63167b174 --- /dev/null +++ b/talimatname/genel/l/llvm/talimat @@ -0,0 +1,38 @@ +# Tanım: LLVM derleyicisi +# URL: http://llvm.org/ +# Paketçi: milisarge +# Gerekler: python cmake + +isim=llvm +surum=4.0.0 +devir=1 +kaynak=(http://llvm.org/releases/$surum/$isim-$surum.src.tar.xz \ + llvm-config.h) + +derle() { + export CC=gcc + export CXX=g++ + + cd $isim-$surum.src + + mkdir build + cd build + + cmake -DLLVM_ENABLE_CXX1Y=1 \ + -DLLVM_INCLUDE_EXAMPLES=0 \ + -DLLVM_INCLUDE_TESTS=0 \ + -DLLVM_ENABLE_OCAMLDOC=0 \ + -DLLVM_TARGETS_TO_BUILD='X86;AMDGPU;BPF' \ + -DLLVM_BUILD_LLVM_DYLIB=1 \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr .. + + MAKEFLAGS="$MAKEFLAGS" make + make DESTDIR=$PKG install + + # multilib stub + mv $PKG/usr/include/llvm/Config/llvm-config{,-64}.h + + install -m 0644 $SRC/llvm-config.h $PKG/usr/include/llvm/Config/ + +} diff --git a/talimatname/genel/l/lm-sensors/talimat b/talimatname/genel/l/lm-sensors/talimat new file mode 100644 index 000000000..971970324 --- /dev/null +++ b/talimatname/genel/l/lm-sensors/talimat @@ -0,0 +1,24 @@ +# Tanım: Genel SMBus erişimi ve donanım izleme için kullanıcı alanı araçlarının toplanması +# URL: http://dl.lm-sensors.org/lm-sensors/ +# Paketçi: milisarge +# Gerekler: + +isim=lm-sensors +surum=3.4.0 +devir=1 + +kaynak=(http://ftp.osuosl.org/pub/blfs/conglomeration/lmsensors/lm_sensors-$surum.tar.bz2) + +derle() { + cd lm_sensors-$surum + make PREFIX=/usr DESTDIR=$PKG \ + BUILD_STATIC_LIB=0 \ + MANDIR=/usr/share/man + make PREFIX=/usr DESTDIR=$PKG \ + BUILD_STATIC_LIB=0 \ + MANDIR=/usr/share/man install + + install -v -m755 -d $PKG/usr/share/doc/$isim-$surum + cp -rv README INSTALL doc/* \ + $PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/l/lmdb/talimat b/talimatname/genel/l/lmdb/talimat new file mode 100644 index 000000000..ab09030a9 --- /dev/null +++ b/talimatname/genel/l/lmdb/talimat @@ -0,0 +1,19 @@ +# Tanım: Symas LMDB, Symas OpenLDAP Projesi için geliştirdiğimiz olağanüstü derecede hızlı, bellek açısından verimli bir veritabanıdır. +# URL: http://symas.com/mdb +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=lmdb +surum=0.9.18 +devir=1 + +kaynak=( https://github.com/LMDB/lmdb/archive/LMDB_$surum.tar.gz) + +derle() { + cd $isim-LMDB_$surum + cd libraries/liblmdb + make + sed -i 's| liblmdb.a||' Makefile + make prefix=/usr DESTDIR=$PKG install + rm -rf /usr/share/doc +} diff --git a/talimatname/genel/l/lockfile/talimat b/talimatname/genel/l/lockfile/talimat new file mode 100644 index 000000000..c1c9c3c70 --- /dev/null +++ b/talimatname/genel/l/lockfile/talimat @@ -0,0 +1,16 @@ +# Tanım: Platformdan bağımsız dosya kilitleme modülü +# URL: http://launchpad.net/pylockfile +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=lockfile +surum=0.12.2 +devir=1 + +kaynak=(https://pypi.python.org/packages/source/l/lockfile/lockfile-0.12.2.tar.gz) + + +derle() { + cd "${SRC}/${isim}-${surum}" + python setup.py install --root=$PKG +} diff --git a/talimatname/genel/l/logmein-hamachi/hamachi.servis b/talimatname/genel/l/logmein-hamachi/hamachi.servis new file mode 100644 index 000000000..1b270ae06 --- /dev/null +++ b/talimatname/genel/l/logmein-hamachi/hamachi.servis @@ -0,0 +1,23 @@ +#!/bin/sh +# +# /etc/rc.d/hamachi: start/stop hamachi daemon +# + +case $1 in +start) + /usr/bin/hamachi + ;; +stop) + killall -q hamachi + ;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) +echo "usage: $0 [start|stop|restart]" + ;; +esac + +# End of file diff --git a/talimatname/genel/l/logmein-hamachi/talimat b/talimatname/genel/l/logmein-hamachi/talimat new file mode 100644 index 000000000..1d6f79fff --- /dev/null +++ b/talimatname/genel/l/logmein-hamachi/talimat @@ -0,0 +1,31 @@ +# Tanım: Bir vpn hizmeti. +# URL: https://www.vpn.net/linux +# Paketçi: kadanur +# Gerekler: + +isim=logmein-hamachi +surum=2.1.0.174 +devir=1 +kaynak=(https://www.vpn.net/installers/$isim-$surum-x64.tgz + hamachi.servis) + +derle() { + + cd "${SRC}"/logmein-hamachi-2.1.0.174-x64 + # Directories + install -d "${PKG}"/usr/bin + install -d "${PKG}"/opt/${isim}/bin + install -d "${PKG}"/usr/share/licenses/${isim} + # Files + install -m 755 hamachid "${PKG}"/opt/${isim}/bin + install -m 755 dnsup "${PKG}"/opt/${isim}/bin + install -m 755 dnsdown "${PKG}"/opt/${isim}/bin + install -m 755 uninstall.sh "${PKG}"/opt/${isim} + install -m 444 README "${PKG}"/opt/${isim} + install -m 444 LICENSE "${PKG}"/opt/${isim} + install -m 444 CHANGES "${PKG}"/opt/${isim} + ln -sf "/opt/$isim/bin/hamachid" "${PKG}"/usr/bin/hamachi + install -d $PKG/etc/rc.d/init.d + cp $SRC/hamachi.servis $PKG/etc/rc.d/init.d/hamachid + +} diff --git a/talimatname/genel/l/logrotate/logrotate.conf b/talimatname/genel/l/logrotate/logrotate.conf new file mode 100644 index 000000000..4a45811f2 --- /dev/null +++ b/talimatname/genel/l/logrotate/logrotate.conf @@ -0,0 +1,30 @@ +# Begin of /etc/logrotate.conf +# conf by linuxfromscratch +# http://www.linuxfromscratch.org/hints/downloads/files/logrorate.txt + +# Rotate log files weekly +weekly + +# Don't send mail to anybody +nomail + +# If the log file is empty, it will not be rotated +notifempty + +# Number of backups that will be kept +# This will keep the 2 newest backups only +rotate 2 + +# Create new empty files after rotate old ones +# This will create empty log files, with owner +# set to root, group set to sys, and permissions 644 +create 0664 root sys + +# Compress the backups with gzip +compress + +# RPM packages drop log rotation info in this directory +# so we include any file in it. +include /etc/logrotate.d + +# End of /etc/logrotate.conf diff --git a/talimatname/genel/l/logrotate/logrotate.okubeni b/talimatname/genel/l/logrotate/logrotate.okubeni new file mode 100644 index 000000000..34396f287 --- /dev/null +++ b/talimatname/genel/l/logrotate/logrotate.okubeni @@ -0,0 +1,56 @@ +# from http://www.linuxfromscratch.org/hints/downloads/files/logrorate.txt + +When installing sysklogd, the LFS book defines some predefined log files in +"/etc/syslog.conf". We can rotate those files by adding their definitions to +logrotate.conf. So, to add them, run this command: + for logfile in $(find /var/log/* -type f); do + echo "$logfile {" >> /etc/logrotate.conf + echo "# If the log file is larger" \ + "than 100kb, rotate it" >> /etc/logrotate.conf" + echo " size=100k" >> /etc/logrotate.conf + echo "}" >> /etc/logrotate.conf + echo "" >> /etc/logrotate.conf + done + +For details on editing this file, see logrotate(8). + + +Logrotate as a Cron job +======================= + +You can run logrotate just issuing "/usr/sbin/logrotate /etc/logrotate.conf" +but in this case, you should run that command by yourself, every day (or +week, or month...), if you want the program to work properly. This can be +very annoying :-). + +Instead, you can run it as a cron job. For the further configuration, +I will assume that you have installed Fcron from the BLFS book. + +Create a /etc/fcrontab file by issuing this command: + cat >> /etc/fcrontab << EOF + 0 12 * * * 0 /usr/sbin/logrotate /etc/logrotate.conf + EOF +This will make fcron execute logrotate once a week, on Sunday, at noon. +For details on editing fcrontab, refer to fcrontab(1). + +You will need the "check_system_crontabs" script from the fcron sources. If +you haven't installed it, do it by issuing: + tar xzf fcron-3.0.1.tar.gz + cp -v fcron-3.0.1/scripts/check_system_crontabs /usr/sbin + +Then run the script: + check_system_crontabs -v +For help, type this: + check_system_crontabs -h + + +ACKNOWLEDGEMENTS: + * Alexander E. Patrakov, for pointing me for the BLFS +version of + popt (Before I used the popt included in Slackware 10.1) + + +VERSION: 1.1 + +CHANGELOG: 1.00 First release + 1.1 Corrected popt section, fixed typos. diff --git a/talimatname/genel/l/logrotate/talimat b/talimatname/genel/l/logrotate/talimat new file mode 100644 index 000000000..6ecef1e32 --- /dev/null +++ b/talimatname/genel/l/logrotate/talimat @@ -0,0 +1,25 @@ +# Tanım: Logrotate yardımcı programı, günlük yönetimini basitleştirmek için tasarlanmıştır +# URL: https://fedorahosted.org/logrotate/ +# Paketçi: milisarge +# Gerekler: popt + +isim=logrotate +surum=3.8.8 +devir=1 + +kaynak=( +https://fedorahosted.org/releases/l/o/logrotate/logrotate-$surum.tar.gz +logrotate.conf +logrotate.README) + +derle() { + cd $isim-$surum + make WITH_ACL=yes RPM_OPT_FLAGS="$CFLAGS" EXTRA_LDFLAGS="$LDFLAGS" + make test + make PREFIX=$PKG MANDIR="/usr/share/man" install + + # add missing dir + install -dm755 $PKG/etc/logrotate.d + # install the logrotate.conf file + install -Dm644 $SRC/logrotate.conf $PKG/etc/logrotate.conf +} diff --git a/talimatname/genel/l/lpsolve/cflags.patch b/talimatname/genel/l/lpsolve/cflags.patch new file mode 100644 index 000000000..8e8804cb8 --- /dev/null +++ b/talimatname/genel/l/lpsolve/cflags.patch @@ -0,0 +1,25 @@ +diff -ru lp_solve_5.5.orig/lp_solve/ccc lp_solve_5.5/lp_solve/ccc +--- lp_solve_5.5.orig/lp_solve/ccc 2009-02-23 16:31:18.000000000 +0000 ++++ lp_solve_5.5/lp_solve/ccc 2009-02-23 16:31:29.000000000 +0000 +@@ -28,7 +28,7 @@ + fi + rm /tmp/isnan.c /tmp/isnan >/dev/null 2>&1 + +-opts='-O3' ++opts=$CFLAGS + + def= + if [ "$PLATFORM" = "SCO_UNIX" ] +diff -ru lp_solve_5.5.orig/lpsolve55/ccc lp_solve_5.5/lpsolve55/ccc +--- lp_solve_5.5.orig/lpsolve55/ccc 2009-02-23 16:31:18.000000000 +0000 ++++ lp_solve_5.5/lpsolve55/ccc 2009-02-23 16:31:29.000000000 +0000 +@@ -35,7 +35,7 @@ + so=y + fi + +-opts='-O3' ++opts=$CFLAGS + + $c -s -c -I.. -I../shared -I../bfp -I../bfp/bfp_LUSOL -I../bfp/bfp_LUSOL/LUSOL -I../colamd $opts $def $NOISNAN -DYY_NEVER_INTERACTIVE -DPARSER_LP -DINVERSE_ACTIVE=INVERSE_LUSOL -DRoleIsExternalInvEngine $src + ar rv bin/$PLATFORM/liblpsolve55.a `echo $src|sed s/[.]c/.o/g|sed 's/[^ ]*\///g'` + diff --git a/talimatname/genel/l/lpsolve/lpsolve-5.5.2.0.defines.patch b/talimatname/genel/l/lpsolve/lpsolve-5.5.2.0.defines.patch new file mode 100644 index 000000000..a325c1370 --- /dev/null +++ b/talimatname/genel/l/lpsolve/lpsolve-5.5.2.0.defines.patch @@ -0,0 +1,22 @@ +--- lp_solve_5.5/lpsolve55/ccc ++++ lp_solve_5.5/lpsolve55/ccc +@@ -18,7 +18,7 @@ + echo '#include <stdio.h>'>>/tmp/isnan.c + echo '#include <stdlib.h>'>>/tmp/isnan.c + echo '#include <math.h>'>>/tmp/isnan.c +-echo 'main(){isnan(0);}'>>/tmp/isnan.c ++echo 'main(){isnan(0.0);}'>>/tmp/isnan.c + $c /tmp/isnan.c -o /tmp/isnan $math >/dev/null 2>&1 + if [ $? = 0 ] + then NOISNAN= +--- lp_solve_5.5/lp_solve/ccc ++++ lp_solve_5.5/lp_solve/ccc +@@ -20,7 +20,7 @@ + echo '#include <stdio.h>'>>/tmp/isnan.c + echo '#include <stdlib.h>'>>/tmp/isnan.c + echo '#include <math.h>'>>/tmp/isnan.c +-echo 'main(){isnan(0);}'>>/tmp/isnan.c ++echo 'main(){isnan(0.0);}'>>/tmp/isnan.c + $c /tmp/isnan.c -o /tmp/isnan $math >/dev/null 2>&1 + if [ $? = 0 ] + then NOISNAN= diff --git a/talimatname/genel/l/lpsolve/talimat b/talimatname/genel/l/lpsolve/talimat new file mode 100644 index 000000000..ad21f5acb --- /dev/null +++ b/talimatname/genel/l/lpsolve/talimat @@ -0,0 +1,31 @@ +# Tanım: Karışık Tamsayılı Lineer Programlama (MILP) çözücü +# URL: http://lpsolve.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: + +isim=lpsolve +surum=5.5.2.5 +devir=1 + +kaynak=(https://downloads.sourceforge.net/project/lpsolve/lpsolve/5.5.2.5/lp_solve_5.5.2.5_source.tar.gz + cflags.patch + lpsolve-5.5.2.0.defines.patch) + +derle() { + cd lp_solve_5.5 + + patch -Np1 -i $SRC/cflags.patch + + patch -Np1 -i $SRC/lpsolve-5.5.2.0.defines.patch + cd lpsolve55 + sh -x ccc +# rm bin/ux*/liblpsolve55.a + cd ../lp_solve + sh -x ccc + cd $SRC/lp_solve_5.5 + install -dm755 $PKG/usr/{bin,lib,include/lpsolve} + install -m755 lp_solve/bin/ux*/lp_solve $PKG/usr/bin/ + install -m755 lpsolve55/bin/ux*/liblpsolve55.so $PKG/usr/lib/ + install -m644 lp*.h $PKG/usr/include/lpsolve/ + +} diff --git a/talimatname/genel/l/lsb-release/lsbrelease b/talimatname/genel/l/lsb-release/lsbrelease new file mode 100644 index 000000000..aa434b854 --- /dev/null +++ b/talimatname/genel/l/lsb-release/lsbrelease @@ -0,0 +1,4 @@ +DISTRIB_ID="Milis" +DISTRIB_RELEASE="1.0" +DISTRIB_DESCRIPTION="Milis İsletim Sistemi 1.0" +DISTRIB_CODENAME="Atilla" diff --git a/talimatname/genel/l/lsb-release/milis-release b/talimatname/genel/l/lsb-release/milis-release new file mode 100644 index 000000000..7a4cb8e67 --- /dev/null +++ b/talimatname/genel/l/lsb-release/milis-release @@ -0,0 +1 @@ +Milis 1.0 Atilla diff --git a/talimatname/genel/l/lsb-release/system-release b/talimatname/genel/l/lsb-release/system-release new file mode 100644 index 000000000..7a4cb8e67 --- /dev/null +++ b/talimatname/genel/l/lsb-release/system-release @@ -0,0 +1 @@ +Milis 1.0 Atilla diff --git a/talimatname/genel/l/lsb-release/talimat b/talimatname/genel/l/lsb-release/talimat new file mode 100755 index 000000000..cd0017fdd --- /dev/null +++ b/talimatname/genel/l/lsb-release/talimat @@ -0,0 +1,19 @@ +# Tanım: Dağıtımın (Linux Standards Base) bilgisi verir. +# URL: http://www.linuxbase.org/ +# Paketçi: milisarge +# Gerekler: + +isim=lsb-release +surum=1.4 +devir=1 +kaynak=(http://sourceforge.net/projects/lsb/files/lsb_release/${surum}/${isim}-${surum}.tar.gz \ + lsbrelease milis-release system-release) + +derle() { + cd ${isim}-${surum} + install -Dm 755 lsb_release "$PKG/usr/bin/lsb_release" + mkdir -p $PKG/etc/ + cp $SRC/lsbrelease $PKG/etc/lsb-release + cp $SRC/milis-release $PKG/etc/milis-release + cp $SRC/system-release $PKG/etc/system-release +} diff --git a/talimatname/genel/l/lshw/lshw-gtk.desktop b/talimatname/genel/l/lshw/lshw-gtk.desktop new file mode 100644 index 000000000..7d1fb9e0f --- /dev/null +++ b/talimatname/genel/l/lshw/lshw-gtk.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=Donanım Bilgisi +Comment=Donanım hakkında bilgi +Icon=lshw-gtk +Exec=lshw-gtk +Terminal=false +Categories=System; diff --git a/talimatname/genel/l/lshw/lshw-gtk.xpm b/talimatname/genel/l/lshw/lshw-gtk.xpm new file mode 100644 index 000000000..d3aad56a8 --- /dev/null +++ b/talimatname/genel/l/lshw/lshw-gtk.xpm @@ -0,0 +1,239 @@ +/* XPM */ +static char * logo_xpm[] = { +"32 32 204 2", +" c None", +". c #000000", +"+ c #160F00", +"@ c #624400", +"# c #9D6E00", +"$ c #C68A00", +"% c #DC9900", +"& c #E09C00", +"* c #D19200", +"= c #B17C00", +"- c #7E5800", +"; c #362600", +"> c #010100", +", c #2E2000", +"' c #AA7700", +") c #FAAF00", +"! c #FFB200", +"~ c #D89700", +"{ c #654600", +"] c #040300", +"^ c #0A0700", +"/ c #916500", +"( c #FCB000", +"_ c #D29300", +": c #332300", +"< c #1B1300", +"[ c #CE9000", +"} c #F2AE12", +"| c #DFA92C", +"1 c #F8B00A", +"2 c #F8AD00", +"3 c #5E4200", +"4 c #1A1200", +"5 c #DC9A00", +"6 c #E1AA2A", +"7 c #B29C6A", +"8 c #D0A540", +"9 c #948155", +"0 c #C88E0A", +"a c #FEB100", +"b c #664700", +"c c #080600", +"d c #CC8F00", +"e c #FEB201", +"f c #AE9B70", +"g c #FBB105", +"h c #EBA400", +"i c #EAA70B", +"j c #453000", +"k c #8C6200", +"l c #F4AF0F", +"m c #BD9F5C", +"n c #E7A100", +"o c #120D00", +"p c #291C00", +"q c #FBAF00", +"r c #F9B009", +"s c #B89E62", +"t c #D4970A", +"u c #916600", +"v c #A27100", +"w c #AC9B73", +"x c #906E1D", +"y c #D0A440", +"z c #F7AD00", +"A c #171000", +"B c #0F0B00", +"C c #F7AC00", +"D c #A09783", +"E c #AF9C6F", +"F c #745100", +"G c #563C00", +"H c #EDAD19", +"I c #BB9F5E", +"J c #CFA542", +"K c #FFB201", +"L c #FDB103", +"M c #C38800", +"N c #B59D66", +"O c #EDAD18", +"P c #C5A250", +"Q c #CBA348", +"R c #D9A734", +"S c #E7AB21", +"T c #B39D69", +"U c #DDA830", +"V c #060400", +"W c #B88100", +"X c #FCB104", +"Y c #D7A738", +"Z c #F7B00B", +"` c #B99E60", +" . c #D5A63A", +".. c #D3A63D", +"+. c #CAA34A", +"@. c #CEA443", +"#. c #F1AE14", +"$. c #261B00", +"%. c #CD8F00", +"&. c #CA8D00", +"*. c #AB9666", +"=. c #DEA92E", +"-. c #F9B008", +";. c #AF9C6E", +">. c #E8AC1F", +",. c #3B2900", +"'. c #D09100", +"). c #A17100", +"!. c #483D25", +"~. c #928056", +"{. c #C28E16", +"]. c #7F5900", +"^. c #1E1500", +"/. c #CF9205", +"(. c #B99E61", +"_. c #E5AB24", +":. c #3E2B00", +"<. c #C08600", +"[. c #755201", +"}. c #838383", +"|. c #828282", +"1. c #888786", +"2. c #463610", +"3. c #4F3700", +"4. c #956800", +"5. c #F1A800", +"6. c #765200", +"7. c #503800", +"8. c #ECA400", +"9. c #7A5501", +"0. c #967527", +"a. c #9F6F00", +"b. c #4D4940", +"c. c #8B8B8B", +"d. c #696969", +"e. c #78653A", +"f. c #B57F00", +"g. c #634500", +"h. c #9A6B00", +"i. c #604300", +"j. c #BF8500", +"k. c #251A00", +"l. c #F2A900", +"m. c #0E0A00", +"n. c #6A4A00", +"o. c #BE8400", +"p. c #433D30", +"q. c #636363", +"r. c #4B3910", +"s. c #402D00", +"t. c #030200", +"u. c #513900", +"v. c #1F1500", +"w. c #C28800", +"x. c #D79600", +"y. c #221800", +"z. c #FEB200", +"A. c #EDA500", +"B. c #090600", +"C. c #302200", +"D. c #8F6400", +"E. c #C18700", +"F. c #8E6300", +"G. c #5F4300", +"H. c #986A00", +"I. c #785300", +"J. c #463100", +"K. c #312200", +"L. c #4D3600", +"M. c #412E00", +"N. c #4E3600", +"O. c #BA8200", +"P. c #BD8400", +"Q. c #845C00", +"R. c #644600", +"S. c #DA9800", +"T. c #261A00", +"U. c #2F2100", +"V. c #211700", +"W. c #EFA700", +"X. c #F5AB00", +"Y. c #765300", +"Z. c #9B6C00", +"`. c #342500", +" + c #7D5700", +".+ c #F9AE00", +"++ c #EEA600", +"@+ c #704E00", +"#+ c #513800", +"$+ c #020100", +"%+ c #4C3500", +"&+ c #A97600", +"*+ c #795500", +"=+ c #B37D00", +"-+ c #2B1E00", +";+ c #0B0800", +">+ c #5F4200", +",+ c #AF7A00", +"'+ c #CB8E00", +")+ c #281C00", +"!+ c #150E00", +"~+ c #2A1E00", +"{+ c #201600", +"]+ c #050400", +" ", +" . . . . . . . ", +" . + @ # $ % & * = - ; > . ", +" . , ' ) ! ! ! ! ! ! ! ! ! ~ { ] ", +" ^ / ( ! ! ! ! ! ! ! ! ! ! ! ! ! _ : . ", +" < [ ! ! ! ! ! ! ! ! ! ! ! } | 1 ! ! 2 3 . ", +" 4 5 ! ! ! ! ! ! ! ! ! ! ! 6 7 8 9 0 ! ! a b . ", +" c d ! ! ! ! ! ! ! ! ! ! ! e f g ! h i ! ! ! ( j . ", +" . k ! ! ! ! ! ! ! ! ! ! ! ! l m ! ! ! ! ! ! ! ! n o ", +" p q ! ! ! ! ! ! ! ! ! ! ! ! r s ! ! ! ! ! ! t ! ! u . ", +" . v ! ! ! ! ! ! ! ! ! ! ! ! ! ! w ! ! ! ! ! ! x y ! z A ", +" B C ! ! ! ! ! ! ! ! ! ! ! ! ! ! D 1 ! ! ! ! ! ! E ! ! F . ", +" G ! ! ! ! ! ! ! ! ! ! ! ! ! ! H I J K ! ! ! ! L f ! ! M . ", +" . / ! ! ! ! ! ! ! ! ! ! ! ! ! e N O l P Q R S 6 T U ! ! 2 V ", +" . W ! ! ! ! ! ! ! ! ! ! ! ! X I Y Z ` I ...+.@.#.! ! ! ! $. ", +" . %.! ! ! ! ! ! ! ! ! ! ! &.*.=.-.;.>.! ! ! ! ! ! ! ! ! ! ,. ", +" . '.).!.~.{.! ! ! ! ! q ].^./.! (._.! ! ! ! ! ! ! ! ! ! ! :. ", +" . <.[.}.|.1.2.3.4.5.! 6.7.8.! 9.0.! ! ! ! ! ! ! ! ! ! ! ! , ", +" . a.5 b.c.d.e.f.g.4 h.].i.! j.k.l.! ! ! ! ! ! ! ! ! ! ! a m. ", +" . n.! o.p.q.r.! ! 5 s.; t.u.v.w.! ! ! ! ! ! ! ! ! ! ! ! x.. ", +" y.z.! A.a._ ! ! ! _ B.C.D.E.! ! ! ! ! ! ! ! ! ! ! ! ! F.. ", +" . M ! ! ! ! ! ! ! G.H.I.J.( ! ! ! ! ! ! ! ! ! ! ! ! ! K. ", +" L.! ! ! ! ! ! ! M.$ a N.F.! ! ! ! ! ! ! ! ! ! ! ! O.. ", +" . P.! ! ! ! ! ! Q.R.! S.T.! ! ! ! ! ! ! ! ! ! ! q U. ", +" V.W.! ! ! ! ! X.K.Y.Z.`.! ! ! ! ! ! ! ! ! ! ! +. ", +" . J..+! ! ! ! ! ++@+#+'.! ! ! ! ! ! ! ! ! ! ' $+ ", +" . %+X.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! &+V ", +" . C.x.! ! ! ! ! ! ! ! ! ! ! ! ! ! .+*+$+ ", +" c *+A.! ! ! ! ! ! ! ! ! ! a =+-+. ", +" . ;+>+,+h ! ! ! ! .+'+Q.)+. ", +" . . . !+~+, {+]+. . ", +" "}; diff --git a/talimatname/genel/l/lshw/talimat b/talimatname/genel/l/lshw/talimat new file mode 100644 index 000000000..eaf55d706 --- /dev/null +++ b/talimatname/genel/l/lshw/talimat @@ -0,0 +1,30 @@ +# Tanım: donanım bilgisi gösteren bir araç +# URL: http://ezix.org/project/wiki/HardwareLiSter +# Paketçi: milisarge +# Gerekler: libglade gtk2 + +isim=lshw +surum=B.02.18 +devir=1 +kaynak=(http://ezix.org/software/files/$isim-$surum.tar.gz + lshw-gtk.desktop + lshw-gtk.xpm) + +derle() { + cd $SRC/$isim-$surum + make || return 1 + make DESTDIR=$PKG install + + # requires glade-2 + make gui || return 1 + make DESTDIR=$PKG install-gui + + # Place the desktop file and logo + mkdir $PKG/usr/share/applications + mkdir $PKG/usr/share/pixmaps + cp $SRC/lshw-gtk.desktop $PKG/usr/share/applications + cp $SRC/lshw-gtk.xpm $PKG/usr/share/pixmaps + + # Default gui is gtk-lshw, change that to lshw-gtk for better naming convention + mv $PKG/usr/sbin/gtk-lshw $PKG/usr/sbin/lshw-gtk +} diff --git a/talimatname/genel/l/lsof/talimat b/talimatname/genel/l/lsof/talimat new file mode 100644 index 000000000..55c68717c --- /dev/null +++ b/talimatname/genel/l/lsof/talimat @@ -0,0 +1,20 @@ +# Tanım: Lsof paketi, belirli bir çalışan uygulama veya işlem için Açık Dosyaları Listelemek için kullanışlıdır. +# URL: ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/ +# Paketçi: milisarge +# Gerekler: + +isim=lsof +surum=4.89 +devir=1 +kaynak=(ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/lsof_$surum.tar.bz2) + +derle() { + cd lsof_${surum} + tar -xf lsof_${surum}_src.tar + cd lsof_${surum}_src + yes "" | ./Configure linux + sed -i -e "s/-DLINUXV/${CFLAGS} -DLINUXV/" Makefile + make + install -D -m 755 lsof $PKG/usr/sbin/lsof + install -D -m 644 lsof.8 $PKG/usr/man/man8/lsof.8 +} diff --git a/talimatname/genel/l/lua-alt-getopt/talimat b/talimatname/genel/l/lua-alt-getopt/talimat new file mode 100644 index 000000000..f0906ce4a --- /dev/null +++ b/talimatname/genel/l/lua-alt-getopt/talimat @@ -0,0 +1,18 @@ +# Tanım: Getopt_long benzeri işlem seçenekleri için Lua modülü +# URL: http://luaforge.net/projects/alt-getopt/ +# Paketçi: milisarge +# Gerekler: lua bmake + +isim=lua-alt-getopt +surum=0.7.0 +devir=1 + +kaynak=( +http://mova.org/~cheusov/pub/lua_alt_getopt/lua-alt-getopt-$surum.tar.gz) + +derle(){ + cd $isim-$surum + bmake LUAVER=5.2 PREFIX=/usr + install -Dm755 alt_getopt $PKG/usr/bin/alt_getopt + install -Dm664 alt_getopt.lua $PKG/usr/share/lua/5.2/alt_getopt.lua +} diff --git a/talimatname/genel/l/lua-filesystem/talimat b/talimatname/genel/l/lua-filesystem/talimat new file mode 100644 index 000000000..27ed8e825 --- /dev/null +++ b/talimatname/genel/l/lua-filesystem/talimat @@ -0,0 +1,16 @@ +# Tanım: Lua Programlama Dili için Dosya Sistemi Kütüphanesi +# URL: http://www.keplerproject.org/luafilesystem/ +# Paketçi: milisarge +# Gerekler: lua + +isim=lua-filesystem +surum=1.6.3 +devir=1 +_surum=v_${version//./_} +kaynak=(https://github.com/keplerproject/luafilesystem/archive/${_version}.tar.gz) + +derle(){ + cd luafilesystem-${_version} + make + make PREFIX=$PKG/usr LUA_LIBDIR=$PKG/lib/lua/5.2 install +} diff --git a/talimatname/genel/l/lua-lgi/talimat b/talimatname/genel/l/lua-lgi/talimat new file mode 100644 index 000000000..87a3ac650 --- /dev/null +++ b/talimatname/genel/l/lua-lgi/talimat @@ -0,0 +1,39 @@ +# Tanım: Lua bindings for gnome/gobject using gobject-introspection library +# URL: https://github.com/pavouk/lgi +# Paketçi: milisarge +# Gerekler: glib libffi lua gobject-introspection + +isim=lua-lgi +surum=0.9.1 +devir=1 +kaynak=(https://github.com/pavouk/lgi/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd lgi-$surum + + make + make \ + LUA_LIBDIR=/usr/lib/lua/5.3 \ + LUA_SHAREDIR=/usr/share/lua/5.3 \ + DESTDIR="$PKG/" install + + # dump typelib tool + install -Dm755 tools/dump-typelib.lua \ + "$PKG/usr/bin/dump-typelib" + + # docs + install -d "$PKG/usr/share/doc/$isim" + install -Dm644 docs/* \ + "$PKG/usr/share/doc/$isim" + + # samples + install -d "$PKG/usr/share/$isim/samples/gtk-demo" + install -Dm644 samples/*.lua \ + "$PKG/usr/share/$isim/samples" + install -Dm644 samples/gtk-demo/* \ + "$PKG/usr/share/$isim/samples/gtk-demo" + + # license + install -Dm644 LICENSE \ + "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/l/lua/LICENSE b/talimatname/genel/l/lua/LICENSE new file mode 100644 index 000000000..40ec04168 --- /dev/null +++ b/talimatname/genel/l/lua/LICENSE @@ -0,0 +1,30 @@ +License + +Lua is free software distributed under the terms of the MIT license +reproduced below; it may be used for any purpose, including commercial +purposes, at absolutely no cost without having to ask us. The only +requirement is that if you do use Lua, then you should give us credit +by including the appropriate copyright notice somewhere in your +product or its documentation. + + Copyright © 1994–2015 Lua.org, PUC-Rio. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/talimatname/genel/l/lua/liblua.so.patch b/talimatname/genel/l/lua/liblua.so.patch new file mode 100644 index 000000000..f9e24f328 --- /dev/null +++ b/talimatname/genel/l/lua/liblua.so.patch @@ -0,0 +1,60 @@ +diff --git a/Makefile b/Makefile +index 7fa91c8..dccf485 100644 +--- a/Makefile ++++ b/Makefile +@@ -52,7 +52,7 @@ R= $V.0 + all: $(PLAT) + + $(PLATS) clean: +- cd src && $(MAKE) $@ ++ cd src && $(MAKE) $@ V=$(V) R=$(R) + + test: dummy + src/lua -v +diff --git a/src/Makefile b/src/Makefile +index 2e7a412..fa5769f 100644 +--- a/src/Makefile ++++ b/src/Makefile +@@ -29,6 +29,7 @@ MYOBJS= + PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris + + LUA_A= liblua.a ++LUA_SO= liblua.so + CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ + lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ + ltm.o lundump.o lvm.o lzio.o +@@ -43,7 +44,7 @@ LUAC_T= luac + LUAC_O= luac.o + + ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) +-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) ++ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO) + ALL_A= $(LUA_A) + + # Targets start here. +@@ -59,6 +60,12 @@ $(LUA_A): $(BASE_O) + $(AR) $@ $(BASE_O) + $(RANLIB) $@ + ++$(LUA_SO): $(CORE_O) $(LIB_O) ++ $(CC) -shared -ldl -Wl,-soname,$(LUA_SO).$(V) -o $@.$(R) $? -lm $(MYLDFLAGS) ++ ln -sf $(LUA_SO).$(R) $(LUA_SO).$(V) ++ ln -sf $(LUA_SO).$(R) $(LUA_SO) ++ ++ + $(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +diff --git a/src/luaconf.h b/src/luaconf.h +index fd28d21..e2662cc 100644 +--- a/src/luaconf.h ++++ b/src/luaconf.h +@@ -175,7 +175,7 @@ + + #else /* }{ */ + +-#define LUA_ROOT "/usr/local/" ++#define LUA_ROOT "/usr/" + #define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" + #define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" + #define LUA_PATH_DEFAULT \ diff --git a/talimatname/genel/l/lua/lua.pc b/talimatname/genel/l/lua/lua.pc new file mode 100644 index 000000000..a2c04819a --- /dev/null +++ b/talimatname/genel/l/lua/lua.pc @@ -0,0 +1,20 @@ +V=%VER% +R=%REL% + +prefix=/usr +INSTALL_BIN=${prefix}/bin +INSTALL_INC=${prefix}/include +INSTALL_LIB=${prefix}/lib +INSTALL_MAN=${prefix}/man/man1 +INSTALL_LMOD=${prefix}/share/lua/${V} +INSTALL_CMOD=${prefix}/lib/lua/${V} +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Lua +Tanım: An Extensible Extension Language +Version: ${R} +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} diff --git a/talimatname/genel/l/lua/talimat b/talimatname/genel/l/lua/talimat new file mode 100644 index 000000000..8eaa2d041 --- /dev/null +++ b/talimatname/genel/l/lua/talimat @@ -0,0 +1,45 @@ +# Tanım: Uygulamaları genişletmek için tasarlanmış bir programlama dili +# URL: http://www.lua.org +# Paketçi: milisarge +# Gerekler: + +isim=lua +surum=5.3.4 +_majorver=${surum%.*} +devir=1 + +kaynak=(https://www.lua.org/ftp/lua-$surum.tar.gz + liblua.so.patch + lua.pc + LICENSE) + +derle() { + + cd $SRC/lua-$surum + patch -p1 -i ../liblua.so.patch + + sed "s/%VER%/$_majorver/g;s/%REL%/$surum/g" ../lua.pc > lua.pc + + # quite a lot of packages still use lua 5.1 API, enable 5.1 compat mode + make MYCFLAGS="$CFLAGS -fPIC -DLUA_COMPAT_5_2 -DLUA_COMPAT_5_1" MYLDFLAGS="$LDFLAGS" linux + + make \ + TO_LIB="liblua.a liblua.so liblua.so.$_majorver liblua.so.$surum" \ + INSTALL_DATA='cp -d' \ + INSTALL_TOP="$PKG"/usr \ + INSTALL_MAN="$PKG"/usr/share/man/man1 \ + install + + ln -sf /usr/bin/lua "$PKG"/usr/bin/lua$_majorver + ln -sf /usr/bin/luac "$PKG"/usr/bin/luac$_majorver + ln -sf /usr/lib/liblua.so.$surum "$PKG"/usr/lib/liblua$_majorver.so + + install -Dm644 lua.pc "$PKG"/usr/lib/pkgconfig/${isim}53.pc + ln -sf /usr/lib/pkgconfig/${isim}53.pc "$PKG"/usr/lib/pkgconfig/$isim.pc + + install -d "$PKG"/usr/share/doc/$isim + install -m644 doc/*.{gif,png,css,html} "$PKG"/usr/share/doc/$isim + install -Dm644 ../LICENSE "$PKG"/usr/share/licenses/$isim/LICENSE + rm -r $PKG/usr/share/doc + rm -r $PKG/usr/share/man +} diff --git a/talimatname/genel/l/lua51/talimat b/talimatname/genel/l/lua51/talimat new file mode 100644 index 000000000..284bbe7b3 --- /dev/null +++ b/talimatname/genel/l/lua51/talimat @@ -0,0 +1,46 @@ +# Tanım: Uygulamaları genişletmek için tasarlanmış bir programlama dili (sürüm 5.1) +# URL: URL: http://www.lua.org +# Paketçi: milisarge +# Gerekler: + +isim=lua51 +surum=5.1.5 +devir=1 + +kaynak=( +http://www.lua.org/ftp/lua-$surum.tar.gz +http://www.linuxfromscratch.org/patches/blfs/7.4/lua-5.1.5-shared_library-2.patch) + +derle(){ + cd lua-$surum + patch -Np1 -i ../lua-5.1.5-shared_library-2.patch + sed -i '/#define LUA_ROOT/s:/usr/local/:/usr/:' src/luaconf.h + + [ `uname -i` == "x86_64" ] && export CFLAGS="$CFLAGS -fPIC" + sed -e 's:llua:llua5.1:' -e 's:/include:/include/lua5.1:' -i etc/lua.pc + sed -r -e '/^LUA_(SO|A|T)=/ s/lua/lua5.1/' -e '/^LUAC_T=/ s/luac/luac5.1/' \ + -i src/Makefile + make linux + make \ + INSTALL_TOP=$PKG/usr \ + TO_BIN='lua5.1 luac5.1' \ + TO_LIB="liblua5.1.a liblua5.1.so liblua5.1.so.5.1 liblua5.1.so.$surum" \ + INSTALL_INC=$PKG/usr/include/lua5.1 \ + INSTALL_DATA="cp -d" \ + INSTALL_MAN=$PKG/usr/share/man/man1 \ + install + rm -r $PKG/usr/share/lua + # pkg-config, change name so that others lua version can be installed + install -Dm644 etc/lua.pc $PKG/usr/lib/pkgconfig/lua5.1.pc + # symlinks + ln -s liblua5.1.so $PKG/usr/lib/liblua.so.5.1 + ln -s liblua5.1.so $PKG/usr/lib/liblua.so.$surum + # rename man pages + cd $PKG/usr/share/man/man1 + mv lua.1 lua5.1.1 + mv luac.1 luac5.1.1 +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/l/lua52/lua-5.2-cflags.diff b/talimatname/genel/l/lua52/lua-5.2-cflags.diff new file mode 100644 index 000000000..b94515659 --- /dev/null +++ b/talimatname/genel/l/lua52/lua-5.2-cflags.diff @@ -0,0 +1,19 @@ +Binary files lua-5.2.4.orig/src/.Makefile.un~ and lua-5.2.4/src/.Makefile.un~ differ +diff -pruN lua-5.2.4.orig/src/Makefile lua-5.2.4/src/Makefile +--- lua-5.2.4.orig/src/Makefile 2015-12-06 00:26:37.000000000 +0000 ++++ lua-5.2.4/src/Makefile 2015-12-06 00:33:01.000000000 +0000 +@@ -6,9 +6,11 @@ + # Your platform. See PLATS for possible values. + PLAT= none + +-CC= gcc +-CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS) +-LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) ++CC ?= gcc ++CFLAGS ?= -O2 -Wall ++CFLAGS += -fPIC -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS) ++LDFLAGS ?= ++LDFLAGS += $(SYSLDFLAGS) $(MYLDFLAGS) + LIBS= -lm $(SYSLIBS) $(MYLIBS) + + AR= ar rcu diff --git a/talimatname/genel/l/lua52/lua.diff b/talimatname/genel/l/lua52/lua.diff new file mode 100644 index 000000000..92c1f3ac4 --- /dev/null +++ b/talimatname/genel/l/lua52/lua.diff @@ -0,0 +1,57 @@ +diff -ru lua-5.2.1/Makefile lua-5.2.1.new/Makefile +--- lua-5.2.1/Makefile 2012-05-17 16:05:54.000000000 +0200 ++++ lua-5.2.1.new/Makefile 2012-09-12 22:39:07.162748096 +0200 +@@ -52,7 +52,7 @@ + all: $(PLAT) + + $(PLATS) clean: +- cd src && $(MAKE) $@ ++ cd src && $(MAKE) $@ V=$(V) R=$(R) + + test: dummy + src/lua -v +diff -ru lua-5.2.1/src/luaconf.h lua-5.2.1.new/src/luaconf.h +--- lua-5.2.1/src/luaconf.h 2012-05-11 16:14:42.000000000 +0200 ++++ lua-5.2.1.new/src/luaconf.h 2012-09-12 22:40:27.986622772 +0200 +@@ -100,7 +100,7 @@ + #else /* }{ */ + + #define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/" +-#define LUA_ROOT "/usr/local/" ++#define LUA_ROOT "/usr/" + #define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR + #define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR + #define LUA_PATH_DEFAULT \ +diff -ru lua-5.2.1/src/Makefile lua-5.2.1.new/src/Makefile +--- lua-5.2.1/src/Makefile 2012-03-09 17:32:16.000000000 +0100 ++++ lua-5.2.1.new/src/Makefile 2012-09-12 22:38:08.591386896 +0200 +@@ -29,6 +29,7 @@ + PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris + + LUA_A= liblua.a ++LUA_SO= liblua.so + CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ + lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ + ltm.o lundump.o lvm.o lzio.o +@@ -43,7 +44,7 @@ + LUAC_O= luac.o + + ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) +-ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) ++ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO) + ALL_A= $(LUA_A) + + # Targets start here. +@@ -59,6 +60,12 @@ + $(AR) $@ $(BASE_O) + $(RANLIB) $@ + ++$(LUA_SO): $(CORE_O) $(LIB_O) ++ $(CC) -shared -ldl -Wl,-soname,$(LUA_SO).$(V) -o $@.$(R) $? -lm $(MYLDFLAGS) ++ ln -sf $(LUA_SO).$(R) $(LUA_SO).$(V) ++ ln -sf $(LUA_SO).$(R) $(LUA_SO) ++ ++ + $(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + diff --git a/talimatname/genel/l/lua52/lua.pc b/talimatname/genel/l/lua52/lua.pc new file mode 100644 index 000000000..a2c04819a --- /dev/null +++ b/talimatname/genel/l/lua52/lua.pc @@ -0,0 +1,20 @@ +V=%VER% +R=%REL% + +prefix=/usr +INSTALL_BIN=${prefix}/bin +INSTALL_INC=${prefix}/include +INSTALL_LIB=${prefix}/lib +INSTALL_MAN=${prefix}/man/man1 +INSTALL_LMOD=${prefix}/share/lua/${V} +INSTALL_CMOD=${prefix}/lib/lua/${V} +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Lua +Tanım: An Extensible Extension Language +Version: ${R} +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} diff --git a/talimatname/genel/l/lua52/talimat b/talimatname/genel/l/lua52/talimat new file mode 100644 index 000000000..ef468d222 --- /dev/null +++ b/talimatname/genel/l/lua52/talimat @@ -0,0 +1,47 @@ +# Tanım: Uygulamaları genişletmek için tasarlanmış bir programlama dili (5.2 sürümü). +# URL: http://www.lua.org/ +# Paketçi: milisarge +# Gerekler: readline + +isim=lua52 +surum=5.2.4 +devir=1 +kaynak=(http://www.lua.org/ftp/lua-$surum.tar.gz + lua.diff lua-5.2-cflags.diff lua.pc) + +derle() { + cd lua-$surum + + patch -p1 -i $SRC/lua.diff + patch -p1 -i $SRC/lua-5.2-cflags.diff + + sed -e "s/%VER%/${surum%.*}/g;s/%REL%/$surum/g" $SRC/lua.pc > lua.pc + sed -e 's:llua:llua5.2:' -e 's:/include:/include/lua5.2:' -i lua.pc + + sed -r \ + -e '/^LUA_(SO|A|T)=/ s/lua/lua5.2/' \ + -e '/^LUAC_T=/ s/luac/luac5.2/' \ + -i src/Makefile + + make MYCFLAGS="$CFLAGS" MYLDFLAGS="$LDFLAGS" linux + + install -d $PKG/usr/include/lua5.2 $PKG/usr/share/man/man1 $PKG/usr/lib + + make \ + TO_BIN="lua5.2 luac5.2" \ + TO_LIB="liblua5.2.a liblua5.2.so liblua5.2.so.5.2 liblua5.2.so.$surum" \ + INSTALL_DATA='cp -d' \ + INSTALL_TOP="$PKG/usr" \ + INSTALL_INC="$PKG/usr/include/lua5.2" \ + INSTALL_MAN="$PKG/usr/share/man/man1" \ + install + + install -m 0644 -D lua.pc $PKG/usr/lib/pkgconfig/lua5.2.pc + + # fixups + ln -s liblua5.2.so $PKG/usr/lib/liblua.so.5.2 + ln -s liblua5.2.so $PKG/usr/lib/liblua.so.$surum + cd $PKG/usr/share/man/man1 + mv lua.1 lua5.2.1 + mv luac.1 luac5.2.1 +} diff --git a/talimatname/genel/l/luajit/talimat b/talimatname/genel/l/luajit/talimat new file mode 100644 index 000000000..538379f54 --- /dev/null +++ b/talimatname/genel/l/luajit/talimat @@ -0,0 +1,16 @@ +# Tanım: Lua için Just-In-Time Derleyici +# URL: http://luajit.org/ +# Paketçi: milisarge +# Gerekler: + +isim=luajit +surum=2.0.4 +devir=1 +kaynak=(http://luajit.org/download/LuaJIT-$surum.tar.gz) + +derle() { + cd LuaJIT-$surum + sed -i 's/PREFIX= \/usr\/local/\PREFIX= \/usr/' Makefile + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/luarocks-51/talimat b/talimatname/genel/l/luarocks-51/talimat new file mode 100644 index 000000000..c3db2fb97 --- /dev/null +++ b/talimatname/genel/l/luarocks-51/talimat @@ -0,0 +1,25 @@ +# Tanım: Lua5.1 kütüphane yöneticisi +# URL: http://luarocks.org +# Paketçi: milisarge +# Gerekler: lua51 unzip + +isim=luarocks-51 +surum=2.4.3 +devir=1 +kaynak=(http://luarocks.org/releases/luarocks-$surum.tar.gz) + +derle() { + cd luarocks-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc/luarocks \ + --with-lua-include=/usr/include/lua5.1 \ + --lua-version=5.1 \ + --lua-suffix=5.1 \ + --versioned-rocks-dir + make build + make DESTDIR=$PKG install + sed -i '/^LUAROCKS_UNAME_M/d' "$PKG"/usr/share/lua/5.1/luarocks/site_config.lua + unlink $PKG/usr/bin/luarocks + unlink $PKG/usr/bin/luarocks-admin +} diff --git a/talimatname/genel/l/luarocks-52/talimat b/talimatname/genel/l/luarocks-52/talimat new file mode 100644 index 000000000..f2af58cc8 --- /dev/null +++ b/talimatname/genel/l/luarocks-52/talimat @@ -0,0 +1,25 @@ +# Tanım: Lua5.2 kütüphane yöneticisi +# URL: http://luarocks.org +# Paketçi: milisarge +# Gerekler: lua52 unzip + +isim=luarocks-52 +surum=2.4.3 +devir=1 +kaynak=(http://luarocks.org/releases/luarocks-$surum.tar.gz) + +derle() { + cd luarocks-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc/luarocks \ + --with-lua-include=/usr/include/lua5.2 \ + --lua-version=5.2 \ + --lua-suffix=5.2 \ + --versioned-rocks-dir + make build + make DESTDIR=$PKG install + sed -i '/^LUAROCKS_UNAME_M/d' "$PKG"/usr/share/lua/5.2/luarocks/site_config.lua + unlink $PKG/usr/bin/luarocks + unlink $PKG/usr/bin/luarocks-admin +} diff --git a/talimatname/genel/l/luarocks-53/talimat b/talimatname/genel/l/luarocks-53/talimat new file mode 100644 index 000000000..186263faa --- /dev/null +++ b/talimatname/genel/l/luarocks-53/talimat @@ -0,0 +1,23 @@ +# Tanım: Lua kütüphane yöneticisi +# URL: http://luarocks.org +# Paketçi: milisarge +# Gerekler: lua unzip + +isim=luarocks-53 +surum=2.4.3 +devir=1 +kaynak=(http://luarocks.org/releases/luarocks-$surum.tar.gz) + +derle() { + cd luarocks-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc/luarocks \ + --with-lua-include=/usr/include/ \ + --lua-version=5.3 \ + --lua-suffix=5.3 \ + --versioned-rocks-dir + make build + make DESTDIR=$PKG install + sed -i '/^LUAROCKS_UNAME_M/d' "$PKG"/usr/share/lua/5.3/luarocks/site_config.lua +} diff --git a/talimatname/genel/l/lucenepp/talimat b/talimatname/genel/l/lucenepp/talimat new file mode 100644 index 000000000..db4ea003b --- /dev/null +++ b/talimatname/genel/l/lucenepp/talimat @@ -0,0 +1,28 @@ +# Tanım: Java Lucene kütüphanesinin c++ sürümü +# URL: https://github.com/luceneplusplus/LucenePlusPlus +# Paketçi: milisarge +# Gerekler: boost cmake subversion +# Grup: kütüphane + +isim=lucenepp +surum=3.0.7 +devir=1 +kaynak=(https://github.com/luceneplusplus/LucenePlusPlus/archive/master.tar.gz::$isim-$surum.tar.gz) + +derle() { + mkdir build + sed -i \ + -e 's#SET(LUCENE++_VERSION_REVISION.*#SET(LUCENE++_VERSION_REVISION "5")#' \ + -e 's#SET(LUCENE++_VERSION_PATCH.*#SET(LUCENE++_VERSION_PATCH "0")#' \ + "$SRC"/LucenePlusPlus-master/CMakeLists.txt + cd build + cmake ../LucenePlusPlus-master \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_DESTINATION=/usr/lib \ + -DBoost_LIBRARY_DIR=/usr/lib \ + -DENABLE_CUSTOM_ALLOCATOR='FALSE' \ + -DCMAKE_CXX_FLAGS='-DBOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT' + # RELAXED for boost 1.58 breakage, remove when lucene++ updates + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/l/lumina-desktop/talimat b/talimatname/genel/l/lumina-desktop/talimat new file mode 100644 index 000000000..53a2e188a --- /dev/null +++ b/talimatname/genel/l/lumina-desktop/talimat @@ -0,0 +1,22 @@ +# Tanım: FreeBSD için Hafif QT5 Masaüstü +# URL: https://github.com/pcbsd/lumina +# Paketçi: milisarge +# Gerekler: qt5 fluxbox kf5-kwindowsystem kf5-oxygen-icons5 xcb-util-image xscreensaver desktop-file-utils + +isim=lumina-desktop +surum=0.8.7 +devir=1 + +kaynak=() + +derle(){ + git clone https://github.com/pcbsd/lumina.git + cd $SRC/lumina/ + $SRC/lumina/libLumina/make-linux-distro.sh Debian + find $SRC/lumina -name *.desktop -exec sed -i 's/usr\/local/usr/' {} \; + qmake-qt5 PREFIX="/usr" QT5LIBDIR=/usr/lib/qt + make + + make INSTALL_ROOT="${PKG}" install + mv "${PKG}"/usr/etc "${PKG}"/etc +} diff --git a/talimatname/genel/l/lxc/lxc.tmpfiles.d b/talimatname/genel/l/lxc/lxc.tmpfiles.d new file mode 100644 index 000000000..04bac4db4 --- /dev/null +++ b/talimatname/genel/l/lxc/lxc.tmpfiles.d @@ -0,0 +1 @@ +w /sys/fs/cgroup/memory/memory.use_hierarchy - - - - 1 diff --git a/talimatname/genel/l/lxc/talimat b/talimatname/genel/l/lxc/talimat new file mode 100644 index 000000000..9c8453f26 --- /dev/null +++ b/talimatname/genel/l/lxc/talimat @@ -0,0 +1,41 @@ +# Tanım: Linux Konteynerleri +# URL: http://linuxcontainers.org +# Paketçi: Cihan_Alkan +# Gerekler: docbook2x lua python3-setuptools perl libseccomp libcap python3 cgmanager rsync +# Grup: sistem + +isim=lxc +surum=3.0.0 +devir=1 +kaynak=(https://github.com/lxc/lxc/archive/$isim-$surum.tar.gz + lxc.tmpfiles.d) + +derle() { + + cd $isim-$isim-$surum + sed -i \ + -e 's|"\\"-//Davenport//DTD DocBook V3.0//EN\\""|"\\"-//OASIS//DTD DocBook XML\\" \\"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd\\""|' \ + configure.ac + sed -i \ + -e 's|\${prefix}/||g' \ + lxc.pc.in + ./autogen.sh + bashcompdir=/usr/share/bash-completion/completions ./configure \ + --prefix=/usr \ + --sbindir=/usr/bin \ + --localstatedir=/var \ + --libexecdir=/usr/lib \ + --libdir=/usr/lib \ + --sysconfdir=/etc \ + --disable-apparmor \ + --enable-seccomp \ + --enable-cgmanager \ + --enable-capabilities \ + --enable-lua + make + + make DESTDIR="$PKG" install + install -d -m755 "$PKG/var/lib/lxc" + install -d -m755 "$PKG/usr/lib/lxc/rootfs/dev" + install -D -m644 "$SRC"/lxc.tmpfiles.d "$PKG"/usr/lib/tmpfiles.d/lxc.conf +} diff --git a/talimatname/genel/l/lxde-appearance-obconf/talimat b/talimatname/genel/l/lxde-appearance-obconf/talimat new file mode 100755 index 000000000..a1a31cc4d --- /dev/null +++ b/talimatname/genel/l/lxde-appearance-obconf/talimat @@ -0,0 +1,20 @@ +# Tanım: LXAppearance OBconf paketi, OpenBox'u yapılandırmak üzere LXAppearance için bir eklenti içerir. +# URL: http://lxde.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 intltool lxde-appearance openbox + +isim=lxde-appearance-obconf +_isim=lxappearance-obconf +surum=0.2.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install + +} + diff --git a/talimatname/genel/l/lxde-appearance/talimat b/talimatname/genel/l/lxde-appearance/talimat new file mode 100755 index 000000000..5a35e3ee1 --- /dev/null +++ b/talimatname/genel/l/lxde-appearance/talimat @@ -0,0 +1,24 @@ +# Tanım: GTK + 2 için masaüstünden bağımsız bir tema değiştirici içeriyor +# URL: http://lxde.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 intltool + +isim=lxde-appearance +_isim=lxappearance +surum=0.6.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/files/${_name}-$surum.tar.xz) + + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --enable-dbus + +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/l/lxde-common/chrystal_red_root.png b/talimatname/genel/l/lxde-common/chrystal_red_root.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e1e9f245f82a8f3bc4117f6b4fdd028fc35614 GIT binary patch literal 1622 zcmV-c2C4apP)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00006VoOIv0Mh`| z0Mn-fw($S}010qNS#tmY3ljhU3ljkVnw%H_000McNliru*9Z{{EgU066iomC02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00q8DL_t(&-tAe-ZX7odtlCh4 zp}$EE@&Erpa#M_410zm=Kr6tAoB)->@KN2vd8{D=hTu6!yE`1R*<Gye>LCE(6<p=x z$B%#nk>J)S)jtHJI*#p@KoRj_LG=gL$64Ja*3Zlf5E8&X5CGY3_5XF`_)-@sZ+`w| z`OJy+D+9-br!HG)^F9x5seU5zZem0}U9WM_Y=zBR$z7**pb-|;XPf8y=lVRkz3Cq2 zWsdUv^ccfbpCAW3mY5G*5QO|_Rf7mFAMIj=ZJ)z7NJN{}H`+F#ghjvC>{>pT=f|fy z$?_1pUFIofn5{#^h+aqnSvRa|HdCY=Hd-73j-O%vTSZ#t2@>V``e-2>M^tIYo8Z=n zAPg<tqX98CS3p&DA{Ph5kYYFj15U(vZh_YIY7ZFRDRUqzvmxPouo-1eBD+%-U$FC7 z-wX#E_GkKcLWY6?K?SETOD_Y;^Yv*Uo}N`Kwg}GXP+eaQV(1W|d9*_|5X5>T&3Tko zbRtHCH3u#cX%<>o?fAwMQ5Wzijzuhcn8Cq_yn@#2sQqQlE&Z@ec(Qt`{QcXz;fQd! z4VKLyJG872lU86h&jno6=@Wx#xOFkSk%W_hIXWSvF=F}a*LQ=m-8iRPh4qG~!r00A zbinm9XA@1H5Zbw@<N<a<U=67funD3(zJH$(doHyJw<UcglX*kpkN-K@2vELD5x(u> zXV;tpa9J4~&Ac4AL<Z$@$@dW{ci&*W$foA=#d#I$ffYQ<rIjN}K@1G0&1E(tG^6s_ z=#cOf9f_9l{f<Ie)Mi?srMhRLQ>(m0uu#iO4NFMs3CfAD0cO-&j`f8J^FqUsO<4GN z&sXl6LPw^?fQuP;k>gq^AsQQ*#{}SF+<!3#u@#dw+O1qyKH7mXWz0ET)SS9N3$l{W zg;1o#OQ;={pyRYiT%d6n2~g}#5nHXuPP2ysz{;GFh}Bmv1<H9TPSo;{Od(R8HCVmU zfnXY=XXSh_LiI{>fyKn3rg66yr+vl6Gv%%xs-bg~P%^^jv0HFIgpx~+UWzalibTuY z8WN~i6O4kX=YtA;OTeS397rtR2T7Z&LZ(XIY92Z)S}76hwNcqceXn+|Od@puam*=L zU1xcwIj>b208ri_>2k)!M-76gEo|C($+6XGu!EY%!-W>23}&R|P}&11_ZxLYt}cVP z2|_37XQf;+D>#z6TPe`4P8-EdG%;gwTkhc^i7Unm5mJ)4tL%@ItRf{3uMWdnwHu-k z&dNGLW=@lca<5b-cinBdrDlFk^?L8y)G<cFR8;g5a(|&S;&8nufguePe^VvzWwSyl zJxgoEq)A(NIbA&`8Dr4OH`f)(jCzu3dM6+ypNE->a+o8jM*`(eE{MGAkp#aitgc~| z4kk3O+09uwhcrPoBHS{1s@vq6JEFAQb#Bg~v-V{wKIlf}5tCw3ny7R)T(kZkEhw@C zXbneut`s4*fbzjqZY?O@rZxAJ6onLfa*Cud@~uL^y8c%-L4G71)F^i=nX)4dW<Sac zxRo`Lg=X_?$sBsk6x&oYrNDnC{Q&o#QtHZ+X|u!2KpZz;J34K)CjVRS8AmPZvy<PV z&9TuZSCl^!dq&CgDqi$l@Jg<48~L`8FZD9?->tUR2J_7BpJCGduGLnnb(<M8OO_8e zQaN|%QYSXSgZAEDn{Usa^5<6skE1B>ZE|-bd!anrxaJEbOdi-7Hlhu$@I(g3fiZiX z`7H?QhVFehBYUqDv~e(b!z+ff5jguw!`CQ(-0+U#mO76oBE832+<8YbTX&bWzP4-k zuzxt%^-(pv<zeo=b^5$FUVAo{-+%bgRL6Rlw?H|6HL-)csQKw#k~(pGH{)tm)+MnP z>GT~Wz=wwieYt?YR8rY_QPf2E+qXX{c1BV_LkI929t3Y@xMDoc5V>=;8o6Q8|3JDR UO>VLfZ2$lO07*qoM6N<$f-c$ZO#lD@ literal 0 HcmV?d00001 diff --git a/talimatname/genel/l/lxde-common/lxde-common.kur-kos b/talimatname/genel/l/lxde-common/lxde-common.kur-kos new file mode 100644 index 000000000..899e3ed43 --- /dev/null +++ b/talimatname/genel/l/lxde-common/lxde-common.kur-kos @@ -0,0 +1,3 @@ +update-mime-database /usr/share/mime +gtk-update-icon-cache -qf /usr/share/icons/hicolor +update-desktop-database -q diff --git a/talimatname/genel/l/lxde-common/lxde.desktop b/talimatname/genel/l/lxde-common/lxde.desktop new file mode 100755 index 000000000..f12322ed5 --- /dev/null +++ b/talimatname/genel/l/lxde-common/lxde.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +# The names/descriptions should really be better +Name=lxde +Name[tr]=lxde +Comment=Select this session to use lxde as user graphical interface +Comment[tr]=lxde genel masaüstü kullanımı + +Exec=startlxde +Icon= +Type=Application diff --git a/talimatname/genel/l/lxde-common/okubeni b/talimatname/genel/l/lxde-common/okubeni new file mode 100644 index 000000000..1cc120f33 --- /dev/null +++ b/talimatname/genel/l/lxde-common/okubeni @@ -0,0 +1,4 @@ +cat > ~/.xinitrc << "EOF" +ck-launch-session startlxde +EOF +startx diff --git a/talimatname/genel/l/lxde-common/talimat b/talimatname/genel/l/lxde-common/talimat new file mode 100755 index 000000000..50f5a2d71 --- /dev/null +++ b/talimatname/genel/l/lxde-common/talimat @@ -0,0 +1,33 @@ +# Tanım: LXDE için bir varsayılan yapılandırma kümesi sağlar +# URL: http://lxde.org/about.html +# Paketçi: milisarge@gmail.com +# Gerekler: consolekit2 desktop-file-utils gtk2 hicolor-icon-theme lxde-icon-theme lxde-panel lxde-session openbox pcmanfm shared-mime-info menu-cache lxde-menu-data + +isim=lxde-common +surum=0.99.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/$isim-$surum.tar.xz + http://nutyx.meticul.eu/files/patchs/oxygen-icons/icon-sekong.png + http://nutyx.meticul.eu/files/patchs/lxde-common/chrystal_red_root.png + lxde.desktop) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc +make +make DESTDIR=$PKG install +# install -D -m644 ../config \ +# $PKG/usr/share/lxde/config +install -D -m644 ../chrystal_red_root.png \ + $PKG/usr/share/lxpanel/images/chrystal_red_root.png +cp ../icon-sekong.png \ +$PKG/usr/share/lxde/images/lxde-icon.png +cp ../icon-sekong.png \ +$PKG/usr/share/lxde/images/logout-banner.png +sed -i "s/lxde_blue.jpg/wall-sekong.jpg/" \ +$PKG/etc/xdg/pcmanfm/LXDE/pcmanfm.conf +install -D -m644 ../lxde.desktop \ +$PKG/usr/share/xsessions/lxde.desktop +} diff --git a/talimatname/genel/l/lxde-gpicview/talimat b/talimatname/genel/l/lxde-gpicview/talimat new file mode 100755 index 000000000..1e9227a3c --- /dev/null +++ b/talimatname/genel/l/lxde-gpicview/talimat @@ -0,0 +1,19 @@ +# Tanım: GPicView paketi hafif resim görüntüleyici içerir +# URL: http://lxde.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 + +isim=lxde-gpicview +_isim=gpicview +surum=0.2.4 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/${_name}-$surum.tar.gz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +sed -i 's/Utility;//' $PKG/usr/share/applications/gpicview.desktop +} diff --git a/talimatname/genel/l/lxde-icon-theme/lxde-icon-theme.kur-kos b/talimatname/genel/l/lxde-icon-theme/lxde-icon-theme.kur-kos new file mode 100644 index 000000000..52f99925c --- /dev/null +++ b/talimatname/genel/l/lxde-icon-theme/lxde-icon-theme.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -qf usr/share/icons/nuoveXT2 diff --git a/talimatname/genel/l/lxde-icon-theme/talimat b/talimatname/genel/l/lxde-icon-theme/talimat new file mode 100644 index 000000000..351b30c5c --- /dev/null +++ b/talimatname/genel/l/lxde-icon-theme/talimat @@ -0,0 +1,18 @@ +# Tanım: LXDE Simge Tema paketi, LXDE için nuoveXT 2.2 Simge Teması içeriyor. +# URL: http://lxde.org/ +# Paketçi: geantbrun at gmail dot com +# Gerekler: gtk-update-icon-cache + +isim=lxde-icon-theme +surum=0.5.1 +devir=2 + +kaynak=(http://downloads.sourceforge.net/lxde/$isim-$surum.tar.xz) + + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxde-input/talimat b/talimatname/genel/l/lxde-input/talimat new file mode 100755 index 000000000..decbf3a3e --- /dev/null +++ b/talimatname/genel/l/lxde-input/talimat @@ -0,0 +1,19 @@ +# Tanım: lxde giris +# URL: http://lxde.org/ +# Maintainer: Martin Bagge +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 + +isim=lxde-input +_isim=lxinput +surum=0.3.4 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxde-menu-data/talimat b/talimatname/genel/l/lxde-menu-data/talimat new file mode 100644 index 000000000..5af247e6b --- /dev/null +++ b/talimatname/genel/l/lxde-menu-data/talimat @@ -0,0 +1,18 @@ +# Tanım: LXDE için freedesktop.org menü spesifik uyumlu masaüstü menüleri oluşturmak için gerekli dosyalar. +# URL: http://lxde.org/ +# Paketçi: milisarge +# Gerekler: intltool + +isim=lxde-menu-data +surum=0.1.5 +devir=2 +_isim=lxmenu-data + +kaynak=(http://downloads.sourceforge.net/lxde/${_isim}-$surum.tar.xz) +derle() { +cd $_isim-$surum +./configure --prefix=/usr --sysconfdir=/etc +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/lxde-panel/fix-crash.patch b/talimatname/genel/l/lxde-panel/fix-crash.patch new file mode 100644 index 000000000..86f372f56 --- /dev/null +++ b/talimatname/genel/l/lxde-panel/fix-crash.patch @@ -0,0 +1,71 @@ +From 5efc0f05fc06cdb52c54338d0139d7316c3c1133 Mon Sep 17 00:00:00 2001 +From: Mamoru TASAKA <mtasaka@fedoraproject.org> +Date: Sun, 4 Mar 2018 23:15:51 +0900 +Subject: [PATCH] [SF#900] taskbutton: detach menu from widget before widget is + destroyed + +Although GTK+ 2 version doxygen lacks such information, +https://developer.gnome.org/gtk3/stable/GtkMenu.html#gtk-menu-attach-to-widget +says that the attached menu is to be destroyed when the widget is destroyed. + +So to "reuse" created menu, menu must be detached before the widget is to +be destroyed, +--- + plugins/task-button.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/plugins/task-button.c b/plugins/task-button.c +index 3e99068..9e8c398 100644 +--- a/plugins/task-button.c ++++ b/plugins/task-button.c +@@ -1538,7 +1538,17 @@ void task_button_update_windows_list(TaskButton *button, Window *list, gint n) + l = next; /* go next details */ + } + if (button->details == NULL) /* all windows were deleted */ ++ { ++ GList *menu_list = gtk_menu_get_for_attach_widget(GTK_WIDGET(button)); ++ menu_list = g_list_copy(menu_list); ++ for (l = menu_list; l; l = l->next) ++ { ++ GtkMenu *menu = GTK_MENU(l->data); ++ gtk_menu_detach(menu); ++ } ++ g_list_free(menu_list); + gtk_widget_destroy(GTK_WIDGET(button)); ++ } + else if (has_removed && task_update_visibility(button)) + task_redraw_label(button); + // FIXME: test if need to update menu +-- +2.1.4 + +From 7aa84571eef5247c0335df57d6ac616cd03d46ee Mon Sep 17 00:00:00 2001 +From: Mamoru TASAKA <mtasaka@fedoraproject.org> +Date: Wed, 14 Feb 2018 00:11:53 +0900 +Subject: [PATCH] [SF#905] plugins/monitors: reset the color if empty + +User may remove color value, or when doing copy/paste color value from somewhere, +it seems that color value can once disappear. +In such case, reset to the default to prevent segv +--- + plugins/monitors/monitors.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/plugins/monitors/monitors.c b/plugins/monitors/monitors.c +index 19b8472..75f00c1 100644 +--- a/plugins/monitors/monitors.c ++++ b/plugins/monitors/monitors.c +@@ -748,6 +748,10 @@ monitors_apply_config (gpointer user_data) + start: + for (i = 0; i < N_MONITORS; i++) + { ++ /* User may remove color value. In such case, reset to the default */ ++ if (!colors[i]) ++ colors[i] = g_strndup(default_colors[i], COLOR_SIZE-1); ++ + if (mp->displayed_monitors[i]) + current_n_monitors++; + +-- +2.1.4 + diff --git a/talimatname/genel/l/lxde-panel/talimat b/talimatname/genel/l/lxde-panel/talimat new file mode 100755 index 000000000..aae2823ed --- /dev/null +++ b/talimatname/genel/l/lxde-panel/talimat @@ -0,0 +1,30 @@ +# Tanım: Hafif bir X11 masaüstü paneli içerir +# URL: http://lxde.org/ +# Paketçi: cihan_alkan +# Gerekler: gtk2 menu-cache alsa-lib libwnck wireless-tools keybinder2 libfm +# Grup: lxde + +isim=lxde-panel +_isim=lxpanel +surum=0.9.3 +devir=1 +kaynak=(https://downloads.sourceforge.net/lxde/${_isim}-$surum.tar.xz + fix-crash.patch) + +derle() { + + cd ${_isim}-$surum + # Fix crash + patch -Np1 -i ../fix-crash.patch + + ./configure \ + --sysconfdir=/etc \ + --prefix=/usr + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR="$PKG" install +} + diff --git a/talimatname/genel/l/lxde-randr/talimat b/talimatname/genel/l/lxde-randr/talimat new file mode 100755 index 000000000..eebde700a --- /dev/null +++ b/talimatname/genel/l/lxde-randr/talimat @@ -0,0 +1,21 @@ +# Tanım: lxde icin ekran ayarlama +# URL: http://lxde.org/about.html +# Maintainer: Martin Bagge brother at bsnet dot se Hong Jen Yee (PCMan) pcman dot tw at gmail dotcom +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 xorg-app + +isim=lxde-randr +_isim=lxrandr +surum=0.3.0 +devir=1 +kaynak=(http://downloads.sourceforge.net/lxde/lxrandr-$surum.tar.xz) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + +} + + diff --git a/talimatname/genel/l/lxde-session/talimat b/talimatname/genel/l/lxde-session/talimat new file mode 100755 index 000000000..d2aa6c6f1 --- /dev/null +++ b/talimatname/genel/l/lxde-session/talimat @@ -0,0 +1,19 @@ +# Tanım: LXDE için varsayılan oturum yöneticisini içerir +# URL: http://lxde.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: dbus-glib gtk2 libunique1 lsb-release polkit vala upower pm-utils + +isim=lxde-session +_isim=lxsession +surum=0.5.2 +devir=3 + +kaynak=(http://downloads.sourceforge.net/lxde/${_name}-$surum.tar.xz) + + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --disable-man +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxde-task/talimat b/talimatname/genel/l/lxde-task/talimat new file mode 100755 index 000000000..344be4d5c --- /dev/null +++ b/talimatname/genel/l/lxde-task/talimat @@ -0,0 +1,20 @@ +# Tanım: lxde surec yoneticisi +# URL: http://lxde.org/about.html +# Maintainer: pcman dot tw at gmail dot com +# Paketçi: milisarge@gmail.com +# Gerekler: gtk2 + + +isim=lxde-task +_isim=lxtask +surum=0.1.6 +devir=1 +kaynak=(http://downloads.sourceforge.net/lxde/${_name}-$surum.tar.xz) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/l/lxde-terminal/lxde-terminal.kur-kos b/talimatname/genel/l/lxde-terminal/lxde-terminal.kur-kos new file mode 100755 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/l/lxde-terminal/lxde-terminal.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/l/lxde-terminal/talimat b/talimatname/genel/l/lxde-terminal/talimat new file mode 100755 index 000000000..cdd40d481 --- /dev/null +++ b/talimatname/genel/l/lxde-terminal/talimat @@ -0,0 +1,20 @@ +# Tanım: lxde terminal uygulaması +# URL: http://lxde.org/ +# Paketçi: milisarge +# Gerekler: intltool vte gtk3 vte3 +# Grup: lxde + +isim=lxde-terminal +_isim=lxterminal +surum=0.3.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/lxterminal-$surum.tar.xz) + +derle() { +cd ${_isim}-$surum +./configure --sysconfdir=/etc --prefix=/usr --enable-gtk3 +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/lxdm-tema/talimat b/talimatname/genel/l/lxdm-tema/talimat new file mode 100644 index 000000000..3f4c56fd7 --- /dev/null +++ b/talimatname/genel/l/lxdm-tema/talimat @@ -0,0 +1,17 @@ +# Tanım: milislinux lxdm teması +# URL: http://milis.gungre.ch/ +# Paketçi: milisarge yasarciv +# Gerekler: lxdm mate-themes + +isim=lxdm-tema +surum=1.0 +devir=1 +kaynak=(https://github.com/yasarciv/$isim/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + install -d "$PKG/usr/share/lxdm/themes" + install -d "$PKG/etc/lxdm" + cp -r lxdm-themes/Milis-Lxdm-Tema "$PKG/usr/share/lxdm/themes" + cp lxdm/lxdm.conf "$PKG/etc/lxdm/" +} diff --git a/talimatname/genel/l/lxdm/Xsession b/talimatname/genel/l/lxdm/Xsession new file mode 100755 index 000000000..9c6954bf1 --- /dev/null +++ b/talimatname/genel/l/lxdm/Xsession @@ -0,0 +1,48 @@ +#!/bin/bash + +# use bash for "exec -l", howto run login shell by /bin/sh ? + +if [ `which "$1"` ]; then + LXSESSION=$1 +else +# default session + LXSESSION=`grep -ri "exec" ~/.xinitrc | cut -d' ' -f2` +fi + +[ -f /etc/profile ] && . /etc/profile +[ -f /etc/bashrc ] && . /etc/bashrc + +if [ -f /etc/X11/xinit/xinitrc-common ]; then +# fedora + . /etc/X11/xinit/xinitrc-common + exec -l bash -c "$LXSESSION" +elif [ -x /etc/X11/xinit/Xsession ]; then +# fedora + exec /etc/X11/xinit/Xsession "$LXSESSION" +elif [ -x /etc/X11/Xsession ]; then +# mandriva, debian, ubuntu + exec /etc/X11/Xsession "$LXSESSION" +elif [ -x /etc/X11/xinit/xinitrc ]; then +#suse + export WINDOWMANAGER=$LXSESSION + exec -l bash -c /etc/X11/xinit/xinitrc +else +# unknown, user should custom /etc/lxdm/xinitrc self + if [ -x /etc/lxdm/xinitrc ]; then + . /etc/lxdm/xinitrc "$LXSESSION" + fi + if [ -d /etc/X11/xinit/xinitrc.d ] ; then + for f in /etc/X11/xinit/xinitrc.d/* ; do + [ -x "$f" ] && . "$f" + done + unset f + fi + + if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; + then + eval "$(dbus-launch --sh-syntax --exit-with-session)" + fi + + exec -l bash -c "$LXSESSION" +fi + diff --git a/talimatname/genel/l/lxdm/lxdm.conf.in.patch b/talimatname/genel/l/lxdm/lxdm.conf.in.patch new file mode 100644 index 000000000..50435a60c --- /dev/null +++ b/talimatname/genel/l/lxdm/lxdm.conf.in.patch @@ -0,0 +1,20 @@ +--- a/data/lxdm.conf.in 2015-10-18 19:22:46.386331477 -0200 ++++ b/data/lxdm.conf.in 2015-10-18 19:33:38.514873184 -0200 +@@ -23,7 +23,7 @@ + + [server] + ## arg used to start xserver, not fully function +-# arg=/usr/bin/X -background vt1 ++arg=/usr/bin/X -background vt1 + # uncomment this if you really want xserver listen to tcp + # tcp_listen=1 + # uncoment this if you want reset the xserver after logou +@@ -34,7 +34,7 @@ + gtk_theme=Clearlooks + + ## background of the greeter +-bg=/usr/share/backgrounds/default.png ++#bg=/usr/share/backgrounds/default.png + + ## if show bottom pane + bottom_pane=1 diff --git a/talimatname/genel/l/lxdm/lxdm.in.patch b/talimatname/genel/l/lxdm/lxdm.in.patch new file mode 100644 index 000000000..be6c8283b --- /dev/null +++ b/talimatname/genel/l/lxdm/lxdm.in.patch @@ -0,0 +1,26 @@ +--- a/data/lxdm.in 2015-10-18 19:22:46.386331477 -0200 ++++ b/data/lxdm.in 2015-10-18 19:28:46.354787701 -0200 +@@ -1,21 +1,13 @@ + #!/bin/sh + +-[ -f /etc/sysconfig/i18n ] && . /etc/sysconfig/i18n +- +-if [ -z "$LANG" -a -e /etc/sysconfig/language ]; then +- . /etc/sysconfig/language +- if [ -n "$RC_LANG"]; then +- LANG=$RC_LANG +- fi ++if [ -r /etc/profile.d/locale.sh ]; then ++ . /etc/profile.d/locale.sh + fi + + if [ -n "$LANG" ]; then + export LANG + fi + +-[ -f /etc/sysconfig/desktop ] && . /etc/sysconfig/desktop +-[ -f /etc/sysconfig/windowmanager ] && . /etc/sysconfig/windowmanager +- + if [ -n "$DEFAULT_WM" ]; then + PREFERRED=$DEFAULT_WM + fi diff --git a/talimatname/genel/l/lxdm/lxdm.kur-kos b/talimatname/genel/l/lxdm/lxdm.kur-kos new file mode 100644 index 000000000..0787ef231 --- /dev/null +++ b/talimatname/genel/l/lxdm/lxdm.kur-kos @@ -0,0 +1,2 @@ +sed -i "s/^id:[3-5]/id:5/" /etc/inittab +cp -f /sources/milis.git/talimatname/genel/lxdm/Xsession /etc/lxdm/ diff --git a/talimatname/genel/l/lxdm/lxdm.pam b/talimatname/genel/l/lxdm/lxdm.pam new file mode 100644 index 000000000..f33486047 --- /dev/null +++ b/talimatname/genel/l/lxdm/lxdm.pam @@ -0,0 +1,6 @@ +#%PAM-1.0 +auth required pam_unix.so +auth requisite pam_nologin.so +account required pam_unix.so +password required pam_unix.so +session required pam_unix.so diff --git a/talimatname/genel/l/lxdm/talimat b/talimatname/genel/l/lxdm/talimat new file mode 100644 index 000000000..b7f25d5c3 --- /dev/null +++ b/talimatname/genel/l/lxdm/talimat @@ -0,0 +1,41 @@ +# Tanım: hafif linux giriş yöneticisi +# URL: http://sourceforge.net/projects/lxdm/ +# Paketçi: milisarge +# Gerekler: iso-codes librsvg xorg-libxinerama xorg-libxrandr xorg-libxcursor xorg-libxdamage gtk2 consolekit2 mate-themes + +isim=lxdm +surum=0.5.3 +devir=7 +uisim=lxdm-a548c73 +tema=lxdm-tema +tsurum=1.1 + +kaynak=(http://kaynaklar.milislinux.org/$uisim.tar.xz +https://github.com/yasarciv/$tema/archive/$tsurum.tar.gz +lxdm.in.patch +lxdm.conf.in.patch +lxdm.pam +Xsession) + +derle() { + + cd $uisim + patch -Np1 < ../lxdm.in.patch + patch -Np1 < ../lxdm.conf.in.patch + cp ../lxdm.pam pam/lxdm + cp ../Xsession data/Xsession + ./autogen.sh + ./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc \ + --libexecdir=/usr/lib/lxdm --localstatedir=/var + make + make DESTDIR=$PKG install + + install -dm 755 ${PKG}/var/lib/lxdm + echo 'GDK_CORE_DEVICE_EVENTS=true' > "$PKG"/var/lib/lxdm/.pam_environment + + #milis linux temasının ayarlanması + cp -r ${SRC}/$tema-$tsurum/lxdm-themes/Milis-Lxdm-Tema "$PKG/usr/share/lxdm/themes" + cp ${SRC}/$tema-$tsurum/lxdm/lxdm.conf "$PKG/etc/lxdm/" + cd /sources/milis.git/ayarlar/servisler + make DESTDIR=$PKG kur-lxdm +} diff --git a/talimatname/genel/l/lximage-qt/talimat b/talimatname/genel/l/lximage-qt/talimat new file mode 100644 index 000000000..1fc37fd23 --- /dev/null +++ b/talimatname/genel/l/lximage-qt/talimat @@ -0,0 +1,21 @@ +# Tanım: Lximage-qt paketi, hafif bir resim görüntüleyici ve ekran görüntüsü programı içerir. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: libfm-qt libexif +# Grup: lxqt + +isim=lximage-qt +surum=0.7.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-about/talimat b/talimatname/genel/l/lxqt-about/talimat new file mode 100644 index 000000000..68925a2d2 --- /dev/null +++ b/talimatname/genel/l/lxqt-about/talimat @@ -0,0 +1,21 @@ +# Tanım: Lxqt-about paketi bağımsız LXQt "Hakkında" iletişim kutusunu sağlar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt +# Grup: lxqt + +isim=lxqt-about +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-admin/talimat b/talimatname/genel/l/lxqt-admin/talimat new file mode 100644 index 000000000..afce33083 --- /dev/null +++ b/talimatname/genel/l/lxqt-admin/talimat @@ -0,0 +1,21 @@ +# Tanım: Lxqt-admin paketi, LXQt'nin çalıştığı işletim sisteminin ayarlarını yapmak için iki GUI aracı sunar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt polkit +# Grup: lxqt + +isim=lxqt-admin +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-build-tools/talimat b/talimatname/genel/l/lxqt-build-tools/talimat new file mode 100644 index 000000000..530dad9cd --- /dev/null +++ b/talimatname/genel/l/lxqt-build-tools/talimat @@ -0,0 +1,20 @@ +# Tanım: LXQt uygulamaları için çeşitli paketleme araçları ve komut dosyaları +# URL: http://lxqt.org +# Paketçi: milisarge +# Gerekler: cmake qt5 + +isim=lxqt-build-tools +surum=0.5.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-common/talimat b/talimatname/genel/l/lxqt-common/talimat new file mode 100644 index 000000000..be3af8e2c --- /dev/null +++ b/talimatname/genel/l/lxqt-common/talimat @@ -0,0 +1,24 @@ +# Tanım: Lxqt-common paketi çeşitli LXQt bileşenleri için ortak dosyalar sağlar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: hicolor-icon-theme xorg-app + +isim=lxqt-common +surum=0.11.2 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +sed -e '/TryExec/s@=@=/usr/bin/@' \ + -i xsession/lxqt.desktop.in + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + + make + mkdir -pv /usr/share/lxqt/graphics && + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-config/talimat b/talimatname/genel/l/lxqt-config/talimat new file mode 100644 index 000000000..ba8cb6a14 --- /dev/null +++ b/talimatname/genel/l/lxqt-config/talimat @@ -0,0 +1,22 @@ +# Tanım: Lxqt-config paketi LXQt sistem ayarlar merkezi sağlar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt plasma-libkscreen + +isim=lxqt-config +surum=0.11.1 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-globalkeys/talimat b/talimatname/genel/l/lxqt-globalkeys/talimat new file mode 100644 index 000000000..52b2d3db4 --- /dev/null +++ b/talimatname/genel/l/lxqt-globalkeys/talimat @@ -0,0 +1,22 @@ +# Tanım: Lxqt-globalkeys paketi genel klavye kısayollarını ve bir kısayol GUI editörünü kaydetmek için kullanılan bir arka plan programı içerir. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt +# Grup: lxqt + +isim=lxqt-globalkeys +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-l10n/talimat b/talimatname/genel/l/lxqt-l10n/talimat new file mode 100644 index 000000000..b447ce6b9 --- /dev/null +++ b/talimatname/genel/l/lxqt-l10n/talimat @@ -0,0 +1,21 @@ +# Tanım: Lxqt-l10n paketi LXQt masaüstünün tüm bileşenleri için çeviri sağlar +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt +# Grup: lxqt + +isim=lxqt-l10n +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-notificationd/talimat b/talimatname/genel/l/lxqt-notificationd/talimat new file mode 100644 index 000000000..5fe80327f --- /dev/null +++ b/talimatname/genel/l/lxqt-notificationd/talimat @@ -0,0 +1,23 @@ +# Tanım: Lxqt-notificationd paketi, LXQt bildirim arka plan programıdır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: lxqt-common liblxqt +# Grup: lxqt + +isim=lxqt-notificationd +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/lxqt-openssh-askpass/talimat b/talimatname/genel/l/lxqt-openssh-askpass/talimat new file mode 100644 index 000000000..724e2f5ac --- /dev/null +++ b/talimatname/genel/l/lxqt-openssh-askpass/talimat @@ -0,0 +1,21 @@ +# Tanım: LXQt openssh şifre istemi +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt lxqt-build-tools +# Grup: lxqt + +isim=lxqt-openssh-askpass +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-panel/talimat b/talimatname/genel/l/lxqt-panel/talimat new file mode 100644 index 000000000..3178d6816 --- /dev/null +++ b/talimatname/genel/l/lxqt-panel/talimat @@ -0,0 +1,29 @@ +# Tanım: Lxqt-panel paketi hafif bir X11 masaüstü paneli içeriyor. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: kf5-solid kf5-kguiaddons lxqt-globalkeys libdbusmenu-qt5 liblxqt lxde-menu-data menu-cache libsysstat libstatgrab pulseaudio libxkbcommon lm-sensors + +isim=lxqt-panel +surum=0.11.1 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { +cd $isim-$surum + +sed -e 's:<KF5/KWindowSystem/:<:' \ + -i plugin-taskbar/lxqttaskgroup.{h,cpp} + +sed -e '/kbdinfo.h/i #undef explicit' \ + -i plugin-kbindicator/src/x11/kbdlayout.cpp + + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-policykit/talimat b/talimatname/genel/l/lxqt-policykit/talimat new file mode 100644 index 000000000..282529673 --- /dev/null +++ b/talimatname/genel/l/lxqt-policykit/talimat @@ -0,0 +1,20 @@ +# Tanım: LXQt politika kimliği doğrulama aracısı +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt polkit-qt5 +# Grup: lxqt + +isim=lxqt-policykit +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-powermanagement/talimat b/talimatname/genel/l/lxqt-powermanagement/talimat new file mode 100644 index 000000000..c3c506eb5 --- /dev/null +++ b/talimatname/genel/l/lxqt-powermanagement/talimat @@ -0,0 +1,20 @@ +# Tanım: Lxqt-powermanagement paketi, LXQt için güç yönetimi modülünü sağlar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt hicolor-icon-theme kf5-kidletime kf5-solid upower xscreensaver + +isim=lxqt-powermanagement +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-qtermwidget/talimat b/talimatname/genel/l/lxqt-qtermwidget/talimat new file mode 100644 index 000000000..61bbd8a0a --- /dev/null +++ b/talimatname/genel/l/lxqt-qtermwidget/talimat @@ -0,0 +1,22 @@ +# Tanım: Adından da anlaşılacağı üzere qtermwidget Qt için bir terminal widgettır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: cmake qt5 + +isim=lxqt-qtermwidget +_isim=qtermwidget +surum=0.7.1 +devir=1 +kaynak=(https://github.com/lxde/$_name/releases/download/$surum/$_name-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$_name-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-qtplugin/lxqt-qtplugin.kur-kos b/talimatname/genel/l/lxqt-qtplugin/lxqt-qtplugin.kur-kos new file mode 100644 index 000000000..8d821fddd --- /dev/null +++ b/talimatname/genel/l/lxqt-qtplugin/lxqt-qtplugin.kur-kos @@ -0,0 +1,7 @@ +cat >> /etc/profile.d/lxqt.sh << "EOF" +# Begin lxqt-qtplugin configuration + +export QT_QPA_PLATFORMTHEME=lxqt + +# End lxqt-qtplugin configuration +EOF diff --git a/talimatname/genel/l/lxqt-qtplugin/talimat b/talimatname/genel/l/lxqt-qtplugin/talimat new file mode 100644 index 000000000..e132bb238 --- /dev/null +++ b/talimatname/genel/l/lxqt-qtplugin/talimat @@ -0,0 +1,22 @@ +# Tanım: Qt için LXQt platform entegrasyonu +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt libdbusmenu-qt5 lxqt-build-tools libqtxdg libfm-qt +# Grup: lxqt + +isim=lxqt-qtplugin +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-runner/talimat b/talimatname/genel/l/lxqt-runner/talimat new file mode 100644 index 000000000..2e8633338 --- /dev/null +++ b/talimatname/genel/l/lxqt-runner/talimat @@ -0,0 +1,22 @@ +# Tanım: Lxqt-runner paketi, adlarını yazarak programları hızlı bir şekilde başlatmak için kullanılan bir araç sağlar. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: lxqt-globalkeys menu-cache +# Grup: lxqt + +isim=lxqt-runner +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build +cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DRUNNER_MATH=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/l/lxqt-session/talimat b/talimatname/genel/l/lxqt-session/talimat new file mode 100644 index 000000000..1ec21c27b --- /dev/null +++ b/talimatname/genel/l/lxqt-session/talimat @@ -0,0 +1,21 @@ +# Tanım: Lxqt-session paketi, LXQt için varsayılan oturum yöneticisini içerir. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt xdg-user-dirs kf5-kwindowsystem kf5-breeze-icons kf5-oxygen-icons5 lxqt-build-tools +# Grup: lxqt + +isim=lxqt-session +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt-sudo/talimat b/talimatname/genel/l/lxqt-sudo/talimat new file mode 100644 index 000000000..4528be21a --- /dev/null +++ b/talimatname/genel/l/lxqt-sudo/talimat @@ -0,0 +1,21 @@ +# Tanım: Lxqt-sudo sırasıyla sudo ve su komutlarının grafik ön ucudur. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt qt5 +# Grup: lxqt + +isim=lxqt-sudo +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lxqt/lxqt.sira b/talimatname/genel/l/lxqt/lxqt.sira new file mode 100644 index 000000000..bd3b68b1d --- /dev/null +++ b/talimatname/genel/l/lxqt/lxqt.sira @@ -0,0 +1,31 @@ +libstatgrab +libdbusmenu-qt +libqtxdg +lxqt-build-tools +libsysstat +liblxqt +compton-conf +libfm-qt +lxqt-common +lxqt-l10n +lxqt-qtplugin +obconf-qt +pavucontrol-qt +qtermwidget +lximage-qt +pcmanfm-qt +lxqt-about +lxqt-admin +lxqt-config +lxqt-globalkeys +lxqt-notificationd +lxqt-openssh-askpass +lxqt-policykit +lxqt-powermanagement +lxqt-qtermwidget +lxqt-session +lxqt-sudo +lxqt-panel +lxqt-runner +qterminal +qps diff --git a/talimatname/genel/l/lxqt/talimat b/talimatname/genel/l/lxqt/talimat new file mode 100644 index 000000000..cd57188ff --- /dev/null +++ b/talimatname/genel/l/lxqt/talimat @@ -0,0 +1,15 @@ +# Tanım: Lxqt masaüstü ortamı +# URL: https://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: compton-conf libqtxdg lxqt-build-tools libsysstat liblxqt libfm-qt lxqt-common lxqt-l10n lxqt-qtplugin obconf-qt pavucontrol-qt qtermwidget lximage-qt pcmanfm-qt qterminal lxqt-about lxqt-admin lxqt-config lxqt-globalkeys lxqt-notificationd lxqt-openssh-askpass lxqt-policykit lxqt-powermanagement lxqt-session lxqt-sudo lxqt-panel lxqt-runner qps +# Grup:lxqt + +isim=lxqt +surum=0.13.0 +devir=1 + +kaynak=() + +derle() { +echo "lxqt sistem" +} diff --git a/talimatname/genel/l/lynx/talimat b/talimatname/genel/l/lynx/talimat new file mode 100644 index 000000000..71f846864 --- /dev/null +++ b/talimatname/genel/l/lynx/talimat @@ -0,0 +1,24 @@ +# Tanım: Metin tabanlı web tarayıcısı. +# URL: http://lynx.isc.org/ +# Paketçi: milisarge +# Gerekler: + +isim=lynx +surum=2.8.9dev.14 +devir=1 +kaynak=(http://invisible-island.net/datafiles/release/lynx-cur.tar.bz2) + +derle() { + cd lynx$surum + ./configure \ + --prefix=/usr \ + --enable-nls \ + --enable-color-style \ + --enable-ipv6 \ + --with-ssl=/usr/lib \ + --with-zlib \ + --enable-default-colors \ + --with-screen=ncursesw + make -s -j1 + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/l/lziprecover/talimat b/talimatname/genel/l/lziprecover/talimat new file mode 100644 index 000000000..1b2b01e74 --- /dev/null +++ b/talimatname/genel/l/lziprecover/talimat @@ -0,0 +1,17 @@ +# Tanım: lzip arşiv kontrol ve tamir programı +# URL: http://www.nongnu.org/lzip +# Paketçi: milisarge +# Gerekler: + +isim=lziprecover +surum=1.18 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/lzip/$isim/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make prefix=$PKG/usr install +} diff --git a/talimatname/genel/l/lzop/talimat b/talimatname/genel/l/lzop/talimat new file mode 100644 index 000000000..de81032bd --- /dev/null +++ b/talimatname/genel/l/lzop/talimat @@ -0,0 +1,19 @@ +# Tanım: lzo tabanlı sıkıştırıcı uygulama +# URL: http://www.lzop.org/ +# Paketçi: milisarge +# Gerekler: lzo + +isim=lzop +surum=1.03 +devir=1 +kaynak="http://www.lzop.org/download/$isim-$surum.tar.gz" + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --enable-shared + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/maclookup/talimat b/talimatname/genel/m/maclookup/talimat new file mode 100644 index 000000000..a99c71911 --- /dev/null +++ b/talimatname/genel/m/maclookup/talimat @@ -0,0 +1,19 @@ +# Tanım: IEEE MA-L/OUI açık listesinden MAC adresi görüntüleme aracı. +# URL: https://github.com/paraxor/maclookup +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: + +isim=maclookup +surum=0.4 +devir=1 +kaynak=(https://github.com/paraxor/$isim/archive/${surum}.tar.gz) + +derle() { + cd "$SRC/$isim-$surum" + + mkdir -p "$PKG/usr/share/$isim" + + install -Dm755 $isim.sh "$PKG/usr/bin/$isim" + + sh $isim.sh -u -f "$PKG/usr/share/$isim/oui.txt" +} diff --git a/talimatname/genel/m/macos-simge-tema/talimat b/talimatname/genel/m/macos-simge-tema/talimat new file mode 100644 index 000000000..13a17251a --- /dev/null +++ b/talimatname/genel/m/macos-simge-tema/talimat @@ -0,0 +1,19 @@ +# Tanım: MacOS Simge Teması +# URL: https://www.opendesktop.org/p/1102582 +# Paketçi: Oltulu +# Gerekler: +# Grup: grafik_tasarım + +isim=macos-simge-tema +surum=4.1.5 +devir=1 + +kaynak=(https://dl.opendesktop.org/api/files/downloadfile/id/1510321229/s/4b235bb70e9c6341be771802bc542e92/t/1513887320/macOS.tar.xz) + +derle() { + find -name '* *' -delete + cp macOS/status/symbolic/*.svg macOS/devices/symbolic + mv macOS/apps/128/accessories_calculator.png macOS/apps/128/accessories-calculator.png + + find */ -type f -exec install -Dm644 '{}' $PKG/usr/share/icons/'{}' \; +} diff --git a/talimatname/genel/m/mailcommon/talimat b/talimatname/genel/m/mailcommon/talimat new file mode 100644 index 000000000..7f7d9e887 --- /dev/null +++ b/talimatname/genel/m/mailcommon/talimat @@ -0,0 +1,21 @@ +# Tanım: Posta uygulamaları için destek sağlayan KDE PIM kütüphanesi +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: mailimporter messagelib kf5-extra-cmake-modules kf5-kdoctools boost qt5 + +isim=mailcommon +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mailimporter/talimat b/talimatname/genel/m/mailimporter/talimat new file mode 100644 index 000000000..c5642b0bf --- /dev/null +++ b/talimatname/genel/m/mailimporter/talimat @@ -0,0 +1,21 @@ +# Tanım: Çeşitli kaynaklardan posta almayı sağlayan Kitaplık +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libkdepim kf5-extra-cmake-modules kf5-kdoctools boost qt5 + +isim=mailimporter +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mailx/talimat b/talimatname/genel/m/mailx/talimat new file mode 100644 index 000000000..049e5543d --- /dev/null +++ b/talimatname/genel/m/mailx/talimat @@ -0,0 +1,27 @@ +# Tanım: Berkeley Mail'den türetilen bir komut satırı posta kullanıcı aracısı. +# URL: http://heirloom.sourceforge.net/mailx.html +# Paketçi: milisarge +# Gerekler: openssl kerberos sendmail + +isim=mailx +surum=12.5 +devir=1 +kaynak=(http://ftp.debian.org/debian/pool/main/h/heirloom-$isim/heirloom-mailx_12.5.orig.tar.gz + http://www.linuxfromscratch.org/patches/blfs/svn/heirloom-$isim-12.5-fixes-1.patch ) + +derle() { + +cd heirloom-$isim-$surum + +patch -Np1 -i $SRC/heirloom-mailx-12.5-fixes-1.patch + +make SENDMAIL=/usr/sbin/sendmail -j1 + +make PREFIX=$PKG/usr UCBINSTALL=/usr/bin/install install + +ln -v -sf mailx $PKG/usr/bin/mail +ln -v -sf mailx $PKG/usr/bin/nail +install -v -m755 -d $PKG/usr/share/doc/heirloom-mailx-12.5 +install -v -m644 README $PKG/usr/share/doc/heirloom-mailx-12.5 + +} diff --git a/talimatname/genel/m/maim/talimat b/talimatname/genel/m/maim/talimat new file mode 100644 index 000000000..1f03435c8 --- /dev/null +++ b/talimatname/genel/m/maim/talimat @@ -0,0 +1,16 @@ +# Tanım: Ekran görüntüsü alma uygulaması +# URL: https://github.com/naelstrof/maim +# Paketçi: milisarge +# Gerekler: cmake slop freetype xorg-libxfixes xorg-libxrandr libjpeg-turbo xorg-libxcomposite + +isim=maim +surum=4.4.62 +devir=1 +kaynak=(https://github.com/naelstrof/maim/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum + cmake -DJPEG_INCLUDE_DIR:PATH=C:/MinGW/include/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/makemkv/makemkv.1 b/talimatname/genel/m/makemkv/makemkv.1 new file mode 100644 index 000000000..c3e27c046 --- /dev/null +++ b/talimatname/genel/m/makemkv/makemkv.1 @@ -0,0 +1,30 @@ +.TH MAKEMKV "1" "May 2014" "MakeMKV 1.8" + +\" Completely disable hyphenation. It is a very annoying feature while reading man pages, in my opinion. +.nh + +.SH NAME +MakeMKV \- Decrypt DVD and Blu-ray discs to your hard disk using a simple GUI. + +.SH SYNOPSIS +.B makemkv + +.SH DESCRIPTION +MakeMKV is a simple solution to convert video that you own into a free and patents-unencumbered format which can be played everywhere. MakeMKV is a format converter, otherwise called a "transcoder". It converts the video clips from proprietary (and usually encrypted) disc into a set of MKV files, preserving most information but not changing it in any way. Additionally MakeMKV can instantly stream decrypted video without intermediate conversion to wide range of media players. + +.SH AUTHOR +This manual page was written by Karl Lenz <xorangekiller@gmail.com> for the Debian project (but may be used by others). + +.SH COPYRIGHT +2007-2014 GuinpinSoft Inc. + +Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. + +MakeMKV is provided "as is" with no warranty. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2.1 of the License, or (at your option) any later version. On Debian systems, the complete text of the GNU Lesser General Public License version 2.1 can be found in "/usr/share/common-licenses/LGPL-2.1". + +.SH SEE\ ALSO +.BR makemkvcon (1), +.BR mmdtsdec (1), +.BR ffmpeg (1), +.BR vlc (1), +.BR mpv (1) diff --git a/talimatname/genel/m/makemkv/makemkv.kur-kos b/talimatname/genel/m/makemkv/makemkv.kur-kos new file mode 100644 index 000000000..b036cd975 --- /dev/null +++ b/talimatname/genel/m/makemkv/makemkv.kur-kos @@ -0,0 +1,6 @@ +echo "The makemkv package is licensed software." +echo "You MUST read and agree to the license stored in" +echo "/usr/share/licenses/makemkv/eula_en_linux.txt before using it." + +update-desktop-database -q +xdg-icon-resource forceupdate --theme hicolor diff --git a/talimatname/genel/m/makemkv/makemkvcon.1 b/talimatname/genel/m/makemkv/makemkvcon.1 new file mode 100644 index 000000000..239f74986 --- /dev/null +++ b/talimatname/genel/m/makemkv/makemkvcon.1 @@ -0,0 +1,266 @@ +.TH MAKEMKVCON "1" "May 2014" "MakeMKV 1.8" + +\" Completely disable hyphenation. It is a very annoying feature while reading man pages, in my opinion. +.nh + +.SH NAME +makemkvcon \- Decrypt DVD and Blu-ray discs to your hard disk using a simple command line interface. + +.SH SYNOPSIS +.B makemkvcon +[\fIOPTIONS\fR] +\fICOMMAND\fR +[\fIPARAMETERS\fR] + +.SH DESCRIPTION +MakeMKV is a simple solution to convert video that you own into a free and patents-unencumbered format which can be played everywhere. MakeMKV is a format converter, otherwise called a "transcoder". It converts the video clips from proprietary (and usually encrypted) disc into a set of MKV files, preserving most information but not changing it in any way. Additionally MakeMKV can instantly stream decrypted video without intermediate conversion to wide range of media players. + +.SH GENERAL\ OPTIONS +The options described below apply to all makemkvcon \fICOMMANDS\fR. + +.IP \fB--messages\fR=\fIFILE\fR +Output all messages to \fIFILE\fR instead of stdandard output. + +The following special \fIFILE\fR names are recognized: +.TS +left allbox tab(%); +c c +l l +l l +l l. + \fBFILE\fR % \fBSpecial Meaning\fR +-stdout % standard output +-stderr % standard error +-null % disable output +.TE + +.IP \fB--progress\fR=\fIFILE\fR +Output all progress messages to \fIFILE\fR. By default no progress is output. + +The same special \fIFILE\fR names as supported by \fI--messages\fR are recognized, with one addition: +.TS +left allbox tab(%); +c c +l l. + \fBFILE\fR % \fBSpecial Meaning\fR +-same % output to the same \fIFILE\fR as \fI--messages\fR +.TE + +.IP \fB--debug\fR[=\fIFILE\fR] +Enable debug messages, and, optionally, output those messages to \fIFILE\fR instead of the debug location specified in program preferences. + +.IP \fB--directio\fR=\fIBOOL\fR +Disable direct disc access if \fIBOOL\fR is \fIfalse\fR. Enable direct disc access if \fIBOOL\fR is \fItrue\fR. + +.IP \fB--noscan\fR +Do not access any media while scanning a disc, and do not check for media insertion and removal. This option may be helpful when other applications are actively accessing discs in other drives. It does not, however, alleviate the need to MakeMKV to have exclusive access to the disc drive you specify to this program. + +.IP \fB--cache\fR=\fISIZE\fR +Specify the maximum \fISIZE\fR of the read cache used by MakeMKV (in megabytes). By default this program may consume a very large amount of memory. Although this high memory consumption allows MakeMKV to quickly and efficiently buffer chunks of data from the DVD or Blu-ray disc, it may noticeably slow down memory-constrained systems or those with very little free RAM. If you choose to limit the cache \fISIZE\fR with this option, please keep in mind that 128 MB is the recommended minimum for streaming and backup, at least 512 MB is necessary for smooth DVD conversion, and at least 1024 MB is necessary for smooth Blu-ray conversion. + +.SH CONVERSION\ OPTIONS +The options described below are for source conversion and apply only to the \fImkv\fR \fICOMMAND\fR. + +.IP \fB--minlength\fR=\fILENGTH\fR +Only capture titles that are at least \fILENGTH\fR seconds long. + +.SH STREAMING\ OPTIONS +The options described below are for network related and apply only to the \fIstream\fR \fICOMMAND\fR. + +.IP \fB--upnp\fR=\fIBOOL\fR +Disable Universal Plug-and-Play (UPNP) streaming if \fIBOOL\fR is \fIfalse\fR. Enable UPNP streaming if \fIBOOL\fR is \fItrue\fR. + +.IP \fB--bindip\fR=\fIADDRESS\fR +Exclusively bind the UPNP server to \fIADDRESS\fR. By default server binds to the first available address, and its local web server listens on all available addresses. + +.IP \fB--bindport\fR=\fIPORT\fR +Bind the web server to \fIPORT\fR instead of 51000. + +.SH BACKUP\ OPTIONS +The options described below related to backup purposes and apply only to the \fIbackup\fR \fICOMMAND\fR. + +.IP \fB--decrypt\fR +Decrypt stream files during backup. By default a strict backup will be made, which means nothing is decrypted sans this option. + +.SH AUTOMATION\ OPTIONS +The options described below are designed to be used by those wishing to automate aspects of this program. They are particularly useful in shell scripts. + +.IP \fB-r\fR,\ \fB--robot\fR +Enable automation mode. In this mode MakeMKV will output more information in a format that is easier to parse by scripts (particularly with regular expressions), but may slightly hinder direct human consumption. All output is line-based and flushed on line end. All strings are quoted, and all control characters and quotes are escaped by backlashes. If you intend to automate this program, it is highly recommended that you use this option. Some options make reference to \fIapdefs.h\fR, which is among the open-source components of MakeMKV and can be found in the makemkv-oss source package in Debian. These values will not change in future versions. + +.SH COMMANDS +Each instantiation of this program requires a \fICOMMAND\fR. This \fICOMMAND\fR determines, on a holistic level, which action MakeMKV should attempt to perform. All supported commands are described below. + +.IP \fBinfo\fR\ \fISOURCE\fR +Print detailed descriptory information about the \fISOURCE\fR disc. + +.IP \fBmkv\fR\ \fISOURCE\fR\ \fITITLE_ID\fR\ \fIDESTINATION_DIRECTORY\fR +Save the title on the \fISOURCE\fR disc with the ID \fITITLE_ID\fR to an MKV file in the directory \fIDESTINATION_DIRECTORY\fR. + +.IP \fBstream\fR\ \fISOURCE\fR +Start a local streaming server backed by the titles on \fISOURCE\fR. + +.IP \fBbackup\fR\ \fISOURCE\fR\ \fIDESTINATION_DIRECTORY\fR +Faithfully backup the contents of \fISOURCE\fR to the \fIDESTINATION_DIRECTORY\fR on your hard disk. + +.SH SOURCES +Since MakeMKV is primarily designed to operate on optical media, each \fICOMMAND\fR must be immediately postfixed by a \fISOURCE\fR. However, because this program supports a wide range of input sources - including ISO images, directories, optical discs, and raw devices - each \fISOURCE\fR must be specified according to the source specification detailed below. The prefixes mandated by this specification hint to MakeMKV the type of media it should attempt to access. If in doubt, try the \fIdisc\fR \fISOURCE\fR; it is the most commonly used. + +.TS +left allbox tab(%); +c c +l l +l l +l l +l l. + \fBSOURCE\fR % \fBDescription\fR +iso:\fIFILE\fR % Open the ISO image specified by \fIFILE\fR. +file:\fIDIRECTORY\fR % Open the files contained in \fIDIRECTORY\fR. +disc:\fIDISC_ID\fR % Open the optical disc with the ID \fIDISC_ID\fR. Use the \fIinfo\fR command to get a list available \fIDISC_ID\fR's. +dev:\fIDEVICE\fR % Open the raw device with the name \fIDEVICE\fR. On Linux the first optical disc drive (and hence the first available \fIDEVICE\fR) is typically /dev/sr0. +.TE + +.SH MESSAGE\ FORMATS +There are several different types of messages that MakeMKV might generate. Each type is documented below. The short codes documented first are used to prefix messages in \fI--robot\fR mode. + +\fBMessage Output Format:\fR\ \fIMSG\fR:code,flags,count,message,format,param0,param1,... +.TS +left allbox tab(%); +c c +l l +l l +l l +l l +l l +l l. + \fBMSG\fR % \fBDescription\fR +code % unique message code which should be used to identify a particular string in a language-neutral way +flags % message flags (see \fIAP_UIMSG_xxx\fR flags in \fIapdefs.h\fR) +count % number of parameters +message % raw message string suitable for output +format % localized format string used for the message +param[0-9]+ % parameter for the message +.TE + + +.br +\fBCurrent Progress Title Format:\fR\ \fIPRGC\fR:code,id,name +.br +\fBTotal Progress Title Format:\fR\ \fIPRGT\fR:code,id,name +.TS +left allbox tab(%); +c c +l l +l l +l l. + \fBPRGC|PRGT\fR % \fBDescription\fR +code % unique message code +id % operation sub-id +name % name string +.TE + + +.br +\fBProgress Bar Format (for current and total progress)\fR:\ \fIPRGV\fR:current,total,max +.TS +left allbox tab(%); +c c +l l +l l +l l. + \fBPRGV\fR % \fBDescription\fR +current % current progress value +total % total progress value +max % maximum possible value for a progress bar (constant) +.TE + + +.br +\fBDrive Scan Message Format\fR:\ \fIDRV\fR:index,visible,enabled,flags,drive_name,disc_name +.TS +left allbox tab(%); +c c +l l +l l +l l +l l +l l +l l. + \fBDRV\fR % \fBDescription\fR +index % drive index +visible % set to 1 if drive is present +enabled % set to 1 if drive is accessible +flags % media flags (see \fIAP_DskFsFlagXXX\fR in \fIapdefs.h\fR) +drive name % drive name string +disc name % disc name string +.TE + + +.br +\fBDisc Information Output Format\fR:\ \fITCOUT\fR:count +.TS +left allbox tab(%); +c c +l l. + \fBTCOUT\fR % \fBDescription\fR +count % number of titles on the disc +.TE + + +.br +\fBDisc Information Format\fR:\ \fICINFO\fR:id,code,value +.br +\fBTitle Information Format\fR:\ \fITINFO\fR:id,code,value +.br +\fBStream Information Format\fR:\ \fISINFO\fR:id,code,value +.TS +left allbox tab(%); +c c +l l +l l +l l. + \fBCINFO|TINFO|SINFO\fR % \fBDescription\fR +id % attribute id (see \fIAP_ItemAttributeId\fR in \fIapdefs.h\fR) +code % message code (if the attribute value is a constant string) +value % attribute value +.TE + +.SH EXAMPLES +The following examples demonstrate the proper syntax for performing various common operations. If you need more help interpreting them, read the documentation above, and use common sense. + +\fB1.\fR\ Copy all titles from the first disc, and save them as decrypted MKV files in the \fIVideos\fR directory in your home folder. + +.br + \fBmakemkvcon mkv disc:0 all ~/Videos\fR + +\fB2.\fR\ List all available disc drives. + +.br + \fBmakemkvcon -r --cache=1 info disc:9999\fR + +\fB3.\fR\ Decrypt and backup the first disc to \fI/tmp\fR in automation mode with progress output. + +.br + \fBmakemkvcon backup --decrypt --cache=16 --noscan -r --progress=-same disc:0 /tmp\fR + +\fB4.\fR\ Start a UPNP streaming server with all output suppressed on port 51000 with the address 192.168.1.102. + +.br + \fBmakemvcon stream --upnp=1 --cache=128 --bindip=192.168.1.102 --bindport=51000 --messages=-none\fR + +.SH AUTHOR +This manual page was written by Karl Lenz <xorangekiller@gmail.com> for the Debian project (but may be used by others). + +.SH COPYRIGHT +2007-2014 GuinpinSoft Inc. + +Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. + +The MakeMKV console interface is provided "as is" with no warranty. This program is proprietary software: you can redistribute it under the terms of the MakeMKV End-User License Agreement (EULA) as provided by GuinpinSoft Incorporated. On Debian systems, the complete text of this license can be found in "/usr/share/doc/makemkv-cli/copyright". + +.SH SEE\ ALSO +.BR makemkv (1), +.BR mmdtsdec (1), +.BR ffmpeg (1), +.BR vlc (1), +.BR mpv (1) diff --git a/talimatname/genel/m/makemkv/mmdtsdec.1 b/talimatname/genel/m/makemkv/mmdtsdec.1 new file mode 100644 index 000000000..1dfe81bdb --- /dev/null +++ b/talimatname/genel/m/makemkv/mmdtsdec.1 @@ -0,0 +1,51 @@ +.TH MMDTSDEC "1" "May 2014" "MakeMKV 1.8" + +\" Completely disable hyphenation. It is a very annoying feature while reading man pages, in my opinion. +.nh + +.SH NAME +mmdtsdec \- Decode a Multimedia Display MPEG Transport Stream encoded file into Waveform Audio File format. + +.SH SYNOPSIS +.B mmdtsdec +[\fIOPTIONS\fR] +\fIINPUT_FILE\fR +\fIOUTPUT_FILE\fR + +.SH DESCRIPTION +Mmdtsdec is a command line program to decode Multimedia Display MPEG Transport Stream (TS) encoded files into into Waveform Audio File (WAV) format. Transport Stream is specified in the MPEG-2 Part 1 standard, and is commonly used to store audio, video, and data on DVD and Blu-ray discs. WAV files, on the other hand, are only lightly compressed, but are supported by a large number audio/video programs thanks to the format's relative simplicity. This program is part of the MakeMKV suite, and is designed first-and-foremost to complement MakeMKV. + +.SH OPTIONS + +.IP \fB-d\fR,\ \fB--dll\fR\ \fIFILE\fR +Use the shared library \fIFILE\fR to decode the \fIINPUT_FILE\fR. + +.SH INPUT_FILE +Each instance of this program must have an \fIINPUT_FILE\fR. This parameter should be the file name and path to an MPEG Transport Stream encoded file. (Which typically terminates with a \fI.ts\fR or \fI.dts\fR file extension.) + +.SH OUTPUT_FILE +Each instance of this program must have an \fIOUTPUT_FILE\fR. The file specified by this parameter should not exist prior to this program being executed. If \fIOUTPUT_FILE\fR already exists, it will be unconditionally overwritten. Since a Waveform Audio File will be produced, this file name should end with the \fI.wav\fR file extension. + +.SH EXAMPLES +The following examples demonstrate the proper syntax for performing various common operations. + +\fB1.\fR\ Decode \fIInputFile.dts\fR to \fIOutputFile.wav\fR using the default decoder library. + +.br + \fBmmdtsdec InputFile.dts OutputFile.wav\fR + +.SH AUTHOR +This manual page was written by Karl Lenz <xorangekiller@gmail.com> for the Debian project (but may be used by others). + +.SH COPYRIGHT +2007-2014 GuinpinSoft Inc. + +Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. + +The MakeMKV Multimedia Display MPEG Transport Stream Decoder is provided "as is" with no warranty. This program is proprietary software: you can redistribute it under the terms of the MakeMKV End-User License Agreement (EULA) as provided by GuinpinSoft Incorporated. On Debian systems, the complete text of this license can be found in "/usr/share/doc/makemkv-dec/copyright". + +.SH SEE\ ALSO +.BR makemkv (1), +.BR makemkvcon (1), +.BR ffmpeg (1), +.BR mencoder (1) diff --git a/talimatname/genel/m/makemkv/talimat b/talimatname/genel/m/makemkv/talimat new file mode 100644 index 000000000..22145d186 --- /dev/null +++ b/talimatname/genel/m/makemkv/talimat @@ -0,0 +1,25 @@ +# Tanım: MakeMKV, kendi videonuzu ücretsiz ve patentlere dönüştürmek için tek tıklamayla çözümünüzdür, her yere oynatılabilecek kayıtsız format. +# URL: http://www.makemkv.com +# Paketçi: milisarge +# Gerekler: qt5 libxkbcommon hicolor-icon-theme icu ffmpeg desktop-file-utils + +isim=makemkv +surum=1.12.0 +devir=3 + +kaynak=(http://www.makemkv.com/download/${isim}-bin-${surum}.tar.gz + http://www.makemkv.com/download/${isim}-oss-${surum}.tar.gz) + + +derle() { + cd "${SRC}/${isim}-oss-${surum}" + CC=gcc CXX=g++ ./configure --prefix=/usr + make + make DESTDIR=\""${PKG}"\" install + + cd "${SRC}/${isim}-bin-${surum}" + install -d tmp + echo accepted > tmp/eula_accepted + make DESTDIR=\""${PKG}"\" install + install -Dm 644 src/eula_en_linux.txt "${PKG}/usr/share/licenses/${isim}/eula_en_linux.txt" +} diff --git a/talimatname/genel/m/maltego/talimat b/talimatname/genel/m/maltego/talimat new file mode 100644 index 000000000..46292ae41 --- /dev/null +++ b/talimatname/genel/m/maltego/talimat @@ -0,0 +1,27 @@ +# Tanım: DNS, Alan Adı, IP adresleri, web siteleri, kişiler vb. hakkında bilgi toplamak için açık kaynaklı bir istihbarat ve adli bilişim uygulaması. +# URL: http://www.paterva.com/web5 +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: giflib + +isim=maltego +surum=4.0.11.9358 +devir=1 +kaynak=(https://www.paterva.com/malv4/community/MaltegoCE.v${surum}.zip) + +derle() { + cd "$SRC/MaltegoCommunity_4.0.11CE" + + mkdir -p "$PKG/usr/bin" + mkdir -p "$PKG/usr/share/maltego" + mkdir -p "$PKG/usr/share/doc/maltego" + + cp -aR * "$PKG/usr/share/maltego" + + cat > "$PKG/usr/bin/maltego" << EOF +#!/bin/sh +cd /usr/share/maltego/bin +exec ./maltego "\$@" +EOF + + chmod +x "$PKG/usr/bin/maltego" +} diff --git a/talimatname/genel/m/manokwari/talimat b/talimatname/genel/m/manokwari/talimat new file mode 100644 index 000000000..b382d5e00 --- /dev/null +++ b/talimatname/genel/m/manokwari/talimat @@ -0,0 +1,28 @@ +# Tanım: BlankOn Projelerinden HTML5 masaüstü kabuğu +# URL: https://manokwari.blankonlinux.or.id +# Paketçi: Cihan_Alkan +# Gerekler: gnome-common vala mutter libunique3 gnome-session glib gtk3 libwnck3 libgee webkitgtk3 gnome-menus libnotify +# Grup: manokwari + +isim=manokwari +surum=1.0.20 +devir=1 +kaynak=(https://github.com/BlankOn/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd ${isim}-${surum} + # Use libgee 0.8 rather than libgee 0.6 + sed -i 's/gee-1.0/gee-0.8/g' configure.ac + # Install documentation to the correct location + sed -i 's:\(manokwaridocdir =\).*:\1 ${prefix}/share/doc/manokwari:' Makefile.am + cat << @@@ > files/bin/Makefile.am +sessiondir = $(bindir) +dist_bin_SCRIPTS = blankon-session +CLEANFILES = $(dist_bin_SCRIPTS) +@@@ + ./autogen.sh --prefix=/usr + make + + make DESTDIR="$PKG/" install +# chmod +x $PKG/usr/bin/blankon-session +} diff --git a/talimatname/genel/m/marble/talimat b/talimatname/genel/m/marble/talimat new file mode 100644 index 000000000..1a275b558 --- /dev/null +++ b/talimatname/genel/m/marble/talimat @@ -0,0 +1,32 @@ +# Tanım: Marble, Dünya hakkında daha fazla bilgi edinmek için kullanabileceğiniz bir Sanal Küre ve Dünya Atlası'dır. +# URL: https://www.kde.org/applications/system/marble +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 qt5-webkit libwlocate kf5-kdoctools kf5-kio kf5-kparts kf5-knewstuff kf5-kcrash kf5-kcoreaddons kf5-ki18n kf5-kwallet kf5-krunner + +isim=marble +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +mkdir -p build +sed -e '/mobile/d' \ + -e '/qt/d' \ + -e '/Quick/d' \ + -e '/touch/d' \ + -i $isim-$surum/src/apps/CMakeLists.txt +cd build +cmake ../$isim-$surum \ + -DWITH_libshp=OFF \ + -DWITH_libgps=OFF \ + -DWITH_QextSerialPort=OFF \ + -DWITH_liblocation=OFF \ + -DBUILD_MARBLE_TOOLS=YES \ + -DBUILD_TESTING=OFF \ + -DBUILD_MARBLE_EXAMPLES=OFF \ + -DBUILD_MARBLE_TESTS=OFF \ + -DMOBILE=OFF +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/marco/marco.kur-kos b/talimatname/genel/m/marco/marco.kur-kos new file mode 100755 index 000000000..391272c83 --- /dev/null +++ b/talimatname/genel/m/marco/marco.kur-kos @@ -0,0 +1,4 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database + diff --git a/talimatname/genel/m/marco/talimat b/talimatname/genel/m/marco/talimat new file mode 100644 index 000000000..a62640d53 --- /dev/null +++ b/talimatname/genel/m/marco/talimat @@ -0,0 +1,23 @@ +# Tanım: MATE için bir pencere yöneticisi +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: libcanberra libgtop mate-desktop zenity intltool itstool + +isim=marco +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-startup-notification + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mariadb/mariadb.kur-kos b/talimatname/genel/m/mariadb/mariadb.kur-kos new file mode 100644 index 000000000..521749315 --- /dev/null +++ b/talimatname/genel/m/mariadb/mariadb.kur-kos @@ -0,0 +1,6 @@ +. /lib/lsb/init-functions +log_warning_msg "${WARNING} Create a /etc/mysql/my.cnf by comparing it with /etc/mysql/my.cnf.example ${NORMAL}" +log_warning_msg "${WARNING} Create a database if need by run the command: ${NORMAL}" +mkdir -p /srv/mysql +printf "# mysql_install_db --basedir=/usr --datadir=/srv/mysql --user=mysql\n" +printf "# chown -R mysql:mysql /srv/mysql\n" diff --git a/talimatname/genel/m/mariadb/mariadb.okubeni b/talimatname/genel/m/mariadb/mariadb.okubeni new file mode 100644 index 000000000..3c8f505eb --- /dev/null +++ b/talimatname/genel/m/mariadb/mariadb.okubeni @@ -0,0 +1,45 @@ +il est très important de procéder comme ci-dessous +pour avoir un serveur mysql sécurisé. +Installer le serveur mysql en procédant comme ceci + +***************************************************************** +* LES COMMANDES CI-DESSOUS DOIVENT ETRE RETAPEES TEL QUEL * +* NE PAS UTILISER LE COPIER / COLLER * +***************************************************************** + +1. Si le service mysql est en service, on l'arrête + +/etc/rc.d/init.d/mysql stop + +2. On lance le service en mode safe pour spécifier + le nouveau mot de passe de l'administrateur mysql + Noter que le & est très important pour avoir la main en console: + +mysqld_safe --user=mysql 2>&1 >/dev/null & + +3. On peut maintenant spécifier un nouveau mot de passe + pour le compte administrateur de mysql (root): + +mysqladmin -u root password <nouveau-mot-de-passe> + +4. La configuration du serveur est terminée. + Il faut arrêter le service mysql en mode safe, + le mot de passe entré en point 3 sera demandé: + +mysqladmin -p shutdown + + +5. Votre serveur mysql est maintenant sécurisé, vous pouvez démarrer le service + de façon définitive, si tout s'est déroulé correctement, il ne doit y avoir + AUCUNE erreur. Au prochain lancement de la machine, mysql se lancera correctement, + ne perdez pas le mot de passe administrateur: + +/etc/rc.d/init.d/mysql start + +Veuillez également consulter les pages concernant mysql + +version anglaise: +http://www.linuxfromscratch.org/blfs/view/svn/server/mysql.html + +version française: +http://lfs.traduc.org/view/blfs-svn/server/mysql.html diff --git a/talimatname/genel/m/mariadb/talimat b/talimatname/genel/m/mariadb/talimat new file mode 100644 index 000000000..9c57ce411 --- /dev/null +++ b/talimatname/genel/m/mariadb/talimat @@ -0,0 +1,139 @@ +# Tanım: MariaDB bir çatal ve MySQL ilişkisel veritabanı yönetim sisteminin yerini alıyor. +# URL: http://www.mariadb.org/en/about/ +# Paketçi: milisarge +# Gerekler: pcre cmake libevent + +isim=mariadb +surum=10.1.26 +devir=1 + +kaynak=(ftp://mirrors.fe.up.pt/pub/mariadb/mariadb-$surum/source/mariadb-$surum.tar.gz) + + +derle() { +cd $isim-$surum +mkdir build +cd build + +cmake $SRC/${isim}-${surum} \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DMYSQL_DATADIR=/var/lib/mysql \ + -DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock \ + -DDEFAULT_CHARSET=utf8 \ + -DDEFAULT_COLLATION=utf8_general_ci \ + -DENABLED_LOCAL_INFILE=ON \ + -DINSTALL_MANDIR=share/man \ + -DINSTALL_PLUGINDIR=/usr/lib/mysql/plugin \ + -DINSTALL_SCRIPTDIR=bin \ + -DINSTALL_INCLUDEDIR=include/mysql \ + -DINSTALL_DOCREADMEDIR=share/mysql \ + -DINSTALL_SUPPORTFILESDIR=share/mysql \ + -DINSTALL_MYSQLSHAREDIR=share/mysql \ + -DINSTALL_DOCDIR=share/mysql/docs \ + -DINSTALL_SHAREDIR=share/mysql \ + -DWITH_PCRE=system \ + -DWITH_READLINE=ON \ + -DWITH_ZLIB=system \ + -DWITH_SSL=system \ + -DWITH_LIBWRAP=OFF \ + -DWITH_EXTRA_CHARSETS=complex \ + -DWITH_EMBEDDED_SERVER=ON \ + -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ + -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ + -DWITH_INNOBASE_STORAGE_ENGINE=1 \ + -DWITH_PARTITION_STORAGE_ENGINE=1 \ + -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ + -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \ + -DWITHOUT_TOKUDB_STORAGE_ENGINE=1 \ + -DCMAKE_C_FLAGS="-fPIC ${CFLAGS} -fno-strict-aliasing -DBIG_JOINS=1 -fomit-frame-pointer" \ + -DCMAKE_CXX_FLAGS="-fPIC ${CXXFLAGS} -fno-strict-aliasing -DBIG_JOINS=1 -felide-constructors -fno-rtti" \ + -DWITH_MYSQLD_LDFLAGS="${LDFLAGS}" + +make + +make DESTDIR=$PKG install + +install -v -dm 755 $PKG/etc/mysql + +cat > $PKG/etc/mysql/my.cnf.example << "EOF" +# Begin /etc/mysql/my.cnf + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +socket = /run/mysqld/mysqld.sock + +# The MySQL server +[mysqld] +port = 3306 +socket = /run/mysqld/mysqld.sock +datadir = /srv/mysql +skip-external-locking +key_buffer_size = 16M +max_allowed_packet = 1M +sort_buffer_size = 512K +net_buffer_length = 16K +myisam_sort_buffer_size = 8M + +# Don't listen on a TCP/IP port at all. +#skip-networking + +# required unique id between 1 and 2^32 - 1 +server-id = 1 + +# Uncomment the following if you are using BDB tables +#bdb_cache_size = 4M +#bdb_max_lock = 10000 + +# Uncomment the following if you are using InnoDB tables +#innodb_data_home_dir = /srv/mysql +#innodb_data_file_path = ibdata1:10M:autoextend +#innodb_log_group_home_dir = /srv/mysql +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +#innodb_buffer_pool_size = 16M +#innodb_additional_mem_pool_size = 2M +# Set .._log_file_size to 25 % of buffer pool size +#innodb_log_file_size = 5M +#innodb_log_buffer_size = 8M +#innodb_flush_log_at_trx_commit = 1 +#innodb_lock_wait_timeout = 50 + +[mysqldump] +quick +max_allowed_packet = 16M + +[mysql] +no-auto-rehash +# Remove the next comment character if you are not familiar with SQL +#safe-updates + +[isamchk] +key_buffer = 20M +sort_buffer_size = 20M +read_buffer = 2M +write_buffer = 2M + +[myisamchk] +key_buffer_size = 20M +sort_buffer_size = 20M +read_buffer = 2M +write_buffer = 2M + +[mysqlhotcopy] +interactive-timeout + +# End /etc/mysql/my.cnf +EOF + + +#servis +cd /sources/milis.git/ayarlar/servisler +make DESTDIR=$PKG kur-mysql + +#gereksizler +rm -r ${PKG}/usr/{data,mysql-test,sql-bench} +rm ${PKG}/usr/share/man/man1/mysql-test-run.pl.1 +} diff --git a/talimatname/genel/m/masscan/talimat b/talimatname/genel/m/masscan/talimat new file mode 100644 index 000000000..3fd777819 --- /dev/null +++ b/talimatname/genel/m/masscan/talimat @@ -0,0 +1,19 @@ +# Tanım: TCP port tarayıcı,asenkron SYNC paketleri kullanarak tarama yapar. +# URL: https://github.com/robertdavidgraham/masscan +# Paketçi: milisarge +# Gerekler: libpcap + +isim=masscan +surum=master +devir=1 +kaynak=(https://github.com/robertdavidgraham/masscan/archive/master.tar.gz::$isim-master.tar.gz) + + +derle() { + cd ${isim}-master + make + make DESTDIR="${PKG}" install + install -Dm 644 doc/masscan.8 "${PKG}/usr/share/man/man8/masscan.8" + install -Dm 644 README.md "${PKG}/usr/share/doc/${isim}/README" + install -Dm 644 doc/masscan.8.markdown "${PKG}/usr/share/doc/${isim}/DOCUMENTATION" +} diff --git a/talimatname/genel/m/mate-applets/mate-applets.kur-kos b/talimatname/genel/m/mate-applets/mate-applets.kur-kos new file mode 100755 index 000000000..28c3e5d79 --- /dev/null +++ b/talimatname/genel/m/mate-applets/mate-applets.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor diff --git a/talimatname/genel/m/mate-applets/talimat b/talimatname/genel/m/mate-applets/talimat new file mode 100644 index 000000000..65b63da08 --- /dev/null +++ b/talimatname/genel/m/mate-applets/talimat @@ -0,0 +1,22 @@ +# Tanım: MATE paneli için appletler +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool gtksourceview3 libgtop libnotify mate-panel polkit dbus-python python-gobject upower wireless-tools + +isim=mate-applets +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/$isim \ + --enable-polkit \ + --enable-ipv6 + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-backgrounds/talimat b/talimatname/genel/m/mate-backgrounds/talimat new file mode 100644 index 000000000..34cb871a2 --- /dev/null +++ b/talimatname/genel/m/mate-backgrounds/talimat @@ -0,0 +1,17 @@ +# Tanım: MATE için arka plan resimleri ve verileri +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool + +isim=mate-backgrounds +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-calc/mate-calc.kur-kos b/talimatname/genel/m/mate-calc/mate-calc.kur-kos new file mode 100755 index 000000000..3b2f1e8c0 --- /dev/null +++ b/talimatname/genel/m/mate-calc/mate-calc.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-calc/talimat b/talimatname/genel/m/mate-calc/talimat new file mode 100644 index 000000000..6107df09c --- /dev/null +++ b/talimatname/genel/m/mate-calc/talimat @@ -0,0 +1,17 @@ +# Tanım: MATE masaüstü için hesap makinesi +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool gtk3 + +isim=mate-calc +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-common/talimat b/talimatname/genel/m/mate-common/talimat new file mode 100644 index 000000000..b1de38842 --- /dev/null +++ b/talimatname/genel/m/mate-common/talimat @@ -0,0 +1,17 @@ +# Tanım: MATE için yaygın geliştirme makroları +# URL: http://www.mate-desktop.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk-doc intltool + +isim=mate-common +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-control-center/mate-control-center.kur-kos b/talimatname/genel/m/mate-control-center/mate-control-center.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-control-center/mate-control-center.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-control-center/talimat b/talimatname/genel/m/mate-control-center/talimat new file mode 100644 index 000000000..fa70eb856 --- /dev/null +++ b/talimatname/genel/m/mate-control-center/talimat @@ -0,0 +1,26 @@ +# Tanım: MATE için Kontrol Merkezi +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool mate-desktop mate-menus mate-settings-daemon marco xorg-libxscrnsaver + +isim=mate-control-center +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --sbindir=/usr/bin \ + --localstatedir=/var \ + --disable-update-mimedb + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install + rm $PKG/usr/share/applications/mimeinfo.cache +} diff --git a/talimatname/genel/m/mate-desktop/mate-desktop.kur-kos b/talimatname/genel/m/mate-desktop/mate-desktop.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-desktop/mate-desktop.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-desktop/talimat b/talimatname/genel/m/mate-desktop/talimat new file mode 100644 index 000000000..7e9c55f1a --- /dev/null +++ b/talimatname/genel/m/mate-desktop/talimat @@ -0,0 +1,23 @@ +# Tanım: Çeşitli MATE modülleri için ortak API'li kitaplık +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: gobject-introspection intltool gtk3 startup-notification dconf + +isim=mate-desktop +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --disable-schemas-compile + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-icon-theme-faenza/mate-icon-theme-faenza.kur-kos b/talimatname/genel/m/mate-icon-theme-faenza/mate-icon-theme-faenza.kur-kos new file mode 100755 index 000000000..4122a22dc --- /dev/null +++ b/talimatname/genel/m/mate-icon-theme-faenza/mate-icon-theme-faenza.kur-kos @@ -0,0 +1,4 @@ +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/matefaenza +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/matefaenzadark +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/matefaenzagray + diff --git a/talimatname/genel/m/mate-icon-theme-faenza/talimat b/talimatname/genel/m/mate-icon-theme-faenza/talimat new file mode 100644 index 000000000..8eee7ae04 --- /dev/null +++ b/talimatname/genel/m/mate-icon-theme-faenza/talimat @@ -0,0 +1,19 @@ +# Tanım: MATE için Faenza simge teması +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: mate-common +# Grup: mate + +isim=mate-icon-theme-faenza +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./autogen.sh + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-icon-theme/mate-icon-theme.kur-kos b/talimatname/genel/m/mate-icon-theme/mate-icon-theme.kur-kos new file mode 100755 index 000000000..c583c7d85 --- /dev/null +++ b/talimatname/genel/m/mate-icon-theme/mate-icon-theme.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/mate +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/menta + diff --git a/talimatname/genel/m/mate-icon-theme/talimat b/talimatname/genel/m/mate-icon-theme/talimat new file mode 100644 index 000000000..d894e735e --- /dev/null +++ b/talimatname/genel/m/mate-icon-theme/talimat @@ -0,0 +1,19 @@ +# Tanım: MATE için simge teması +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: icon-naming-utils intltool +# Grup: mate + +isim=mate-icon-theme +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum +./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-indicator-applet/mate-indicator-applet.kur-kos b/talimatname/genel/m/mate-indicator-applet/mate-indicator-applet.kur-kos new file mode 100755 index 000000000..5078fa193 --- /dev/null +++ b/talimatname/genel/m/mate-indicator-applet/mate-indicator-applet.kur-kos @@ -0,0 +1 @@ +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor diff --git a/talimatname/genel/m/mate-indicator-applet/talimat b/talimatname/genel/m/mate-indicator-applet/talimat new file mode 100644 index 000000000..25f084ba5 --- /dev/null +++ b/talimatname/genel/m/mate-indicator-applet/talimat @@ -0,0 +1,19 @@ +# Tanım: MATE panelindeki çeşitli uygulamalardan gelen bilgileri görüntülemek için küçük bir applet +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: libindicator mate-panel +# Grup: mate + +isim=mate-indicator-applet +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ +--libexecdir=/usr/lib/$isim + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-media/mate-media.kur-kos b/talimatname/genel/m/mate-media/mate-media.kur-kos new file mode 100755 index 000000000..5dedec1b8 --- /dev/null +++ b/talimatname/genel/m/mate-media/mate-media.kur-kos @@ -0,0 +1 @@ +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-media/talimat b/talimatname/genel/m/mate-media/talimat new file mode 100644 index 000000000..39e383cfb --- /dev/null +++ b/talimatname/genel/m/mate-media/talimat @@ -0,0 +1,21 @@ +# Tanım: MATE için medya araçları +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool libcanberra libmatemixer mate-desktop +# Grup: mate + +isim=mate-media +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/$isim \ + --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-menus/talimat b/talimatname/genel/m/mate-menus/talimat new file mode 100644 index 000000000..5b1a904ef --- /dev/null +++ b/talimatname/genel/m/mate-menus/talimat @@ -0,0 +1,25 @@ +# Tanım: Freedesktop.org'dan Masaüstü Menüsü Teknik Özelliklerini uygulayan bir kütüphane +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: glib gobject-introspection intltool python + +isim=mate-menus +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-python + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-netbook/mate-netbook.kur-kos b/talimatname/genel/m/mate-netbook/mate-netbook.kur-kos new file mode 100644 index 000000000..1d319936d --- /dev/null +++ b/talimatname/genel/m/mate-netbook/mate-netbook.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/talimatname/genel/m/mate-netbook/talimat b/talimatname/genel/m/mate-netbook/talimat new file mode 100644 index 000000000..d24a9e31f --- /dev/null +++ b/talimatname/genel/m/mate-netbook/talimat @@ -0,0 +1,20 @@ +# Tanım: Basit bir pencere yönetim aracı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool libfakekey mate-panel +# Grup: mate + +isim=mate-netbook +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexec=/usr/lib/$isim \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-notification-daemon/mate-notification-daemon.kur-kos b/talimatname/genel/m/mate-notification-daemon/mate-notification-daemon.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-notification-daemon/mate-notification-daemon.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-notification-daemon/talimat b/talimatname/genel/m/mate-notification-daemon/talimat new file mode 100644 index 000000000..407905e7b --- /dev/null +++ b/talimatname/genel/m/mate-notification-daemon/talimat @@ -0,0 +1,24 @@ +# Tanım: MATE için bildirim uygulaması +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: dbus-glib libcanberra libwnck3 libnotify intltool +# Grup: mate + +isim=mate-notification-daemon +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-panel/mate-panel.kur-kos b/talimatname/genel/m/mate-panel/mate-panel.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-panel/mate-panel.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-panel/talimat b/talimatname/genel/m/mate-panel/talimat new file mode 100644 index 000000000..6e357ed2c --- /dev/null +++ b/talimatname/genel/m/mate-panel/talimat @@ -0,0 +1,28 @@ +# Tanım: MATE paneli +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: dbus-glib libwnck3 libcanberra libmateweather xorg-libsm mate-menus mate-desktop intltool itstool gobject-introspection + +isim=mate-panel +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-introspection \ + --with-gtk=3.0 + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} + +# vim: set ts=2 et: diff --git a/talimatname/genel/m/mate-polkit/talimat b/talimatname/genel/m/mate-polkit/talimat new file mode 100644 index 000000000..2356b215d --- /dev/null +++ b/talimatname/genel/m/mate-polkit/talimat @@ -0,0 +1,27 @@ +# Tanım: MATE masaüstü için PolicyKit entegrasyonu +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk3 polkit accountsservice gobject-introspection intltool +# Grup: mate + +isim=mate-polkit +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-introspection + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mate-power-manager/mate-power-manager.kur-kos b/talimatname/genel/m/mate-power-manager/mate-power-manager.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-power-manager/mate-power-manager.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-power-manager/talimat b/talimatname/genel/m/mate-power-manager/talimat new file mode 100644 index 000000000..0ce5997ef --- /dev/null +++ b/talimatname/genel/m/mate-power-manager/talimat @@ -0,0 +1,24 @@ +# Tanım: MATE masaüstü için güç yönetim aracı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool mate-panel dbus-glib libcanberra libgnome-keyring libnotify upower consolekit2 +# Grup: mate + +isim=mate-power-manager +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --sbindir=/usr/bin \ + --enable-applets \ + --disable-strict + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-screensaver-hacks/LICENSE b/talimatname/genel/m/mate-screensaver-hacks/LICENSE new file mode 100644 index 000000000..4f587b5a3 --- /dev/null +++ b/talimatname/genel/m/mate-screensaver-hacks/LICENSE @@ -0,0 +1,9 @@ +/* xscreensaver, Copyright (c) 1993-2006 Jamie Zawinski <jwz@jwz.org> + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ diff --git a/talimatname/genel/m/mate-screensaver-hacks/migrate-xscreensaver-config.sh b/talimatname/genel/m/mate-screensaver-hacks/migrate-xscreensaver-config.sh new file mode 100644 index 000000000..860a0d5dd --- /dev/null +++ b/talimatname/genel/m/mate-screensaver-hacks/migrate-xscreensaver-config.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +DIST_BIN=`dirname "$0"` + +CMD=xsltproc +XSL=${DIST_BIN}/xscreensaver-config.xsl + +if test "x$1" = "x" -o "x$1" = "x-h" -o "x$1" = "x--help"; then + echo "usage: $0 [file] ..." + exit 1 +fi + +if [ ! -r ${XSL} ]; then + echo "Cannot find XSLT file" + exit 1 +fi + +FILES="$@" +for FILE in $FILES; do + echo "${FILE}" | grep ".xml$" > /dev/null + if [ $? -ne 0 ]; then + echo "Skipping non-xml file: ${FILE}" + continue + fi + + d=`dirname ${FILE}` + b=`basename ${FILE} .xml` + + outfile="${b}.desktop" + echo "Creating: ${outfile}" + ${CMD} -o ${outfile} ${XSL} ${FILE} +done + + exit 0 diff --git a/talimatname/genel/m/mate-screensaver-hacks/talimat b/talimatname/genel/m/mate-screensaver-hacks/talimat new file mode 100644 index 000000000..acf957efd --- /dev/null +++ b/talimatname/genel/m/mate-screensaver-hacks/talimat @@ -0,0 +1,18 @@ +# Tanım: MATE için xscreensaver'dan ekran koruyucularını etkinleştir. +# URL: http://www.jwz.org/xscreensaver/ +# Paketçi: yasarciv +# Gerekler: xscreensaver + +isim=mate-screensaver-hacks +surum=5.26 +devir=1 +kaynak=(migrate-xscreensaver-config.sh + xscreensaver-config.xsl LICENSE) + +derle() { +mkdir -p ${PKG}/usr/share/applications/screensavers/ + cd ${PKG}/usr/share/applications/screensavers/ + sh $SRC/migrate-xscreensaver-config.sh /usr/share/xscreensaver/config/*.xml + rm ${PKG}/usr/share/applications/screensavers/popsquares.desktop + install -D -m644 ${SRC}/LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/m/mate-screensaver-hacks/xscreensaver-config.xsl b/talimatname/genel/m/mate-screensaver-hacks/xscreensaver-config.xsl new file mode 100644 index 000000000..039ffcdc9 --- /dev/null +++ b/talimatname/genel/m/mate-screensaver-hacks/xscreensaver-config.xsl @@ -0,0 +1,27 @@ +<?xml surum='1.0'?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + surum="1.0"> +<xsl:output method="text" indent="no" /> +<xsl:strip-space elements="*"/> + +<xsl:template match="screensaver"> +[Desktop Entry] +Encoding=UTF-8 +Name=<xsl:value-of select="@_label" /> +Comment=<xsl:value-of select="normalize-space(_description)" /> +<xsl:if test="count(command/@name) != 0"> +TryExec=<xsl:value-of select="normalize-space(command/@name)" /> +Exec=<xsl:value-of select="normalize-space(command/@name)" /><xsl:text> </xsl:text><xsl:value-of select="normalize-space(command/@arg)" /> +</xsl:if> +<xsl:if test="count(command/@name) = 0"> +TryExec=<xsl:value-of select="normalize-space(@name)" /> +Exec=<xsl:value-of select="normalize-space(@name)" /><xsl:text> </xsl:text><xsl:value-of select="normalize-space(command/@arg)" /> +</xsl:if> +StartupNotify=false +Terminal=false +Type=Application +Categories=Screensaver; +OnlyShowIn=MATE; +</xsl:template> + +</xsl:stylesheet> diff --git a/talimatname/genel/m/mate-screensaver/mate-screensaver.kur-kos b/talimatname/genel/m/mate-screensaver/mate-screensaver.kur-kos new file mode 100755 index 000000000..3b2f1e8c0 --- /dev/null +++ b/talimatname/genel/m/mate-screensaver/mate-screensaver.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-screensaver/talimat b/talimatname/genel/m/mate-screensaver/talimat new file mode 100644 index 000000000..e9b247c08 --- /dev/null +++ b/talimatname/genel/m/mate-screensaver/talimat @@ -0,0 +1,26 @@ +# Tanım: MATE için ekran koruyucu ve kilitleyici +# URL: http://www.mate-desktop.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool libmatekbd libnotify xorg-libxscrnsaver mate-desktop mate-menus mate-session-manager +# Grup: mate + +isim=mate-screensaver +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --with-xscreensaverdir=/usr/share/xscreensaver/config \ + --with-xscreensaverhackdir=/usr/lib/xscreensaver \ + --with-mit-ext \ + --with-libnotify \ + --enable-locking \ + --without-console-kit + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-sensors-applet/mate-sensors-applet.kur-kos b/talimatname/genel/m/mate-sensors-applet/mate-sensors-applet.kur-kos new file mode 100755 index 000000000..28c3e5d79 --- /dev/null +++ b/talimatname/genel/m/mate-sensors-applet/mate-sensors-applet.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor diff --git a/talimatname/genel/m/mate-sensors-applet/talimat b/talimatname/genel/m/mate-sensors-applet/talimat new file mode 100644 index 000000000..3e8bc0987 --- /dev/null +++ b/talimatname/genel/m/mate-sensors-applet/talimat @@ -0,0 +1,23 @@ +# Tanım: İşlemci sıcaklığı, fan hızı ve voltaj okumaları da dahil olmak üzere donanım sensörlerinden okumaları görüntülemek için kullanılan MATE Panel uygulaması +# URL: http://www.mate-desktop.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: docbook-xsl intltool itstool libatasmart libnotify lm-sensors mate-panel +# Grup: mate + +isim=mate-sensors-applet +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-session-manager/mate-session-manager.kur-kos b/talimatname/genel/m/mate-session-manager/mate-session-manager.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-session-manager/mate-session-manager.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-session-manager/talimat b/talimatname/genel/m/mate-session-manager/talimat new file mode 100644 index 000000000..dc646fb50 --- /dev/null +++ b/talimatname/genel/m/mate-session-manager/talimat @@ -0,0 +1,22 @@ +# Tanım: MATE oturum yönetici ve yapılandırma programı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: dbus-glib gtk3 xorg-libsm mate-desktop intltool xorg-xtrans gnome-keyring xdg-user-dirs + +isim=mate-session-manager +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-upower + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/m/mate-settings-daemon/mate-settings-daemon.kur-kos b/talimatname/genel/m/mate-settings-daemon/mate-settings-daemon.kur-kos new file mode 100755 index 000000000..4ee9aecf5 --- /dev/null +++ b/talimatname/genel/m/mate-settings-daemon/mate-settings-daemon.kur-kos @@ -0,0 +1,6 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/mate + diff --git a/talimatname/genel/m/mate-settings-daemon/talimat b/talimatname/genel/m/mate-settings-daemon/talimat new file mode 100644 index 000000000..390063195 --- /dev/null +++ b/talimatname/genel/m/mate-settings-daemon/talimat @@ -0,0 +1,25 @@ +# Tanım: MATE Ayarlar programı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: dbus-glib libcanberra libmatekbd libmatemixer libnotify mate-desktop nss polkit intltool + +isim=mate-settings-daemon +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --enable-polkit \ + --enable-pulse + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-system-monitor/mate-system-monitor.kur-kos b/talimatname/genel/m/mate-system-monitor/mate-system-monitor.kur-kos new file mode 100755 index 000000000..3b2f1e8c0 --- /dev/null +++ b/talimatname/genel/m/mate-system-monitor/mate-system-monitor.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-system-monitor/talimat b/talimatname/genel/m/mate-system-monitor/talimat new file mode 100644 index 000000000..522ba2e76 --- /dev/null +++ b/talimatname/genel/m/mate-system-monitor/talimat @@ -0,0 +1,20 @@ +# Tanım: MATE için bir sistem monitörü +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool gtkmm3 libgtop libwnck3 +# Grup: mate + +isim=mate-system-monitor +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-terminal/mate-terminal.kur-kos b/talimatname/genel/m/mate-terminal/mate-terminal.kur-kos new file mode 100755 index 000000000..3b2f1e8c0 --- /dev/null +++ b/talimatname/genel/m/mate-terminal/mate-terminal.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-terminal/talimat b/talimatname/genel/m/mate-terminal/talimat new file mode 100644 index 000000000..72bca7b29 --- /dev/null +++ b/talimatname/genel/m/mate-terminal/talimat @@ -0,0 +1,18 @@ +# Tanım: MATE terminal emülatorü +# URL: http://www.mate-desktop.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool xorg-libsm mate-desktop vte3 dconf +# Grup: mate + +isim=mate-terminal +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-themes/mate-themes.kur-kos b/talimatname/genel/m/mate-themes/mate-themes.kur-kos new file mode 100644 index 000000000..0ebf352bf --- /dev/null +++ b/talimatname/genel/m/mate-themes/mate-themes.kur-kos @@ -0,0 +1,3 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/ContrastHigh +gtk-update-icon-cache -q -t -f /usr/share/icons/mate + diff --git a/talimatname/genel/m/mate-themes/talimat b/talimatname/genel/m/mate-themes/talimat new file mode 100644 index 000000000..610bd9120 --- /dev/null +++ b/talimatname/genel/m/mate-themes/talimat @@ -0,0 +1,18 @@ +# Tanım: MATE temaları +# URL: http://mate-desktop.org +# Paketçi: milisarge yasarciv +# Gerekler: gtk2 intltool gtk-engines gtk-engine-murrine mate-icon-theme + + +isim=mate-themes +surum=3.22.12 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/themes/${surum%.*}.tar.xz) + +derle() { + cd ${isim}-${surum} + ./configure \ + --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-user-guide/talimat b/talimatname/genel/m/mate-user-guide/talimat new file mode 100644 index 000000000..83300f2bd --- /dev/null +++ b/talimatname/genel/m/mate-user-guide/talimat @@ -0,0 +1,20 @@ +# Tanım: MATE Kullanım Kılavuzu +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: yelp itstool intltool +# Grup: mate + +isim=mate-user-guide +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install + +} + diff --git a/talimatname/genel/m/mate-user-share/mate-user-share.kur-kos b/talimatname/genel/m/mate-user-share/mate-user-share.kur-kos new file mode 100644 index 000000000..a96c64f40 --- /dev/null +++ b/talimatname/genel/m/mate-user-share/mate-user-share.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +update-desktop-database -q diff --git a/talimatname/genel/m/mate-user-share/talimat b/talimatname/genel/m/mate-user-share/talimat new file mode 100644 index 000000000..26c9b92f7 --- /dev/null +++ b/talimatname/genel/m/mate-user-share/talimat @@ -0,0 +1,25 @@ +# Tanım: MATE için WebDAV aracılığıyla kullanıcı düzeyinde ortak dosya paylaşımı +# URL: http://www.mate-desktop.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: caja dbus-glib intltool itstool libcanberra libnotify gtk3 mod-dnssd +# Grup: mate + +isim=mate-user-share +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr \ + --libexec=/usr/lib/$isim \ + --sysconfdir=/etc \ + --disable-bluetooth + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mate-utils/mate-utils.kur-kos b/talimatname/genel/m/mate-utils/mate-utils.kur-kos new file mode 100755 index 000000000..22fbaee6f --- /dev/null +++ b/talimatname/genel/m/mate-utils/mate-utils.kur-kos @@ -0,0 +1,5 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mate-utils/talimat b/talimatname/genel/m/mate-utils/talimat new file mode 100644 index 000000000..edf5150f6 --- /dev/null +++ b/talimatname/genel/m/mate-utils/talimat @@ -0,0 +1,26 @@ +# Tanım: Disk kullanımı, günlükleri ve yazı tiplerini görüntüleme, ekran görüntüsü alma, sözlükleri yönetme ve dosyaları arama için ortak MATE yardımcı programları +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool mate-panel mate-desktop libcanberra libgtop xorg-libsm +# Grup: mate + +isim=mate-utils +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc \ + --disable-maintainer-flags + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/m/mate/talimat b/talimatname/genel/m/mate/talimat new file mode 100644 index 000000000..7a6779d4e --- /dev/null +++ b/talimatname/genel/m/mate/talimat @@ -0,0 +1,15 @@ +# Tanım: mate sistem +# URL: sistem +# Paketçi: yasarciv67 +# Gerekler: atril caja caja-extensions engrampa eom libmatekbd libmatemixer libmateweather libpeas marco mate-applets mate-backgrounds mate-calc mate-common mate-control-center mate-desktop mate-icon-theme mate-icon-theme-faenza mate-indicator-applet mate-media mate-menus mate-netbook mate-notification-daemon mate-panel mate-polkit mate-power-manager mate-screensaver mate-sensors-applet mate-session-manager mate-settings-daemon mate-system-monitor mate-terminal mate-themes mate-user-guide mate-user-share mate-utils mozo pluma python-caja + +isim=mate +surum=1 +devir=1 + +kaynak=(talimat) + +derle() { +mkdir $PKG/tmp +echo "mate sistem" > $PKG/tmp/masa +} diff --git a/talimatname/genel/m/maven/maven.sh b/talimatname/genel/m/maven/maven.sh new file mode 100644 index 000000000..7fc96502b --- /dev/null +++ b/talimatname/genel/m/maven/maven.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +export MAVEN_OPTS=-Xmx512m +#export M2_HOME=/opt/maven +#export PATH=$PATH:$M2_HOME/bin diff --git a/talimatname/genel/m/maven/talimat b/talimatname/genel/m/maven/talimat new file mode 100644 index 000000000..cc30f6f50 --- /dev/null +++ b/talimatname/genel/m/maven/talimat @@ -0,0 +1,36 @@ +# Tanım: Bir Java proje yönetimi ve proje anlama aracı +# URL: http://maven.apache.org +# Paketçi: milisarge +# Gerekler: openjdk +# Grup: geliştirme + +isim=maven +surum=3.5.2 +devir=1 +kaynak=(http://apache-mirror.rbc.ru/pub/apache/maven/maven-3/$surum/source/apache-maven-$surum-src.tar.gz + maven.sh) + + +derle() { + + mkdir $SRC/maven-bin + if [ ! -f $DERLEME_KAYNAKDIZIN/apache-maven-$surum-bin.tar.gz ];then + wget http://apache-mirror.rbc.ru/pub/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz \ + -P $DERLEME_KAYNAKDIZIN/ + fi + [ -f $DERLEME_KAYNAKDIZIN/apache-maven-$surum-bin.tar.gz ] && tar xf $DERLEME_KAYNAKDIZIN/apache-maven-$surum-bin.tar.gz \ + -C $SRC/maven-bin + cd "$SRC"/apache-maven-$surum + + export PATH=${PATH}:/opt/jdk/bin + + mkdir -p "$SRC"/repo + mkdir -p "$PKG"/opt/maven + mkdir -p "$PKG"/usr/bin + + $SRC/maven-bin/apache-maven-3.5.2/bin/mvn package -Dmaven.repo.local="$SRC"/repo -DdistributionTargetDir="$PKG"/opt/maven + + install -D -m 755 "$SRC"/maven.sh "$PKG"/etc/profile.d/maven.sh + ln -s /opt/maven/bin/mvn "$PKG"/usr/bin/mvn + ln -s /opt/maven/bin/mvnDebug "$PKG"/usr/bin/mvnDebug +} diff --git a/talimatname/genel/m/mbedtls/talimat b/talimatname/genel/m/mbedtls/talimat new file mode 100644 index 000000000..99120e82b --- /dev/null +++ b/talimatname/genel/m/mbedtls/talimat @@ -0,0 +1,22 @@ +# Tanım: Gömülü sistemler için şifreleme kütüphanesi (eskiden PolarSSL olarak bilinir). +# URL: https://tls.mbed.org +# Paketçi: milisarge +# Gerekler: + +isim=mbedtls +surum=2.3.0 +devir=1 + +kaynak=(https://tls.mbed.org/download/mbedtls-$surum-gpl.tgz) + +derle() { + cd $isim-$surum + sed -i 's|//\(#define MBEDTLS_THREADING_C\)|\1|' include/mbedtls/config.h + sed -i 's|//\(#define MBEDTLS_THREADING_PTHREAD\)|\1|' include/mbedtls/config.h + + # FS#49914 (2.3.0-2) + sed -i 's|<time.h>|"platform.h"|' include/mbedtls/ssl.h + LDFLAGS+=" -I../include " make SHARED=1 no_test + make SHARED=1 check + make DESTDIR=$PKG/usr install +} diff --git a/talimatname/genel/m/mc/talimat b/talimatname/genel/m/mc/talimat new file mode 100644 index 000000000..15a537569 --- /dev/null +++ b/talimatname/genel/m/mc/talimat @@ -0,0 +1,20 @@ +# Tanım: Midnight Commander, Norton Commander'ı öykünen metin tabanlı bir dosya yöneticisi/kabuğu +# URL: https://www.midnight-commander.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: pcre glib gpm + +isim=mc +surum=4.8.15 +devir=1 + +kaynak=(https://www.midnight-commander.org/downloads/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--enable-charset \ +--disable-static \ +--sysconfdir=/etc \ +--with-screen=ncurses +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mdadm/talimat b/talimatname/genel/m/mdadm/talimat new file mode 100644 index 000000000..5ac372acd --- /dev/null +++ b/talimatname/genel/m/mdadm/talimat @@ -0,0 +1,18 @@ +# Tanım: The mdadm package contains administration tools for software RAID. +# URL: http://www.cse.unsw.edu.au/~neilb/source/mdadm/ +# Paketçi: milisarge +# Gerekler: + +isim=mdadm +surum=3.4 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/utils/raid/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +sed -i 's/Wall -Werror/Wall/' Makefile +make +make INSTALL=/usr/bin/install DESTDIR=$PKG install +rm -r $PKG/lib +} diff --git a/talimatname/genel/m/mdds/talimat b/talimatname/genel/m/mdds/talimat new file mode 100644 index 000000000..d878c2a98 --- /dev/null +++ b/talimatname/genel/m/mdds/talimat @@ -0,0 +1,17 @@ +# Tanım: Çok boyutlu veri yapıları ve indeksleme algoritmalarının bir koleksiyonu +# URL: https://gitlab.com/mdds/mdds +# Paketçi: Cihan Alkan +# Gerekler: boost + +isim=mdds +surum=1.2.3 +devir=1 + +kaynak=(https://kohei.us/files/mdds/src/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./autogen.sh --prefix=/usr + make DESTDIR=$PKG install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/m/mdm/defaults.conf b/talimatname/genel/m/mdm/defaults.conf new file mode 100644 index 000000000..fb6bd308a --- /dev/null +++ b/talimatname/genel/m/mdm/defaults.conf @@ -0,0 +1,748 @@ +# MDM System Defaults Configuration file. +# +# This file should not be updated by hand. Since GDM 2.13.0.4, configuration +# choices in the MDM Custom Configuration file will override the default +# values specified in this file. This MDM System Defaults Configuration file +# may be overwritten on upgrade, so to ensure that your configuration choices +# are not lost, please make sure that your changes are made only the MDM Custom +# Configuration file. The MDM Custom Configuration file is found at the +# following location: +# +# /etc/mdm/custom.conf +# +# If you were using an older version of MDM, your system may have the the older +# mdm.conf configuration file on the system. If so, then this file is used +# instead of the MDM Custom Configuration file for backwards support. If you +# make changes to the MDM Custom Configuration file and they seem to not be +# taking effect, this is likely the problem. Consider migrating your +# configuration to the new configuration file and removing the mdm.conf file. +# +# You can use the mdmsetup program to graphically edit the mdm.conf-custom +# file. Note that mdmsetup does not support every option in this file, just +# the most common ones that users want to change. If you feel that mdmsetup +# should support additional configuration options, please file a bug report at +# http://bugzilla.gnome.org/. +# +# If you hand-edit the MDM configuration, you should run the following command +# to get the MDM daemon to recognize the change. Any running MDM GUI programs +# will also be notified to update with the new configuration. +# +# mdmflexiserver --command="UPDATE_CONFIG <configuration key>" +# +# e.g, the "Enable" key in the "[debug]" section would be "debug/Enable". +# +# You can also run mdm-restart or mdm-safe-restart to cause MDM to restart and +# re-read the new configuration settings. You can also restart MDM by sending +# a HUP or USR1 signal to the daemon. HUP behaves like mdm-restart and causes +# any user session started by MDM to exit immediately while USR1 behaves like +# mdm-safe-restart and will wait until all users log out before restarting MDM. +# +# For full reference documentation see the GNOME help browser under +# GNOME|System category. You can also find the docs in HTML form on +# http://www.gnome.org/projects/mdm/ +# +# NOTE: Some values are commented out, but show their default values. Lines +# that begin with "#" are considered comments. +# +# Have fun! + +[daemon] +# Automatic login, if true the first attached screen will automatically logged +# in as user as set with AutomaticLogin key. +AutomaticLoginEnable=false +AutomaticLogin= + +# Timed login, useful for kiosks. Log in a certain user after a certain amount +# of time. +TimedLoginEnable=false +TimedLogin= +TimedLoginDelay=30 + +# The MDM configuration program that is run from the login screen, you should +# probably leave this alone. +#Configurator=/usr/sbin/mdmsetup --disable-sound --disable-crash-dialog + +# The chooser program. Must output the chosen host on stdout, probably you +# should leave this alone. +#Chooser=/usr/lib/mdm/mdmchooser + +# The greeter for attached (non-xdmcp) logins. Change mdmlogin to mdmgreeter +# to get the new graphical greeter. +#Greeter=/usr/lib/mdm/mdmlogin + +# The greeter for xdmcp logins, usually you want a less graphically intensive +# greeter here so it's better to leave this with mdmlogin +#RemoteGreeter=/usr/lib/mdm/mdmlogin + +# Launch the greeter with an additional list of colon separated GTK+ modules. +# This is useful for enabling additional feature support e.g. GNOME +# accessibility framework. Only "trusted" modules should be allowed to minimize +# security holes +AddGtkModules=true +# By default, these are the accessibility modules. +GtkModulesList=gail:atk-bridge:/usr/lib/gtk-2.0/modules/libdwellmouselistener:/usr/lib/gtk-2.0/modules/libkeymouselistener + +# Default path to set. The profile scripts will likely override this value. +# This value will be overridden with the value from /etc/default/login if it +# contains "ROOT=<pathvalue>". +#DefaultPath=/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin:/opt/X11R6/bin +# Default path for root. The profile scripts will likely override this value. +# This value will be overridden with the value from /etc/default/login if it +# contains "SUROOT=<pathvalue>". +#RootPath=/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin:/opt/X11R6/bin + +# If you are having trouble with using a single server for a long time and want +# MDM to kill/restart the server, turn this on. On Solaris, this value is +# always true and this configuration setting is ignored. +AlwaysRestartServer=true + +# User and group used for running MDM GUI applications. By default this is set +# to user "mdm" and group "mdm". This user/group should have very limited +# permissions and access to only the mdm directories and files. +User=mdm +Group=mdm + +# To try to kill all clients started at greeter time or in the Init script. +# does not always work, only if those clients have a window of their own. +#KillInitClients=true +LogDir=/var/log/mdm + +# Note that a post login script is run before a PreSession script. It is run +# after the login is successful and before any setup is run on behalf of the +# user. +PostLoginScriptDir=/etc/mdm/PostLogin/ +PreSessionScriptDir=/etc/mdm/PreSession/ +PostSessionScriptDir=/etc/mdm/PostSession/ +DisplayInitDir=/etc/mdm/Init +# Distributions: If you have some script that runs an X server in say VGA +# mode, allowing a login, could you please send it to me? +#FailsafeXServer= +# if X keeps crashing on us we run this script. The default one does a bunch +# of cool stuff to figure out what to tell the user and such and can run an X +# configuration program. +XKeepsCrashing=/etc/mdm/XKeepsCrashing + +# System command support. +# +# Reboot, Halt and suspend commands, you can add different commands separated +# by a semicolon. MDM will use the first one it can find. +RebootCommand=/sbin/reboot;/sbin/shutdown -r now +HaltCommand=/sbin/poweroff;/sbin/shutdown -h now +SuspendCommand=/usr/sbin/pm-suspend + +# The following options specify how MDM system commands are supported. +# +# Specify which actions are displayed in the greeter. Valid values are HALT, +# REBOOT, SUSPEND, and CUSTOM_CMD separated by semicolons. +SystemCommandsInMenu=HALT;REBOOT;SUSPEND;CUSTOM_CMD + +# Specify which actions are supported by QUERY_LOGOUT_ACTION, SET_LOGOUT_ACTION +# and SET_SAFE_LOGOUT_ACTION. Valid values are HALT, REBOOT, SUSPEND, and +# CUSTOM_CMD separated by semicolons. +AllowLogoutActions=HALT;REBOOT;SUSPEND;CUSTOM_CMD + +# This feature is only functional if MDM is compiled with RBAC (Role Based +# Access Control) support. +# Specify the RBAC key used to determine if the user has permission to use +# the action via QUERY_LOGOUT_ACTION, SET_LOGOUT_ACTION and +# SET_SAFE_LOGOUT_ACTION. The MDM GUI will only display the action if the +# "mdm" user has RBAC permissions to use the action. RBAC keys for multiple +# actions can be specified by separating them by semicolons. The format for +# each is "Action:RBAC key". If an action is not specified, it is assumed +# all users have permission for this action. For example: +# HALT:key.for.halt,REBOOT:key.for.reboot,[...] +RBACSystemCommandKeys= + +# Probably should not touch the below this is the standard setup. +ServAuthDir=/var/lib/mdm +# This is our standard startup script. A bit different from a normal X +# session, but it shares a lot of stuff with that. See the provided default +# for more information. +BaseXsession=/etc/mdm/Xsession +# This is a directory where .desktop files describing the sessions live. It is +# really a PATH style variable since 2.4.4.2 to allow actual interoperability +# with KDM. Note that <dmconfdir>/Sessions is there for backwards +# compatibility reasons with 2.4.4.x. +#SessionDesktopDir=/etc/X11/sessions/:/etc/dm/Sessions/:/usr/share/mdm/BuiltInSessions/:/usr/share/xsessions/ +# This is the default .desktop session. One of the ones in SessionDesktopDir +#DefaultSession=gnome.desktop +# Better leave this blank and HOME will be used. You can use syntax ~/ below +# to indicate home directory of the user. You can also set this to something +# like /tmp if you don't want the authorizations to be in home directories. +# This is useful if you have NFS mounted home directories. Note that if this +# is the home directory the UserAuthFBDir will still be used in case the home +# directory is NFS, see security/NeverPlaceCookiesOnNFS to override this +# behavior. +UserAuthDir= +# Fallback directory for writing authorization file if user's home directory +# is not writable. +UserAuthFBDir=/tmp +UserAuthFile=.Xauthority +# The X server to use if we can't figure out what else to run. +StandardXServer=/usr/bin/Xorg +# The maximum number of flexible X servers to run. +#FlexibleXServers=5 +# And after how many minutes should we reap the flexible server if there is no +# activity and no one logged on. Set to 0 to turn off the reaping. Does not +# affect nested flexiservers. +#FlexiReapDelayMinutes=5 + +# The X nest command. +# Examples of valid commands (assuming installed to /usr/X11/bin: +# Xorg Xnest: /usr/X11/bin/Xnest -audit 0 -name Xnest +# Xsun Xnest: /usr/openwin/bin/Xnest -audit 0 -name Xnest -pn +# Xephyr: /usr/X11/bin/Xephyr -audit 0 +Xnest=/usr/bin/Xephyr -audit 0 +# Xsun Xnest does not support font paths (passed into Xnest -fp argument) +# that include the ":unscaled" suffix after a path name. Setting this to +# false will strip any ":unscaled" suffix from the font path. If not +# using this Xnest, the value should be true. +XnestUnscaledFontPath=true + +# Automatic VT allocation. Right now only works on Linux. This way we force +# X to use specific vts. Turn VTAllocation to false if this is causing +# problems. +#FirstVT=7 +#VTAllocation=true +# Should double login be treated with a warning (and possibility to change VT's +# on Linux and FreeBSD systems for console logins) +#DoubleLoginWarning=true +# Should a second login always resume the current session and switch VT's on +# Linux and FreeBSD systems for console logins +#AlwaysLoginCurrentSession=true + +# If true then the last login information is printed to the user before being +# prompted for password. While this gives away some info on what users are on +# a system, it on the other hand should give the user an idea of when they +# logged in and if it doesn't seem kosher to them, they can just abort the +# login and contact the sysadmin (avoids running malicious startup scripts). +#DisplayLastLogin=false + +# Program used to play sounds. Should not require any 'daemon' or anything +# like that as it will be run when no one is logged in yet. +#SoundProgram=/usr/bin/play + +# These are the languages that the console cannot handle because of font +# issues. Here we mean the text console, not X. This is only used when there +# are errors to report and we cannot start X. +# This is the default: +#ConsoleCannotHandle=am,ar,az,bn,el,fa,gu,hi,ja,ko,ml,mr,pa,ta,zh + +# This determines whether MDM will honor requests DYNAMIC requests from the +# mdmdynamic command. +#DynamicXServers=false + +# This determines whether MDM will send notifications to the console. +#ConsoleNotify=true + +# How long mdm should wait before it assumes a started Xserver is defunct and +# kills it. 10 seconds should be long enough for X, but Xgl may need 20 or 25. +MdmXserverTimeout=10 + +[security] +# Allow root to login. It makes sense to turn this off for kiosk use, when +# you want to minimize the possibility of break in. +AllowRoot=true +# Allow login as root via XDMCP. This value will be overridden and set to +# false if the /etc/default/login file exists and contains +# "CONSOLE=/dev/login", and set to true if the /etc/default/login file exists +# and contains any other value or no value for CONSOLE. +AllowRemoteRoot=false +# This will allow remote timed login. +AllowRemoteAutoLogin=false +# 0 is the most restrictive, 1 allows group write permissions, 2 allows all +# write permissions. +RelaxPermissions=0 +# Check if directories are owned by logon user. Set to false, if you have, for +# example, home directories owned by some other user. +CheckDirOwner=true +# If your HOME is managed by automounter, set to true +SupportAutomount=false +# Number of seconds to wait after a failed login +#RetryDelay=1 +# Maximum size of a file we wish to read. This makes it hard for a user to DoS +# us by using a large file. +#UserMaxFile=65536 +# If true this will basically append -nolisten tcp to every X command line, a +# good default to have (why is this a "negative" setting? because if it is +# false, you could still not allow it by setting command line of any particular +# server). It's probably better to ship with this on since most users will not +# need this and it's more of a security risk then anything else. +# Note: Anytime we find a -query or -indirect on the command line we do not add +# a "-nolisten tcp", as then the query just wouldn't work, so this setting only +# affects truly attached sessions. +#DisallowTCP=true +# By default never place cookies if we "detect" NFS. We detect NFS by +# detecting "root-squashing". It seems bad practice to place cookies on things +# that go over the network by default and thus we do not do it by default. +# Sometimes you can however use safe remote filesystems where this is OK and +# you may want to have the cookie in your home directory. +#NeverPlaceCookiesOnNFS=true +# Will cause PAM_DISALLOW_NULL_AUTHTOK to be passed as a flag to +# pam_authenticate and pam_acct_mgmt, disallowing NULL password. This setting +# will only take effect if PAM is being used by MDM. This value will be +# overridden with the value from /etc/default/login if it contains +# "PASSREQ=[YES|NO]" +#PasswordRequired=false +# Specifies the PAM Stack to use, "mdm" by default. +PamStack=mdm +# MDM allows configuration of how ut_line is set when it does utmp/wtmp and +# audit processing. If VT is being used, then ut_line will be set to the +# device associated with the VT. If the console is attached and has a device +# name specified in the [servers] section, then this value will be used. +# Otherwise the value is defaulted to the value specified in UtmpLineAttached +# for attached displays and UtmpLineRemote for remote displays. The value +# can be left empty which means that ut_line will be set to an empty value +# (if not VT and no value specified in the [servers] section. The values +# can contain "%d" which is translated to the DISPLAY value or %h which +# is translated to the hostname. The values for both keys must begin with +# "/dev/". +UtmpLineAttached=/dev/console +UtmpLineRemote= +# If true and the specified UtmpLineAttached or UtmpLineRemote does not exist, +# then create a pseudo-device filename that will be touched when the utmp +# record is updated. Creating such a psuedo-device ensures that programs +# that stat the utmp device associated with ut_line such as finger, last, +# etc. work in a reasonable way. +UtmpPseudoDevice=false + +# XDMCP is the protocol that allows remote login. If you want to log into MDM +# remotely (I'd never turn this on on open network, use ssh for such remote +# usage). You can then run X with -query <thishost> to log in, or +# -indirect <thishost> to run a chooser. Look for the 'Terminal' server type +# at the bottom of this config file. +[xdmcp] +# Distributions: Ship with this off. It is never a safe thing to leave out on +# the net. Setting up /etc/hosts.allow and /etc/hosts.deny to only allow local +# access is another alternative but not the safest. Firewalling port 177 is +# the safest if you wish to have xdmcp on. Read the manual for more notes on +# the security of XDMCP. +Enable=false +# Honor indirect queries, we run a chooser for these, and then redirect the +# user to the chosen host. Otherwise we just log the user in locally. +#HonorIndirect=true +# Maximum pending requests. +#MaxPending=4 +#MaxPendingIndirect=4 +# Maximum open XDMCP sessions at any point in time. +#MaxSessions=16 +# Maximum wait times. +#MaxWait=15 +#MaxWaitIndirect=15 +# How many times can a person log in from a single host. Usually better to +# keep low to fend off DoS attacks by running many logins from a single host. +# This is now set at 2 since if the server crashes then MDM doesn't know for +# some time and wouldn't allow another session. +#DisplaysPerHost=2 +# The number of seconds after which a non-responsive session is logged off. +# Better keep this low. +#PingIntervalSeconds=15 +# The port. 177 is the standard port so better keep it that way. +#Port=177 +# Willing script, none is shipped and by default we'll send hostname system id. +# But if you supply something here, the output of this script will be sent as +# status of this host so that the chooser can display it. You could for +# example send load, or mail details for some user, or some such. +#Willing=/etc/mdm/Xwilling + +[gui] +# The specific gtkrc file we use. It should be the full path to the gtkrc that +# we need. Unless you need a specific gtkrc that doesn't correspond to a +# specific theme, then just use the GtkTheme key. +#GtkRC=/usr/share/themes/Default/gtk-2.0/gtkrc + +# The GTK+ theme to use for the GUI. +GtkTheme=BlackMATE +# If to allow changing the GTK+ (widget) theme from the greeter. Currently +# this only affects the standard greeter as the graphical greeter does not yet +# have this ability. +AllowGtkThemeChange=true +# Comma separated list of themes to allow. These must be the names of the +# themes installed in the standard locations for gtk themes. You can also +# specify 'all' to allow all installed themes. These should be just the +# basenames of the themes such as 'Thinice' or 'LowContrast'. +GtkThemesToAllow=all + +# Maximum size of an icon, larger icons are scaled down. +#MaxIconWidth=128 +#MaxIconHeight=128 + +[greeter] +# The following options for setting titlebar and setting window position are +# only useful for the standard login (mdmlogin) and are not used by the +# themed login (mdmgreeter). +# +# The standard login has a title bar that the user can move. +#TitleBar=true +# Don't allow user to move the standard login window. Only makes sense if +# TitleBar is on. +#LockPosition=false +# Set a position for the standard login window rather then just centering the +# window. If you enter negative values for the position it is taken as an +# offset from the right or bottom edge. +#SetPosition=false +#PositionX=0 +#PositionY=0 + +# Enable the Face browser. Note that the Browser key is only used by the +# standard login (mdmlogin) program. The Face Browser is enabled in +# the Graphical greeter by selecting a theme that includes the Face +# Browser, such as happygnome-list. The other configuration values that +# affect the Face Browser (MinimalUID, DefaultFace, Include, Exclude, +# IncludeAll, GlobalFaceDir) are used by both the Standard and Themed +# greeter. +Browser=true +# The default picture in the browser. +DefaultFace=/usr/share/pixmaps/nobody.png +# User ID's less than the MinimalUID value will not be included in the face +# browser or in the mdmselection list for Automatic/Timed login. They will not +# be displayed regardless of the settings for Include and Exclude. +MinimalUID=100 +# Users listed in Include will be included in the face browser and in the +# mdmsetup selection list for Automatic/Timed login. Users should be separated +# by commas. +Include=users +# Users listed in Exclude are excluded from the face browser and from the +# mdmsetup selection list for Automatic/Timed login. Excluded users will still +# be able to log in, but will have to type their username. Users should be +# separated by commas. +Exclude=bin,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,mdm,postgres,pvm,rpm,nfsnobody,pcap +# By default, an empty include list means display no users. By setting +# IncludeAll to true, the password file will be scanned and all users will be +# displayed except users excluded via the Exclude setting and user ID's less +# than MinimalUID. Scanning the password file can be slow on systems with +# large numbers of users and this feature should not be used in such +# environments. The setting of IncludeAll does nothing if Include is set to a +# non-empty value. +IncludeAll=true +# If user or user.png exists in this dir it will be used as his picture. +GlobalFaceDir=/usr/share/pixmaps/faces/ + +# File which contains the locale we show to the user. Likely you want to use +# the one shipped with MDM and edit it. It is not a standard locale.alias +# file, although MDM will be able to read a standard locale.alias file as well. +#LocaleFile=/etc/mdm/locale.alias +# Logo shown in the standard greeter. +#Logo=/usr/share/pixmaps/mdm-foot-logo.png +# Logo shown on file chooser button in mdmsetup (do not modify this value). +#ChooserButtonLogo=/usr/share/pixmaps/mdm-foot-logo.png +# The standard greeter should shake if a user entered the wrong username or +# password. Kind of cool looking +#Quiver=true + +# The Actions menu (formerly system menu) is shown in the greeter, this is the +# menu that contains reboot, shutdown, suspend, config and chooser. None of +# these is available if this is off. They can be turned off individually +# however. +SystemMenu=true +# Configuration is available from the system menu of the greeter. +ConfigAvailable=true +# Should the chooser button be shown. If this is shown, MDM can drop into +# chooser mode which will run the xdmcp chooser locally and allow the user to +# connect to some remote host. Local XDMCP does not need to be enabled, +# however. +ChooserButton=true + +# Welcome is for all console logins and RemoteWelcome is for remote logins +# (through XDMCP). +# DefaultWelcome and DefaultRemoteWelcome set the string for Welcome to +# "Welcome" and for DefaultWelcome to "Welcome to %n", and properly translate +# the message to the appropriate language. Note that %n gets translated to the +# hostname of the machine. These default values can be overridden by setting +# DefaultWelcome and/or DefaultRemoteWelcome to false, and setting the Welcome +# and DefaultWelcome values as desired. Just make sure the strings are in +# utf-8 Note to distributors, if you wish to have a different Welcome string +# and wish to have this translated you can have entries such as +# "Welcome[cs]=Vitejte na %n". +DefaultWelcome=true +DefaultRemoteWelcome=true +#Welcome=Welcome +#RemoteWelcome=Welcome to %n + +# Xinerama screen we use to display the greeter on. Not for true multihead, +# currently only works for Xinerama. +XineramaScreen=0 +# Background settings for the standard greeter: +# Type can be 0=None, 1=Image & Color, 2=Color, 3=Image +BackgroundType=1 +BackgroundImage=/usr/share/mdm/themes/resim-1.jpg +#BackgroundScaleToFit=true +# The Standard greeter (mdmlogin) uses BackgroundColor as the background +# color, while the themed greeter (mdmgreeter) uses GraphicalThemedColor +# as the background color. +BackgroundColor=#76848F +GraphicalThemedColor=#76848F +# XDMCP session should only get a color, this is the sanest setting since you +# don't want to take up too much bandwidth +#BackgroundRemoteOnlyColor=true + +# Program to run to draw the background in the standard greeter. Perhaps +# something like an xscreensaver hack or some such. +#BackgroundProgram= +# If this is true then the background program is run always, otherwise it is +# only run when the BackgroundType is 0 (None). +#RunBackgroundProgramAlways=false +# Delay before starting background program +#BackgroundProgramInitialDelay=30 +# Should the background program be restarted if it is exited. +#RestartBackgroundProgram=true +# Delay before restarting background program +#BackgroundProgramRestartDelay=30 + +# Show the Failsafe sessions. These are much MUCH nicer (focus for xterm for +# example) and more failsafe then those supplied by scripts so distros should +# use this rather then just running an xterm from a script. +ShowGnomeFailsafeSession=true +ShowXtermFailsafeSession=true +# Normally there is a session type called 'Last' that is shown which refers to +# the last session the user used. If off, we will be in 'switchdesk' mode +# where the session saving stuff is disabled in MDM +ShowLastSession=true +# Always use 24 hour clock no matter what the locale. +#Use24Clock=auto +# Use circles in the password field. Looks kind of cool actually, but only +# works with certain fonts. +UseCirclesInEntry=true +# Do not show any visible feedback in the password field. This is standard for +# instance in console, xdm and ssh. +#UseInvisibleInEntry=false + +# These two keys are for the themed greeter (mdmgreeter). Circles is the +# standard shipped theme. If you want MDM to select a random theme from a +# list then provide a list that is delimited by /: to the GraphicalThemes +# key and set GraphicalThemeRand to true. Otherwise use GraphicalTheme +# and specify just one theme. +#GraphicalTheme=circles +#GraphicalThemes=circles/:happygnome +GraphicalThemeDir=/usr/share/mdm/themes/ +GraphicalThemeRand=false + +# If InfoMsgFile points to a file, the greeter will display the contents of the +# file in a modal dialog box before the user is allowed to log in. +#InfoMsgFile= +# If InfoMsgFile is present then InfoMsgFont can be used to specify the font to +# be used when displaying the contents of the file. +#InfoMsgFont=Sans 24 + +# If SoundOnLogin is true, then the greeter will beep when login is ready for +# user input. If SoundOnLogin is a file and the greeter finds the 'play' +# executable (see daemon/SoundProgram) it will play that file instead of just +# beeping. +#SoundOnLogin=true +#SoundOnLoginFile= +# If SoundOnLoginSuccess, then the greeter will play a sound (as above) when a +# user successfully logs in. +#SoundOnLoginSuccess=false +#SoundOnLoginSuccessFile= +# If SoundOnLoginFailure, then the greeter will play a sound (as above) when a +# user fails to log in. +#SoundOnLoginFailure=false +#SoundOnLoginFailureFile= + +# Specifies a program to be called by the greeter/login program when the +# initial screen is displayed. The purpose is to provide a hook where files +# used after login can be preloaded to speed performance for the user. The +# program will only be called once only, the first time a greeter is displayed. +# The mdmprefetch command may be used. This utility will load any libraries +# passed in on the command line, or if the argument starts with a "@" +# character, it will process the file assuming it is an ASCII file containing a +# list of libraries, one per line, and load each library in the file. +PreFetchProgram= + +# The chooser is what's displayed when a user wants an indirect XDMCP session, +# or selects Run XDMCP chooser from the system menu +[chooser] +# Default image for hosts. +#DefaultHostImg=/usr/share/pixmaps/nohost.png +# Directory with host images, they are named by the hosts: host or host.png. +HostImageDir=/usr/share/hosts/ +# Time we scan for hosts (well only the time we tell the user we are scanning +# actually, we continue to listen even after this has expired). +#ScanTime=4 +# A comma separated lists of hosts to automatically add (if they answer to a +# query of course). You can use this to reach hosts that broadcast cannot +# reach. +Hosts= +# Broadcast a query to get all hosts on the current network that answer. +Broadcast=true +# Set it to true if you want to send a multicast query to hosts. +Multicast=false +# It is an IPv6 multicast address.It is hardcoded here and will be replaced +# when officially registered xdmcp multicast address of TBD will be available. +#Multicast_Addr=ff02::1 +# Allow adding random hosts to the list by typing in their names. +#AllowAdd=true + +[debug] +# This will cause MDM to send debugging information to the system log, which +# will create a LOT of output. It is not recommended to turn this on for +# normal use, but it can be useful to determine the cause when MDM is not +# working properly. +Enable=false +# This will enable debug messages for accessibilty gesture listeners into the +# syslog. This includes output about key events, mouse button events, and +# pointer motion events. This is useful for figuring out the cause of why the +# gesture listeners may not be working, but is too verbose for general debug. +Gestures=false + +# Attached DISPLAY Configuration +# +[servers] +# This section defines which attached DISPLAYS should be started by MDM by +# default. You can add as many DISPLAYS as desired and they will always be +# started. The key for each entry must be a unique number that cooresponds to +# the DISPLAY number to start the X server. For a typical single-display +# machine, there will only be one entry "0" for DISPLAY ":0". The first word +# in the value corresponds to an X server definition in the "X Server +# Definitions" section of the configuration file. For example, the entry: +# +# 0=Standard +# +# Means that DISPLAY ":0" will start an X server as defined in the +# [server-Standard] section. +# +# The optional device argument is used to specify the device that is associated +# with the DISPLAY. When using Virtual Terminals (VT), this value is ignored +# and MDM will use the correct device name associated with the VT. If not +# using VT, then MDM will use the value specified by this optional argument. +# If the device argument is not defined, then MDM will use the default setting +# for attached displays defined in the UtmpLineAttached configuration option. +# For the main display (typically DISPLAY ":0"), "/dev/console" is a reasonable +# value. For other displays it is probably best to not include this argument +# unless you know the specific device associated with the DISPLAY. The device +# value can contain "%d" which is translated to the DISPLAY value or %h which +# is translated to the hostname. +# +0=Standard device=/dev/console + +# Example of how to set up DISPLAY :1 to also use Standard. +#1=Standard + +# If you wish to run the XDMCP chooser on the local display use the following +# line +#0=Chooser + +# X Server Definitions +# +# Note: Is your X server not listening to TCP requests? Refer to the +# security/DisallowTCP setting! + +[server-Standard] +name=Standard server +command=/usr/bin/Xorg -audit 0 +flexible=true +# Indicates that the X server should be started at a different process +# priority. Values can be any integer value accepted by the setpriority C +# library function (normally between -20 and 20) with 0 being the default. For +# highly interactive applications, -5 yields good responsiveness. The default +# value is 0 and the setpriority function is not called if the value is 0. + +#priority=0 + +# To use this server type you should add -query host or -indirect host to the +# command line. +[server-Terminal] +name=Terminal server +# Add -terminate to make things behave more nicely +command=/usr/bin/Xorg -audit 0 -terminate +# Make this not appear in the flexible servers (we need extra params anyway, +# and terminate would be bad for xdmcp choosing). You can make a terminal +# server flexible, but not with an indirect query. If you need flexible +# indirect query server, then you must get rid of the -terminate and the only +# way to kill the flexible server will then be by Ctrl-Alt-Backspace. +flexible=false +# Do not handle this X server for attached displays. +handled=false + +# To use this server type you should add -query host or -indirect host to the +# command line. +[server-Chooser] +name=Chooser server +command=/usr/bin/Xorg -audit 0 +# Make this not appear in the flexible servers for now, but if you wish to +# allow a chooser server then make this true. This is the only way to make a +# flexible chooser server that behaves nicely. +flexible=false +# Run the chooser instead of the greeter. When the user chooses a machine they +# will get this same server but run with "-terminate -query hostname". +chooser=true + +[customcommand] +# This section allows you specify up to 10 custom commands. Each of the +# commands can be defined by the seven parameters listed below. In each of the +# descriptions of the parameters N can take on any values between 0 and 9, +# i.e. CustomCommand0=,CustomCommand1=,...,CustomCommand9=. The numbers +# can have gaps as long as they fit within predefined set of 10, and their +# placement order within this section and with respect to each other is +# not important. +# +# CustomCommandN, CustomCommandTextN, CustomCommandLabelN, +# CustomCommandLRLabelN, CustomCommandTooltipN, CustomCommandIsPersistentN +# and CustomCommandNoRestartN should all be defined for a given integer N, +# where N can be a number from 0-9 (if not the default values will be +# assigned except CustomCommandN for which no default exists). + +# Custom command to run. Multiple commands may be specified separated by +# semicolons. GMM will use the first valid command. Examples: +# /sbin/bootwindoze;/usr/bin/bootwindoze, or +# /sbin/runupdate;/usr/local/sbin/runupdate +# +#CustomCommandN= + +# Custom command dialog message that will appear on all warning dialogs. +# This will vary depending on what you want to do. Examples: +# Are you sure you want to restart system into Windoze?, or +# Are you sure you want do do this? +#CustomCommandTextN= + +# Custom command label that will appear as stock label on buttons/menu items. +# This option can't contain any semicolon characters (i.e. ";"). +# Examples: +# _Windoze, or +# _Update Me +#CustomCommandLabelN= + +# Custom command label that will appear as stock label on radio buttons/list +# items. The underscore indicates the mnemonic used with this item. Examples: +# Restart into _Windoze +# Perform system _Update +#CustomCommandLRLabelN= + +# Custom command tooltip. Examples +# Restarts the computer into Windoze +# Updates the computer software to the most recent version(s) +#CustomCommandTooltipN= + +# Custom command persistence option. Setting it to true will allow this +# command to appear outside the login manager, e.g. on the desktop through +# Log Out/Shut Down dialogs. The default value is false. +#CustomCommandIsPersistentN= + +# Custom command mdm/system restart option. Setting it to true will not +# restart mdm after command execution. The default commands (reboot, shut +# down) all reboot the system by default which is why the default setting +# is true. +# In addition when corresponding CustomCommandIsPersistentN option is set to +# true, setting CustomCommandNoRestartN to false will place CustomCommandN +# in the Shut Down dialog set of actions, setting it to true will place +# CustomCommandN in the Log Out dialog set of actions. +#CustomCommandNoRestartN= +# +# Example layout for more than one command: +#CustomCommand0= +#CustomCommandText0= +#CustomCommandLabel0= +#CustomCommandLRLabel0= +#CustomCommandTooltip0= +#CustomCommandIsPersistent0= +#CustomCommandNoRestart0= +# +#CustomCommand1= +#CustomCommandText1= +#CustomCommandLabel1= +#CustomCommandLRLabel1= +#CustomCommandTooltip1= +#CustomCommandIsPersistent1= +#CustomCommandNoRestart1= +# +# and so on diff --git a/talimatname/genel/m/mdm/mdm-autologin.pam b/talimatname/genel/m/mdm/mdm-autologin.pam new file mode 100644 index 000000000..f3b1541ac --- /dev/null +++ b/talimatname/genel/m/mdm/mdm-autologin.pam @@ -0,0 +1,25 @@ +#%PAM-1.0 +auth requisite pam_nologin.so +auth required pam_env.so + +auth required pam_permit.so + +auth sufficient pam_succeed_if.so uid >= 1000 quiet +auth required pam_deny.so + +account required pam_access.so +account required pam_time.so +account required pam_unix.so + +password required pam_unix.so +password required pam_deny.so + +session required pam_limits.so +session required pam_unix.so + +session required pam_loginuid.so +-session optional pam_systemd.so + +session optional pam_keyinit.so revoke +session required pam_limits.so +session required pam_unix.so diff --git a/talimatname/genel/m/mdm/mdm.kur-kos b/talimatname/genel/m/mdm/mdm.kur-kos new file mode 100644 index 000000000..a4ac4a4d6 --- /dev/null +++ b/talimatname/genel/m/mdm/mdm.kur-kos @@ -0,0 +1,16 @@ +getent group mdm >/dev/null 2>&1 || groupadd -g 128 mdm +getent passwd mdm >/dev/null 2>&1 || /usr/sbin/useradd -c 'Linux Mint Display Manager' -u 128 -g mdm -d /var/lib/mdm -s /sbin/nologin mdm +passwd -l mdm > /dev/null +chown root:mdm /var/lib/mdm > /dev/null +chmod 1770 /var/lib/mdm > /dev/null +mps serkur mdm && mps sersil slim && mps sersil lxdm && mps sersil gdm + +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +printf "\n Varsayılan olarak tty1 devre dışıdır, çünkü bu bir hata" +printf "\n tty1 çalışıyorsa, mdm otomatik olarak çalışır " +printf "\n sonsuz bir döngü içinde yeniden başlatıldığında, bu etrafında almak " +printf "\n giriş yaptıktan 1 dakika sonraya kadar lütfen zor kullanmayın " +printf "\n sorunla nasıl başa çıkacağınızı bilmiyorsanız getty@tty1" +printf "\n" + + diff --git a/talimatname/genel/m/mdm/mdm.pam b/talimatname/genel/m/mdm/mdm.pam new file mode 100644 index 000000000..a4fc75c53 --- /dev/null +++ b/talimatname/genel/m/mdm/mdm.pam @@ -0,0 +1,14 @@ +#%PAM-1.0 +auth requisite pam_nologin.so +auth required pam_env.so + +auth required pam_unix.so + +account required pam_unix.so + +session required pam_limits.so +session required pam_unix.so +#session optional pam_systemd.so +session optional pam_ck_connector.so nox11 + +password required pam_unix.so diff --git a/talimatname/genel/m/mdm/mdm.sil-kos b/talimatname/genel/m/mdm/mdm.sil-kos new file mode 100644 index 000000000..c1fbc33e9 --- /dev/null +++ b/talimatname/genel/m/mdm/mdm.sil-kos @@ -0,0 +1,3 @@ +gtk-update-icon-cache -q -t -f usr/share/icons/hicolor +getent passwd mdm || userdel mdm +getent group mdm || groupdel mdm diff --git a/talimatname/genel/m/mdm/org.cinnamon.pkexec.mdmsetup.policy b/talimatname/genel/m/mdm/org.cinnamon.pkexec.mdmsetup.policy new file mode 100644 index 000000000..410d3ee1f --- /dev/null +++ b/talimatname/genel/m/mdm/org.cinnamon.pkexec.mdmsetup.policy @@ -0,0 +1,21 @@ +<?xml surum="1.0" encoding="UTF-8"?> +<!DOCTYPE policyconfig PUBLIC + "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" + "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> +<policyconfig> + <vendor>Cinnamon Desktop environment</vendor> + <vendor_url>http://www.gnome.org/projects/mdm/</vendor_url> + <action id="org.cinnamon.pkexec.mdmsetup"> + <description>MDM login window appearance and behavior</description> + <message>Privileges are required to change MDM Settings</message> + <icon_name>mdmsetup</icon_name> + <defaults> + <allow_any>no</allow_any> + <allow_inactive>no</allow_inactive> + <allow_active>auth_admin</allow_active> + </defaults> + <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/mdmsetup</annotate> + <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> + </action> +</policyconfig> + diff --git a/talimatname/genel/m/mdm/resim-1.jpg b/talimatname/genel/m/mdm/resim-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed7f976b4ee6472ee03fecfa17353e5fe3698305 GIT binary patch literal 509698 zcmbTdby!qU_clCqN{b-i&?TsZbV`SSl$3yU!+^AuqzD5Ht)w*4HFPL2bSs?$j7Z50 zHN^0a&-1&!_xt1f<9pwIUFXc6bM`scTD#W0?zPU{!rdmINhQG90RYg@;0F)`000tz zFb*z&4qFSt9ymC7037VE2tEKn^FMX$U+j(lUiTrwJ^}e}{oiHc|5qKa_<vs~`k(7} z*y0?E|DSh)|2=>$!q0@nrJjjOJriRUekLU<A|)aLzy;vo{<l>XwgvA0)c?~Qd%9Z& zC;@PB{*`}c+<yfh@86jKA0H2&kbsczKL-&BF(DBN5g{Ql88Hdzzk;oilaZ4D`}6N5 z|9upf01uCVl!%b%KTZCRPItWkYGQm5A|E^)b^tCl4jwhmT|WSb?H_{wi1)AW{!?&p z@$d-<iLhdjVH-44Va3P8!wOA+l^EMP1bZKVPfb9>CZtG6`|2$bJBUs=BBhX+<3)Yn zef{aboFX>fA4o{)A22XJ<l^Sx<>ME9E+#G^DW#;WqN=8@p=n@fWc=F1)Xdh--oeqy z*~RCbub+QFU{GXKbWCjA$9PC;T6#uiR`%zwMa3nhW#tu>4UJ9BEzs7s_U}LX2L@q7 z!y_}Zb3cF0FDx!?Zo#*Ab`ih#{+u9Dr)TFEm*}g1df@=@{;L-D{Qs#JHC8X&e`7%O zPcIx?f9!!rjZeTPL`b9fis&tfmR&f4nC?YNVSOJ7hlu{)`!?Rwr1YGkn_MUVRQr!+ z|Nj*G@PDP*|D)Ld)@unsj)#LCJUnWEJODl68!>SW<$DHXfBHgx!kJ4sps$MyphxTJ zd*D1u*I2<v6@ZG#?ndS-UWLBfP{5V8Gd=l165|yN2K81=etpIMnXFC!sTeEkD`YE& zv;+cq{*_5pn0}@&HED|#bmjkzU?WQaG&X1iAHv*QUp*ZRDCTFC?DlJxC5B2MW)p6m z-vRko%1B2VfP6TqK;gXbupGnEt(lYli<vY~FR=t{JLHdw#+r~o%O11i(I^8>))jCb zS-uTTU=vg4O1jL2v0nL|mvVl7<QpjVNduRdc!8O3Vj}wrzEo(+_<rHA*C~l0=}jjJ zZD7p7S)Q@KE4M)^t`NevkE@I<Sr+xCjY^c;lR1I87^}<feqS0}VQF^~)<|fm2iVT% z1RM5P>-kN#Ibb$8m_ov&z(TThC{AvC84`90&MOcmpkfnzuDf1&tlP0G;*+n_#rx1w z>B!wKEwFtgP=euhkqErjwb$3o<}z(&UZl9Q(I#^Mv+M#LzUrD`RA|briIF=TROgw^ z32_k$0Wrt!!p6rGa(j;8vn_n)`ZXT~HnScN*nPQ~Zh`y%1%tr3jr-c4N0t`Qpbkbw zbn+=4^2)FUIUudU3CZGg3)CPQsS2UoL(kS&&*?APeV)e6=>5VG{3w7&9zl2hFy5t) zt8y@G%SBt?&v4uQ3@(e(ka>VBzoz!-J-GyjbTDvdDW7)S=UL2>khl3|+4ik4Xh3%- z^sfq;XhTE{G<gTlpJ6Xzc~AYDMXl|5^M`l!aWeKokHz(#1u`cE`Q``|`G&89lJdlU zKbVI?gX%sIBOB{K=x)YSN2m0(FZ>aKZMg(H)d=mbnyKL{zi)g2aFB~-gxBt<jJ}#G z^AcDcyU=e~6~7vqdtcypxCcJX<V9Ms{!)X8`Rt%z5@*L|JUVDRbF<>%Jnl5y@iUpQ z6m1jR?Dyk*1V<9%Q<HKz@B|;t9h2(&jc&fJ1a1@ZL6qarOC8zEL*1A)hA)0GgC1&M zc0thD*|pNBLB_)5U7LVr4xw$|e`@9ZWLd6KCK_mDJ~Rh4NnXIvyPu+~V6gk&Rz#CH z$QtB>sjdq^;B}qbJ&%M3nnZCHy^3gMB}ta9kUIc>CET3)WAy<$uMWMp>iId3<Q?FQ z)T{MPw|nVR$-Zm7)uc(__Gg9W-&#SQ9&{~5q%hBL&J;?HJn6j4Lw$1+wpa&9x0_CZ zg~(r{VCvbHkRap0_P|mq^OeqlSZZ~hUssW^J3wXaZRzw|^_{FfUJK$)d?HWP-fc(p zXToUJ_=V0Ea!U&bBTz4F^|TT>TDsbnYS`*jA|GOF5V5y#UZFYEtKrY^fqqXwMuY-A z801&_#k)r?*YW<C+R>=ghw=R!cn=+*QDj9qthx82lu%OL;r?0%ch+Jj0ns93qd-qT zB{StLG$>9pQ3__WyA!u1i8j7Mu(VY$d{ce3%_nr7G2HJVtG<`lbxler_3LTl<J<=q z%dy8d6Jl4kWj(c;331)?2ts-Hq1(y7h=ed~M{;Had?-O&@k5E-FNG=JJ1(O{7i~Mh zY(C^{g*=~1<vZm%5i&l@bp-^S=`~zJuGUH)D396@%t7ZBg`IN)9VG5>`s<!R)<2Yp z(?i2eRE<6NLP*KUP!1x=5~LgR&JcN6V`)l)wocAXJY%N30~q0Qwm@A!+9l}_s-!eZ z%DDeg6-f#+^J;`bGsP$-rJ%>uS41pCitDm_eTZnI+9Gq|9~V{*@UgQAk=dlNS)OY> zr|q^lC2C32t<BW{G*}v*m;0N+A|ykD<fomG?j1monh0;U{t!EP9W-Lbot1eh6qEA5 z)EzI2{)K4oRJlX`$Zvl3A`_pNIEHPi4rJW{`kTJMjxuG!WdmWdJrD8ESqR2|)QqbC ztR6<M{8b7Hd$PJ$uR`wK^x2h>OEBB$its?%f1LH2?M=!`rw_0V|NUc1gF%sbB;BHI zYdB$-ZezuD5=kHE4=67v^c{J;Q-9`To*O7iq_O4Z^vZE98|2B>=IrZ>jDW33{_DyT zt&iDRFdBwAln_t?xHefEl>B0z_tAt}o6k>2xBrO6OTUdP9pN;(lf>gcaoY#K161pn zYh+WNy9A~nb{$xK_Li3*Kl2oKK4?eX)X^fJoym5E@k2Hd@$8LZMLkZN68J$U>o>fN z<WwV2hG-F9P&!ZI;vV|vN5LHp%+L2<xQ38F)%!pfYC$$+X(XH{#8VsSii<eR#eA34 z%L`JKszhPl6}yyfYa)XQNjhBmEz=_^?wSw05hG0@{z3kSpN+vLhl}s#P=Y8_$JxET z<>h7-mN8a0ux^v4+^IoA`J>K@J@m}-INfyC+78?%AYLX~Zae4>5RI$oc^<7VU`w&n zZN2)X_0Tl4<=R6_hji#D^wq3iP^fPm%UiZ5cL1-}%`FB2X`#Wu=Vn*S6A(#8c|V2} z-odR-?~s$1)Do!s^uLtczV7*z2JowyHPVTHvI~D9Q<Ynt0`U&PG>blaJV>iM{)3`I zTmd`KXi@w`Y%kLYL}o<mj`ZlPW7-MRV`?*)&G+nvJM#0vVLIQ7AY|_Sfr$vmU7fxz zsi4`uj}DaYLMM8?SQ+5+33Ks@JmZ|i9Cv`c-g^UKogpXVqSE(^7`?dBrn*PHM=oQD ze$&K9UyY)G>6sPs`M+|Kqsf1z2vq#cQxGnid$(JZLo&rF(jg%!l-m2K>57JoRy0&6 zM`j3W*XZRR<aZdap7E2LNGo~h4)C4X+Og;DQl2eU_vrA$6*wE)zwyjR@(YOi^YbJq zwC;Rm;6N5o4Znp#RG%DhuY@Yj`j_dN$;25myO7&jQ>H!0g{{{%Gg=9a0DkyieV20! zx^+><hj<{_O?$6*J^XG(Fad=m#m|jz59uWe42UIFhlXXYZ=Imch>2MrHX=L_UjA&e zwldR;=CPEXfaJ~Bdoc7k#W-zTt)bbrBmE6%f6zHP&Uj6TPYB{M%&8oD6nqD;JYzmb zlHa!Z2~B1^XuA!m)OgZaAr__ARkn<R*H8AG6^k$uTK6wp?^^yxf`at7`91V01KtsD z*MES!?f_S(+cDb-CWDWjZaT2i-gHdeN1$1mR=lU6t9bJ_SF?70vD*;Gk1!Ls1Rk=? zddkg(W=ALYdJu-w6{ho(`Fx^kM!PlT3!5UtWKc7+!JxRMc`-5NIH$>qT-IbzLKTEa zh*J1jU<wAAaFSFl`uMR)Ou$Ye$F-)rF_4c1b|0A9)iMC-O4PnCW}?d$JBdYj&OkWB z#TIv*E-|EqW(UnKpKy58xsBxmG+@B8W<`>>yaB2XKoBJs&bin;<Q_m=@xllxM9_{m z@!v$&c~SJM_lZm&!~m=5nWpKvA9?)x8RiQ;ay#DNKh#cROn*h_J}VJ=DH}Gy-&re~ zVk7RXVfAH9a{08pI`17jrO+qZNJbC2v~#XudgUahKtF3K%69YG(_`(1F9!$Qp9mE~ zjW{9)w3z*zmOXg_@|mkbh_>&ku-Y-J7K8;*s8}XEH-j{C#*Vc~+cWdm{u5H;v$JiY zXELWt564sePM`G_egYBMMu})soL!}hSREqtv94*ip*quq4S??{n{GjYIDT58lc3ks zVV}>u^PjMxuMg;vwATJD&y=o0)2eqqK7)^b!2}e1PhAM1r0dpD+FdJ4E(@Oyx&nR1 z9k5FgW3<@9N(p1Q14vf*7uQDy_*sV@JMHh^@)LlSNRnBXC<Tq#_-#$9ZB4V&JZTaR z<W^;|2EOz~cYh+tN7R*kx;)}F4(v^LPiC_izSpjx;QL-8rc3zg@hfR{Zj&M#bH9f& zHw9NAe2%Wm9)84ugSHYk5~37)6!BWFJ_vJlGn;3>e}v0V@Vll*Pu!X&7~n)JZ{I&V zJ~kTfJXx-SQboP+VgW%y`1|8$Ly-e2W44i;H_0KAFcx_!29-UV$Hi^gwzPxv_&|<| z?J{PJ<s8@Q!Uy$g8`X~nSghN+KR@%uhy57L%j56u^|u~vc!C5k9KNzI5*7fz`UuM? z`w$|R{z_Ra73f6#$hUlzjlo_Pa0iem&$qj&M_&PC`38=RS3xv`ZJV<nLMqr=vicpV zF^4*gNa1@VCb|uDi*el4e<TyA^V1?>n|Y_TGTzjr(4+ap1%zkqjyA-!_!>5L2XLOy zoyqlxW5&nHjr&gBCzr2jW89UjhTBvnFzic~!P9UdTd4vW8ON{F)-H=tWyV2=@Nv<q z$$SJcgs1nK1mMFXV7BVE$>w~Y7jYdw0+>D`A~C`GWPTi<?b|(tHx8|z;evm1B3H@Y zk_~<pE^_sUd7Pd%QBu<jeWaBcx?G_w^Yol3;>EbYNQCcO2up4}g8wb^YGjYLH?sbQ ztV1U?%W@<<z2Xz(IpNz&LdEMDnMT&XCW>MqIlX$t2|-(Tl2A>qCs^mZ1VgG)IEPCc zNIc4XbMkZPykw<=Y`$jO`*iQ%hReqkb(=1&2rH8wZRsGYEn;{Ah8wM995H67$ufy@ z^Yjk(=Fd*)aKlFi<kF7{L&ErNJdD!J?hUDpnb+;+7*oA@XlzQMmeD1$cUr9eK1$xj zFF^wB2kbf<u>8<Q%Si^{M~qF5b=6})29_3qkjM%f`OL(~JHY(0a>nd!wmq0Yh#qYx zF}#nxRIohkCEmx7t;ST+*LS)byUqETQ*7p2^xW)d(q*<fXHd{Z*$<YP0pY!A686V2 z4l>aQBB%=(PjD26u2$sKWXCNMJ=bTv2s{+0d2t}8UgVjcR0wk+Qx>z?B~e@CxW~QO zWnLiL#ph|v=kf53MuHEsr}A$J_<RfBn%y^=Q7PhxiD8b77AeG|v|r$3JuCh-f@F&K zzXs2*AYl`{JSFj0>0>iD(75svRn1$M@ubg7VVS}NO`M)-A)B*6EWC_&HFs@`GS=@L zQzPRE8zX&h?q0n{l-~LCJ(;(6Y}u>XdE|Y*;Q4zh@rzKAz3`z*@14uu!@Xmp-R^6y zjnpKWXCqXgW#CLr5q=yK{9JGJx~K7EHw2XLIW{NkJSudp@#&ePT;L!a+>Pn#&_lOV zEIFz91ae)Xj?xY5w^`v}elO@&-^><)x%aws<dBSQPmQ!8==&j?IRm}Z2{IeIRQCNV z1j&8Onq2)KkC|^rWF5SP@jz=se`+{!)(mZ$ypZv#7iy9DCHs07n5YRge)vxCoN=_H zc7jD0KNN3nmeV+qbY-wE<$_))9Mc9XQF*WJ#k1rNPc)^>_}y98yAA()vnK{2C^QRE z*OHbQP?Q)VbyYmJynWwgA)rZN*e{LgK1*V^4oqRSmu2kudCl3@npOQd@X}JbECLO` z`8*-GuGg`UB5)M_O*6%TYF&EU?veb}Pfj8J1I*YM7=$2#J0F7c&KR%Vln%gSjBV7O zX!G@1=$`(|d#g>L&S^ALjL}zC`n};k>@HdDA9U}@k77PgsbRK(kvc)3wc08scW-RU zQq$wPxX=+6f!OxwhR!K5r@r87jbj+}k=z+N(%6T&;0;z84?b_TT=PbpAXxU&q9Cr< zU&IA*15I(Vd|6~M>AAk1-hV8YWQT}2Q+_q8Eu`IM{Q9Go-KNfT1Z{(};M`O)4LQc4 z{e_4v65`;4#AooE6N4h-7p_X&(*F0Z(?=1z_!r-dm+bs$?f}IZrjsiw90Wa4M$;uL z<zVN-C{T`23h}U&)kraT%|3m%K1zd1`(r*+n*ZCW?MLbS)Cylm5bBWiow@0+mIEe_ z!pP6d%5ns=*%WLAQ9}E9{2DCwQTN**&ORv4GFD2<FjDm>y+P$8W9<{F>*An%)Kc~1 z`|j@;?J|MR_gonq88=S%^o7kx8fKtN;$hzodt{}8u4h;C#6H$gnHS;etE-Zc`%2u% zOSx7dgt;2%m_OEu+g`6*o_-%@1LIi;yU2I+VkoWVn|YzFQt!Q2)LK@cLmLUHlfcPl zvGwr`zh?!xEl4f|SaLV3QS;Y6AbSBXh0!xDI06$iMLL|Z)tSfS&@}tX?&Gq+gd`DI zI*7D7j=Po2ZKrG<Rk%SksXLKj*9J{f5k@N~L?>*71e9?n`Qw!wjGPSi%V*VyfZO1o z&E52Vs+cZV&@_Czsg$C}K2x>wGLY-DN+4-5TSHBk24a0*gQfGw_-6@vlgTmrRDusE z6lLh?r;l@L_|<&OXpaEA`FzwkUQ2Xw-tJQ0MCQX`_l^sQ#+*2_@1xa@pC;B3p07m9 zoJ}IbZ+s&2b$)VaF*Z4Er+>8xh<QRC%bYSRzrh!I;U6~-Fy9RN(Z>?PCm1`I026rK zkt@XW<@@<+UViS&XBzg-&uMptvV<z%@vvN78)$C~Eh~UJZfz;EC@rpL4pG#fDc4S} zfAAPxh2_n8M46g@g3ZDcHx)e?(m->0A(*bpu5Te3XF#pnO#s%x>$~zR)%9_|2T^^> ziNbq71@S9Kq+mg&Qiw0R1z(CvhuemN(Ej9oDOS6g%Hel2Wmmg4Z=?y2_=BG}u2^D> z!OE=PD<y1y2gv=@;A&5l8D@XQxIKOo3abs<*TP3?HZ-{~^X`19Jlod$T*rP?<SY0+ z(1$-x3Ad_C1MAw?q}zR7a2UYrn`XJnx6(l$8X3D9cy!b-7Eg{d*+m@Bq<G?&-DA_e za>yo?`;glN)Sq8;yV-abX!#m80t5%2vsB{UD{AU-OM%$&*gSo)mMiOGIG3SD!YO1P z`E%oCafp!7SQbP-TtXn!pHUWlHI+)AF_m#Fh|gj0$SnGHSa*woCFuGUeUT_toS=~z z*L79zHg;({TMi!|{;XQvMWzbJdeDLwVTF5pubR7xjsMh2SGA#wSO7QOX+NWmOd3>U zwud)Q5I0$#;t4*N!A2%_OIz=DjW!KWIc|2#;?=j@bRV1Lyn~{><tb4EQcDv~1)eSD z{E8ij9P9SeULaW7zesW6!)8$)`+Rl%hg1f|IZXFYBX-?Y#*Ze8-G5IfpL=X+sp|;F zWzqQT)__j;^k^KjjW{fh0IEbIa%pVB3mNAO^el4sgT2E1j_0l}SWruq&eIbfQwyq( zbo{<~Q4;Mf<@4t8X$y~>MBETB;2{gt0zKAjd9ZwC+(yz!v`0ki8&$@Y)g2FUX4Nh! z)NSybr6xdbK@;yn?BWg}W4M10zO3Or6&oi%E}d-gNEWq+o@4aKSC$#`UB8jnq@j;2 zjZv?j(d+p=ac!(LcQy&kckxYZ9)psL4&D5KUdAzlPLGwX90T5e`I3#t%Prx9JUS3c z@VRvs+;wu4a~t<Wo<+g`ZhaE+1vb8np%wL~a3tD(A;E#Xx+v8=(IRpFLLszM&I~kj zJXYy&pj*zf<Je`9pM)E;LdgJa&;-rOqH&bh3&&EauoU&+sEnY*fl7_%t<=SV#>UJw zQfH@MzXxCA?Jo8vlz5TdhJGz}jpAZ&>PT4ylauT8hP4ynu~d>R)_nDG_x?byFI*1- z%O*ayQa~{|O_+3LQ9gNQc)Gm5+$FXNeSaY@5dOZhix_JoN>z51Wxfvz&3ZEfOJq4R zOte2S_!1E;m!FriIR-A_)3B00*x_g$5a!CBLOYR`qbCbWG~Pq?<h;w$LKV)h4B)Bn ztLnq64*Ol66=R{Zi71OL*O&pYPPJw^@ZKJ5CIjR!mHpY6mVz3vku<uGWgiZ+RxBfN z>w1Nr?e7hS@bgw9GFHowC<Zr?ZM%2H(u-um)VvQO-@;T*D=@=>4Pu|ETDB>3sB`nM zxZSYh^Y%)W)O%O2lF-vtMFbd2bkZSNl83!^bpYY@iyhb9S%(H4G%KV4lv*hUDMURg zPUImei#7XRFF2c}OJ$_Q6+|wB4Ldk#+bs&h8xF}R0jbjg2hPLR(<r|@L#rR`)Q}K~ zn=pQJwv;!kA$7++-!%#E>v^f|9~)VUVc4QEw14;yu3T1HF(a$OaDr`CDlEcxGcu3M zkfd4TaY(aMPn=dikT<jSZzE>vGu)<VDl}v@nK1Dsj9?<-7bcNl4VwFgli27bR_nmx zqX_t9Hw|#`6uHd&2c-FTw!ui^W-oTGARZaNvtuK2ePX3zvZg#B9(UC@nR(3?rzc>k z6`y^W#8!${-6zoVPIq#rQbxj6Sk1cCNKurqK)xMQCa_a*AuMNRay!;OkU^bfOz9{F zb37|!80tAPf*6G}Bqgq!X*l8g#GN0#&~i*U)X6m&x!1b{nhMg-Dt<;Jlo<8*c3gJk z0qzRA(>GZUZxKOsa1~EH-DcC7?`e5v`W2@b>21J+e`Po;`jnSy0@)%#<MWE8%*%m4 zti4Mvtx71q<MoA1{uWX5^K_G&6>%@V>xa)N7IE5byPl><vt~&28B8}w7KUe1jWZX# z;a-z|H1~VSs-ekV4Pu^gyo{x(G{uLd;u=M4Blsp!#fc8iW5jLVunVgn`8#)jKgF^{ zN=#9<4jqH?fgMofMR~DtN=pRF|Gwy`4`5jsE!~PMlDKZ6Kj0j~$u_g7nFq16!!!Y6 z$UuA#Bbz+IFHolk!NxCl^8<8FC`X8RysG0i+grWQ|9*^M7LBsQyc_kUQKzR|YrC!= zzIe%+MwcG{S+HxxnS(*K_W@`KUi0_`4ZGXk9Y7i)(|e19MX{PGRobIoGNn9mvq#Vx z(4LM^I@6J%LYHkofPk!y$RT>l&~~IM?n%F=$n!luzQHrgNU*%NL5a^}x49lap_Im( z{Gb%}wv^E&vy$)B{iy(rn-h&kurIebDx>Z@j*NgHRFdaJ#DcT9hRxq51qJgbST=8c zZz&6+;_>aAaBWOJfcc$#Sr=FTsHi=?G5#H3^!cVP8k1JvTTZp+z`C$taM|5@!%N6! z<6)C7nbSJrH=&C4;?3s+O=`a4yQd`QwcZ39<O#TW3J@!fOb|_|VJDdfzr3`#wjiL5 zVPisMZ&IRwr0Bu8$Ml*)g@^7ji!R6PKZtG5c`e;%-LWBv>hMwm!8|?YE_a|1;kq}& zoNZ`pZ$I(*q}m+~&W{hb_QpHT;~(9Rtr!g4N9*H?HYbfGo+9lsgvl#c2t0LGQObp- zU2pxwbU@7y3O%0jd2r=X)5<(1m0yLh#eiTuEO&sxqHG=`*SS$OsGJWl3k&g8d0QgB zD)+oK^b|2(rOCs2K`EEx*sM8gp=)<yu3GJ3;u#wCNCNYwG9xKCEF@rRSrzKSF=P%_ zdo{`FV?gqLXv}GcIgc$V+S6M$?0ZJ<XII4x?{P<8#1gB+3vXZ<=uju)K*Jl#^T=hm z!-?5r0)(DDvT2QxNIW3JZMaFI7rvF0n1mwqMoh(yqH%%km)l8J)q(`BY{xSG^PW#i z*GxDtrr;aO(4STY@mgOL`D@<N*amDI^}&(fjEx}{Z4ckG`!7Qp;Qxl$<r8@_T2|)( z{qiET$BgRvyCYjAkYMIjy1q#M=jNuF%wRLTb_3|nZ}CU#xk|oooh8=AY`mV)umU*d zOJ2I$`j(>giO&bPNiw}w==>RuBXxZw_*C}m***>Des-&>L@zIU$;wN$c-Xf!syB0* zY~D+I_s2X>`ue=G>>fwEPzssd&`l1O<1=?AmKIFYjlk5rO@DL=&p)ZCZ!mt!vs^f9 z7x^;UuK8&;rw@t{4lY`T2HE-5!=#2cXB+{(nMqhCcA4(?Lq7K<zN6w8n{}>E9^xP1 z{{|PhXqP9xRTR`S4AbX;CMZYqd<NL#Yw2)*H%dO>)<%bPj{W1gA%{;Wjt_bJZ7=;E zRfCCwnyfqB#xh<t;q8iZQi?cUpmL62vQl#d5B*cza%;Sz>T(cdt1+OV(&(w0W41>1 zT!knxqgeewth+Z=&$3~1Z~xDV&y@ipe*GZ6;xXgJ`@eSpQg9%1i1fwR0Eeb5wV-<) z_lHc97|!6LI8=i7hn!;U7)SE5k6+q@t%PbwUL&k6qvrnhK793jLZ1RzyLK+0#8Po$ zKBT{S;Qq^Ljs~eo_$siE5hj5#bbEY1bd<N*l>23UDzc6vbrQ>EW(`dH4HneexEN}9 z(5a9$!t({7c<Wda(jy8~KtofTpG~BwZ9G-e=MyDa;Z9H9sJ^Y<icEXQGlfZ8R74Sd zVbGCcE%|s3!6kRh;7B>*<?=9X_se*WnZ=cPdgK@OV7|6lP2fTPTQ#br#tbx&gA;Xp zcBpAMR<N8ZHjN4_lMc<sA|QQD#1NItQ89Ct()(|xEb_PSk`Ija?)QLDA<p%bIe`{X zYnPp~j^!187b?NF<=nc6*}Q;pBM4(5Q;R#y%Q<-}OQ~a0TKzXswI+!Zn^r^%tIjVL z^~vW}0^YjvW?tzZ%6Zs=9>1d_k*2Sgam7SMY+(pJ%I0Ugoqws<Pt=yuau!J&T@ryq zqz$PjnQAz5i-4=z;ry#PFG-I&b=jYVI)B~F+)KECpA<B2tBHbWkQVjkT?lH*j`{rk z^=4tDbRo0as|3~PFmFSI7kvNFxK!ie>UIlMgLP6|M?QdZzP8L`_iH-D2>jUe;bwh| z2AViv!x76D?vttu7BW*-R4JG&a}3;&!&3KG{KxNeFZ0U#28TTFEIL-9mVQ0UKm?Uf zq_Ys*RimPPmcos!hb_jQT>p!iETw$auv?kOovLNhWx4|_9nN1F@@u=#-(r{c@B$?& z@26mI1Uuz7wu~1A-*_0Tbk<J$KPnpIvN>?TfG&8)VbGjVS!amqTMveHOixl+iP+k8 zknosB1mS%EBgr1xpnAu2m#+wqax{O<2Nq^|+OptW+EaV^wp?3?NTc)S<lHOtxLXqQ zW)CXZ>A8IFMtQ~}9(<17)n1-^X<9?0GwgxV=Nu@kClpdSjd`QP4YAs^-yk^MND3k- zsbck%=>M>Mu+WP-NnDllShpI?W?g=)3Y<j8q1q4c0IpY<`_FqJT=80^_dHZzJt)_a zxarzU>2=U3ssFA_Xlh<z=_P$$2vG7Eibx+{3)_ifT*l0YAzi*J4~UaR0wu2Hbua1V zb<#e&Fmh1uS+%zUGE=VZPwHS+I}9@g??py;zd)t@D0`Wg+j0G>-q^Txku7FR!Hl3@ zVvscA^88BQ{=OOI!QYL<9w)5rPddE`n(eP&(I%`UuLhHzz&62W(tDqyyhMj(Y*tD) zfgxFYvo*56r%E2Q5k#>s@5V15M#o)O<Ua-GTkRRVsfr35e@vr$69_~*9w%X-K>~S( z(5J=FG=;J2L4V&tsq5Lzj>ZfnME{|0(%O&|^>R<Cv|oj2g1(B=>yVjE%n)c949i>B zY<N|grmWZkuszHgJP4x?*grddnR<{>Hv03c@I;_mQUP|LZ!1muAxmFA4N^Ll;j;a3 zhdUk4a&$d=$m(QnQ_-;kLPSqyV*9Fg(?HR~Rx(6u9FCFwc-?(Dd3vnVWSmVhlax+_ zgLr&qe?VlpSP0Y=7f4nZ^&&dv<oO^0ubpjHM=LD9eAn%NUSvjl2YAvpIQfI4)-rdm z0)HaPzUgd|he_e$aK7Yqdxxue%!B^U8=`l3L||EI+h*N&z6>i*+N8!Q<lZF!)DNd9 zPU+O1ub5nms#lHnbs9_p2lB&egW_U7T||8uL+V;RM#E3{bb_Bl4g3no9JU83$0IMo z1g_?O)sYQlIc+H8CN+JOPm&dyU!SeU<(}!xCi=pK+^Dz%s0hgE1i|HJyM$exp1^-p z?qzvIzrfN<Q(;5pJYs%iJ8EQP$so?ibdDNHd7ae?!oqutcYu#uO$*l@0EV0TV+B)i z#$05*+xu{}n-JoY#$^ehPS;+2#z(tXb{=&SUp)No0L@dkVWh1O^x}UO|3sL&N8E0M z5@=^xV&D6h4lvKtqvR64GyD|cAD*kB0PHV|lE)C)#i=j03Sv90EdMD>{p8w}K3d+% zmSg=k3W)aSVUi~YcLn*EyVD%3;<uz58~c*?d+B=ow7EFY(|-Gl&DoIw^+*l}4u-c# z>(M{d(Hj&!Za`ox{os!9i1{)s_XBx}RHJ3aBCVN(gLCXoZ`Gx_?oK80r%|8|5A~It zc5lIdK*jCC&$w!m_Zi{n*9b_!`IUbGp{}a{n<-0ePiKMS$oX*shJ{}YvZ+bi`C%jE z6AwE0R(fs=?O*A%T<8qud4jVN90aep`JGkXs`Wms^y34OFpA(Xoz-$OaxL5EKh*8S z7=ivwpjq&0(9b}9>r#_yQ##-5*EnH7)UO&X{sF&}ed{p=M&u<TA;_;dp6Ps+GaaGi z2Bc8~YrvQH*23#aS7h`e*~GK)06A#O)sy@mCF*&$5kff=MC0df2*+#SY?(_9@gmQH zoB}aQ+#iu-6_nQ>*cX$3-KHw@D>S-G%@SRp4&l7Eh$1^az=-TPGKJKq%vY-kOmd{F zC&peY?c7L*gps;xxq1fdSE<en5sgis@?gdJMmtDD?OT;3$*@6uDcu$9M;N|R>*#G0 zcQku(vwredZS{OYzBcHaAGC2itv$nD0K~u<2P;FLe)IYfd`^@hnPwh)yB)BdC)=I- zI~>MFR#E|0;TU)P4XbAf`At}3B<5}ICiJE$;SLZ=@Q3n3eR6ZAv?azkt19!JJ@V8u z^Y7tVah^%^imOYB2Yy!ir0RRHT8qz8SuVb|M{_;mF(~d*y5rGmG_K|{X@m0U4$Q3{ zI|I@}Cf(py7v-h2#3KSvee=<7gnrllcL46Jtqn8rOjasKgtoUX@Ybanr!52b%Ho5B z(%TdmS1Y3Myx{A%J~rineM#6=5_W+!Vh5kkPzIFT->bkm7_f?&^k`<6t@z?b-LOLV zL-MzkY|!asGd8{(tWv=T(SKHzb8lheyg)sASHs%KTnNvR+v}M*cCl<5zyl7cijBX% z&q0sK9Yd8cFNOb*6hiMw<Ix}R*XsSlLNfy_KbAy)J)vP;u=glFIXf>PF;-n+SZ2yW zL9yHUq|yw;^)2uEc~@B_b`L&i#r9Rk*d))<=>-XQsKeVnH}Bv%?ZL+}=8^60cL0uB zg~fgJ6pp9ov*g(9YC<_Qlh5JuP5k?bZ&b0P%)rZQ%pIU5?CQ2+{4sybFWp>5dH%s? z{z2!5pTTy59<|t2Ind(|^!g{+MFEk_W4tJZr#Or#z=UkaZP-J<{#e)BI!TY0EuqKP z3|LVhi(IX5Z^7R=Cx}z8*SfB43Vf*Ak>B%WG(Oxy5w){&bB7N2<z@zKsC%tI<fz0d zR+!J64oKWjJ`d#gPZHO#8;&er^o$5=H^DZ-_NhWhaIk*1Bjl&C<CrPhkU|l02dFhx z<V;{kYlhVJe3^f=dIuOT&lAohrMGH2nexf&^#5x5oqJ!PIIvG&a-90UIR8=ra)E*@ z2-8)LljQQ|6G;n|&koM~ZT_B)BB%2QGuri*I{@m|d0NKOr|OTH%{m7-qH!KoHZ+p` zFbhQj>{uL>4UsK3C(I>?w|DyRJWu@&kkKD<?2(VSPghddsR~%z4Dy|{l)iNy*ipwD zT!_j~5gL+5h;qhx(Cvl8U?-@_{iX1gSf-=?Qu4DqfErAvGZd)vQ>4G4=6#`SQ^;y7 zO12{`Rh`o)r6uw_5r#O-!-krgNdh1=(9N9MtA-*5`54)9?(Z>t02L^5Qpt-@<S-x8 z;}XZA#s<;y5l)HVc%pdY64?0zcbvmv-S2&!<Z=G~T2XMSz*|8Qlg2b-<|L$#VP~uj zZ$B(ExAYEBs*Lc*dYv<xvDP~PnSoik^=NfS?@WY4G_c+Uj3AW60d`H^TbA6-+dha9 z+qJ)4OrX8!={h!M*C(7V3oHm5eUrU<6_%r~Myo{USwYP%{2@Y`0+aVsBDjdbUG5b# z{!QGEl>LQ^anc{^(YfySD@d~5*M*WW6n6b3t2|8H_ilh=Oep-r^2=PD)g3JMe(O2r z-T}6+4Gcz1ahLf_<)f1nwaqCY5{QjKLC_ze4)i-rGc^?F1OMMLj2!OS#U%7st}mh- z=<bD{7%wVAo|pgHD^dZ!&{n%tV3GdG{-zz$kFh8r$Xu$E!-(Wh-SXMRGdWT;3S0vJ z#K?If&WfR~5o{rHiVvxgF<A3pd3LXxCykSX2G|ZO_&N_fyAA839=-p#wV%@D3hx*b z!dL&q4sRTZd5hJ-tlle`c+98JIcWtn^$%DwEr;Z&aZNBXB|oT<_-4#CP%5E3?B%6h zkPx^qA-^=)todLRonh4yHcLGrdwmB;eHB<0Z?<w65kpEnA&q^Z8*NsJVA-zNAj#W2 zc{5{%%dcQM;ikTD`9G8=!FPa^r3?*vn{JC2^PVS9neG6Y=;yc^OoK{zyNDf+-msk6 zl{8{ciXGU{11R#mvM$w%U5)TXyfyL!n=y5A(X%wUug{TXQ2`Z?WC7(|UtH;{L&<1l z`y&b;rzy@oE!%muJTAQ=8sv(0dcZ1iI2aN<^CAc@^oVK@G0AubFvvN)fXQ#qy)Y%E zW=;fPwsIWTp=i4DZvxToF~4A3UHsBn+lk*tdUO0Ljg{3cz70hlQLPN`AL}kDdf5ou zVX-+(Hz*EJ6{GW7CSuQ+jkZC3T7nt}#kUX5ljpb5JW$swKojNP0kp&a+dVHoG9E4_ z_9flJ6kV@MV)=XXW-SN*mR0EsZ`)nR-)d!HE=d<w-YVQm7bfrUZgwLU3A*#U!rR)A zlE3$pU=UtI<@}M?%yRfYpz^_2v&Z=L7L|XrIniN}v-xE~Z^I*YYw#U&yRghC8CRY9 z=)L}U<fnuhywn_Kir~`<wnSq#zE)a1SjxO-51QpqJ+B=%)eCsxX@&K|2>q0M>ScDj z?akH~GZGV@p;=81{3TpT?G0e)y6*R!IB==#mJD+srW*^9&&q4>&%8SS&T{_u_3UXe z4L&X(a=LC}dT%McX-X?ZO?gXROuhlVxbZTnV}5t<a?X2@h7}W*rEv#%y@#E1F6JhP zw*nbQ^!InB&K^$!Go11L<`Z{J2K5z3Me>BMuJ!1rD&vp&gvX3P{V%70sGC36W3ys& z;foc_DZP(wyVH&B!1R1lN1%)N({COPsy-EUkf&RQe?nxXrywsr;@C$uG_k*geZ+2R zu%2p#oo(yFv7Ai>#Qord7;A?lT>S0A{l-~jIcabIcqv=L07?#n$=d(zL`1`<(yvFn z<Zl5y!%u;(0}<7xF*ISnCeL-R>{kBGj{ExNh28`C+_o3%4EWfz<J~`xV^%93Yp^nq z7cmEcl7i?9s&vF(N)5W-i{rTUTXDZ7vP=^as!GXvIn?(kRHX5?2D>P`Dm=Jb<6lwK z^L&o7iyM?U+*^xNp4S^|w~gB}>aV=jM1@P8j}w?w)fg72U8@si^-ZjM+`8E73M;X% z-6o`9ikaPS)hwGvwZu(HP0}@l#T(zrrR@*2BqqGB&uqmHggjM(J<6?LiVk*p*~AeI z9pgY^#&mC5_Mqqx`G>i*6UNPuWhX2=1&(#+Vm<a_?TlZpN_PNS2UAsH<<Q(N>DhwT ztmRH@cInT*HUJM8119&{;5U=gpvBTK)g!}0zi&B*jMPc<SfJtCNd0gWaRfvm@<X#O zuKbH3=bRriHI3t>@<pFbY%b5QeXS!j53fHF|J(MPLRG#*cFHL)@(3HFVwZSXh}k*; zOZi>RRz*NKC>ON>(3=qV!AZB1)BUxtJ?3$qz{4Y!%VFIDSeZ+@3evP)OE^pG{cj?k zGU!ZHgezMO3x3KI4|FeRVhjkYJuQDKy8kJHQ45;+i<Ja<^}Z|M^oBoJSBfsf)t@vx z5zd^inQYNNquTD$<lTYuSYq=_{qeeJj=_qghklX{?1(#cba{dWbY+w)HKLdf*{qh| zD`fJS1sC1KH$PoSiFfg8N=@qi?L}DzT4t&6uywTvbED=5wsV}_%KmYS9Z61>FhXuO zp@hTWzmwVybFkiYYOhl9H{bI*iuWlK6ZuaK=F2v<fH^JWVkhT%>zzqJA(^nVj#(S~ z&kF4l$gDaVM(Mn@?la@Yr!QkH8XvrVVM`v^$ZWg(=nkNBn%sxbHr9|E6w0aVz4E)7 znMlaoBAM8)9+Bz0@CG$uam}3iJ^}nkRpc`O2*`XAx!f!ql>9|2i&=AeD2noIhj{rg zAN4Eu=@QefLtrm(Uq?r_5fd~wc=X3fYjw1Hg;|OKkgq$>@<)U(h1`$FPVJb3LgVcC zP~$P-cXd?3rw6sX@<<p6UN)M5q1%S|rKgx~p~L2IRgcd>$J&0M#^TKROmWazr-Cr~ zTwRudCWFk5#Lu9S_S4mcbBy7+LN!RH#dB4Qq=h42D3kI05ThbCZr_$rWG-UgGoL=O z?upvhpOn_Zq?QAPx#juG`-tWff*yuc`Fq--_8O|Z9&b+n7tEG;SC=O_*$Ab5IgG-) z4i`39##*~4KLIp>U`thP@ta^Q+Bm?vl&`BltZ08KqU7EQn;+&;b@NuUI`5!p*7qV< zR*_hhOiqNC-ke=IE=4_ypx@ez2&+$QTb-Q+uUmaD>hOHBYC|9VY<)j`@Tl`0Hrc7T z&2&bIWj1C|?of19W;(8Bp~-ri7vO{O(Y91RdS9XFc>Nmq9+l*QwfS?YA5Bym(8cRm zu{Il_|9Xr?TA$daEji4AClmOhcK_;H|GRs^7pDYtUtNt9;n~feaICp`Q~emkih-1z zSmSy%)WQzCTphIa;@(G66WxXibu8ap8E~O6vt26>gdJJ^$8~)OrW(yZE#8Maey=>6 zl>4!k%+C1gtp{<MZN`CYrNF2N4oceZ$fXzR8mDEJT#q2Ho|i}5e~|S}sw;~xVlCXs zx0u+!vmsh&1MPkjx{mmjbDbqqz~svj%}j)`+Mcz6uuM3-u(L%z`^|*KkLcmX(H?^H zJHWT)e*m(g#9G5miIdXbrC!CspKv(cfUEsv_GSy>`X-hDGXuIf$qD}FoK*K;yi(?F zP8M*C))!XWd!-@36}w>g6<!pCX{yRPXitu|x1cehMBCm99qKeTnacbMP67O(O7Pf+ zy~4Z{2T`V6H2z8%t!GM<GZZ8mV^74_c$fn`EAYJo$j?-DQY&<88}IY7@EC6POrDlU zCwy~)>WtXhh8NXfF+OQM^J|fUYr6R4I{>cutAF^7$EIqCtI@>K2%2VblEaSp3m4sY zmC(%=g_0%$$5`Kv=7n1J#Oj>cOqpA#)2by5@LebJD8l5rDkZmK#)~miFHw?m=4A@2 zlOC5vUOS8eD0><SvuV4{IJ8pItOTY>MqgQ?(RsdUQ<&+b?<$lo@g1ki8#Q49U^}T$ zQz*mvH{)7w_e{HRbDtd;SaEW8f9(@C4am45`G-)-LH92)cuG!a?9JzQT%D<Wox&Sf zJ63aWd@&gID7Vt2H^*b@4&a^3pfRDle`r*lw+bFrADPe{LKI+qBiV8Vv0ZxBVXpef z3cb<9b)Ed}*@s3*c9lq5KKU*d^ZY%7;Q%|&$3|n_rv1SR3}<^uE_TB-fg%l|n+u1E za{$$_38xqJIJ6n-JDvR(eUg=~z9C#&Pq>odw>n$?zK56~<4#Mv*}7Q<wMTMBp{pYM zYu^T2zV0|S#ubk|1MBMa%szjz-I^3H$vL|^zO1Tbz2sN{Zwbayul8EeFZ0xF76y+) z*SDvRraPo_hD>t5m!!xvfwhivE$ng6nH^^;oTTqtu2lW`s$H{rJtc8<2guhnt!5rl zrf`&t6M@y<7p=^qr0VDV8(Z6RRv~cGnTW+t?r1D{neAzQF!hDKSabBo9*xc0zdinO zb6PeDl1N~U-q4q{R0!M22{Ti+OY|>i*9$d11tOmFrm2rCf$j9<^g3;kux2r`w<m92 zOc%ejt7`!~AOaw+SLGiy4Rd6d@-YhrsNFP^b@-$9X7U9{A4)zU{OyyD#hJ{Zh9{!Q zZK*1rT<X0PBCyc5WBpf31cc&&`3G1G{7{WLN8JXvG9hwoFqkp#`VZ&md7ECjpB}Fj zK!B3>+F+m8eLHY4J}-Z3DMx+m*V+yY!N~*$mx(gi$7ol*OkB}^kPsFuU(E;YXf#nd ztvsn?Fg#@#`py4yp!qVw9+i4<kZpL}$Rgzn>*6XG)SS_HveG=NBXU9Jh&3CCUl2Nn zW*cZpsOK5r_9zF-l{E|PM7(ydyzhq8EfHIHeFu~aH7;`pqz$kSk;nZy1mlqdYh5y4 zOzuS3*)HD!o-zfUq8pP2Gj5lp!=D@McCV3wU^0HkpS_u~*;i)paBE)J=H}(f@&iG| z)Y1ac>f+2{)%(!fnp^%CTlZ0xs7azER_N-*@lD6vD-ogO1(p=Fqc>E)3l<dK=@@4i zd!$>U?rbxve(-)SZ4sWt%lsc8K2PHPyOt^n^#vk#2k8Dsfa+;^H9pxdFw=?ewM{~O z_O`&i?<su3`@J%ON?zAR-~k6{N4osY0uPOCZI@^x9YL`mX81WbEKB`wGKb}hyw>t* z{79FCN83~C-#9p}8A(`DWk{iqJKpe8F+I(!U4>Z&hw$gb$8`vy@P;d%Jbm({gffsD zBlJB2`_Tn_K_i^jdbl-XSJx`Y6%dthd{Iy+Fa8%Cxs;`O2LKE_CV(}HLjYNDc^_Fm z5jHO~?%0I{gCY~V1opx;NzT&&DZh|~HfgX_#8O107TpY>uF4{0b1BQ@-U!EP5**W1 zAE>!mL)QQ<&?m1??n9Opo)!W)3k_UrZcd4srIR?HwJnKYsvf0N=?59~On)b^lWrXT z`fGt&q{WUQ_5i^GO8Q$mXzCNiv5Up%NxHE0{k4yu4R~E!R)m&P>}^Vg!@PC*z#%;) zFJl`yU)$enWy-k&P$Nb!jxj1YCCU_;f|ED(L`T=y^=4)sV3)$Ycfi4LyWs&pyC`Vx z)Y@qPN`zdnU=ueaiuLPuxlO^`V(-JgO$Z$>*P6wPaURm|u4BH~GKFQ%o|NQ23T9Ee zNWy;TfW_nnS}VfXOuM0n@>_aRQ$j=A8FBS#sr_AkVOM(-5DwK*5sUCpr&#Hb4y;S~ z$~@*4Zq8C!>_OC1Vg_|8VS2YCG$ORycq+KR-tFv0J*O)$=3l+pG<j1;#1!^wz83z9 z-?Mcn^&pJLG8=)7ud(M#_tBL+o$7=ix4)Ci!@}TPQJ_PA`vezJH1ZOLyeRluDHW1Z zbS*LLdA4xfC2<FkYZiE76NTAcwGTMn36lxU<x5$b5Lk2H-;ViF<{g0Li40pd*Vx-l zkr+Mh^&88q{bL0abq5ZDn1lR`mAt%#iz~gBufZ)44Y_{O+ZiEnj^EXs!b_Gvu-3rk zdCFxOo2s#WI@q-nW6yp*^ZDtaLevLEPQs@L$E@_&!K!XuJj|givpgdhq2naFR={RZ zb^VvsEBIoTu_of`eK0L9P+63}v!@&5kT+1)B+Yg&#+W%3>q44E_&i>Kn1I>dzH>N@ zty#-|YW3r9VG+dUq@#)d0XrVnR5XI6ewz9Q^J)q<=?hebI<Q(pYpu*)&sXOvwrV_t zOQLWS9HC)lE(GH`{lCN}$+wGRW_JeviXqBadWI?vcc_*cK2eJ7PA-8iq(E3qd#3T+ zWEZ#>u@cP7{BuEN$$5sFAI*e$2je_BJS{1Jdwf`du_p3}-}7#r%$!rn0j*=*gy_v- zHCoT%q1ah0No7p+sr=Wn_9JsDnXOv}a9;NrU7iI^<zTU9B1+u-M-RflrYg$yQ<h1U zP}etqe$AX9zw*t*l1~>k2H44Mwthu<R>7HDoYj1?o_~~p4Y2wHIovv7J<@6y_4CLA zL9h0Rx9;^4`3XB}duv~qv^8VXbI5JjeUi?x*ghkkk80I<zv21Dx3kIpKm6QI{<VwA zRpB=WLG))gzsXz#s2__$7;)Vtkzrl)JD9Y;<oOaxZj>kR{{U7s+JRlEk>VlP&f6*R zT7>=x7kD*vsSm#Ty|z|fH;6DwErlxW9^WJlcnu4uYGCqdefHRZ!zaHLe_&Z?u1nS1 z1eL0Zp+0naJK|=mxP?$F9W!t{jCkZI1JAddi=bClgle|uP22(A-kZl{!{uXyE)7Vt zBk?@kp0%yL#$wBJX<tmbxmWyQXWy3y9ttVXNvp}FeBVI7%~XTTF~Iu>Lvk?*863?Y zzoqO^g7hmU2c(PF9_wehp%!qgHNB@I^iJ9on;&&GJ0ZV#jCsl1(J4kk*N6x3Ou<cv z{6|4O$i{w;YohYV%jgO*-{WR*kMIXQjD`cfjXGx)xwOs8*O{Apjg4nWHV=kPqY`gJ zEwFiYYb6bj?2!Xym?IQtVD*K+^^xpV!g={l03>j0Zf;l($?<N3Xn6Q=ouz_xD$)Oo z??4+AOT$<tc${NDb2OxtqTZ>aP`pNTnTN>==&iK|hpe;nZi~yDUmP2GuqF0{d34y? zMjOl-y!b8jRnCie&=wr-0Ff}v6u2hMKeO{aFH`EYsA!O;kXY4f$9w#^P=x+^6&i$j zH{9@|24TS`cH;*RLt@cr&fgJhQg;(9Ghe%S(S>z@4B`d5XUmgB{I9BWySrp7U6Y`K zA9PZATb{<jVPlkX*ks!p7D9{KOuzb%JxvTXir26nmMh;Imv8;AcWKc*r<1>`0;ia^ zQ<YR>$za)&GKl$RVeaP43%}`xu~0Zv5u@rv`<hQ)AoNYnX{ljD5lOB+Ycfotd<dt0 zDLXEm|IHW$XUb}DkvQR3iAfe-A{JhJCsx!!_N*SVSK^x2vuifT@yf3}=g5c*10IsQ z+-N&H#Jn_4jBnZ5?0ERTVdy$^YB_u_LecrRu--A7Gp8`^&q>LzrCO$3R>Cy6dEwJK z-**I55DcSBttL3=DX_*F#)vWA6slYHEP-vA8*{vJ0skEDwE5)WNxW84`s+e0G~xpf zZtA(DiYl{G6T=J-bcynsxjf6TTrVJw%+!GzM*V=P&f;`^e;yn64Sd21#m3@(QI|ZP zAKh?-mf0Hg<a@f&a}utUt;_n^*6th{xgQtD_}u2u>t<fUJmhkJcSk~>o?ZD0s@KGE zwX;<Ze`h}<nnz!hZ)$KWJ&98mii|Op#0F;02eceza2nmN%U}~xUPR~t!Lf`BAa^xe z{0j*a*x##*<Im=q9>vBnGp3IuzP|Nly2tk0YQ9$c+K{$MOGMz0_DH`ci+B*mH_#eo zJ+Q!s?|fZmS(WuCjNGr(bPO3-XCD3wz5`L3<B_=q<;_uy{9;`Nog29>;(ga0iI*hG z3l9F-u^c!9IIsCeaYHBTk5$IN`3_(MO|D52(c-nrwqs!OnJ+kwuMLs$-qI>v7FURu zSl&lZd+ju|nyo0<Q9G4S)&I6b<YBt70ZZowh!uapo0{}G2xU9x+5SJ8+PIbc!sR*J zPGaZ5DPn)ERNgt|g{bYpAE8}}4%yJw^TH#2<y6R+;934UmeUff*TJQomw-WQHGP~L z%$6Uo-w*coN-31QH!0h7eNiF0DQOIy)_Y0ao1Oom08yqJHc}$xttNEMz1t2uX196v z?@Q~@)A)LpR9&g#=@k`XiFf~tq_Yld>iyq15~6^T5(3gHDWNnBM7mQ-KtQ@Coud?x z?k<s(u7L;xK?c%{9;KsUAnh32=Xd!2{@-<-o#&kMe%^7v?kDBF1@NI8Ab$!pgD$-9 z91=%APe%A3Kf>dx=M9{pXy|JI3+5tg;_b8Q+zH-FEkRPI`e(NEBA;S^LZb1qeqV&U z3ptRFswmRmbNVpe>MB|}UMk7D)c;6;uq3+e6<Z@pxp`ix@tN_HbMg1Mj5xEanhUN< zH$<&Yp*vOHlArSs$5ae~<L=p!!WF&1!L!e8W)->jI){=(W>|3Y-Fq^@a?%$zOZPe> zbv{iu^~zz3W>xiQ+K`wbdL4<UyOSoLtkn6KwZSHg1)EDEX{4T3f5PcqV@o+#GH`YB zMj4@#s;i)6#L1VAdo<j6zfYqQ`ZkZD^Kx?CK}HGH;JY8x#hnP8RaeQcpB(q1F^2Az z{oe#BFZ;jXfsvvJVl|x2l>|3RHkZ!1RD7;4yuoscoR`DSsDnNF{bN!~@R#}Hp+Vco zlggZf(elx{3jqCQ_zT=(a%I@LwP9D*aroQ=TN`<OM)bt|YWOle5GdIeCclf>Z3IdY z&3B^JtErlZs=`iG4V$vVnLE*I5A0?3{Kn*KiS>xuR)xw+A9W8^yu4TNzWt-@PAm?q z*=Nku$13AEUrzA4Epcv~$@5Nts0Qab0bBlbt!(y`0#sV-2fv?Wk~l%*`5vWLFoGi; z%plGtdjJVZ>@|=-l=i(s2$6h2wCufa^)3jEjf#M?CcF8U*qiidoz^(-7}ymi;7D1n zF2>m0+I$3#n>v6I(R)9l)2oZG5?RvG^+LX1!4!NQ{)rL2=;g~7Z=PdN;kjj;YoPDx zT<jM(@KOYMl{)z0Qu|l-EODj}dNwu3DM7&o<@;m!qy*&xh)8rq0fa#=xCpn~uW6!i z^=LOq43wjQ+)Y5O=3h9uZ>Xl`Sn)>zdh+{_m@EGyg~yuCj9K175!lGrwcoG5+xs6G z{T6906*Q`?JZ#$G3r?G-ZE+>~Mas5^1H&6!@_)_1TI@es_|k7iq$#K<-bfZBGU{zC zUN}Efxk%a6@H;;{ulkZbF2bCg_Z(Yu`;L|5b&X@Vst4LROEFm%`uB8D+W+(19l;It z=TK*!%!pL$5|3V=Lv6x6!SC~Tz2NHUzutT&B{&8q3kZ&8hEqnLbuJsRTuMej!<IAE zz_K^+^YQIX9R*3obF{i#+kh+3VP(8-ogh(@1r(v_{qHt&Leejy@by}MNw?3@%4ZTL zf02b6%4wo7&Pu)S_CBmlhOhFznES+$)G%spE~lmhTmstwN2F?pO4FN@80MJ*g2i2A zkJJ4!KW!&^J=6i>{Zvx9oP39T8_!pDZ;|*{o;)u%?vi@oyLSTUtU?wUZd;#+Lbofo zkCcCQo-X>@*zR8bkLNBCFx2W@XFG@e=q~|cKe()=4f8@xE8W*5;V%QC>axnVHA}`p zC<nT7+5;@*jV`G&v54p7xff4jlBRm!$}Y0~DRJbn#~fW?xuM5vkrI|@R8mpVxz*I8 zzyfosCO4kcZ<#30iX=&T_qinV4d?{359RLJM7O~4s1Wf|bD$O@6>Vx)<Iz%tC@tM> zC6Y+D%s>abKDLH7hJeI&7p~EqgtAJ7p2BXd;Zd7fxpmW<4mJJe+M4$|psTI2=wEYV zu9YPLxy_@?Q~@YxNd=Ebbh>05*BjN#*r{q|o#6$)tuIilWmAhli3R(JimHs<O}(t> zCd5&wo$z+$J)?xe!iHa^TGp7*c1rw5&vQFqq^MIUcBK6A#o_Oym(RaA<#z&OEUU97 zB~Si*`-C{7cR58sImB(C>CD%Zt*<MnOHfT(JXgU`&u(GE@XIjM?Y%DMaSkW1(45-D zMT)5Q_5Ct}XO)bXm33o%%BS|D?C--V&}Y}x^u!SqS71?<$}Pw9Gc;OXRB=n7YGcTP zC)jbiDlK5_=YSzI!(Ez&(RwNVani6^GK@CWClXGZ_oG47c(BeZXs4qElyChyBDnbU z6VRx1j-0X)N#?cK^w<E#dh;dEnIXiDLp0}6!wHeyBD+gvX4I85){%Rp96)Jv|J>n4 z3gt6xYZ2+RWfoxCNg)C$=QDjb%yJu56joS8%SNj$s(Im0PLpIDBNK=^sk*nlSjO*| z!5wzW&T?fmPfsX5+7(@|!@$Md4U&$$7|<kCf@C~p9$8S8+Ar#vA?p6r5XAGot`IkV zn_orGwgBRSzf8tB!dbgzX6XH1`!(__(%WtDi?E!U2tJs{D~@cj{AC7U_8C)s-Ku!X zoR7OO)QXNcgkA<BvYN)Y;gfwJKrM3m@lfgtJ9!+z1(FX#W!#LH=gLm(Zsnb2Jjozm z!(a^=*D?uSF=nuJBd^b@@@(hbS^JiI-z!`hjd3_-E&k=W*PjI2Zg2@=Qau!yk$%Pp zFv&G)+V?twD-(vnPv5ankpi{G*Z!732R5M~W8hg+=6Y-vgiiK<qIDacmKx~%^>oL3 zF3*JZgPGokho&Npz|XD!C3{*2y_-tx=rBMyZi6QQMl@@G)JM5TFPuUZ+5t!hwfu4g zA8;wWy>}wArwhUb3G~(7*>bk~MqUlgk^P<+1t^UvgM7fl0*?cSoHBmTcLJ!ygO|!V z%eIR|tOeWqCTJ;}DQ{sAryoGb#9O?i?Q-(%lKn8RBX4RLv$lqqU(M&>v?)G8a(Vkb zY10I^{e3~Xl6oobe|~;ZbE!{iWEE0cn7Dj3%VUFlYdx$UJ44lZ1f4%atH0<T;CnS* zE)#Jhb8l<!aO8D-v`G}H_C=A5b+SoFnrOP3^c?5U!c({|GVt$Zpn=R3ajB)MbH;mx z_d&GkTZ-PNmQt^G2$N>A4aT`l7jKWg)qT$!Kbod&=-Ukb_Fmz>v?KHkt(7OnGGG<* zAHm@jKEqu059g<-5k4geFBwFcF)6)juwBY(aXB~H#1+2&W#g~*gUy&M%F%AD!Cg9c z>{CAQDeY=r`_5|twXpuB@}x0a_LWVd&{3exENkp5rhY-Q%$@Fz#Ln3~=mL7`dx5r* zb4s|1qPII*Vcp#_h8q?L8iBtxy$rYdwjCR+bzNe7OcJ+D#s3B{!#xq*oZl$Av$oV; z=8|T2ZCd)sB53{?N7VfZ;bKXRn5&EvoK-UG41~oo13~h^gUz;45Bfd12IvQ3;H#6W zvHa3{sf6O^QfcS14^I}!FZHy-pJfXW@0H<PV52MXjt$#7f%kqWJ@}7cC^ej}(m-;e zp-rIulrx>ifkqy~1t^vH=r0*w%6xU5c=|?{PqfA6);uV?P1)uWp<?5lJ?wx%u<8I% zbl#lmN5cy$7W59VQo4K#uVm*6qx%mZ-w;1j?yoY>IqulYdlX_DCHt@NZH&x^29p0W zI!KbW0o}|DG{;xa|3n?g@+-uE&PJ61Z<zs7UWGNZCgpj(wl}R3f8Fu@g<jtMBuW?h zCl=4s);~rUaNaMu2_-duPzNVj@x;Q&p=!==A`(kneW@Rr)KF~Obf&Lgb4LbB#I|0X zOrBH7;9Gaf%nrqo_gXe0(FlL<YpenO&xykPp@Gh)DoL*M%g^gtA`gC%L^&;?s;%JH zpF%aD=Qy{Q`6MI#?<F+Y?(~<qonIdt{F;8%V^y+huW(%xReFv-(rsnnWr=sEaxx7& zp3nn4njGSNO*aM0i$yI%hOP;Ey1T1oND5&MyBYrx1W<{JGsu#q@s}}^wD3@NRIb#0 ziQj6i+fF|%xglO;ri7nKC#nTPp8XB-28N*dW^t5@+xf18TBFM#_f=S-yhU)Z`$(1Q zmW=%?y}y(&T^HZ((GppznjHE4&OO@s{bU!nX7i<I*P7g-9&FvGq$_7|qSfe_cb@xK zwsi@gr#zUlhwY+u)^FCX0#59ob~w%OOAjWTatRnq++DhBOY14`3=)m#1r`uR6Ii@E zP{{%)oF2!M?WQd~7hU0VerlVt?Fv%x^4?!6^!mWfUmbSxa^Tf)FDb0DO;S^E=G9u2 zns<!Po}66ppB(7c6n7HbwUp6zeVeuWX?v-C_Bn=fdG0TJkIe57j8mb)#8^>A^TLF$ zQ?t2rUA5=RAOJGSC5K#AxgAyrylYo>w3UdOv?~|viwx9UlTz1_;JZ&++2BH?60MoZ z!1p}G7WHp1aC?6#MShXl|2ia#TOGM}bx|!uf3gvH*%%$C!jy7$b{L%ZLAKAG+of#i z*~le289+tc7*q_(&<Skp2TRfrJ~u<rS8*JpGMx%iZ~%1lILt3?zx910W2^Gx_yb>K z2dqH>CbR{4<zH&X=^m=ws+n8CUpB<~rjt-t2bUa_=;2=KegSUQl1CLOoa4lFvUptK z_=U$@5yj7n0)W&nWNJ;(Y3`D$=End-NTe#)+JaxHDKK$6P~~vql3<AOX}+Eky*QuH zH8=BkOim38Jx)F0i%9uy4>*`4a=we$Y+;_U8xuq#rZZ)$e#w2MPf2-W>cxyWEqP%* zfBybw+i1&>d+YqkAN|bNM9J1xTk*ycuZf+CJ2~V%C19ZBw%56Dvux)R3=A(bgD6k< z)Ym(VsrU3Tt_6`_9zm>wl)CV+y1R$<J_mpPkUAfqNbZnUS~s{vUb!Zw#t%yjDxMfC z{Ayrf>woaP$-2Fe{S%2eGA8%2isBF;%Y_CB+DA?kvBqboy&_ZwPohe8_nh6UeDSaf z<D_?F`F+Asmjv5PTa~Sxe~z<NAL%a^uLgmOt<F5v-kHVyN1#SQuDU>d35<C%mezC- zdufa#zSK!#lYVm59|!be*)|gI<P@h)C;)_xYkmM4|3*1v7@TRp!+?Nxzj$=W&j5AG zcsZ6Gwtjqcz{`0$gcT}^_+yvlupYIGoYW61(d1)%MdQNuJ)+U>)gEm^(n^!M@8(bH zo<@VLvA%>8BqY}VOm2@k!qfG+uG?n0$!N{WgO8Herv`U9dUCq^(YZZ;*w>*7PaDq` z!cqW%xaYrA{MMW37R|}}ApfIJkqWVXT4KD|T4`WpVp1=^Do8($CrRRV`^vjf6tEYn zE$~``bE?#I{$R6(yYPRYQre{7j`;DDq-pw@WwnH;gWr;TlKTkcTzOObOwSniq$MZv z;GTf}`{5|KPRB&hyAt|Ka`8;;;(g89!dvj)N7`Ads}?1{k?4DmwQjO!o!rY3TLt25 zEuX2)YZ!bNKHqI}FY0?JYG$_cU^8O$TQg(IU$T_IGn8D5fl7iKSJHK$Ute-I=eb}y z91;fTXT?oii=}<jfY~qsoQNfi@#}Pdm8vI8^Z3WbbbdybgI-jnW$=t1!zYD21)A!O zT)_7Z>JrYR{a1#x;PG!64*;-E95idy?26sOQq-h;zyM?Mz}}r;hth>ltJ;k~RsO%! zP`4{C-UG(W&5d#CCJ*wzsE}=bQM0sCWt!Ox0L0tZ+RtU2c>W{EX=n#>!&diqy9xM5 zXW7#$!@{l@rEAy^0#xx^oq^OPF|(%u-ltu@039A|i2kE?IIYc|Yf01!B9fE>_H(~Z zbLO}|>NG1CWeLK)8{P(sp|$;778-Q7u%k(3#h!J7<BuF9*aS+Ge@T0sUGH{K5OiV4 zZidKf*T)JxRWAlKN<OEGhxs3<V&E>%9%q>;x!l{5UnNTb|Fc`I^qsM9RGV7~313wG zpTSSC5tY{5G?6V)@&z0+9ZypG>WD*&9wQ?p<5%8h5!w7)lz?EEIMj)wyfB~byTcQw zUBe}dSJn~~BSNZaWn~hj*I?z8G<#-f5@-%W3uIA$DpTuHf4vzre|xzY#HOpW@Krj> zW!Ir;dFk^HwoRMBC&iFD{nL#kYDWFWN0dRgXX7R4MUg{KW|{1bSz@nH&`RK)$;|R^ zvuV7QOZ_clJ9*><<4I|UVWmhIC>hAC)MU&3vm7{IzORvXoX-4E{xecM7kMD5Kq&*$ zHFs;O%7J@HNMZ+kDq97PF;J8Ze-0quWH`O3RG3%4L-ncx^xJL*-wL;vHZ5zDoS7fx z25(-46`eIQ$JXV%8G4BHKjP9KmbF9l$RG?3kU}FA(zI!o{y09dDyODr#Sc(S^M@Qt zk)US{LHYG1D{*rwd3RrH%3HpL1l3C?u-uwot*J`(p|%iOjJh5VqAlWU+uUn7%87vS z1ng@^8AX~-^TY4Nh8fhne;;`M`S_I-{{oEn6F>Z6UM@2ck6ZvC&S~*^Cdf_g(p=j_ zovjA9*6HsyY@Rh)we^{97Fs6U3koaT3+C{oD{b8t)w#QnBq<BHf647ST|C;?-M=0( z-!qO>b7!-sz$_?C=mUv-<pOz}sbEyJt;$J%HG2QZP;G>}!UEO2!6M*#sfG*1UR0gC z#<zWZ27Oh{Xt*hQ&L1&hh@>OQn|a1jB=a-r_3iCZ%OPn%tUhC@@OQ{zW+>&6yskB( zO<!}!QJ?r(CMo-R)a%x^Zgq0gm-Sd3rALcbpPn}{=)R4=H@!P8J@lDsP1^rSvS+zU zOY9$!rA_~ctqote?!KnW2cFy1xsVUKO2F`?K5J)mRDLev&J$+m#vMLQH}e<miCJ#R z1!pV!7(}@U`NubJv?^H+P(`bSHDW~ROoe_w;iJ;%^XnS0fXP^*$oKIzNi?9DlK;Tu zSq6RdX0K&X=Vb|NXt41Jc}%cFN1J>5uYYOcL|_j9z`+`GRghPox^~9us3@RbINL(= z#J0Nx7BSR78R)H27iV?J!u?78V)vI_>e~H@$%5nkBmKaqP=R!cv8}hJJ}X7ALiHB~ zQ?X-z+!Anu#P7d*Yg;(~ML%?Sc4Y4e*zhR0$eS8a!wjuO)O+vl1D%FC_oH&ehSQef z?Q7{rUx4XOHAmL!)T?$KE5m;NBm$gV4MQY7CQ2grntuTp$lgjfGuP$ARciYt8m-6d z7Y|*{LJC$fHu%f2J`W_IKmJN1nz<O_Cj#sx=cPYqoahE+v)F=Vf%T}qMe=8Y?m%c+ z3>?|hftt>+)c7mdJ#rYQW30f!cAA$(ZtRvX+hIJio$$<CzZsSnHq@2hA)jG(H%-$e z{iTPSg4*kkCbH@KYcqy+!eZQhY6dpK<12UJ@;zthSHt`sJ$h;Gw~T}AK*`;z&k8rW zy-SR^Hn^&RG+vyE8RIm4ccvvRkX1~d21zjSC{ubx)@gF^mI<>uSAoIe-893CR}@%) zDZetH=8f0Kk0oB8ooHUiB`Izr_l?oNbF;_ddi&tdPpM2ePI&M<2SA%z`eIA7Gs>DE z#zVNMxQ>~!l-ymEME~@#Pp(CAp*$M(q+QO%sWPWDmJ?&zFX7b#%Y3O9@&~!4KU1th z%-OL-ub|;aG*|qf>U#!H6&WR)NY$bpbtL1_1ZPpcY_FqCSOy^@wdsNW@Q$-M#yx6Y z*0z56jisgd*vl7*cQBuPFAjreG<^l`atqhwEW0nO%7i*oDn=TKpu0#qaH}%L`JvK> zn#SKEjZAY=YJ!r&ie^oiWD}beM~JfSAzAs<pCtWGIBDnh{9YsZK;XegCXUnDTBA~; zf87xC_m;Kxjilo%m&b6}dF37<x}E{6!ofCt{ipz2bWW4nItZC{%sSEvrqSf0Y6$Y* z&bdgi!vyO;mw3O#FYtBK17mbf3Tz8^_B}qh-(N>v=68ik2TzM4-S0QEJul7$_p)VA zhcmm(zk8|ll;HkNw@F_T%5_Pd=`k=HAN{(^ZwBJ`k2x~*wp_5mkB7>Oe&VlmM@MEL z=>`VNwVz**j#(BB7-fr&bLh7A?EJu^6?Wu6nVNL$Oe8(#EO?-9kTH-IKmLY`TU<#V zXKuQV=_cW1_RT2CTZt_5A+6KCMJXZ;I!s#2AKktVtu|jBWxW(_{uOqW6m@oGSRXaQ z{xA|_=gABjzWl=dX{uH^`YmNn*e=>oV|*&QOQt<RIU*6Z{Yfo)aJEMgxZC^=K;&1W z=)@fpR-C=mnePt_$$=|Uirb_P9_3^dr`!h@x$u86GtF0Q^X_%YM49GD$oxkT>-Q+r z{A%`@q^);Km~}aQr_hC{9#^C3N5-?qby;oDM%Unu#R^*{)*up8((1>0+Q8enJarp< zsbYkqQd||%Y<hgnch_4|(UZ@aPsUfgZ>GhmG0%7n{xIotr7k?+dP@5CrwDh-rg4v+ z6eHTe^0~lND}~uGCW4jn0j)rtqybEX>yy*it{~~a0%&KA-!3hbUsdxP?MtKWz_9z0 zJABQ~&@^@lDzwf|Q{S%_K}HwtV|;@ljca1`tN~x#HAHoXrUI@%w5OZk4wONDO@9@7 zuYwIm9L3jUMKQ!4fMx};pBxmq3U)DCdYc<F%IJf)I;TspvfT*z*{s@qXXh~#Q^}=^ zTN}ByDy~zaxF@*~P0F%y_EX(0>%Erpb#0XA-y}dYP!VT+0CQw_JC$(k0c$ESgWb6e zh;t*j?d_(^JDT#Ap1#Y?_!6H<KF<;yj93>FEaOQdjfIYm%{-DXnq{<4a#~tA1fb>0 z5;q_@A?V{$%~Xo^C}XWryUtGFX?~Crx+Qlbd#I{+LwgEQ%o~XQN-{GBTyAuV+PJA+ zQC_*yX?eY#2lU$f@qvMa=B?R76T*Y@`n^mnewVe*ZTY*7CY=S1$VkFl`)KpioJ<Pw z12anQ)NvPPe&SD?CIc-{?%Q05zolkm;EbY#cONUbEm@HS%!5-yU*+v--qq<<!DWD6 z*+mL6uCT(-Y&Iq%suZI157o_ZvI;wF;4tEdU=9VtgOpyYC3@7Av{^R~j>w1k%iY;d zg6YiiEiZ~Wnts>}`zeVDmE`Ji=J|BJo0@B*e;Zi3J|-Z!X>buZdfejGey3inxWFI& zTlv!~s5q2blXV6Abpd1Zh4(U&1<gvz1*~<UG#o7<GVW7NtoIamq9$d(P2d&mP!hR+ za9MH1!kjqjM}4xf4H~_y#C=}c-00{@xBun;Dppc(p0t7KC;we;K5~C~m13r(4R7wm zON}f43-nUWn=g7&A2%g5?yQbX0^0t)I!bxXeC{{KuS}3FEUD*$6RbF_Urk-0s6}02 z%~yq(ryK797fyp<LyH9Mm*cMdZEuXTj2F|m&bA*F?z#&c5sOVY^YQeoOqcE%7D@XK z22baY2=cuZN*2k8NZqR53y_O(Q3|$yXK|5F`|(uVUB>?$ev{Md%s*~S`V(M}?+4!@ zlb__?4%lW~$6oo?T#~!7^a<E6H;Agq@3O)wUDBj#k1AaY%?)WuSMDTu4HOjo4Xx2c ztLj0ahMvUku3gkaE9%>FIPaxweYw~+a%c25jjK+}TgYZHi#@9G$Y>z#*~oij87R=m zxBB^fm)V@0I8REN7h4keoV9u?-hye)m5F?`Y(tgh5xfzdXS-Y}1(oe%vg#ar=^bIx zFt-CM_NFrA5D<3hxyvM{{M?bJ>KCsC>(!Nko}$MysCdr0R*%Z>PLW~R;85O4B;1!C z$+Pea)-4oN?9p?s%~*DuwI;Y*C3vXpqmcrqrO?zFAe1E6Hf>^dYOi94wWe-a_YCRW z=$z>c1-WPFS6)$ZJ&}B}fBrc$SJNFv$Q(Q1nuzy;U*Wq#feHE)^LJCQn+Kp;V<HD| zF2ogr`&}C6@etj8`SHr5;Q!4F>Mf9Q?!?Iwi*y8J)ZqXNyaFjF{^>1u2ko({`1pdG zvdhC_{{+zN>emQdQdrQ3_;5YC(a|*j9!g?<6QT2P6VUFSCd2Ebxv5z&*6x>s-bZV@ z$}z5Asro~RZ*jFP_1E^E^dl-UKjrz$DP;c*z_H`r|BQ;?wYDW_Kt+bs;TZ%d0Dhn5 z7Qd_<b=0&3H%3grJWqHNc{x2_*lMr2(8MrNdHhzrgjD`Eo)*I{a&?_Vd2d7|oMVFU zbaT+uFGvbEW9Hk&R(H<7dYNm`+AXvQgj34Ge^4IzTtmpr>9fV71hslz{(iXDaHXrg zj9Wgw#_E;k3D(`s281h?Dv)*1T&*&Zc^H~y?ddK7uvl|aS79&S)ISto;uNU|&7Lux zS3g(Fuz)`}5nU#qW;nd>J)eY=o>`A$EO1*0XvhCYfMvu<1Bj-H#fPjX^wAXW0<Hns zn(0Q`<97kM@oZV^fI8QSZN83#+bZ&WvI;*g&i+Vs<uve$0(HD^pdN(Kc!^|u-L@bL z!b<hxA^m1!JR?NRV?5(i{b@RD+jwQukFP%d5R;n>)4h^`u56s%P|QkA+|x^Dl7y== z<6>KX!RWQ?ypZ?xV|ygyhssq_aIEBZC8ABqn`XKFQr|8jnLEJ|R}XL_S<A7ne<3#t zuAy?Ga*CH%mn8z?bIW7T$H1V)*M24p>%zmBV4vN8(^k**OQ4??_4pz1U*Qs1Ncz%; z!sLR)Tb<(yIj1cRV{7~WjIxg5_nLo=3f)~t7WtiCHcgxyDLk<1*XzV>=xINddu%$q z@()l>Wrq6vY_t~frLImLN}xDICskIOKkn#A-)hT6t3Xh5;#`jFBJ&M8=NxT?D2X1W z1!9!P4_LCNWf&ci+PlOJ{qGInhl4dL?gi@-Rw6*kd!5s8|18yKQ}!bfp&mp4SVf~R zMf{^kT&@ZtrgQ&akqm0STbCeU)`&KsgyQ~Zjw|3DR{wfS#;iH{F=N6P$jG0{s|h!( z&;HWa!;gcWPY(90-}wjTka|J^j9oR5?nqm0fbzPFbZ{cX@pu<#ZjboO+vhlU=tR4( zOk9&*e-h}e_Ar02a?v6hHP(K}w#L?=Gt=XiPHGx&;dhdO8ohu6I-32N=0!E0TXotU za8btN<ju3sY-gdEs0sW*2et?Ybet<5-urkri>f}+O$8G4ni;^YG(x|m)(%QES$t-| zftgki3un9k48ybZxSh?tf?ft9(f<%=be36caH``8u76POTXG$Nx-V55psj6_UoG+W z?Be*3fTE}{$gg&%$QTngjd&K|ow62#*?pa`^B=(ux{};r?PMVVpkNTkRUExgr{Ap` z(CZLB+-kv1!@MGeR+%NqcG#6<Xiq#&br%rlzR?J<V{@R_fO`>M-x^o7L_z1<)Sbnu zjM5g??1;87--{=K)iroyfovg97Lor8vgt)VTK$he_fPd63A0f^!SIDr*qy<ZF4&`( z-G7r+=8In*79FsJX8W)0j*H=BjOJ-H?(Yzpo?aSm!l9mZhLO{rPoWt*Vxw3|Yd7Ha zX&uxStje3gz;?oKoiwAyFVTQ~f)jP%6r9ck<VYPZKU1B!hTbOHpYN7!UV2sGO!Ci0 zxYm0!*nj_@&lj~rrmO&uM@Hi)r%ratLpxwW^*Bf>)3)9edp=1-dKZV`q>YkYveu+6 z6V-}jQzYzg^_9E-5RQRnBSQPMzzjom1d8$9*Dw18@!xzA!Rmko#y^hG`M)KERF|Y; zmihXKgHbRHR|~%GGTbJ6VDePCQ$JZwMFMyv$o+qadkDD4s$bqaDL_`3#pV^{$Tr_C z^6YzwRw}O4;vc!aiX4zwrYca;OnA|y-GThW$YHP;To6LYHn%?SdG29Ta!$zNy7$_y zNkvQeokR9+b&6t%MMJh{N-Yh)5q~T0EDV`wEwK2$g#!F?DMjt4t(ABy7Dt>SD0mHc z2_?Ta5DR_u&vhd^-ek)Lq5S~u`=o)ZpDN-NpRNQ+fUetmsPttm&P>P%HJY~L&h~u+ zRRkcC!xgEbeu5)a%FF`1l{FjdD@kJbRq(&_YiA)}@_@QufpLBV)UW^^2=ZvU$;vq; z{L-!eJ5L7@wgbm&{@f`q;E>qN5L-GJ3VZ0MVl~wrm-A|Sf>xj$wwdJ(1w#JpNWee} z6V3JzM<XW-Euv^`!$kVXh{Oo!8l&Xbwx?@V1Kh*3a=VUJ5J(v2`N30dtF4%9uX;wY zpZGN{f2?()Jnx^C%~n3sf<Sl`Xcga@CCDG0Lf^S8w&@FJ^M`4;t#h^HTr_gWf+KY= zA?0`GaO&kRzZSPK7eQvXB>|1CwknIu$kx}WVvH>)2KY-;l|#=Qg*9NdKemIxMZiXf zf8bzvaVOgP?K<1Pf5=4KG2-f?f@j&SHv5Sa;gs5zd^i@Be8NYW9T2NRK>El7bbPdL zB1B9-WJ^<yc=W1(Mh?)=rW;cu$4QA3*Y<FsRfJB8?KF*Tr+vGR*ShA5Vy-_W9@*({ zsr?4V5dvmCM=;EJr6%`yea#pFdtx|Bex)XHrFK<8UXwB(=P=#_tV=%6ikqpsEpyCR z57LX2FU?N=+V1+3&%<c%MtQY1IoYuV_>O$0)-EUgQsNf4@Ha>!w}dRDTvtYRUC8;a z_xUp(ghp+VVzyInu@qq2ab8tn7Sgct)iR5i=5|O!7{JLG_L`O|vityLcqV|0?R1jF zeFdPm7r`@L+;}tic}1$<WD=vjrt!UizLrt$lkUJl$heE~xbW+P%K1vbLqJWF_>N$F zI0Usp3Hu*D{OJ#G$a=NUyqQ&0aews{LZ76R<6R1)2Jtpt9@c<5Khn=O%}gI*V6lU| z>A4AuUrbk2G_$zyZ<0^oP(<6SpFJTC&y07AUCQYgSV{@w6z-d%hR-emw4(bdV+u5P zqabuVr-DOX<2RWNP?!RGIM8%q+^y4xw=>vKTy@6LlAo7H#i*c`HU(aw%;!Ib;3KvQ zpnZk)VEpsRgXVD4Um};@bCIV)2ZzRX_}agezzGfU1iLdeWz5Ag$z28LT|9&=ZqpB= z$f5dbg0S+PS=pN*_Fn9O9R$c#TzLK1PcoHkaL228O!xM39cc!7REHCu4hCNHb(f>q z(n%PL*!($L^=dtn1$5!_Y~v+)zwRtcXRiB@@tThHTa->|p>o;9uuvIDG3LRO!-cy6 z7tphd>#&Tq9CiZ6LHYb@!&@pFgNJF<S9rP+C5i+D%@-tik|m6_r#0={8#N}uXz~Pl zqKGT9RE@ICfavAWKVo@_D9rs~e+WWkwVL+rhtfzf#zf1akO^IY=hBTv-P^=q;KK=M zATyEAfPb(~>C?R=*jG&YLzqL!=!xoMx~!<xeD%R!YYbnRfMFaAZGu}@1}Phizn7ml zN(f`Eadof%X@6_jG7vp3cZ$aGNpU)Dzf+M=V*LntbXIR%8*M{R#IX3S0JDGv-rBi5 zl#>GY=`hRvF37}L$>6jC9PJ1MMB^e@1LmjlhBoC9)1uhrdy%}mGa0fN<I^Gq-K&Bk z&?0<S3roJdBAjLC)G=hjNN^1Itka~Wh59^}MO}We!;|2gw|>9P_&OjI&K6Lxy#|~9 z*md{kiwza~H7e!S6EDd8t;E$8QVbn766oJ@X$d8XZKeM|0afNNQowLZYCrKm_a%M1 zO#i^o!uQ34u(RxK?bJj}#y^-;4ln`Zay4c|?cO5RYM=|tu#BYfe8K@+)-Nm`!21Vi zdYaszxo+0}*X>+~K)f%W%eO_?K8HGBdy$a#*Z)%|-+PR7Fm&7k;N%AQ%Ed0;+fegi z)x=UX3bc2HS_4AcLWYEyunh7)g5WhaoX5;#ArobmV`K-dics)o66F3l@pNk%O{Xzn zcOh#xU2FB+(6TDPWD<>ywv!74a6MxuD`&s2bjF_N;a;kB3~C?0oW1<Q&rdDH)jK30 zU91tP&<Kd^C$2_)|M##LIg~j?f_VBiq9%jRtFvacn_K;VXceC;6$Aqxj#NdS&F8Co zCp=bmCfT^gZaLUQom!D?ifQXM8z7DND7E`a{VB7#Urh12V*>Vu14<WoV|S9k0)Y>T z6o;*Zb?-bh;lEp{&b$?n?Jwd;kgSm<H9N>PK#C6{O2GO7EI`o&vBr>{*$72o0qg%h z_o@eFiBP)xpw8VR-4c+GzQ^yTO$MuJ^bI-oRoAUCbe^Gdh62xuZ!<2^6>#f#2kdG_ zl)9%lmp~z=FVwY<5nNR$pc7j1pq9P;liW0}TCYeOrUj_%=l|{+A6kTocy64d6M>dR zo|yy#dt@L$dE)@hC&Rrbxo{@Ar%j@>)P+5!$s<IhM_03LzkY7Ud$wLLo;DRgT7WEf zR=ZR0=QltBQvOCvun&ibH)iXtBq+98+c2b4scRYVrWo7|9w_5T-aoIhl0z=NIuR*O z0Tk4L99Sn=^jTVCTaQl2qzJ(I@)o-oQPMTW4X>-gWkRu&pIX)G%I=*8t}0BBRvc{_ zsxeKz%yKZeAM&?z<tmId*x*?z@m(>uY(Iz}_ymY-=4urTh7XcX4@MHAU#~-+)lq0R zp6olIBy2aObD&;p6Z`r@RmZYZqjdBWi`mx~K)aZ`@mt#4PWuS(NCrFQrcUggnZC<d z&^~Mevz6vgj{8|owfwS@+-0f?(?K%P;Hf*8jpopQOLbzw=5`2S^K5WQdhX3k96OPD zAl8Bb(iB}yh|trO@@1t+ceU+?N*JPBhMkql$w5?``a7|mH$@as|LO9zZ;yp4yty?; zxVUmvR0ts>U@*v8f;16`H5S+*SwdZS1rAv$w4E;20k@p@(e8L_-N7#ny8BnB^uM_a zg;QSCKsg9{(=m>0a|LsUyEJXNP%@Eix<P!ggl7ZFP}yTHC2?NmluzDnBK@ks@$aq% z6yiv%w&uEa`Bt#_8Lq(l3_YDjF8}4u6r4B0on%-a-%4?aqnyrwWeS<$7f*0MypwNs zx@pPNC(c}u<}|5Tuh*DR=fzK3*3VoPsXEsX@++{Rnn_n%TG_NE89^lbg!u1&9tHoa zn)6NsnuKOgm>7=kli$1sh|kKVT92s|rA{w!H@K`K^r>PDj!Vw?^-VyhyLe(kFJRg{ zd@FR}o)pvKQL*Q)?rmm^ilulzk?`A;m2&tDtgGXQddFbESUtd#KDyzGlWAH9QUoo& zp@@S4s+hG_d_}f&i|P8B?cW6m{?Ge-cd1tC9dT-I(&zSs`^1)np;yT#yp2(u#}2l@ z*O6QZ^F~TuOJ7#ibKdD93dFGOga1G1MeL~atAM7K213@JcJj~TdWw_HKdqFtb_9Gc z&)(?G$3~;JuKAQ`*<<XtP<~=}wjFh|VL%@YJ(}LZyU}EQ&Kw9jKqa-dvet7kJ!Yo) zU4LiWNe1@l>?F?HW4z@~AUp*Wzs3R)nx+2es$2BRRS_}zw&i9qs|DjMOcKnQ-Y=dW zUj~5@*IP*?adw3EM#@-;EMWu?rg5<0%JLtB4{0k2bqSAHLCA5?BUqxUlhvxFfXeCU zJ^>RFodg-G_GCU7V;SqUOLq%^>!x4%l!cO6+{sOZ%Esscjw9TMaO@j=aiVc1w<|Zu z)d2%Tt%3X-Bmsvllh1ieR|ZX@rYw#@DPm|KIX5;o5higO1%yxaTt~r>Vhv}aSEsAD zyG%57oA1HAz(wEB*mQrSmTL~{+l9Z>?{WQbgrAZPa;y``7EzGRj`N7y(9lu4xJf0M z-BM(g{I-TaK+f29Un(JAZVo8@B8x#w8h*36F&O|dXTHV{2Eu<7y>v}gc|w8UnXZ!{ zab)I^K!Dr1H5hc=f!ft#PF_wJ0BtuiuAuRuPc{1O=k?+Qa~JW$36w3=iPyLTpvW** zPTG^|<L7CFul89&o|Q}cWvy?nl%tp@ByS>ooBd!f8mssXw6b3epeg3TWb^hWCnTa= zNX*ZFrxP;L*DD~lAL(xmIcp!=kggHQNbci9`J4n*w%*G37oRg?*8obpnup2yndf4A zaxOSo3<<?N|CsfGO>}#N8ZP@m@%JrBwh!vuVefvF^<7vd?I&9W8;yfKn(8WgDX;#* zf*V*t<4@DyTQ-b(;H|nt1CGusWa#DygzjK<2%c<zrP6BTk6_G=#aMr1vp(I`&RY|E zcU#kYlVlhD&p?^_)(PH>tsmjvCSv|GXA|UTRxkAZpdhpmDH96hhDX}s?b*dJXH=B` zbrX9?cXto)ig1AzCdox%5?AQ|zc}xul@|X7XKk16)$io|>;DKe^69=0nVS}1oC$vx zqgbos9{uS}T*h7dTz&;3EnfCO3eua4IC@7QpoZUiG^}6VV(WDeaiP^;Y27`f)#ezD zLyqM)*CF0FA<+0)IaaQN-@ow?p2f_#Zz9Z1p1fiQyR1&@qh*~&)<$7RbH^SRM(o+Y zu^tm6O=u-zTxytKYm*o?BhC1GXBg0I$F#kfJt%AQb)wU{!v+rWtr1E7^JGk}Y){(; zq19JW_z{1WChu$vq9S?zu0p$MBa1PC5^-Fud1OM4O}K9a?gF033mQVQj`z_lUx7BE z<QL7!oZ1nuzTCPFY)k^MGw8b3VYpoS+FDYdhEM|rIy3sqhn{Qw+bob;?}FKXKFpe) zYl3I~GP+ldQN=Sjm&~J5@RsMxW%HO~8`TAg7CYRNYO8{qQdO4v;UFTposjgfxUgsi zfR!}rXrxtsNRa^r&FcsZq$tyKTs`gS+^t)BM3Q)+f}-M$xptweOpmwF;OruPBj^z0 z2R#Ze`NAMXZB*Q^e3a*h{jNs^zI50RO2YA@r1wFgc*q3Zu&r{&hquqL3cjTlw$Hl< zoHj{EmERHJ&2IrWPD?$2Oh=O(4{tl3?&EmFrDCB)Y7<wrxFg8vuEsv!;2o8CE(CM+ z?Oxk{E?gNz>O>B-h|g&LQNKA%zldkCWBZkJXgz|Y|Iuyfe_8Fm2^OJr@#wLNc0As3 zUh1nf5Lcf(6qbX!V>PycrKNjH%|RwR4w?HOFIGGJO*hwG;?4KeQ=l~f^fd-c7MhbR z6+qj?T3FzN<4hwh6^VCI<?X`isJvqJgS5=xKx7TVsg{|!*<eryiyf{YER$=Q?=zf* zQ?%@n?J?}e?vvyf)zIW^J9u7D)V_jvJBL>gqgL3zpYpshi+N(M00+6YvJ2Ne&9l2p zp1C}YZ$*3`2z!4!Y`ac|#;k+de2DY4MQy?n3+kpg?uC2#<usCV5<-sGfbZ#DYI90# z02=<!u>4ybN^NdTKf~sibkq5+M*s9?>|=FCSeoEpQNxOB2&qTw$kz`kZv{TUK>GxP zq2B;yRI?W59sBSJ?qJ&!_FGqPRUu{6fg7lZ_LCu}`x<><1Ba93To1=>oSk<vU{3XX zQaw{mNyt0)+y566%`|objQxPa&NoNkHVywIsTVy<t(&3DLot#9=MprWm%FkngCFLy z<`8qVY^GireOB5GPYry654tY~#5~>~OExD&ZiioPP_RKzckx^v!!O&K)d031QrE$g z^o?^VIVwAW6IZBftHm1=uckg3EwY!FL^DDVGVehXYV7nf@MrNim2`EKnxh`KtGxW7 zA6~8}qn5<+9$lfv>8Uc%HTfJzoVXQey78=`O@2$Rd1JUs01^<4Md+)&MpEX(xhc>$ zRb*x>fk4HI9aa*^RO;YX-*0w^*xD!?(F8xH%BPD|ej(d<vm&6`wLMoTnQBQ(Yf%uo zY$uPax>aiLN1!%ce3;~|)qmS&(UPqLlBwnRBo_TWeQ`b^EV6XjUl@{;ehJuFKO__X zc212tue{GmCU|<2sNY;VhYY?T57Br891HOCb#qkj=XpYl@KvX=sSe5A0z9iW-%l1B z4NEq_q5)r6oy^x7Ui;`Zt18`H#l$j^6J451w(YA)5yWj9=3(KaWjnxyt2Muc%KC{X zXkTRh#<L>LETs9Ncn-;Wksl-m*d}r;Nhk}VfG$M0+<ycUb^J~;@!M>|G0794RoShy zCnrf45MfG;gRc3Vdm{Z9OP^hXXW1erMbx(;3BV-TpphfeBy>>Nj%n)!DEL2uSravy zFD}5>;n>Ue9Z;bI{bN1Vb`EYAq7%|Q5OBSDozz7_`VO(}&$NX%ZH?5=3&A5S_cn9r zLm(s8M-WiuZ?)3s?+*K$*lsWo!H25~0PEW8h6_2~-(M2j!zab1&$z<?Yw@?_o=pDP zUZgp?H~v+CFM&sV6&3u#OLeUA|JlONN?R(%^8n^$3T*KE8h$@p4{4HhHKfB6IYn!g zZwC+W8<;278_2MMi2l6>O-?@tcP2Ug)nq#-@PT^{W`@jk*zma8CB2pb0~v!F*=1Iu zEXCLNrUhXK6hH)+)h{2POJ>Q|rCPyPRWkt{O+46~dZeAONae1q<_cuuyaEH`y`PW4 zZbfS*Scrj|uBX4kMv#NJ;^5UvD8gXccKp?~9ayIb2XL@^ccg$NLo5|O^bC`fOJ@zO z-r>>VO>PC#o_cOmgpT_Bujmy2x3pL<dwxqteykXFbOogO8LXRkgsG%Fiep^f@}=Yq zyloD{O9vY~=P7dXNYKdI_iSY8fRDj{19^%-Q$*uSQOQ*qEP^wmjBpYY?k86z@Re_@ zm5Ldhd}Xje66qT;GE9)p#pn`R(1c7ENWH6w`sKN;75KI*Cp?~DKOz}82d`(rFBY?M z3A>*m{5Wf4gxxfI=%tjgBr(t+ljK3%Z7Dv#A+q1;w}!8wAI-84c+wJW+edAl!-2_# zc|0|@+UI$Qow)oF_6_La+c#01))Kg4-5`T$(u}x=>;qc@C_E94HzMk(aq?UI-y^hw z52fHE+GjabQHe!8XQlC$yoMX#8F2EZMjD*u@$Cr9rlFMcM?j+?bw>Fq(`i7-?T%FL z)n*ZymhTYhG^TQ%)mP3ZF-P7|T*Hr?TLKoT6U+FF4GPWQqt+ZlKxc_?AmL5zWd3R5 z+VN4>;rTWba57FBELWJX*b!9%6qoubez#g!aM!+-qr@I`phEcS*+q#G^eg^o<Sud? zF!4PvkF%mnc~P1niFwC=8FV_GOH2HgD`Xuq!ewyxp|PLDZQ-(5s8>I>H9Sl5hv^rX z>*>h?R>&Keq$Ct?u2!olU}i6XV3IUzqt!q-m=dcdbsEFm-33Y2lhW=nO%MTU)5&nN z3~kBRP^=`^H{d^MtHcrgaGyQxO=p$cJ<yUMJ9@H2z~)o1jhS(DOE{>dEr@3O6)v>2 zYG$Uwl{U>E#Tn7rgoTC0%%4^4y`+a)#2(GN%9B*Rjb1+m$XlIr^VJm(Ry+TbW(DG; z&g<$I_rzUQxhSSKNU|LsB!MP26=W6!a<u(op`dr;z%g(leOIA;!Se#*i890MVOS6G z(=)b>*<h(MXvXbk2A1?l>Ep8(P6J4aHFpVOFkl`E`JIjc<|KFB^fEX3dRsJGS-cC3 z12!FO>!>Y*=3*A7eNzj6R_m!HBzWFb&qf`;^@#%p-~Yp|;cJ}6HLEFNNF%gpL?lnf zwCH@toxS9EcN|ot4ayEcdzX6sw^L}OA1bJMJT{EouxHJ*Aka5Z0zXuFP#cwctqR*! zCMn-i_{?~J{-yoi{|i-x%8PAzP)7-a!Zo0nMznt0=0N)xGoRa&0-~asta(EEdmhrh zt1@`HyDyq~KJIDv=zA`wM&>XfcQMBK4s3g84J%ZjWB@-p*M6tl8aTj;yaXepzS5{W zgRvuh>=V}~aO=U$MB2#*tw$~Of@@<Fql@dw6T7<knjJ~M-79>AMp6_d;qt39|9twr zsWRj_LH@=0Ks$Hti^yj)*uv?i<JM`|MZg(~mDduHg^iudzH(D&9d1^}WCjkg#dNDz zx-iV&yYL1bDw63{VY@{T(}}!j`ZtYtWw+iD`H3Im1IBcN1*TS1w@FT4#W+lKb#XPc zJJY9}CB5i!^6@>XAV2Lo0UVVf9<x^N;wm{xyoQgL4~GYr&#rf7JcNW))2oTe7}=H` zrQqGp<WHL07hQTwLyE=f!RVz_6H(6tlKjBe>|zgw_;f__QWn-iQ#24yvbcUVcy;U| zri;HQd3YGtj$pzIdmO~ij*?w`ms45~vN^s_Zm4deJPs}=-2Q~~nb&UGiyzVvNH}&2 z9Jy~qJ0U0Tox*HE<1z-8F%<M}j_pe(?I~toYF|6MQTQGyjK%K=n&0l2<rI}(zpa!c zhDZp?i(P2^;BnO6U8Udt0wk>aoAsN$e@(kTjS_X_kkF4sd8cjA2X0M@?0{td0`+m= zP)Y10w{{bu+L8+fjJo`^oCcUmo|8=ws@!W99lO@KVYrkq&b(%)F#q9}icnn5-X5*s zCySNO7>z}1fsn=R`DAke(KBh^{2{wMmX%xBMJ3iRemD_io3=m8<dU>&{o|L4Zy8wZ z?GW9sr#{d2^fMvw6Pq^ZQ>e$DcL8|rt26n=DkqS@)DH7+g|5cb%T?3bJhT^|Qul5Q z%`;#eWIP-Uv)+=K5ue7W7$abQl}ERkhPEHINo9VX8Tmz;za_o`^OxOT&4++5;;0)` z=*77Ml?uQ`tp_4;6tt%Tf%*T|BmqA><M>4Z&YZ`cL}QPazpC~U-GGBCt+k(j%!zGQ zj#em6?1b)ZrESU0eS5ln)bwpPiS#d?t?vE>wTUC_8`L#_c=op?e+dEY?qpD^I!C01 zueKBg<T20MT9RDoo}lQJg~dSP1I>ceRJf7}PeEvtkONC?SFGYuo*$FRqT`2Oy}#e6 z2?euh6j(YR@#3c<HnQ1do)KL6vsTU4-#Z%?h@y7fT#|PK7hHT^Q_eaOcDL6nd_5|Q zkBsMcVI}uAdk|6IW~mY1cgG8iM08fQV&$Sn-9j@Yj<`tEz<@C2NV9UyeDT@h*=9-_ zGN$0RShD9^eYukfFQ`E^?b9D0*o36^*E&ldbB=~-K94Wuh-isRC^(cwv4-x|RO6?F z$HwN_zO(tu+FkjT&&&)ps{1EUX#_%IEGOrMu7b={<j0xo<wLxSJ+|Trfn$~qfEfJ* zoSWnoQZI$xT`EcQZ?|r-ESy7+rdDkfE#nlvN^{+*C)+IyX~Dw~T!_^gxZr2jJ?>N0 zm2q*@+IcDag2fv-Uk4GVU!3r(iRVS3a-sL+D1v+{mPq&|-D^=Pmf)gb$EAu{w-q#d z=ZvWvZ%#C;7kC~Nvv2In#btr~>VA?c+<`@Ufhhi@y(Shv`9q&msQpmAV|Aog7QBn3 z)7jkQGQsWn8KJh$QLHT{XRo?)iA}6b6L|Tzw&g;*_j23Y)X5fdCGPilh$R0g%5J=0 zB$F%n&~!uJ<qnNXP<rZwZe`f4rA42g$-Nh{?I3~j3F0DP*Tp*9I?pah<jEh(ABwD< zSMI-da5ZKaiB1wnZr%q+6t!|6y<Mv=1_wI74Si6nFWI5)$G}qmS7G7_U`H@sf*NMH z+CEA}5~%jABvCRR+<Tl)7SHR*jk(Rfz!vO4`5V{^o?R~{wr9ck5~3uxS+9cg?#}&O z{L_`Klcvar%MqqgT`oxW1pXV*(y*^fzZR!R!CPFw)kS%GdsG1Z=JnC~S|Th->b!i` z%D98gl^kXR&qOfE!xGKalLobxK>1#cgLE3!_kSjl1KgKxwqn|7M%UAyJ*F2Tzb9S> zu$WZMY<7JRbWo=L9Q`Xf-&1#j?(EyAIVtzr*-scP#$QrPK`7Q;(<C*<<gz#Yg!!FZ zPNzSr<sckK28%nB(zw#HM;Zmvhf+_jQ%&mnM6=rWRF8paE7r+<;Iq^SCg$*9a2c>r z-F#R{r%W4f7BL-@!4TC|6!fSQZS-LyJ18!0Ay;d`g#A_rAPe?zB_YY{^DnY}Q}p`M zd(eBeh5c`rC7fqki}2~Pq6c{RY+tGE13xY;kmJ+Ogl{#0xv0zk;dDpZ$A~i5&dgHL zkSbF4Q}lVwH@`f=L$kW#Cl2!7$Ye!>J?hXbKML>13T{5TFLgHgzwr05pwJKBW1PNI z;k>V|K7FE(<F?rg8C&DJAJGkw_B~a5N4S0Cx=vb&GF-ejcfu6*rv%8$qpoI6$=;8M zjbPy;xA&9IcE5DGzBA({k?;~(%bRLe?-`L;1eCCBV_Tu<4mpvv2XVm^)d6T~tF_=A z-n%>2A8EZHlYeVSIl7%wUY@9Nw{n2tV|pD+UjGr4t8*sy9m?;p9PD4sawHFkj$FKt z8FN@-Za=afFBZnqkZWsRMkt<K_bhH)1sfX?dEe>TXZy4NDM)ROTb7+hN9V}1+&H|s z*vVB{c!-z@Lj@><ftqr)EWuV^JR95nJ>(kT=Bple(RLQj-(OK+G0M&!Jh7Q~AwVXt zBp-jCcuSDc*0%(imS8JpafF?t^*i;f(SV@FFY~<Y%PY2XV4&06UEOr%`J^&*=79cX z8vdn+RJ=d=8Vv9gEjQaR4L8Bf0VmY5|3?6{Ur2=N9)<k0(FsEf&O~fJetQZo?3UJd zEur^sy??JjD~81(RV$l<D`gWFjw<Iigm30JkUC4rsJ?JmdBEi?c-oSPyu$jF?$C2( z&b}<)5n_lYM`D7FXx+#Esm#dT+Be`1^X;Sh`}047_zG|3vD(zpVP58sV$e#B=L8fV zwddF?N20#v=2S2f7H*fy@y@5K^CwF_Mg4mk8y))*o4d{G{NV$SKH<u}1xD>|*aY1N zvnj^n6(KdNe@E&>LZ_SC#FuAZscOR<cKkhu#t(DRFA3=qehn;Lm$7)18?|ToYBK&3 zVWIzz;7Oa{byqpBB&LsP5m7EUhFzi1DWR}AV414oY^P!!6<vv~=Fa&e5}ch7I;)>> zAJt|`J<QW0iELzHvzi(BwB~g}eneXMZxBM}q$AF0n^0aGq1N;ZYU$6q>%M8Me<7@o zP2a_XHTfu8e*;{?N7Cf3qM4D{;t9u$grY8|wx2Z*A5N*v#6`n?tb||VTU*kj8H)dp zq_gmA@_pYvB_Q41n>5PkZnn{llnRXQ?(P`fNGS~>U6O(@8VQj`Ns(^J?{j~C&tI_n z-d?+|GmhhUi~aw^;&Q`6K9g4&7EVQ-N1ClfX>h*A7}WdSklZ1Nabwc%5fcIvNYG<c zxC=2L;qa&0;5;N$PaAH2j_n&W-R7w~38p48{39l<m6LLyxj@+hO2;+PbH#85Z1Efs z00~%@ZGDNr7jo=5!tFO?{3Wd{>_tDlqLtG@QLsbzi&+f5vvyy}yS)@u65(nKzGXYb zHIf;&9SXPqK962aX4uqrg^FK48IWigpvO+QjfFT}6y;Uomhu`Tx=hpT=lf6&a47h! zMAWYq<(3O7^~ucb5`S5bNL_&v->HcG4-N72tfFCs7JshSj`C2kN(J0L@^iAM4Z(s) z4u+^(1SI%Od}Nb37GD9XvrlEtG#ga>vOOBf5Z+&*<g(-Y1+&|1%d3@i5Fh?jfj*hQ zdUrizm7OtNCfv6UlS8HQGA{5bs8rv(;bQQ=Hlx*`@D7yOg>I>>moPs0mwr_6Cbj$b zdIrD+GoAvGbF5e+nu&Vb6^O@o#onsO*o0BGeH&Tug#CW^`Q8S}V7kiMob-XRM`6)` zq7!@a>(+rPTGk%%D$DjYR(WK&swdX2)+TYW({5Q{>=(0DG;GgvqRT6g0_)DJaW=BY zk$p99@UWZfyU_6m5QFDsHLg2GvQ+m&-}?0Jq>MPm|IkX8lIaUZ5B_Nv4(5EI(AMD2 zdCg>k%#wEB*I07-v#xGM$*@~MMp^9WvOYZwLGIn^--z4?^|cn?Nc9bVw)^{n5l@Zo z%b`vTqe^ASU)k*6YND3CSwZnEt*_to>WG;=9$o<Ii9=f>6*@o3z*|7fUHMz{_ekoV z%I2H9_wgWRf4%C<%M$~29{zMS`9^AR%t7+Jkt%D4VN}qd*xFpVn#Xt5ts~Q$be~(l z;ou87V}V@y9Ea1ud1o}_jvVpoy+NUZXfz99QdHZ7_g}$$59^}^nf`5^QjYXHvc%4U z!+GWj<l~MuHW27GPsBn-m4urp>)Us`uMznqLw)!dx&lbh^g7ljHV!Zu5XW;|PQ0(v zO^>P6wMExQaAYzYr{21QY^Qi-g4~NXW-Is=*`Tk~f(CCw3}wxpDAa5j@bDq$iHMY* zlcNJQIUNL@-Lr$XiX@Kl2L?~nT&r>VmQH7zy-f!pnwZxzI>-5)u8An%pF4YX-?24y zkTSSl+Hzjn1#4RCwq<hFjGfI!I%?%g&+;<834?4COS;_yaXCFoHzH#Qk+dcNbp!ch z`m_GCT`!r?rwiw`j>oA&`|~_??fC1%mGi@cWUde1FJere(@*q;uj|VAyhXqK19R}+ z$sgEMJ7qv%TKo^~Dsc9(StnwMYSR2XGN{*1vg-=P=ujV(ezfb`eEzhLGdbN}u6)(7 zaLudXGP^9b5CujH`?IDpvUlrSxwtgW%l9&SoHky*pzkbL;*ME0!Sv6Yp?<>)3Ja)= zS!lY0c)W9y)=VcocPo7(SH8R(y6Z+Zvy9lZ>qSE9r|04w3*RR@%x{A{SLRyP5LO&b z0war2Tp;E^hP~y==B&d_94)j;<%=&@*Ei*VbYF81@w|uHinkEnFE#>Bu{+-*^$tfB z?Lq<eB+1yThv`=1xyu8!O>mPvR!M5FJ$-<0|7A_{z6}QkY>P1knAjEN;Pc0h+apr6 z^ce2LY+a)7nI0djzQpRZ%$w|K7c!Y8eTpnKH@~D5UQgroIh_=&&uMmB_8-P+H_0E6 ztY}O%^$$@P*glzh?74F<>L{<2FEi-!cRBiT)pqfL@BAYH$?C<hq)l1#L|Sp<L#oT| z%$JOVhZ;4;7cQw9mfLXo)fcia1rKGiC}svRV>5h<a7NqdAtxI@FDpx4)Q#4efMkwd zsOv%9dHPrYi8G*7mv`rWvr6+4-QG9L@Q*0@&y;{hUtf3WGM&{LEPeE#2G3+^2XIHx zCQiHpmh#srPo#G0;cG|u;W5p-D(_+bsH;cLO!YRnt=kOXSMkOve(C|cxq33#mP`vJ zuq30Ahdf*qASewfV@DagL=HH|UWyYQDAMR`IVy2+$_g??1GS7}RT8Rjj(Je6jm4mR zt>JRzCk27W=yL)3Og@m8#hkCylh>~|&OeWEyZ{cw|9u42;P{2Q?BD72wVSq!yUnch zDR_A6MbN~<x{U}xc;;l5Py4pHRu&d5w+dK(3=-{3jFpz(0;DI|`h(??uHqxYUiVl` zOj~vRoMBfX{JIX{Z^`>Vw7W|}BPy$eO)VjE{?IJc|M4?!ETMc=yRavW5`qw;>#9^T zBxpbR^1y9C)TnW8Z|xrd{RI2(+zVv8uDaZkGek}Ul}0)#tBi9b7G}zO;54FvVpB`r z@0FW;=}6dha~;HNXYOR|yehRozO46n*1;npV=ImCD->R$$kMHF&fGEnoq2A#Lez2l zG1*$ymc^rV4*>QJe9%pU@fh#9%mJOgI7$_rsPGk0Q99t8e|63-{+~-oz|@x?KMqa` z8L0j%J1tCzOw;gM*R~Lue($@6VwAkoZ+Dto6>9z^KJ4SQuOfK}KBoT|7=4eCDYoTX zFKZHg4t9QM+e(*qINCv0-><~HDFNnS?*cxz9a660t{^XdQv8S*WDxmrK_t)ok{jCA zK~>A?y=aQpbAPW3hK!(x6<-5`P<0(P)1g7vwGEmf{zca`%DKa6_weHU=66~UvGf&( z1_m+>C)MnI(K}$(--XIZIruk^!B(SIoYN~Y-vKm-6&7ZM$bk@}j0kD_5AbLcP5nJP z##$Q<0m<ere>5gw5__PBm_0hG(4+4R9`xCS94$9{E#)-ZcxScz<ZGkS?ie97`C>*; zI*#QZoxE^}E&J%rt!SCik^_D7&HUC6b)XC3c#`SeJM#|?HK{^n(LotXa}IUB?Spx3 z*KSZ+z;nHwZ#LFoz_2$~{j$q1N#I+Rc+~E<$=t<P{QgASvc*adC$EoL<N+bGSV5%@ zYfhKc|B_mr^qz(hm~}@(`5A6OnCoR)>>M&KNB!>Y6@hwRW1wrEU9PULXs5TJ--Io3 z70Fwe-#6Bh=NK8d5<SU!xBm+cmad^GhXjp@-BiySEmNP%?=jh&ymJsHYX;dRVEKMk z9L4<1MP_f=Y0pb<4#EUUxnG@V>c?;ExOVxRybo1>qFBkD@Z>M9|F6QsxM0Z9F+qL# zY9g-k)lxv@&hsQ8ZX8odd4MWImWL<|*gYmkBi3Zs)*cu=)xs>;R*r28A3gu+GPTk5 zDp{CZ;a3m$_r&fWX*haWT1QzzrsjS!WuCCDjom)GiM((b7Cbsqp;KsnSZR;l0-)p% z)t4lTv3aaieO#!s0DTy`+hEafo!K*9lM_jmt?`56;Scb|<(9;xa3GOSE}td|pI;Q$ zbYCmb37r*{?T^2~l!<Shv)c}SrP%j56we_lS>3Z!iz%;+Pf54eF}T3_O&`BB%3TwQ zN@`0m)Y?SM0YMO-4PktqMFmb*M?YJIGkFoRz`&pmv*Wo%TIg(Q^ED`$d%DOnT=(V` zCg*a3IGWexb<Hp4=0<hrY4HO!4BqrIpIgB0cjtBeaZo+Lf!e7_nW7_%fP!1Fd9Jct z=|#MMvu@IAv8o;xI}FO#=OZ>O_(TyyW4U?QCc9rG@g(#qQYYxZ6&!NZ{qS%C_&O6h zg-8e1eHwaQW`M(F>OWjTRooIQ`AZS<aKHgY-DiEvo5NF3EaX`{kQI}!wD0QZrM^#k zZh4zP=Gi`XPN_XYx_eKhE5flOQ}9dQ(x9``34>vDx<cj20DO9@NR5+G_+GY-sv*ve z{=o2fo4~zlR|Rt3bPCyDS+5cDmqUFJ`Zr&E^+tBN++1OmcSeNW4JwXNy0pt>^^0?K zQUcm;I3anKvN<Fwa`JVfXmMB&{t|4*sQDG?Jqa=os+$7VI0pJWdn*)YJTRI??DeGs zl|^%H7>j9RR|-(pv*piFLDQvh2ZQGp(mo(XEIF8uba^c{><;d9dq0%?D^C})`|X5H z6CyG1F^Z)V-f%Jv)<e2gu{kd>`&#oWQ~B;R*wO6xsZn(*pcpobKB>jOlJP^W8vu(u z%`3jj+~kn)b{DY=iKonQ@n@|A<4yvDVjFXnt<+?Sid-roQzEFeESbE`LOSq$$b?7} z!W|d@bw&?nxbd&VzbTa7XJSr!t9Txs*8Z7GAcM>a#zp=xxticP_V&%s*wFFt@RZXs zq7|I1q{4RZvZ(5eM`mepAa{PD%!Eofw7GfP-~3^Gqg8lWikJ(2H7P{X_Um|Ug^^4B zegA6)qTCW8Mv9Lj#?-9yJ6e4XuL~yK=H6P56TxYo44B8edbvj4uf}~r{HrF&=6}*j zN92CJ&GZ(gr4K*vFuN3rLtuh@j@L7jzxLj|bIC;eY&n3N8N=*Xv>Rn(tZ2K7vm^6Z zeM2oUNue`F!Rr{k@{>Vdj>|<bfrMP>eZgqpMdahU_#;;#;)R&{IhTdTv64*j5FG0{ z=~~~!^f=NPV5zf4O8M!y;1vYjp1^$?mvJV5#c4(E7na<h8nLB?)KOM5G?A?oGhOs* zJY_CX{0_uFd+o4d(Y0x<0PmI<Q9hbI#y`pM{?(F`oBad@g;f>1$)`ke?yc0|Pzf)3 zI{4F=NQcGf)sdDzUxnmxWGn;mD;m_6R{otk-T<XkQx}Y3>%pGTMPAUx*Z9eH9ST$5 zP0Rd*0C3Vd%8)90BlB&~1h$k3%f^6EO33=(Z`KT-uRs{(-07+^V<N~<>N*kqr9tnb z<jm1ywy5I{!Z6t|ZF=HcgE-JGPJIt6OQV2?`>?cqLyInub|EtL{0jAN{_97WYt!*p zvyh9q(-H~N1_TK~h}kJuuC*-dkaXKt@9|S6QpVhLt`(!<Up7~sWw<*lv)|=(fC%il z*Oxa_ehNM46&CV)V%L>y4Y2dZ2pQ*jw8xKPl%HknF3tf^!0n{+PP*t&SY?S&Vk^#g z;o8M)c5v6!!^uf<CV^w_cqB#^&51!}PkUQ%Qz;c9np^V8+hbc`0_)#>-&b`x)lPK; z<DVC|_|LwnepJiibt5o(V!jyC@CFJjn}qXS##^Oj0U$Tkq{cw*)-&U$5OH%E;^gG% zWp25}hWxEzfpFXsaGpK^gytXV!|MDUoon}<#B#E-KnBW|jQPc*Y{bV<p$~fPO!GsH zmWJr#?+AC|Az6pPcY*qzN)#}mQV2v$=O<>J(X7i$CGtTUjdF~(U!F*&EOL1Ec~lhR zp<M8qbR(S4OI}JRWkaqD!GTv<r=*GP5SSk0BWUYOyE0c!V!|b3wS8;;up;rjP0;<1 zfzvJ$fi-_aNXpKs=)8a7T@~?*^guoPlQ<|VlfoRw+^*`hG_rUg0Xw%E4>u9QdeMKR zCr?=V>P{V5ITI|)ovG-`zz&ii)AT(X5=TTVDdib=O!3Qd<7u;=d;B7}H9uWDJ9zDc z=$7r8`#^>!wko$JtFvDH=IPIK%lAGH8Fa;+fF^-kL*m$&IJ2p>ms)ZVA$19eZq>TD zso0-0R^BzK7t)&k7d<7EVX`6Ste{9cEbAi~()zqB#t2J2frcSZg;oaGZ<odDhJ#r4 z?KxzFwo+U&>ktNxq-)dYkU{btYUEadyWy5;Y;?#BjS&V??4X%3^p!&dPoPi65mZUs zd6R(n^Tz&cT0J<gERi7LIfnEqVvZs~6+me6dsdoBB^4<WxZmQXT|PpMMKxS7kN(gg zm<vVLmrNi%SfHl>%Hd#Ok7z<?Iqnf7$OFNVaeb$ibN5{!>qqqM<Ks3u29oTP>~KX} zU-t5XnsaRv{5l;b_LX^|a{13XJa-LqN&*nywwQdQgT1mYtovpyakW*B_A<+YU}2}k z#(d-87SnEY|DWwbUX}6U*K-r~!{0FmJ&;REOXC;kV|BGg(Ksb5yCIR4S7oGiLlNA= z_{XEU1lb3u+shKtqBKRxaK9nuhIgvgyBTgstVU9NPSzWOt;X8#t4e9P)EdTl$x8iJ z_3eNbW+r0jAvzmAv81h}EZ7q2d;0Mj$2mbly8FBG|Io-XFWhSPTtPdRmp8R<gWRTO zCjh85BLoO?V*KmxY^6_(#pgg_J;1&O*!~a?`4QVIlTKAWyziT4&;IXW%37(S-x%{s z4Vc)FyU@=upr=&M77G_njwi1CYg34H{6dPVWVm6=G*Sam-V17m?zQI>ZtPY5e%*4Q zY(yaVHooch{C(jn5wO(}t8Bu*<{t8DH0_4N(xM5rJ<x!Wl}4mS!aj1LJWucoB2^^C zb)lF-1c(OAW6uN0ZR4(>F=^2Nxw3}*GyMZE7=n_*SsrAkg&wigtQiXnw;q!XZI>cG zOS&IQS9{aWo<#+uo%ho+8Jz&(r8UpXtRGhiD!Xfc0JFPt2{=S#qvaOB1ibBdwA-1- zC$h>Pn*1A;;zlsKQu(vzbyNB=&1c=I7k+te6Ke_=k@G$uL_yKiQ126L5BgI8teHk0 zNC`Xla6>QvI%eg_>Sta2tQNFBEc~+NFu!nHgy(rXE#|)AUVFAMIv*{D)$LbE*T(55 zMvpsJ;kvDtho7E%yTFHpzB`#o6xOXRgT~N#X7ukDqD%_!mW7;w-0uxR#DB?|uSH7$ zGF@j-hc0wh;-T*`U=7*yc^B)mf83?)-kpwPyky4GIE4)qI+B5HmRuMR(z0JV=L^2} zCAy(UjSQx^46gL3@lDt)LmpFE2Y?~-g%|^{gr0xp@5-yQ46{q)Pqq1lkR9Ln*~&xU zw8>Qt(m~MsK0jFb+4>@@3t@fAg)S>uuY+RhIa|&u;_*-DG({431GTk;(`(XCr9r>@ z_QPF!PEsyri{<dEoJmM4$ENZgf4i&~M)UKk2oYNjZ5uwz`hq>uf3#lK*PZMI|J_7_ zIH7!!DH?ppH{#vyJYNUf4VZT)6iSbNaIRu~X{Azc_BVFii6Dyc6mqa!-plTR_<_nS zi698+*xzV#=q)jC&g{%{QDLzK6-nGwI%h&(q~-6V7)^r%fu4swrv$>9@8}3^iAE29 z?+N7pq?|HVKP!wn<8RDchrU~{{)H_ai`na-#+fudB3XRpH|2L(xxP}@R3*n^Nd%`? z1K3^re{yNv{+Ot@(}&E7E>jLKex=y}U=hLlKi8SFtU<caWGSRT1BclD#`>qlZwYf6 z;15O&@$`{J{*%fcHy&dqlJPGyxA15h?tnoCl_9UG{e`m4%okE8Qvnqq5EbZ~e99sg z&KE$^NY+ig3&FIn52)6+%~l;+LU3Hdl%_q&N5E6QaHQdvw34#%m<EX?mRtX~^^owY zYK-cH^3#zNU*2}`5RH4Ev`n5*dSs~IWL3zqF7{B$2NyKP{hzhh{%Oj+A(mJr2$`$5 zuR~=6(!ZsR{O!H6_a^0AeoJpXcf$G{%ej*gzN#hVeIs3i_EURVIH^o^rpv{~rE_az zQSUREO%(j+r|tGt4zZg9&4eKnavlc@8V1~Hy_260oB4~@fjrfK9f(DlFCFe`=Beh7 zAV|3$wjm=ks~Q&dM(ycMI+JuJ{rDk=#Q5bcb@6Y$&BL_)y)!%N)p>0JV-HlB!`#Oj z-JS>f@^glhy4$BRkI)gJ#y487HVIX|MzTCiJ%9Jo_&!yTlADz<z}i^?w~Eglr9S}J zM%|w@K<lX+8Vkthe())bkO;lTe-XD4{_qx{FSHcVs}MBy+N6bBfs)pX^J+!gd}6Ru zM;U>&h7=ln8jzzKdP2W;=!N;^ForHawPfX*tdN<#NsMQ#kAoVr^G8+#F?aNxJJ~aq z%OW@<p!$GjI}k*zcU1$(VgCe@l(+!yyH9mHjRPld$0YPFsTG=P`3Dlx5PTBlx$E#> zOkCGKjhe)H0S(2_le>g$e~WvCGM!K2?|M6E4%G3I=xRH1Q-3|q9H@rarE%QKO|AM? zEBJrzXa8MXWM=EyS&g-@po%!xJ#hQoaT{7(zpnuySo3JJD>6D)3`$uo3cb4`Sz;VZ z#OzDiyxQAW;~mzyxqj)FDD?_Zu<ff#TC<Uy-GmKum9Y9OiM!vN`x5ovlwDBX_*dez zJu{rQu_lQ7#(evSxX&bFPVb)6J6l#V1dVsYC-Ec0{F@|}$!%^i45`z#{jmd*2@X)3 zLzGFbJ%zwSSM1okgeKsY_UO<K;FQuc$t<U8p#n8&k4`VdyHLij%dwoI)too8k$r}B z2(?i|Mw*7e^6?-dl-Pk{K>AKy8V?+diBqoLPF~majnpUd>&bfFHaBwkYr79-Ik$3g zx=I`3pN5cbPb(S6^OuX_&OOBCYM5m>6F4_v4>bX#DiGvoC!5ienfnlg8Dx=?@$fbi zEa1Oaq><v5(B+@v8hSA#;#gfIMD{Uy&z|wofh(^cJ-1l>x&ql$C1A@)J)4Nu^(N)` zCtIQItMpB!ov*)`3b|_fM5NYQ!Fu1=Ah&pc4XvZ(`MZ%$<S0)X%Woig=V3Q{Q^c;6 zJgJI0LRze%Y?OkKIF%tI4Pdze>dEdD2@<9I-gjL;T^TuPO%H#6y%#a2Z~@=>R$FwD z$kjT>Wc<sD1%{tSA4$@&I#@%0T&^Ac`(cmn7;~#`<~7V!7nbZiK!%`o>0byM*qX%l z8$cFVw#;NIXqSk~2F~U$#P7n`mBO|&R|?!!*77tNzNKloEu4WHtB@?{v1aD_Z9k#w zir4(~DVvOas&Svu=o=(oRko5ks}S*v)tIoQH<Vi%eTBZb7%NuALp9_*CtM^}m0S5v z{L1xSpJc_oq4>H{gTFN<ErA3ghMBT?O|h#(3Y~hm0y0KD*mqxw(N2ArRkeiYFJXmB z*H3Jl$LuG3J|BSPfi~r5<hCd!qOIs{NtqD|Q7Y)+AN@!G?qGrYQ)nGnq=i|iVYTpv zxE+(3voh4q3@iivcHVZh2CQzbE~~7#3b-Rt4s7TJ*islWdK=5RMW2$&6GRZ?R+L{y zj&wc`zxf+5e`A<%-dsOYS%Qz!%%VYZp8qU4euf)M%X(PdE=X1fyo#Lx89FN~{I4`O zykP=ty^4d-X~u-G*kV1Dwzu*-EGH-Ls(EK~Qc$LvXJ787k<zgsz@rap0D(RMri{t` z7*KU|1n-K)1g&ao4*tk~^<GxgU9+RN=m@n;s*hmitlFlzMVpdMT&T$U5F_Xk*F?1q zhoIW`@4idxHjKD3z3}7jVsPeQ*bIM;yJ0~;EEBxem(v4H>^#L0-%oC}GwF!VEBG2c zf`#}$h(l6ThFw|PPk~OQL|$z8NVy*q`x5uBEwStB{!T~=JN5L#rMCb7Nn6vSGJ<M% zgF0?&KJ$Rp&!lFfyWfQU*Y>lQU9h)Bm$u4{ye6aii?e^C-!@4w=)IzW(hb#Y1?Mz2 zMO|Q!@V^e-0HmdW`_3+I3|fDk`<!<ph$)hhOX}ZSg%?4hZqGEnaFr%e8p^<J7;meN zoehklzS05$Q0h9NtoY`Jbnq<mdI^3q{KMsamBsp*1r0Wi+n)gaQ<kvc4=MRI{t9A3 z5BPD*uX~mS&j+;R_kXruR^%SWwd@}s2{^ME;?Uptpf<T3<CRCrN52h)bC#yK?yJOs zwHwXA*4Xs+%(B2)#k|37Qs&1RE*QS@06;|S7H7c{@##xm_mfpsz8EEYQvX9sQk`)S zC8g?Z*N-gyLYlU}dV_M{&7XZf*?kHV`2jrdFVES^^t<(S9qNJ%DAd>&N%!8=O82cb zexhguwxc&6J;D>hKyaqw=;hQ_m(94{@3!^fdjCMrK{Rc>1RfTyS7rG7E?5F_RdYU0 zo{LDPMAl==Z&V6h+2!;`<s>&j0-M`(p;vDsQ%;ABvd{g0(lznw?Cn63J@4-4*^DR- z({yzuy38~5R(e|ObnVl(3Vz3lJ%w(6zviNh?wP-y;QL5O6=E}j#Uy+8gL&~LjWPG- zRy;*2f3R$!%y-R(46Ne~(YrDZAZP>7QdhXMMMn)R-R8QfTnXK!r}G-Em@dPMJeyWy zaK`@%7D*6S24om^M~}WScqm^Lm(vn^2-MfxfHr_FpZROb7t8WXr)X}>R*kw@<qmno zn0e-iKY0`Fym?{y^xiXAy3}+Uj~8(L3BJ;q+t^pLc6Y6SQw?Ywq^qR*4olZ`W33SL zo28=z#M1(sc+}Z#hz{m40`R$(t~$!QIHzAfN!IF`=!hKkU~kG}7A@6YyqJL8-ep>f zYUN=RL=2W}N$Gj51gd<8|2*p-p*V*cJz17_{V)+uA8ncQNQk9Y+9rd&jjeG1*~&*X zr~<ZC3BK-3d}~2*BL{TVF4C$7je(}#P^eS7{1i|k;Y}rF9p@p<U#?SJ9vQO9@6b}7 zMc&{9lzj$+gxp4&<(51%SU_Q+Q})!OKDO(=8L5zA2R)bBXn}rnGq=MI;uC;q?eM|U zkVX_sRw$uIdjAikQSL=%Vs{BZ;FuAF^JRmz5rpTB2kQ}{B0qA@C~zrEYU%qmL-s1) z1q5Q3=`Gfwj-77=(nd!Z=2+*P>sA?0I^iQ=Z|3MX8w@#k<87o!60xhjR+)W^;7H2~ z*%ZvZ|J27Vbv`l%fmt)oH~!I6ryiw^!jj{{-!LRI@xrz#5Axww?a@|AA7Q-w3|l)l z6&kG;1nuZeA-|-#Qmh~>i09|f*HRg3V8c!KYtdK#4IDE6<V?Kjb<LSxtN2DetqWJR zY)DAOeg#VX3-nC+Sp^zo-QCWkX1<lrk7lfpE1+ze4HVNOx2dNiVWbOW#7Y58Y$Dj6 z=o|FFyJp}YE<H>5lz)}-mpp~V^eyHglx+FSMZ9OGS$ymKP*|_*v`MqjKI?LJ#Nt-f z7SrQ1rU;X)-`HGV<7~9GMgnYm_~!T~oN{6j&sY_Fg_@l8U(mQrZ!kK56O0upp+Vj( zwiHIZA~PnOQ7l1`AEX0*R6X2#z850s=;wP<mfvZy6VMEX7?#=Xz8R3m)>@r{JXAHw zWu@WMWP7KNCZ>w5%0BA%pLI!U`g|!U!HlrK7Z~K)3EZMsT;^4crYH&rzF#}67i-(? zDij_y;WYirGR41ja@@idl6sO<s7L%FCm*<Ghv-Aja-k|fjR*r;S=oi8h(R)nDZb~3 zRc2KyN4l2=$%m(e#<npws|gM6$^3#3eIr%ro6O*T=S(VbGGFF$etVKmvfwAk97VL4 zHf+48m7CM)Bdntc8(Y)9o}i&Y1!TT-kL(b_8-UW9#l=7+XBE_6f>W{?(f4&(FckZ? zw?1r^cV%&;qFeC|uMb}R;lw9tBv+c`Anpp2&_hJ4h07QS2*AoU;<7;`*5Hf2+58U( zi|Jg!=~gx;5mPG_d{eR+CQPQ@%X!22(J0&GD~kaV@M|>NN298ZUC)$^<*ZSV(aeei znQ22MUkCE(o~J0cqMFn9+1^5VQopyqjQgMYq9|jQP{AFd5|%%(av1nM!>v^EQmw#1 z@`rRcU*ZnQKm%hotIS%fK+*&_-CsoyL^A*PHq8LKhygA<{~Wc}K{p(A%Q`k50x{;e z%7L_O+<vscG=qk^s`woUh7C84f;6{|vlx9;Xs0YHtq{lp6h88Km|^B8()@AX$}yph z?%|%SCtJ>k9hWhltaok5hdR?PQh(QN!-|q$p*U}RoQVRGa?3^dB9<acID9uim8$5h z?ah2!x1Zg<x?v=9)$tzCmBnFD_Di4XLRs4~8Eg43Hxt9sAI5%pv*NfqkR<#i+9Np^ zxhPgu@{U(zy-mTQ%jO(71|P9%jUNC2Se$UZ!}t7v(Er}6M8!^-ciqv&2{Re35*clf z>kMU77M{^})~0_fk<d?j2209|iez@X-c02?CItstEvnG$mZq_uheyW;ofDT!(idL0 zt^3JuET`#lI0hAMYqLO><03yLbr->$LiF41)CZ?%ZUX`5ITA|Z7V_^z%Ztq-R?z)t z{cp9Z8<ri>XAE>kTLPv0%x*rFLb8w-*B3YLce=bzl-F=M6pL@EQop^C5^L7f!?~no zLBv{Wo>|N^8qxd@^q2`?Y&kF-fK7o$!`AtZeJ7#Rn`fa~qZ~$`;qWGmgFfzo`{D>X z;x@?mjE%d)<|Q>l_<`;$KD)Ja&xnUqua;9nfa%*Bz&7~^`}gCFt~f938m!kujkL*# z>-46y<lGP&(qfz;p@$9+i*qmlaWY)tv*MT#B56YY)LECeQI9h^)xJ#MUMfjN{uBxu zrf_zB-%)N!gGTKlYl1*41r?XG1`rqhns%F2N8@1j3e-nr#EZS%)>Y1yGx9vqEb*mn zl(#I~lG16o(;Gn2xpV)eK<i)(wm*K3R7#{xi@VcKzz;10WKxy|B2~+BGM5-1nt+$# z<dP&bL{|?T&|;4uLEmAx+YO^k{S|(s5j@g~8{mEdFGHb;V#r(v=>9g*yN+y6{$V1% zYp?K_7d8S6c1Ehpp@^`(1GxQaw#u%W4NQ)tNNY!Dm>}&q&dOJqK%|-T@oMGEUY1Mj zRV~#iVU+(p^f(j4ISw?6&&(l}5|GAsy3sx2CdTwwP4jt2iRSB9_lN!G*17fhrjMVV zT4JO}LE~R;<(^LJ6dD`#*k!c+g&|rw>{|SHx-c3e6#?J-*dBZ(2!ni-ky$!yir9e_ zHywLgGFq&L-;7gJVyg~4N75&J#rLZ0Sq`07sn<nQ=U)o<hnfuTBJ^tP#nmFFs!4w- z7fNR!=|J|kf`T*K?iL+Il(iN(A7=1^z?L`U^yWkH<eRS|q0Mlb?U#^g6XiN@21*Y_ zw?I5EotKBJWYx*IR~0dMaG;QC)iE>6{f^rg;CVxFc~eqI)@e7|L{7jgK%TB;_QNKe z&Yhow#T*YQjmkxXVb0~Za$SIFW5>2CApgEg4@D^mOnl?NFP)zenjPtSBe&Noz`5Fa z3(z_n=hn*xl)KVizD5fGyl3CzVit+SYSWBY-}`)NObp^)w6(-0t`NJT)VHAKo4)60 zH4dz{a&4}5G+GQAp+_q=bAM81X?(71!>V#2ICec9z?!fYl_;6z{!|C^1eW(EWdkY# z19EW)Cg1wLEqKOPhZia1Dv54Q?pab7>O!QyiX^QCQEk#2JQx!H<<*yUTE}gEKTee8 z5!HL>nj<(DIP$f5J7OBH7zW$ue>y2gw}{rU!I;n9>S13Tb%n&a^asq(hF#Pj2PI2G z4yGL}th5hyVx%!cO`d(An(PZjUY7fn+l4Qk+eWI=>V%lngZdm`mf990wD)=Ya&cqM zt{KI3xC$cM+t=6y6Tt7lMZwdci$QFHh8)jXU!@esq`0lO{*uI&rqApDRp$UcQUj-P z4bn46XD84Wm8!#vYitycv(j%gYk5hvh<$Q_*Jw*2O1Ouuj}=<mzxnZpPPW_GQm&kQ zznQPpWtpV0Ssm;8;mIHsI9y%qPvCsQUj*lffTk~<e`D(K3nVqY$B^Ff9NT2p=*oEl z*N~jp5Cy5lIW8DElB@3C?BjW&#<VuhT!aS7Kv7J;P@o!8kJX?Wdb>7JV9|`axchEb z-%)|vgyyz%%r%Z+BRp_9$DDJ>ckWD(YDrMN(w4;Y3g|%<EnJ^dCP58UlexY5JnBY} z4%Ao|kIO+CJN*hB438TomepyaCt9R6NdCR$jMZ75MweykypMiIX3i`vVPrTxCS9>= zv5rclWkDzI9MCI(MWi3#xIWxLPRtp--a*R)sP8I3P~Xj&iz0v7EqG%+-Kb^4jl-7j zT?01kt)pC8<zU<JWF*xtzlzw^BaZ+)bydKWum%V1$NM^qI$N@4k<Hu@ojD=Q88XN@ zJH|4(lY3fMF)BY>FyvDc%n?K;FNpOkv~`Z@^5A_U%}Pi){>U#ky}1iYhjHzTfg$@& z#4k#7nUl&LIZBrkrE+IsN;2~ESPqxfoBjt`?#>D$Qy2;9Iyf;hE~j1Ev-l!E{Y0^) z^V<Mv#~!$|!ej+zwQlAZgPBeQtJ6%vdyLzfJu;Up>C$&ucvK5K_XJe=wT362Wc~%i zRqieI>o=dY+SQ2aNjg2I8-CR!=L&zQT3?4@^cCJW(-n3>10Fej|4NTj=YKlvl5J*E z`bzXy6Yc7kfgod975l9m$D`r#YhYX`ZO?b|YJFYVcz9S7Iy1+tnpCRaW{h?l|5dh7 z7oPp;O{}iS-dKVx7`-1+yvxm#M~A<iz92~Q{Aaz?-4E;5`Iok?0$x(Kb9efqdoZuY zzc0bM0t!T{TXQ`^=@^pnb;r+NH*#-Zh<io^yU!ILsN3O;NA967!Pb~#Z#O^v5A7qB zk6-S$%B+**wf$b_kF~)G?CL4+r5`2dF7c6M{+#@Muk0SVPS9euoIK)UCbm<6DDT6` z3-X1st`1nHE7n8HA?tU1YYVVZJPO8F5Q1HZ83|4wCCx0g5);F$m(m~q*s>wvgeS(* zSV3Xxl}-cY$Ls6iDPez_%XicxUd%V(mRk-v4vA>oJ-t~z&iC%*r^4KZ>@lFP{@C*7 zE37!MU5S424@a!ptM)+hU!)3o9{fe_DejacbGc@sMT@P`qS4CJF|N<{o@D%y3IFo@ zGKjp@El0dQ8TAVDUY(lj2TFGyr*qW$8<a3>;3Ony#W-SE+!~XEBYA6IV^o?1EMbRG zvyS<zBgpNnbYHG1;r`@T1w_)YC%yShCOXYeegPzjJ+;~p%9t)LpEezXLR3&30KKTu z^edYR*lNlOO-u@)%~WfS^$WaVTGKocQhYjn6c^TBTpa1Mhl@y@Ho0;z$7%vz+qYe| zQwMWBp8Yx-mo<kV5}Fyfu0N&DBCnn~gOJ~P|8Kziu~19ZPJKq)taPZW&YKp80`heO z^V=QEmFenszqWAlVlrH)fK1E&I+b#+JXr=7oGIG>c~00dBlO#$U6cmdY(9J_&lvnz zo$c0rk)0sYuG{TGd%2b0cMbiaFYlp9dckli4Ma4D|89`A=}|cDQT5s@cKN~8xV#gX zsX;~6l|0$~?W<Y3M1i67RAXS(I+P<kAwJ{}V?2W!kEwp(8r*-J|6C#3%N(6U98k#> zyE=ZcWbL;G7TYxmU;1=}Z4A4=q}h<X$arSMJ(_VrteGX8m%fp!z4DSDli-Qr$DboU z>(CA5JpI!pvH!x$IojDQb7-s>(XJ}Dso0u(18F9zD<vCTUSNeuA}VAbz0^GY!M2c= z`lYPE0CT)d^Cj_=sI?K9ZiB=?o7Wfu&*;novUFZ_D;t|N%E`!e*EbFsb}AB_P#8{j z5W%M_%N_Y@zV^c92>d;ZDw=nFs82uz+h}gm(PD|;Ystnr$c9H`y9XmR)0bsW00(bH z>Bswk(7OW#&ZDw8p_%m95}bk`YE=Y26K((Ww^;6Wt0hyE6nUL{SdFDlwcR2s+bOa~ zDZ5&ttTXq<r-)z<rrwznJ+;rw`Bkn^!eZ^wm>S$Ric`Nr69KCIM+`@C7Z<RAGQE7( zap!}0O`k>BJE>4xQI=PC-@ur2bLZ7{ugZ<pt)~E`ub2K$U#bNGT3(Rd_f#~gqN2Tp zO8vuUlC|$uVvZC@-4^>ZRa(&Z!%_c3`&={5PD>_=Eh0vmJicFCt|6RX*DTlXYKhBo zmhjoCr43Duoa$Z2>qh1zVJk*&eA>@P+Z{;=OXMP{^Zj6Pj#yRwXCsd6eBM-&jo`dw zzx|Q_687kVXYs=>Fnq<h!sqfc^zC21q!A3t!+I&X8BSq|<lGR>5Zmtq6PL>f8CSm9 zn%p|Br+ui|dC+hqi6U)ibCY(!&0n5>Iu>{VI1`C4CUxm(+f2Rk4AcRD*rz@}Pn58U z5V|i^rsK%)r7OYTaW^${##}VZ(pE^E=8jadtchbo-RDR;&LvF#aq>x-{ZhllGF99s z@+XR`w$<=qe!F1dqtvk>H;FI}2*plIgcoaL#)J62{);&y*%2gm=oiP=Rv=!I<Es*y zHAaPkaLsQWP^guJ3yt75!4;1o9i>jIKczU%xPi<2FS-=!r(zXZQPo3i1zLN=;D>KT zAG4>(38svR1ivF~>rB<?1N|{kOt?2f0v;hPnE?@zYbk<C;X%1RMSDJ;8W~=(6V~9O zUwZjs1210}=wkfsz}Y$EPGnFR@x19<VxG#yy<b{6QsQgv^Zhy`&LVIQ)M#NZAYVSu zMBs1;4aM!iaj+f_^%KdUaPR5aY}lKGMhvuR>@ZLkng`BAaE+;{P@!+_Igv<szLR@; z(3E(2i$5ZjmoGV3x;lb!yW>q`y4DTGxr0&mrVs}qF{5$F&EAuL#lTcE2Jz(LX1OTA zQPX7(?Z7h{)cJK8)+>QyobidU2<z#0gXJO$wwCKUHq!9&4g-R9c>fc_>|(qx!fmZR z<KNsL>Oj(gG=J-D8npAMEum8jus_$%R`20%p%4T{3o~onCb6$3L$&*jfWkPbsvNny z5Mp~Lp(ajojRjPMCz_JJ3`Bx(9jh${ZQLNv6?uNadMCVetYp`m2~vWa>Jo2L15ym} zr;3`xZ!npbSc}=OST2-S#2Gi?`zHo_J!<@8ppAladYU0sJr{g0nJmJ!NO+O?N;_6s z(Y!S2D`#BG`O>_p(-K6*ou8rix1{hj+yeu8tta5((sfi7itAT8_@e&sf7V#lm)puJ ze+GnLZunSC6<HGwi||gpn~R_8Da}m`s`7WbBsh#U$8U1gKmur1Bh%`-xcVibQW&AJ zj9fDVO(Ng9=S`fPX$VSvJu{TQn{11;&8lzG94(>C2HJ~NOj}cyMPZNrMXgs*i~5{n zC1?}B`yxB=v6D>FH8TP}`oV6@-4G=2LfJmpk@j^hsiK&|jqN$D)U4kk5$?^_!-aO3 z|BxDfnH^pPeP@M2!yKOTsu`DTf1tj5+^ihC1@k?M5}ZU2#h%->-E|qR{hQV(9>km( zDj^Klu=iM2bn48fT~O$QEQXvM0H{8H7Y>E<NVckxfi1fS?%qt+XnGIEPt<;lC}GDb z9rE%jZe#~b@_g2S#7Bz0ED{*?NNHv0zDB00)=Snng%1H#Q(9X(sU?Rf)pW7U;#|Xo zfz}b*G@NOQKsO0n;WxbHMHY~xIKqz90(8TNs*5(|kxNRjNA8y0rkE~2R8rTyi<&zy zkup;N_0-KS9SHbU<QjpxO!49duq4^~>7TFA-p~IJjWc(U!0M*dd0-UT-bpUjqNbbh zkkKW(SIz}D6vt#YlEJhos--IQsMyCRu-$%uwaWbX<gzQ^&$n|TnR&%=ai{x5-hywl z!C>WD3sOLw3lC8|2!HachK^gb>VePNrSd0wdL7kz+LS)V6Un2U5;Ho?Q<IsY7zag+ zdOctt%BkKru-9AM8&~kwAhwRv3iOJmJ)_ld;t(ecfXUR;>4IF!I(Z#lIa=kaI3A)< zb65+KG1VoF5AASAYO^U=o*=DZAqDy=>_>~o{*{pSZ*SGDWY5S~&onn1V%D)!v)Eo) zdMfaB+uFA+u9v5%nwFBpkyTEtU5M5x-CR#>^dya<DgnW4)^|IT_Uz@^H6$GCeN%m3 zrRKaA-N=mO7!BNGJCw*>GkammZ(^Y#Oa3c?rYHO~TM6EP&A)V_e8s&?6f862)8cEl zB*l4hH?L*u&`gykCwA<vX`MjK=fgPWnWi{OFiS2#uG~V1y}Tq<rPlw;HczAgFaKEV z?2GjUJ%g+|u_mB+#$8w{6<HX{qS=lpt<&<-)oWr=NE;E#=%Q<lV~b#AYcPjG^+UPy zP2&ZwQwtl9enSfOT8SMf5&USC%raUg{;lVw)UL=qBoLaOW>8|XOxQNZlK#xzniO)- zb#PVdZZ|_AqyIifYOJ>Z`rygaAl+}(rQ=yn15+#5<kR>5h3hE;+9v&~1Jpm=mZHJ$ z>9Ax&Q=V)xUVj5xlvd?zP4+!Vg|WLIlujoj&Xgs<>qO8M8n9X$D)HG;5tKt~9&rCX z)i~*0^WF}U>wjngrMXZ(eH7ErwQ<{a=^7&?eDRC#4Je1;d7oicAxLU;2Tq;#EmQ>q zCKe~UEFhS<b-Ec#YfaX+qxa2k7^hrC0QGFSuIWh9L-KB}yv=a=7vbcn%q1ab>aCkh zP{;M%OV45lw<dWKe*|Rv%4rsz!Q)r`1bu|G!$hys!e4gt*S?q=`8Z<<(`1<EW5gZR zZT1U$H;te6=2hBHH;b=v4-2H1V~`$WQG0j#f_w!TDNO@ox!aJF+nEj{heR7+9ul-7 za^HQ8KySNpD_5T9=hd`FdMk-EiO+vqq8^R)zCVSkzD}PNP(KsI-UqxBZ!lEMCR*Ac z6Sls$3BS@iYI9sn<nt6CdgLh5KM@T5Rv@{=F1kJ&<xij-hIuL&(j~y*N_dK@ALWw~ zYsk4-tHcSBeg*oPjDmYljckhe0q);n+xK(2!ajop7s{WhUNd)c$o0w-7UX&U1ZwMY zz6p`P-y~z5&OH-aZ7nHWb1_Moxg$q_J^$6bZ<~(L1VT>2n`1WJ;kT8-c<1o{&@RK1 z4g98ev=5PjBqHXI1EH#!>J92L6L@DE`3bg3i*0iq869`|h*lKuI1To*#lVY#IWUi4 z9$1{Cx{O`uU7i*QsT)VTMfMp@`k8<;6*XtvZ~b^|*_iz6vya)vk%)%s-+^2y?<si6 zD~QdWybj`=LAs4f@<;z!3Q{{=<Sij$7H({;!!+S2Y5!{1cHv*X-Nr<}@4o{c&`L^7 zFyddp+?WzuT+>-bafRLAm!@puw}rjVkK&ZP{Uhbe+i(~?8pD$TZ&JB%Q+ZGArw_e= zMNa(YPT$#y%-g7+K|6Xr8fnencm!$-m<?;Jl63FT|LUyt(h8Y}Y0kf|Gg6~)%-~a^ zD6c!X(?4xucw5d>Je*p=FB|Kt>K7*%^2hxC`-mMVK?K=?#F6#-emaa7ooaq{U5=MD zNMx5rjfSo}!X9DDdXDe*se{QP^*q>J`>jQ#Yk{m*uJ2~tZ~A#r53V^==gb;&VpT=^ z^Q>#aMHEe?>2MOu1r8%h)r_$7rVNLX>kvATJ5ihK{1I>zefBKeC=>$gMBaC&Js3aQ zW2BC}OVx7ltR+Or0()sHPILZ@JjA+eR~N-b&M3%jIOL>`v?N=XjfUn#<2kB_O<5UP zK)|u3p+C`&B^wCb{jcNG+6ugmbkTP>5vx8W_N1#yhGwzTpaLBbGZ>TKqWBBiW*NOL z7Uv$V_+=%&BLWvgwpgklALC~LWj4ucY>nc>H1+3g+LULbw~e~1)kKtEHe;foHB$n( zN9q~`x0vqK;`g_Ig6&n*kF&lN4W{g9Ca|5s$HRcCISIz_?C0~azzn%)2n=kg<W^GL z`I8dt_DK_CjXPMb5@ruv252n4!i?XO%v|2i$2vNIx(SA8(OI@aj(aaBoCwHwaXw4x z`kRxWjx&JF8ZyD>SXSsK%BiWtO6QSW^zpm-tkYwru8kC%xss9zG=&?oLQx=Py2AHi z(*btyVR`dlZqukZ2IoCWx)n)`G3Ybau;@H_UHBztx$vAlO3NW#)DQYSq+4%%=?lgg zB<KP4kZ(#5t)#iwuX9xiql-BRFYa3|;(f?d(29T*XU@$Mj`bsKj<a65H7pp-yD8;e z0@!doF8XlPy>P&w>OI^$iW5Y;s?{SOTsdm9!%)o<eqQWQh}Rm2@$#s%zal&%A!tTO z(;$vxIh<<Ywv%bz=)D79H<uu#zXI_I9eXswxtjecAY9`Q4N+b>ddIRop~;}?uTWJl z9S{Tc^Q#ZnF|4sd_uh#U?7w{p+@7JkMDfsN0PyTWHYD0RA8AfJ+;tqxRvN+^C?{P< z8247PG^eC-2R*D@m_2stUXXPyRd6Lg_}fA@=#h=x#r-_=ZeM2TBbQA$lpsMm(ZJsu zzKMfN&p5ac)I18Zflf1J{;4zB5hz1Q{}J$}pP{BVHsdlvzXIa7uBt2beS^wOgPRNP zy*?5GIFhzsTT=P$OnFw3>`cMFbVACoW$BSR*Uw-Vz9pyxa1Xu4UQkfII56NS;(3*0 z-!HaV+4cnp1lBPMTHFri45TVn%eXbYu98faK!=lJg~7!PceH4)%iGCt^vKa*b-eXx zQ<pF9(++fvQnrPTc1n`m``7a0l<67B1P@dzq`!Shhb)&Z5d-AMOH>aX_Eu2Upz{Sx z`cFFNcZ?>?gM`4vUQsS>oF3ti1_N6~mkEtb6p=+mnel{QI=xc}U>x3J(Ks&RrFL&k z!r*?{&ydxTo_n!tbEnli;k4~1<iEVMfP`4QGB<8iE?X+TR0%571e=YdE5i-*LrUlM zhwh~Jy3Aa$FA{BK7KN7Rq<^;+Zl4G5pAG!vYi!IokfU579Ci!s(dx*UNTqgL^`<y@ zuhn$=k3(!TZ8I6hr10B)M5g6gG*W1S+CGQ?OK0?<Itk6tc?9wGw`pIi8dj|<iyivw zw}L0@1;#c+H;V3m%iJU7J{jVlV`!&b_t>Whaq}OS+>9H<V<cK{?X2}b9LVfxc4SRN z&)NTx9Vy9s!}q*=e!+j<+G^{cQQ)0^e2nhW3QD!oxze8;hyK6r&6HklSSIuNyQ+V` zV>FE;5T8R6;@7`JSrb-vaq^U+wgE-YCEx*4^&G<d!;0oc$cl!f%XV$1#=spz`c{lt zaNNLQjDJX(`q6J2kJJ}G!D#j}4s@&Hs)@=9f;uYrF)>@w-p&;b2;-i<loR)47o09v zsaCRaYkGq{mXc$)mp_H|Y=pt!Adk(D&Px|;_6)I73|yu>4#JHJfvzCdCSn6D1Y22q zZx*Ygml#o(mZsm3X>$UhQgpY*v5bLuKN`XHg9Cjcr?U&cUecb+^DXS+G?8GuBv%=~ z_>n7o<#+fH+NA!s{WGe6#0gH%KRu(B)Abi-Q>Oa9l8ielb0v)QSqWN6mUEG(W#pC& z$JB~jjhnXKOkqJfR}I5c#*mu!3)j~Xir0C@en5cR-}0DQ<J?<rIL>Fe>aEro5jL|N z6w8HT03BxqH0@R9^C>Q4O4#u&(`7mVi#G?>sic0o={N^}Jrjx&yA%UMPCeVDbiEwX z^l~(24*61Y&T0u)1LYVPFl#0ArVNn`)j(6h(&4dzf)Yekx_oBlD88+6;AsZe>Z0WQ zL40lujEgkxM{)$`2msJc_NSX{y|3K#`)8Y0`(-S>jub&(mmXP@d`7SUb5jgtuSjn1 zVYAjuV*fm@?yk#H8&)}YRtg1~NG2ZiT1R7nO6$#hPmI4jIFR3nb9Fm&{Bh7<Fy@_X zz~wKq;+ht(8QxYwBT&4UiLrlS&MZ^ml36+4afwFPSlR^!L(!f0A`ik1sKzI9gY#6( zJp34bbn(eprIJn6W)yyw=ISyTuvDuUR-bD$H_8TqXm>xt;bFku$4@9nz)aCiAO6ji z1!I*d@JB6;Yw;uKFm7ZJjR8?#VSh=jD7;0VK=dQPxos|mcN-x!_nCK{=G(f$5eHg< zf#siL+^qKpnm6dP<IGtclNS&gnwzQ*ZT3yS7;DE<1MuqIYnE4<<qkV-K$&2qK_YwC zGWfhdzMm!XM@ZgfWkVv<o5nCU_&3a_K;8Z9hH;1rZP-eY%*XP0^E?b^H19E_zV_IH zfNPSXwfhBfcE4m?tFr%LS+e1V#q(BQ*Jxwl(>U5PI<FcL&Yt1hGlt_RZl<xsFo*6G zPxfCnZk3W@E)d<%vI>pu*}pNq<xR=&QNHNST!6FZ8Ov{-U_R8?9Zjgve>2^c>5VDR z3i&P-n{`g48aeykvf)VN?<|i^;^b}OHeu!WK*Qi4Jv;puE*5xbUzcJ3=A4|?7cKqE zraZHQu4^4>{nYZz!UCuO1L?dl&$3cOgi#vOvcl0IFWqbO1&Xl>w^86Wat8r8u`@a2 zWya@1vE0>tUbL^^7xV6#1&sxuKe-$1MPKYbyG7fcW3o5T%odXtT(5}nBP<1{q?>l! z>DYu}eN;1S2@#E62_HoX(|)&=w1O{IZx?QrOIr%m%81k;2)Y^QvaPch#1`L7#+d!; zW2|;=Fs96(Fcp7ZaD$bQzHo^mF*OrR{t)Xl%bTVGvCV3NsU|rCK|VEz4Uo{$st_+M z(B38F2SaCC$lok6*~%VRAjfqnYeurBi2F~bmc|;I5kGPlf9LLm#%JYW@p%<)syps0 zmu0i+((nv}?sj~uG+2WLP1*=%ib<`PbJEr*ILeABaxu^#ZnMeW$ZX=TXi%BAY`NOw zd;3=+x2XZWvIE6mq6}Nz+26nDeBwCzr&p&tyN35hbxdUnZJIet1K~(<(5BM>WKU%K zG1mM)j?TiZ$@lHUgCX7B-6b8;-3~^lbV-ABmw+%BC7q)~x<Nu1-6A<r%8^Pb`Fr<$ z{{nV!Jje4~_jP|h=L!2w4P$b1rVo;?8H(2aZK1>bwCDGoQ|39x=6?V!*NtZFu8CcS zu@%&k8Ju`oAR281jg8<n$LSF{ho<nW<@gUvU6)(SVLC0~s<=1C?{`T*x{+=OGK;jz z()*e)uoj>Z`S>qax@IDFppLfwMa~_{%(;{KV0MfHsePl2P1U4_{6ws|Gf=z!Rb%R@ zFZ_*rTNgKE*;=$-cyi>JN7558Hw}9~wI4XA6XZV1?1lEGu$AJSeY+ceAe60^p7OQ( zOE#?xuin*WVPvLy6t5s=z=MTtD}8LI{RVnD#6~jug@Tb|%ZmbpxMJDIjmaa1dItH! ziT#exZuSn$^}Bn><uvLGXOrFzlR%>>+}Cb_aEb~Rhq0)%Hzga!y664j!{&+;1Sa{W zlluA*7oaAwMOQVk+hx5Y+4%6DUE__@*EQUIdBo(N9N4I90fXMeZ;74uJ4tNm2Zna# zc4Ub8va1g1ae&dlisvj0D+&scX8Hl@$T}4oV0*Sm^+y?h(s&^1f}S%{G>F*{#v681 z3FjS8?eYvqQS!UQP=8(7$>-?_79PW?8}hE(QwR&(#_jObBJv1#I4Z(lV^hFFf7BlH zRdm#7LKyZZj{fuDJ*$IsLxa1QR|Er1))I}21Cw)U+Y%x55C|Ry3QZcu+05$5LfwUZ z0@7sN=~8DyY8x8^9nTk7<1vcQ7XQ|h(g~pgvKg#xj~mq2)ggb#(oldIaY5>-_EeYU zv<`|J4r0zo<q+9rF(pfHvCA=_H<LC6qsnFKqA;|UDJ%sw8wAVohP_i^p`L{Mf>Ne& zSU4rTMHP4<Xq9&BpAIgG>S_k`Xd6iW);Y#%PJ#*j;bPjEtSo*Z3mA)h1T0ZWyUXe^ zM03M+wwV$#PHGdc&JK$*wxCy&TVbV_+_bIe30(L-yn1!fy|UNUlaq6o(U>y0VVyl{ z>qpG~a22%}_M|F}<Y%Q44U2rw^Xeq&Bu_bP)&iFpDoIt|sBpp8ZqV;r0~2(X-Q1WO z2I?^toVj!#f@wHY1w)Q`T4gdDurc<^tM3lY77AsuN{+;S#q(W-G}3i(D-z+sS^M!t zB^3Ww1XrWL_#$>%yD9!~&ixEgAuI*qI!1pHY{xX^xD3U^m<_X-szh$ZAh>)E+0Ld1 zyUzarkka4vqGBgw{fwcM^_Q4x9M(w}SqAe?JRNRoQSO{pI!o_=7p!!z8UsDq-bU=j z4L94_=O+bVHES(s_tzkVoKsxR(IFw#u#y<uv~zcBlHdd8yWWKwcMOuJ{3NcxV5S@m zoDe#9f*J<XI78}Di!SPtuxE-eI##S?;0ti5p{_2>iyE_vd&mc&xz|YwQ~dOiO;R>a zQ;(%}G$Gku88zUCnqt`^gz|SEmJ;|?T2ZN!a*_#PYx+Mufbg1-FdnHKQbMK$JXo*M zox;K14@4SF==wR5hU~pVr~Lzu#gRq@PXwtBe^y=2_UCcmh_lnN(3ObWtsGjd491ST zvFeZ8Pch!`uifhYAa#*uI_e~d?$1}0KIP?h>2yQys0s2S`e#UH4V*TPs0U%8XQ+@k z&(Oz>D@@N8#z|U1LRX4e(r7j8g>b52Ai+2WmH&1Rd9B$W3573Lu?!OSg_4CTGZdv^ zlB8J)o@1*w_XcOAfh;|3JN0&BI>T7q%gOfmvkp@<(zT5TBAiG<!t=N)Gc$yuu1d_` z)^TvoblY2H?%nQf*>AR@o0WYl=g!3m@s{6GNrwX;WxghRlBoL0^i0VD$K^SL*9+}I z48KCl{c6hdIXaJDvy>3mt7~Dn+<krDdL^Jefg?rlXx!M58O>_yfjY3aZoQBWuaiAv z;Pt?z6nUK!a6#Ls5w|eQr!3>#*-bKuZI_|$zC;OQxNH-7nv0{6e>4JX@SrQ@(mb;% zYr6Bet3!uPIp%mngdTs)|5zj$mpnlD!&~Zox2<PKSdz`t6{DU4wlne8`#9d@C-0YP z`x>wqyaaaf_HFI_{!4Po)&`9;E${Ygot(Oi#*q!EE?`J<Ht>*CT9CSHVB{`v-XfkH ze@B=L0&v&Ql_;Uk2c{ohw~(9*$7cmfR74A(EVl=SrRevT!j#wE<}gWIDk^9%fmjmn ztP*8+Lzh1oQJ(FWammu-ugF%VMJ-c*qIVdyUZzb;%-hR61-!;X16!GYfvAXjp1QH% z*38Cx9kKaTYZk<R^Jbq)nxw|vc7bf%FCMJho11Okagb`TcLN_&I{0a2Ow<gg&NVs( ziu)Bv)Uo8$UzqoFNo2kdk+yO?_gD%e9QW>g#cI(4AZhtC|H>%JrJJmc%Cl$xA<|g3 zVpEHa7v;UZhPl$u@g+?xG5W*H%FWzF*t-(8$AO~EG#EE^j-4w*({tqKnzF!uVTPWv z-5K@t;e$OewWP=9eV3N{&Ix(Mn$Dq4L=jp{EE@8^VscNbW}(MHHVaDr2hM)rQ{!k{ z$i<R<FruRT_%~HqG~>&Kyo>JY&L_pM#25+9H1_tU^t4Vpu+L5=38J~@8iRVCu4|?Q zI5QMB;bWyL7O!|#&Q`S|Rh%?8SiSW9zfsqF@8DUJG^f#L6ix`@(&Lk)U(K0hjB=?G zMrw>ao~Zxc+ETT%tOL>$=kH!!*BdG)QK~BH`1$eLib+Uwrp_IdaqnndA65ka2p~+= zA)9Onl<@SWAHS5^<w0#%ESWfxa(sGr|Ex9t3MJ6daR6$c567WM8z??+yWA*jI2H2M zbqs^st_S*2c7>D%{3HA{4uTm51}Uog<`Dkw9R+rj{HtvyT{5fcNS)b+{&&6Hx;e%= zYs!_LcmJ+hqsBbXd{bkR@%s;D`}Hbzlh~c`Uh1K9qkI3e*WKOGJrE7MQtj|tJ7Udf z)ZqK)b#T+3&!5RJF{sw}S3PtU&Ng8Q)b;l#HmE)vH>Af;kzk(pL<5D{stNZzDk)iA z@A!9Q?wC+K(3&;L`1yz0HHOuSIGwc=W};OwEPOh`-@JQLZ%hIu&E->_qTa(2w|{Hq zWHrLpk$;z6BK+*D#a=u*?vKH#|Bc_+cZvefGSNk7zdmcB(`*W&-_Fd&^hMO*0@Fkv zz0NBz)z`?t;&4e&wr#wvG>9od+735X-cQE(W0zH3eAYr}{`ILv(-<cHTwE+l2(Aa! ztOUmLOnIaCT<zq9K}~ddIY(?z#YKx$OFm@_XIs$|U2Khy591~>8awh8dHO=QgGkPj z<ux7^twi4N0SGLTNxPz;F@<fb+n+H{zN0sjW1de%%@dbkm}%DNgO^UyZ$Eb!?OK_m z#GDJ-rfB8>D%Bd=LrZyAncp2)>8p`*DmGf1I<L98UVUmzlU}^zZ|IS5R*X>JraQlt z<CPe}B@Q@AQJT(NwC%PHpY?HDLLudnf#heYigys4Q#aYHp86xP5|~+zc2oZgxnmlk z5OK+kD$3JwO~8FhS~;2$#=|n1Dzj5p$q{-o#_wLUMf%W{TYw7TYL)TCX;Fcrm}2Z1 zWP=qgbe|E0vC*NIDHn)aD}v52-(iN_ln36iQ?ZrAX5wK75;T-LXtK}<%%jzW7$oX7 zz6MF3y=D<TXl3grA7Le<51XMBXB=z!+2|R|#moRloz?0WJ5;4d767;}riC%sFX7}r z_W8UBgT>a2@zDuazZs;)MvPP9nFTavl1_&%3-tF9G{Dy~+3|_Es-!}owRcHO7C3CK zw<&u6SWDB6T>SMMH`jrsp^6iUUco0|6eCWlPsXs7v6E6LiWWt!oB#qhqm@NQXFAto zN>GvxrOOv5hSX*g>{}z^TpQWjynGVaH}@-eR<YRjgtCWxlStKM^!9AO5UDvGUN{Xe zmTW52fR$O`Q23~dxlP3p=hjL3uG>%HRoG^&%<dFQm2JVH8L#5TepFrsU><?CZ}^YY z^_Y1~J1Q_QkhfIuLRpyi4uES#%P%~SD<SLEJZarxsY=IXU~eUu{7-IJ3{V(fG@2*D z%90<y2XJ(^j7}YX8jRGo@&M2m{e=PTlEJo1`=z1bNHWz~v-1VeL@b71+E8|qq}Jr* zf*58pNo5<46`}eI!lr{nwz@hC?%$ecdf|6K;Gn=*IpbQ+{78Xya;oFeax?|qzJn%! z>p)tZm9d(M=WAZ#o-5oUP1yzCM^q8W6+~T=_XAD47Zu~(j5%j3pU`&-qh%ZR&MM&< zk$i-bDkAmhDx&hx##y#%^YCGRPkCjM@+)~O+3P5{W!~#X@G6nJmQ8;lmA62j@N6y( zBL8Xf9<PV~oS{L{vTACKtYiQz1`AKY<XNO5^pVjw^2kYPs50{q30V$_er%Y)ejMr) z^POn5ZJqwjvt=Z)0$)z6oUt9a(t?2(-*Rp{4B`UVCFu>5beXsP5g*;rl^A+{=1i!r znXFt|cLxDc?;W+~Vv0sAH}Am`&D**P{2D)I*&qsgUs_c=eMv?Q^2Ca6W@wOVf6u18 zm64i|5`|OKS9GtyyZ5@Q-lPpLXhy_h$5=PdjY?2^yBx#mxn6!rKTs16xw0~ShVTe^ ziZZ;FFl3$ps3KcN99Mv$NK$lDlQ(JADt$dC4OLX!c3F;1#NhHV7(Tg%5tq}GX;-OG z5c(EHxT}-Y1DOO$l*rL&x2RI{M%ct@)K!M-?ENZT9lllRLM^9WC7adn6<0*_HmW`j z2kfu>%+<_K;Xd%4)8f}}5E*B4V8?aY*ugya3H4VbaK`ZR!a07S!%$Z|28fUnCj)l7 z8QhF(woj34F#zNl<PcHpJo_a-VZ_wAn&k8urkHu+JmKxQtmvToaSWk*+V=~^<}Lf@ zvbnO0=riv2@l+V}m!kTUwKdpUHCpWPPB4d4JxLmam^lD0ddto*Olk_=B>n9OaBmoR z19!)HtEgBN?UjF6Q!>A8(YVx4YRR;)*|1tTlEjnK_q6?+o0KiDp-bybQ=44&3XEXK zG}vd9xVJCki;Gbd!qsFaEOrxyrs!+$<GL*<DJD`wt$Mh)YU@0!B(AWe_P!yt4jcnu zN!-4Nk?PT${Y5+J!qJmxroc{%1kdn1cwYEirTbniqFBy7IY+;^j4_l16q9Lg7%=-; z=%I$XVoWW+X{Snn_eX!UYgI^Ng?)O!KBTG*bXk!D56-VULTd#Ip)x*zc}WHsK82VP zUj@T^f)YYrpEco_+gfv&UBBP;a{vx;W2XAJea=U&f3JDR+kbTHK4~EQ4eof)4wZ$< zj<A+%I%1`_9A|PS6z6$FHTej0S7&@CHgu|`G`}&2{V}weB1ScDI;EI+{~&S~^xHd` zdXiW77(}03dsaBPW}TG*a6_<h{)cz$R|^LdRzD^=w4@GU9W5vrj$0Cj<CzrtCpB1S z>hrsaHS;&T#6^1wPoYao_M$pIb<u^<%=iAF$vKq<?yarCzQoJf_tg?>RYPUnLOE3E ztaQ()m{R>1vbF3xX-wAfTV6XSH+c+!*y8lhYtRa@gn_O-fkv@6*OOhM|8;-s2XL>v z9?Y^1r{uz(+%}5`4++L+>&J}<<wUP*%s0qCoDrn;s|aCbzFI0H?aYpH7HNpfkwN{? zTmo*J4dz7a8urY(tktC>{uZf@7y3L1x*n8Qts#_r3EM;}JC=O^SxnMSE~$DMG0!GE z$ZPsfVoz?+?Y0Z0b_+vvAqK9G{?y(`pVK12$9j{7hx%A`4F;+U&cx6IV)-{-!WtW^ zraTqzQFiS^^z|#@;^GigX(YS<po7j~(Ai)~#g=HTWLXWzu@hV=mB;iG<u6_GbT5dn z=5xYTT$m3tT;7a6X~^!s!>ACSSKJxbFOV(eq@2(|7%Vp-G+an79pV$QvPxb>xc$V_ z^r93cnWEWUY_g-@rxm+$*Int)G4-+$(FjElHw_MGXJVlNcx7w@YR1WN{B)}ITPK;S zw1V*Ym<qiLjd=KRj=2MS)?)B~j}hlo+5~U<2<t&+t>)U?!ZWC(?M9>@c?z4nPN8<m z@r7-(JHr13qB}U-T=&P9OsMzVssg%bv~LC4fp|XxFHNiDXNh?A<_69#wwf#=MBj!8 zlE;dUh_$SLnf_zRZ34u|^ewQO9+uerBXG7x*-H9x5<e=g<Uf~%cFd_G1lh^d*~Ly5 zo*IEDy1Bi+c%92v=w^Zm^&|2sovs38wR!m>wbxd$J(+ob{&d`~_fdJtz&p}T*^+NB z9~w7lyr<Bl@v`(Sb63ttTB5lT%FrQI=W!l6U5b=`8?gZ;_XBx<V?Z8@P$n(#tIPQL zjB!&*A;-;oG{2H6Ftfd9>fegH9+$QeW-b}gM&E**4<S0NtSv<EveYNSQ>BpottZ!K zIxQ*S4Z4|X$eZnGw3(MHkky8YLWPfKC4M(A+hfkwDpqfJY#sQUUz-u-XjFke+I)uU zj7Xbd5hhTvKflqY%UmRt@Tll2dDAu$2mui`#HEI&e*I9_)D&o;<(2vI4o&J#CIEgn z?hyQrs|0y|{f(rDdHPMS^!>wE<YdoaLexQpPBQhi0Ce)vRr|ug1B6*jPS&{(ZD4C& zqT>SGKbJO17;Am9J~Z%x;bT(M4DWS<LVVVepEGqhPhS{(e>|*P5Jo-gn*B5C@B@7z z|9_EUKMPmI*ph}PJ!ze+;qrEDD0Edou8kR*IKjp*EL0q?ke|{su$o#k-Fp^RbW|Eu z_3DQT^?2F3;luYt-iulffGRQkpkYV|6Vv}$+_<_g(ShoMbr_k+8!RXgj)Kk3cy~~t zIi51fg<daoYO>%&{tvLZHzyOa0he`H>7;5&+}IMko$I?Exr(^js_Ch}B4MQpk#tBc zdF#$6gHvYDEN>I(#P0_>GXAd9mPy7=Y%k<9ZMI)}m69Xwd&9SBX)#-S@s64s4cqrB z>|JdqiI`ys)S_*|iYUj24pPj+xUI%%2k`Xb4X!Tu6FDV%<T`5w0N%<*xHbP$)uG8G zRxfZky6`|D5sbC2Pdd8X4q_F_(+6o9ynSmo<~`4wfxHlO?vrne#{KK>Oxxb|^r|bX zD>CkF7H`@*A-gg-Il^E&MRyuB$eTJZ2|<4;yLmD>x%y8~t}Ruc45lKol|ifS#7)H| zJsOc~b*yN_=VC*|9-G;ive1y?!u_^`{D11T(||1^7O=UUt!OfhI*~Yy7OQtFBI8dD zZ^Qa?Np*Q5;^un&F+W3aFFLYjv&KXK(`G{@FcB@FEf*LK3|eSXA$tEE^x{YA%%PvL z-Nbg_lY4NcuwUDH^Dx$*(5st<rDGL7{IIx8@*;fa!bSWsJZm<r><K%j<Ao@1uN)H- z84R$Z5%BN2Peg;Wr_^TSij}8J5oKzfEMw@ieVrBZN-jl<kLSfxWXFo4<J<d$!TdMv z74&;7)I@Kzn+O{ryS?~fKu$eSL?!z?{xr<tVWLuxa-(^v=_ju6V(ZDAeyR9W!cJ@Q zY>;c!$81xYg(@e+&VXM!PZC=LpMxCl=&v*KD;bYrzhH-B*FtS`W=R=SIxYH=)#6i5 z*pl<an@%_AUB=@E`}B6!6zcGi;C5%Sm=-%nL&Rwvhj)f@)wKs`7VnyA(V=Hz?O8}# zu16HCo~0#fm%h15dE08>ot>!laqf$U1Vpw|mg(w=Ptu@xkG-A(D@Y|}Ee-_vxl_P_ zZtU5gEVV#Wf8pXSmCINAmwa*;x*&}-u4;@6aBQy78=81u9qG3dr5$axJ$Yo8#Sraa zk@?G@(8+a4S=3I+VdU^b6wa~d!!NEFeF&OE>49Orx|axZYkRE0q4+VrghWwjgqznM zgql%vm;-xa>03dm?y~+gi<4DmRMNdsmc`Z=#}wB~phIkg``6`G_g5628`Y{rB<V3z z7l!1-PaC4=+(rDFHB8)0+zbh?=(N0;&A)zh2*7FrFS*MR|G`B;E7^#8*TYtGFKAnw z46eyP(Bww6gx9!4HOaBY3tbvwAs}&VeE~gE!>P?tw9eEOmFi~rkNdu0>tQHhcAyJH zK^^kNy?kP<xFLPMfUx3=gNATZOE_U!)J<JhGJZ^WZhCqzWax%tzz|0(Ia=!CHC66% z*GbX_?3ofs&2%J&hT&U3s!}!|3I$25U2@yK;sHWq=CqQWqH9(9Wyy4V+KE{uu;xWa z%J?0Roz?n++a~0N!UAfW&Rhb&(7~BP$geD7mk}=GU&3-i>@s;q8k-6!ecFg3qnb2$ zhpHpzFMIJVIF>)<y<~UBO6sC7MU4Y6Vohv_nj>3!o>A*DY1uYJHSWA?X<WS7d@3x{ zygi4RP|iKG)lJPqo1P$PW_ULX5wFBCgT3Mdr_*4lm&>A;k=hJ_cj}><PLjoV(J))W z>*?OYD98EnimCnZ`k}AJ*9~!K>^;&CL*`8xx4)vZW%{97JdSiQX~wUz_4}`UJtk8m zQ$+E$h_%n~O_|apq|B?$Zga-aJ~Kp|*oPT^@ta07*$0Hc$u%6_&Q`ztSW6?v!~Kq` zopf``q1)7QXVwp!A@s>@Hhd-!)yrFkX1o`8d-=)M4e7@JJIBN-3(@$Ql`kR8KNF8W z)W}zp-9vI_A@Zx&y@UoH3&z=*@qW8&D+?RJJldI}xIIsy$057Sdm1|=ScOrY(njuu z<mtg!o=}b5{<0-p);G0hAzWXuYW=ZF-e|;9ZnL7ldqjXXst^6PDt=;~U^MsMcunHZ zFr(|#t|#1X9n3qSJtauXoC^C>P%sAS&6#eW9P@t1H7Kvq>Ff-VpwF7KS`nn0#v^7K zmS*=&T^yeYbhi0|&_tW=I@bvO<mv37AjHu=!Z&BtXVrQo?QyBbuL-to_lu~{iOapv z@7BD{ai*CN2?M(mGk0UR0|&A9kRZyF-hKEqp;>5(PF3t%liVHLJKxNp2!;FA_n!E* z*PmbhO=vHXKQM~}X*l%xR5E-+f#Y=(kyVPl3K<P+zb7E!H<NI8Ek2qFk}y^hI~Jz? zwCvFMI$QN*YaPZs@$hX+wh!;p5`PrLc&0Y72};Ce64i*CzRVH8z2f{;iLQII8(7C? zmb+ur*Wgn0+uiJJH==<&*hyi4{pPyb>I3(_@BqIiDvWS{Z9RxSDwhoLeb^azx0O;t zx#NDef4=?@wD(Cnd3<)IeukMDqK+!xGt8Z=o6lg|i`?x3x4~YMdhF3^M+=D&r3$_m zU_B>(j|!gr5nG8`<b{F8yBD**9oQqIX$SoUgRWL*R*!eP4~HMNDVoa7%wA+SbkWh* z*{E@McW5T1NPWE;<Be9cHUkU<^`Yf`VvnT2fP-@X&@N+|-Cj0^EXbn<EUoNJN8E;3 z$na6`Gp%ngrQ3mOsq0muP|eeutD7g@uqG*v-rgi`8$A4?q7vS|&9*iz9Kb$(K~UeK zfS;ur84;)9ehZBZ%CW0mjN!Fq!(8-^wK87iFe@+t2A`clRCRB%D|paNAW%yusG`Lf z75dj4!?f=wSYA1}TlJU%FAG1Hv7JYiB28GkdfuvIAG7UT@!X(P<i;hzijLjjCPvlx zzw+OkIF~VVN2{vkoeHUcMZdePB&ETXa)LKmE|cPvi@r|Cdm3B8;zHdE>h>8^c~J*4 zp{DO&I3%MkDI!Y~5B@Wslt6*K1F3zmc!-dQYogX({HRrk<3Tp=yM`S&&D#*=v>jB# z0EM_p=wOzZK$w-z3+kXF(|cFqp2Lhjg8LdKYmK#c9m@Brw8Y-BLmSyhC)Wez@aX;T zR%*-^2}FJbX*Y_DonNio-5aw6@R-l|jr|SvD3-skJ1VVuU0W68LH&ID%6N;$VP$*# zRTj0?3y{@eL!%x?KR^2mu8as*(|(M^F<SoGiCwAZi@(7&TSXmT^t!PQtZq(*>jX}B zRi!~iF>zV{R`CurWcYZt-{5LE6u{2GJ?ncSR;~F1pFdu7qawO%h8x(be$*fE_en+9 zV3xkjJ3c@l^2D5U(`t;R&zzjk2P^8}Og&X^eJ4}X?81_xi0CI!>K1AIm^3%qlFhJC z%Jnet^c{)vZ(FSouH_-DwEsEzPI*aR9CIgPW;zD@uy5lyJfS=eRp#h;?}PKs3@LH$ zH0TEFZv9jOBxZQ)CL-;LLL<%+R*1QvG<iiNCwIoe?zf_pd9lLjxdrV>f7L$x@~Vh` zzXJ2Zy3l5nMxwsZW$jmy%R|n{SC`+ldwuJUsWL<b;OD`F37A?7D@X$smv_DoTR0Q| zsk^5rHswG_ncDt&u5vd*f7>s5PkzVUwOj?rlMTQkcsdR+37l<9uAHrxcgEQ5mR2ZM z9UiS>I)^^A$b>Ey?_{|0jghZ4pih=1&TH%$A1aYo2o<)878&PuLixdG*mQ+V3y(ah zu{u?%)a*fzZZ$owii@Xo1M`(Kz8V|*DH4wTj)-1fshzWL1zpQXXHjo~_WY4ypWwYe z_qX+jnz((l@n_T@n8u!i%VlC&&Gv=Tg@mkrpGt`xKs2}h`iVw$3?eV_5?ht6Lc)en zf{FjCp><6Hj;<7o(S)csJ!069SknoJYSQa2@5#h&`jrMJ{5OHF3tmsL<9T|sezxCH zC}y2=BHh+t=eJQ*hAuKjJR$w%hf{v*FpgS?V-SiWK0dKt{MCQY?BD6<Yam8M`CTZM z?tHJ)x-I4B8bx2Mn)SvT8<Y&w-D}1`#>1pLQLBn24%ppOdwv$41lbzgkvI5W+GKIn ztv9s7E3tddc%!aGtF}E6Ukvxu{ZTRH(@nMzK21)k7I5+{X3juJR+q$1pyT(*+Ys{U z1j`&C^h_V*M(rrXtxqH^=2yvMXpP<RPbpPPEX*vfcxJ((%QF|DNNT%BGf83cqspL5 zVglvo?(ED}+VAJF50<MtwdfkdeGdlimBbB7FDB?aY{9XZLSdGU`cvt75~2kGi}MXM z#jDNoiZX;e67jdpE>D}IWK5EXs@TKLWry4RtZMl{;N9|MsW9J4OQV3h7Qxk*xnVXS z<7oA*y60uZ6Fdn+WjalESUu7_>i#SEuSLO6VR|1~uCH%Cf$WTomrSW;`e}O!bKd!U z;DHJmkxX6uGqTRVvhpzfmXUp>3KOQ@h8KKm%c+iWlz<oA{=GM3T{#29e;*%ofaAhz zXs#O!b-a?O^wKKR6?nU)Zf-90_*{*QlYS78+~IiJf!^Ynh+HP7GmTEAc(C_AEnqPq zuijW&sq4-5_eU)9KqeCvjcVx~%5SRpabvoR-c{4!k@Wn2W!NQs7eieQDjTEW*JLl% z1>^bHiD2zB^+P&-k6Z5VF7t7xrZQ~oF7mO&6L0u-uP-}kZN)5vhEH++ITGSxsG}sy zcr9F#{pFl>qLNt?i{8G}YntdIGZwHxzmBRP@-?|*3JutVb0-iLkTs$F$sPhsB(V*E zpXjBq=ZsE{0DgUmxCjlHCh6KCn1kTn8&dDqdG|lEE$YYVKy_#vQz_aL<z$v&ip{%z zQT>qYO4snc*pNDbA6GT3_(UH+|Iknd_x!+DW+Ahx9l6lUWagmr@`W3K^)Q%ROoX3* zch7E|tW~6yD?Mi>eBQaP^eeTOw9({}zfSf(Ji>}uMP*^K2o8yQUMpUtSVo+-hj8I) zpw>r9a+-$;l*|px4kZ<pQERZ^b#=gmze<_<m!hJ;x^=AAU==8_5+vH#Pu?D@Nsl;$ zj?iDv>~fj=)Xmj^Mjya@gam6~c*PX>z;4B`LAX6rCz`)0?Bi(2;}aC|kD01vR&ML? zO@RcdDQP*m`s~tsot%fp_Czx!YQUC5-g-q_Kc18k4cT;UpAWOj$O#mRBffbNa5M;z zms;ZBXbJwMCPF>rqcx1$YbNP<dHHLy`bcC7Bef^_MT{_h$b}4_XvG5PKnLK7=&YEP zCc@qyQg91B0(XIi#_*&dU)=)H!^l6{kAv7X>Z%Tis$x8$%&5Xte514`Y|5A0AK@xU zZFS|ih3h)D6gL(bYP1ri>JK5Wm0R|jfX8B^DbsgYT+kF;91a#H7lyjPOID_^-ZPyJ z#f^_8+h96VRkNwP&lbi^{k#n&p(#Gbf_Q{7DMH5PKc)0T^(kpn>wP9){Y9<eso0rD zOSzL{DZoU3m_nTw3K`}oTi`IKN;F622g4r;2dVA7Cuv^-D#V1t7bdUC8`w(>NV>>m zQ-kVS)(X=DRk>-#Y#p-nHF2{1veGsHMzJJ9cbM2G1%B*d@nIoY<b0U>{In_%Lqt_4 z4=z<Ma|nEv*LF>ap<BN_s{iCJC0U?4li_^YFi`kH^Q}_L)>L;uA!_g-u9?9V9Bspr zTMfLedATV#WabE9y1;ea%uE`-8?!ChD61f9Z-o}Ol}aeGmUcvimh#w-J4;J5+vkzF z%s$rrdI8}4%ES#{gAFGt;_SdJ+?AaaII-4BeZ77vMyEm*NpeiG0w2S_x^7wymge7H zZ;ONviGD|v3G=`0oY102QEfMka^$n47gxwYX2$2b>>0t~p$}gz3pF2ye^1gV?$_># z<7i;hLpw@d=-|%q-UXggXzepuNT6BZxpuYWP@iFZVsP(;NSklX8EpnLcC>%_(+gJL z4NXa99&>2|h(~jI1>aP%VDf+|?NU?0Iy5R-DYjgH@Vi{~aRf?=2VIS?sCj)$E&S?J ztEG{OiM?RVuRx>{-vNNwMb6Efg6fbSI>GBHPwg0W9lzZl4E!dBJMKqE!@Q!rdn8^Z z(Am+@g^=sL;cSQajsx3N%z#@=YlW|Q;dQXBShTX}oy%QA%{iTeX3-SoT1$6)=V(@5 zBEuBG*7T5k_MuV{<LWm+KpFN<abBj@--=>2^aG~-c6Appdff=aad0CnS6GZg9aFmY zuv`EA0*BKx1q1efYgLkoGmo|%!BsU}-21>fXQ)N0eloN5=YgHHopw;}nzOveJd8;@ zZ=l<NKM0$W+)90B_0y+=6bQC#Ln3XkAZnsys$qJ4!%<bvwXyw$(GQnwn6abw%<a`v z>Zyk#8A{K)fgu<<e6ZCM1zK*DpZSpU5iD;8Wa6q(u(>AJ72EKB?EU&N^hbUkG&3@X z@8@DtQ{sl@d#|$YPe%nMG7s2IUx=i!4c!@P*d36@r)!s(c}mzqx{*Qbj$E>k2%;)< z3+VfvOk`PqhWt_qrks2Ze}UZg$pH+SG%~*oLfjyc2F3ECJ`0ZKQw*pw1`-r&)RVWp zUEKa+lR|?o^ys7j=$W+77bK*qPM@CLtzBFD^J01u!9Ee@B3^mhd!s=`ThFg454OKP zmJ2IL77NVT&*KYW-k1OJHzJCc3`5>DNm1Yk?4%#qg3MaEH*Sz(qYZa4cq1ZP#QWPn z>-uliGW18HnOM%1YBc}D{{Zp+sR1|g9sd|Q>NYi_C0_*gDKHZfd5;aUh@^5<Sg{N* zur|3(gj5rF{cyxcaHc2ZQ!(lZX>{yf9Y%Qzuw@)0!q&tV-0(SUz~li^XLrUnzbwdh z8UsrLx*LX6dJ;hftGA5}$d@-V@6u`vz32jbTL5vBr}Bfx+lHW9x=%dhU+kqFzIhQT z<T$TyAXg*{@z0(3uDEPPukXP*jRMzP(K`KJMWa%}mu!9-pFV|ub$0OgX*GL{hNPb? ztmR(mn7P;odGE2YEyD(5&zg-px#JzYWw4P8-v+hY9KPK@cSr=V+FMyY&Zd-W-|ilk z)??aN&HI5qp8b~@)Ty!3?X&APdc!^uQ#ynNx=M-FY_1|=h*$dSD6dJ4Vh`8rSjH{3 zRwMPbD?Ckv`BfR}8<loS1{@F__FA+cHg!8xUvc!cU(_4-sw&qd@wPGPcRhf7HVj+* zCplq5OACR{k#wV3T|?%VvMyWlH<Z>`Vdo(9^_(3~Apgc4eF@gdP5t;n(X!r*`UXbm zVW)U-O}~s&DmHHPc}<2tD)fA2<S8IOci3UhE6tJgOH?^XF?sEeW1B`Pe<K|L?PN{_ zLH8jU&#bRvFZzFg=SoCHA~#3hgQ9=GUk*buh102BU*1P&(kN0$Y#L=uD?wVLiC@xz z)vOlxaWIhSd1$pOmqdG%CWFT8u_-HB7&TZnh-`HH$z4TD3nh&YcnVv#G>?FWKS@!g zfoA75-mGjw-o_AYMr71mg%6XGd3zX{7BnqyBqV}KMSJQD7G1<c@s{w~MwLWLzoW}v ztX#==GAwVRVtuY%IR!tGFhx+e9^YSIzf`gs(=#<5>~(JK!^WOO#MLlPG|bfKi5+*H zHt;a93Gbqo@+aRk1@`)-za}S#9xA-~)~WT5j^s9wsn0Ig3kCi!(r@fwm_5PfXmjQG zx~^TDXTanoe0FA9-ID<yv?Sh>5uX1Jn$DLMnR8z2^9zXsX!XYm1z-QILH^z_pBR<S zn>X@S|3x2&JW**gRUVuUY|DzgTz`zN`9ruJ;r=$*Ch&U&6c0L;^)LvJ{8zor`qXsp zH3S|e`dFg`>di)|Ds(EQ$ZZfX{T-CKoilDeC&*zWZ8*@1J<8C~H6j1_O&>8m<UO64 zp=hv3`>Q&|-}(2(1TCxjp_~$`W`1HqUqTZ&K&lGS%{)lF**$FjDd@K7?jgVY4d*t* zXPHx)I|Tl^N50b!LA`tiYqL%=#U--&zE<A7SO714=LcuBb*3kI)|1^*^JVE8;y}N; ze7A6N0?x^e^H@l?(CJ@ISNo0+3vXgg1<pr=nM4=RI1=x$xX5AeqClZ#j3i5kEg|;3 zJ=}B{=L{%<opTe?fI*(j1u)&7%h7iPeB^l>mT*mK$%8q?#p^&{A2<01G+nJT$=UUQ z?>Z_K;{%H-wE*!V_+mKX+UFN?)qgR`62=Xx_;u^m(|lsZk>U;H*<;3!dVQnC*~m=W zwDCWH>Poe6_R*nIYUEJI8Bf4g>CX49_F1ztTOahj8jP@&qmY-xO0~7Az|x)j=b=vO z6}tyE9Wv>$AhxZ|Gz?By<Xixymp#rU?+sp7jP`g%r-OYU`_l6@V-SAS&71^+=Ik7N zI4XA<hapXkA`*C8U<7s>YJL+D*~Xk!uZ+Dzu2e^$xO%xFTWXghbo|5NXX~jbb5DIG zoLoN%DlDWRbIbPlvvJ0G$k!Sq{K@{k?DJrK=NEn!y7%WnD4Hz_ol@mI-qJF|P*P6c zJ=}vEc~nib+|<?C;DvMh>Doog>{c)^G~oJg-StDy>Cabzxucr<p0mq@LAJhIi^i5H z4~Atz#L=t<do8^STZ)C&aiR`+iyr-Vd*u|WCuYe%grV>LUf1qX`l++FC1fhih%yS_ zJ@K@t*a}kqblcW!rXeT9bCE)xnB34Xo)Zfyngt!0hi1k7cV6_gdWE84B{N3|8bQ!0 zQsSTs^!HD^9g%D)hl+g}nHs0Y0P08VzfJvvq*|H-zo*5gpWq@b)N&x}q3^~1OIsTP z_YxoZrnn7T-$VyXpUUW0HJ5!edQ10~t^p)Jfu5HhP&jpzUiTN)u~O6D_1*bbi9V;^ z6I=?8wYYLP)Ysdci1%-amV66a=`RG!22^%kP3%mf5iEh>CGk-5RxJ#$73K=-clDz3 z#mhp$R6j-4%zm5vHrp)W-?0aY%&E;-aIN?`C0Q9>h6-rh1W}ki$iMk_+oJrV_bv%b zp{5F_jF-4Io#p-c{{Ve*GGK1K<}OsaW3J>TbmIHzikI%)<QH-|QHVR;q=3#8`?3)9 z14CtX#4BUYtVJhF%Qq4Sl>C^4grK#;PauZMJZG>YzNE-C(!{PiTQO5R@4W(FtO)3C zj^jDS`)o}WUw=pmAFK94+v{i0FURq)ItyLK``uSW10?EE85b70rmb&MxB0}hF--yV zjKzF39enMt#^2)DYXn(rEu9Kf#*YM?x1H$|he8JH_$pY!j#WhBcpem{%OQ(lgkR~0 zY$PUOLm_NcZpXsCW~dAzw3e09rg6Y8^mg1Zmz7W;@fS)5lx}Fj<*(YTwx0(ZU!yzN z^S&eB*V-hLZN^vpk^N5LD5bNe>7aA!Ew)N#9?OD9y01RP8~$l6#4EzpMKgDeBm9l< z!pLXT|7!tJZ)2n3{c5YlTT+T2i)N3a9NT<iV}4ow5OGu3h@^7f)y&Auj9BUMAFi~9 ziu74fdLm?UNJO%j5Av?X-*tRAc=PJgbq7lyc65iEKBg5>{iT|lylWKOp6HKDYt8nQ zn`p9K_D3MDF#NLIswyxkbNOJ`r3-4p9O)#d^*EG6()pctqGzWcqtxQ#Um5(YR&$LV zgT?f#0{zKfV8dv2Ox~2v$>#XLncIlZgII@lE05RpU>n}vMBSoLG*JIajf=dl;}^}l zWSR--YNbljjc8%1^U><_3Ge(<<2*fIv<#_rDdwAoKE0lP5D(ym5wH~1Ew{-14(e&S zt4QZ3RJ51R5h#Y8@MnJ4Xtg@fhAzDM)G3#zE)nGT=|x*Q+l<Wfx&MS4)DoMW)s~29 z%*0BIwc^FoW-8@H_qWU1%?(=R-2E;&w@MwneJg789nB`nNMi=2$Dxia%7UGEEcc^~ z2)AXo+Ef#f3D8flIskQ{46}4)weI$se2Ts<H{;h&G_UF<v6Nra0@#nm`degLit%RZ zDh1MDgswV^*a&lf38ABY#|IaOWg_@7ITKW6gqVi5-<=>0!-Un$ss%nw2nq^qL8NL_ zyga}0#4tuWo$JYyLTA;=w|!A;>Gp_R|3fVnLQDWKHPUFBPs^KN>br9x7O3d&lUvs< zT5&AuN$r($`zCQ&iulesiYafnbyIaoVh<oowBd=KNt6F6A@cf{hDYeL(S~taTV+wL z7uJ!X1$*x7q4=b5#>RDn3CRSg7?1S8$LM;(P40z*kmlY&myAX^!?8|Odk^<gscbjV z*5l2Y;kIRAG7y2DiU|OL)+%y0R6o$?<8{Z%$r$#Sm7@}F<9L2rc&Bc+bh#9kdxJhc zRNoX5%%10avV0*T`a#>T4DsJMrFuMUj9{h_7p(2y-jZ%Nvp4~1(9%Tsq?+jk`aHQF zzO0lBI3m2{?S+((YNuB_uW8RH<gLO>iWc=ZJo4#WCw4=R28{=bn>JqjK=evs%LH9F zNpbdR(ol+D-r9DDJAAUJ@^?GpDfrG$PWre<-c4pf)Sa>!X55!3LXtepRZ{cFGxe4| zGbHf9G_~j}c7?}XMrtd4+zLe{M@#bm04pMC5WsbHVT*u1yWKvX=ViA&%G}4X7L}j< z2n$_ZvV=>GPw_EEI@?rKCr$}`g_M}DrWXxKF`&q<*7#N2>-AodPDi#jh>mqT^DU`6 z;n9Nd-`anpmGc8_u@@qR!8?{}<SZ{YDl;T!8|LL+xpc~uQ5#o!UpsV$#hqBt8V`^G z9MeS|&%%HI=P4@<{M-Ez_peZWtrcl$`k=%{kP17|7j>21_XhvpjQP4qD|vfc_}HJM zBh1c&RgTKPPPcL{S5SDIE=XNGxwa2<tz>IBa9%N^>m3KfYe0tjAo?KM57vBS!psQ_ zBEsoN@TZm!NN?F+Y@P3n>7&0Io}upyO<|gt+~u?mqn>s#GN874{h^>jv`YzMu-;_# z-O1T2P4C8XP4mRt*Olc=U&4N7E|RDih>kmn_Q#&8V>3Q}B@huXIL8z;oC&f%fmF)9 zGU?9QH=h=eck&$a_5N{`8gNl+k%*AaA5IX_qNnw=#%bs;$St53X6`3xHnS~;qb_oq z^koC7NIjR!T$8N2^P=vLHVed_ge0Dne`+2oL{ODopN84zUcFAB*6^8aNR7olQEp>M zYHqBg4bQ!-<^MvgBsHP&&%~pE_YR6P+D3`eEl4$qxAi;#`!y~x_xHn$BmS5_{|(yN z-w!oxYbgNvSw`@Vt~hWEkrW=Gr86@%S;X?N_q$$?vg!AtJxMKm3Qe4`S{6*{_!!)i z9Fr)X)-qRuwznQsZT+3&>*IT{9nJ9kaOiGC7+BAP)>4^A0?vJ@z6QsvE(~M%#^sMT z!kCjIOPjV@admnUPv?g^6f=dcEmxz|^cvJJbn`jhw_G=X`<C!(H#~Zi*YPFUvd%yx zI}_u!P!kcMX$|A^SK#Ru9ez(>t{a`89L~6S(;D3rMm|A1AZ*vZ`DG8w?Y+O1#8yPT zZ)sjh_ST1Zr}1AeCFC^>qN!H82T4a{HfxI|;Qa@->i-c9Z8C8x6TjwI{%fDSH?H!_ z6!<{1-<@)Jm-9pQg+VYgvG97B(K7P4j@#j8nGr;GlDY^A`QD^dHEd!ho+NlSllY5} zXa$jbqO-EB!hfaNO)AVo{p-z2jc%#Mg3H@vSCh7GDpSuFdDzM>he!x_?mYFb8IAlq zFHJ56<OPgB?wRwU;=?}+5gY-OOv9~W?WrTF$tfD!c*+FBv8Xi4-!ww`FV_~o%BhHu z@aNfS8PuV`@Tkp|Ev=N%lF*1T@DKdJ`0UhCgUGRJ@g2X$n`IaTfqf3G2o%XjbCLtP z)PO9CDQ7KMZc8`OdFG0aGZO9=A=+1PkTyiCQLg}p#c!)up>)u7?pCG~HC@Fw(YK^; z*AvnV5@GdF(7BVbqi-Hi*cxX0NOP^+$ko|ADSTRu!0)t-Vs2MQDJ4<V_p5?#e(;=- zo>qLShVfqd7z46&)5eOx`)y~XLoPp|KMGmX-PYaJuf9?YW2X1M8M$Ss&m-#`+^Ool zJTSnk;eM3^e_fJe=Jrj*vU4XsDTzEE_>MUeYjL?yhQ=j?(UkN(do8kG?p5gW0x7v# zFNc3AAJdnpc^+mp8v9vR^@sgScda$&Y=JE-4<C&xtG8jFTVau!DEvVaG!vCIJ6R<g z&7il;+>W9EyCqDrc9?jcVlMiqyLpjPFD4N;EA13yE~$zpdp^7Qy<S5W`Ga*o$R7^L zP&<~rKDxQBiBLC85zi#973TUQjQlSS)bdlAW5jFUIQ=@kt<he1Kkib}@4vsZ43h)_ zVmFzWfI0Rd3P%Of34TRTk)DuA55lkZ8!x@>psF(m6Q2W8!w3GXEE>O^@vCvpz;Dz* z`*-xY#(lnfMG%IvnO5*3Iei+1ixzLla{Fm_#Z=W?1IfmY21T5L9R-A6^pWzqdXTHq z8SF3~Fq$mOdmo*F3f6*~ax!H{`uF|RwT@6%znjHhrxzVho%#qOuAVP|-V9Hz`cG+b z$&MoitH3#(7g?PnAM^~FH?n$SzW=_3C2n)C_aZ=e$}P=Fvgwi`9{?|{R_zG)(}F$M z=ge}c&4haF8+$jgnk1)86NUB@XhxVU9D3<2dx~H%QY@*OMiPw&xK+$5ZVBS~9F;Vg zXLmFhv0JzzpY&{++5)yl4lnl*#g6JUNS18ZmxbG<%hdzj`%}~bwmwI4deTkhJ~M1W zc@h*@$_n$Yp09NLX>zd5W%dJpLIqgb*nOGR-xM)wB8}&Z?cNE8?CwCHekwp4N*z<R z5(N$dz5WL{YGN~QY@<GH+xMTxLa_tm#Tqp@OS!VW%$mRMrWT<Px+rRWUkvG<>s`Cy znEOGbvAlDn@#HvZ3@6*borF)nD@788$TZuJ_SO5Z<-VLFF2P$%(rAh&&w9qfwHa8G z=|PB#loD>UX|*Io&u%x<4@BY%f7<fxF-Q?OqBvFEbrP2lTh3iA-sOpje`n;n!Ymfw z%IQrDV>a$2ggbIk)h*gTwbX*1o!}tmif4qaT8+SyYkIcF@H<<T^qCi{Ro=5YJv}6w ztYtVz*sb^8kb)@p%|9hnJ9C`#QsA2}JWAWutb}wN@;ew<C5-Yn%MFjh@PlBunIg4J z!ctQ=HFz#eCsa&Hbp#*at%qQeUM#jMDm>xD4d|?QTnQ!*YPb4@mED$c^|k{s@2TXZ zwynkN^J+zTf`u^tBNudw+)9FVUY%_>l-ByVDm+7lXaE!%o<w(;759r*EDi6+6y7m6 z<*X6+czkrO1FE3rr=G#El3KU>;->bhqpgMw5f4bu%01^MhM)j%sKPE{?%WB_Lpkp0 zIAYa6<eWeJ@ezr7Q>46AO-H@%RT~2FkQ$0@bmDz1j_}#|MEUA`JdM_|Ixc!cgtWw& z@txxCgOL_qhPI&M17g)u$t--xd&87p!fQA3otTi=hoRL3MIV*WRlHWJ(9*o$N;L~z z&O1JVE!1ccyzdwi%)p2Gxs`5ml1B1|YSQM|{7nDd8)r@N2ELZ4J62;(^lWC+t$uaX z$thUQJ9!?vpNR1%MW>%DMVL2-BzN>vsCyRfPvN4QxmVmC2XxIGPX4PeK?hn5M1K5U zdDy{H7vPR1W%LP{7R0hEY^AEzj{9wfvG5dzp<cg-ec2u0^6BYwl>k7$oP0)T$`_jA zI43hq6@2+OyaDnaWia8N$i$1vBe`;Esm@~!j$<R;M=_?Oe+ktT^5DQ3j^{eo*8b3t zN)XZ=h*Lvoyy(unjP^1<C#VJ>n;h|8QBY6qGaaa$ikE4IA7!enc12lm^_GyU<y_|d z0w7I1R!5tMBTx7I84=mvy1*8}BI`2}VPHIpO0}Lh5+n(7Kone&rrLh(v;i(tFT#>> z9?1L`J&zSPa4N%%a4$ny1KVGV+sD+G`kCHv?cjNStse6~4)ra{0ATBE%v)JI0s~WI z*EihCxnbBFUi#kDD8`txr{@D*+>k|oK*e+8V-YPFULuq+(5~ek1I<Jh5)`cAwnj`e zZ}t--v5zKe1>eL0Qjv&I3$4#3=FG6Gl)0O#-qh|`bY5Yy{@G&a>j(CdN<<9dl&+y8 zlM?Edh~7lv&2}@<;Hz(wJe`ZVTychDF3z@?$EF5nCwE3H&XkR<Wx|wqg*~!SH}&C( zdVa}NnSX(Po>ImqsknYR@4U%Ez%lp@SDcvI_W{>pxqk8`;NuaME_q)rCHRkHw{9x* zbL)#3K4BRn-=5n?BmoBTK%-tVHtN_>+N6Q@!OprS5_NFp%9sFmJGd~7oq%HKCi&8L zyywp!T30U1T)U(EWse>DBW4vx0ED6j3r;U{$RX2)UcTSyjf5*JonLGZPTf?+Ao!|s zw=pv`30GF6k=o<fP|L2XgCe3(j}rBf{c@89_Iu+G{psE9h1={YufHmdIBb0mZ8)G{ z8l+}iWkJJk=u*l(RWlDuUJsE3^~*;aJDLDP@oQxZ%vsatNj6D07@l0w&e;F)(t99N z1FK8ftJgCU>09N-<ud1t>`kr!2fh;*uS+^&S&wagd4lDY2e+1^Y4tjCXUKh_%+k(s z*r;zu6R5vkf;7pi<xBHL#_baiXIH)erFAKb2M~H;5Nn$e;-Fvw$n+F6+oRH*YRwh` z6zyK0>0?*oj+;``ua<YsvVZu<#?F{uqn>-}81|m`$v{IniWiWw$&q&&Zx=nqwOq*e zWk4IX9AK>pykaHZ4zDFtvgxhm#J4A&5G9s2IY%uigy?)dY>Vx~>6?Qe-5LmiWGkI| z0)zFlRIi~hsa;9>XO&J<N6*tnq2WupUuY(B|44jGdaH5;;-(dXQD2JJ5RA)>W*jS` zEQVvb1_)?oeUZgEtvrMO3!{u-_~84OleaZ9^hzV0_A?Nzn`%$P(GpiOk{m0BO6uyQ ztLQ=hIa%IIx;PZTE2G4A^eC2_IHi@3A|Hp@KPB_${97*<CpM-rgB<Slc&9Kj%_O{p z_gU+-0IyN~zNf`dBk#>>*RD#@-^16n(-6FXGSvXXe7_BwY<-LcH`J1NAkm){f(K0v z^9QSV2XQi|ZL0km?gGf?aeh2}|MwBz{cL^jh4NOgb&6;m<i5kTSf@B96#Z7R<8J;| zPeYIF%L%THu)XhrA3$LT)gi<GJstj#7ze5M|L5cCoaNV`yc1jm`Fs{-kx8(mYaP=+ zz2|oH=i>U&UB`r2h23G^O`B&|=mNxlFgh-(OXLs#F~`65V23I5NwV}tXY2c?yE&3! zcDh-F64ThqpED(u3MUP^YQYUUJ2uoNF$fjqtvoTU3;eaL#khe@ocx-uv>#4=W>O@v zui~Zef*y|AX}`T+9?c!EO5K3LifB+I_)l{ye@-@IEwa`>$#;kTNibvFKDvNymwG8I zP|#bX9TY{rt(=7Ig?yyHH%ZGW?i@%22?$>HTy_D|QR(RY<-q|ezaLFtW~wIxrT+mU z9MY@M4?g<IiMUk`Xp*Y;s${B2VEP1)H1RYZY0f6sO%B;|O#-47HcryrVZZ4<?B|W& zzQBu>*bO@BUT*H3$`tm*k97XJxl%We*!tWA)P(GCbSbX5lUn3Hl>Z+|*Wn2D|Nlus zL?q*5W+XE!n?q$}Wt9-JW$*1MDtmA4BwNTlvXXN4;bfhCxGv7+4wrTP-hF@n!R!5c zzu&Ld<MDhxo{xuY)Oa)#@u+rY5{Uo4zw${3tGv~GIP|YeQDdk>@sSG`&;6MaD!x0< zd9Gqn?vX@y>j@y19;^FHLDL61UBQ;QCU(EF(o3QL0PR8Zy}hUTOgGr?iGYwJoJ8$M zN!~Z%Hm~IK@RhOIv*IA=ass;rJ7GOcvqBH2mj4B!5S&0bx3%5X_=ZoPS%qeN8!Cgs z3ooZ=e`R6-bq@?Ff7c08T_`~afm~BNpK3FjR8gLiEnzGwnuDW?IuAB&oxl3e_cy^F z>CNv+C+_p%9-Q~PfPqeeC--SYXoX~^wd5s(V$0OZWlF?Sp^kkM$0Yc|(zFK@7#NXw zrGlhvkG73C7^#OnWtSbczLIs_pPUw-S`y)ZgkAlpd%3xB?g`B6;Fj%8K)$cA>=LQ! z;azQ`uaDk#-tz;AwMuryzsbJfzL6^?*G~Y3bmwcR+XqTo$Jc#8{ru=%XvAk$En4Be z#auihAC8_seZ2N!PrQBL(|tGJyp{2dudR$>M?h`VQtyZ>KO4t3XYa!m0+oH-i9ff; z6m|Q2z4Lvk?_xPRgRct@JWl;@Y=}+YEZMTi$t}m}D&1~34Eg&bO3$uZ-KlXU{Fhsv zz6yC`TS$>F|1U*d+mz%!y)9S3Uy2an%Wn}rGN-3Mx(nnBLH-x{zFt;fI6Uuz?@x`= z$RB#_!-XG`Ky6ZcbUFUl$)u<VGV9#uBc2f-uZpC_>q7zyTr7>Ue<|`SRYrF_BZEQC z#B{+4DM}wOV%zx4s^dPVeS6`ROBfA%;x2TiERP+$dQmZu{g;CG0_fh}Z8APQeJP%8 zV`C7?9CmlrjEnc#WvY`RBZaxJ5}%$BWzbLfhlBY>Ab4d9;;4Z*zTNs{Ya;bMSZlu0 z8ge0NLyB;Ck#aINwC06A->K~KimeCx_ON9>d~ch(07xdDgHDfFO-+tX1+{Vp00R*T zxg)q8sM0$7an`1Y)nOh~EZh`&7xebz`;!Ehcl9IUPNC=FFao?E*=ymGTkzJ(Kz7*F zJ7(^EnACdcE@IoTV^!*AW1~%|Qd}2<%)C0Vu2x<7e91emE!tNo)<e*+IVfl5y8G%t z4)BP44`VPL{uhx*N|@C2FwaQ4VF{};5%@I__k>yoB(CzxP%M7?CF_jFa|ft{|4WJ# z{bBJYveKtt>H!$hbXXrE^K4O*U~9rNCVQy^pEBeZ^H}*5@SEGqKe~us*J8@aNX<-c zz94ZR`a!v71k|{U(2k#qxSvMP4=jHgHuYPmfoC`Qd44LiW_P|iLSG_p8}=w>5VF^K zt{VL^8+LRNL!re3p~*Xatpl&PrGE`S&quB^(pF4#l-1per(tOl{sLD6Ltb8#e!EjF zjQla+`{%?#!^8`HN~&8*xw<Emv~GJzpO9Y)-6NgGuyz$k{H3s;FKE>DmTw;Vy0b<K zq}*O+8-bIW=R1{Z<^Oyzn2*$BJI@({Q%WmgcFz0%YuI|US0~~+@+B5bbEb45=HB3( z=EU{<UM3YDny;~<JO8`dIU}BJmzMCYQzX-i{VnMb_$SQlzdkVqVyQkTtTKlWA8meI z7!#8EZ`Z)>v9W7rn4O9<P;2&S4`xmBZg8-9<HAt{OeG(pL0ePBJD*N(x=7T;HGEU% zll+=t0B(mX<NqM@?wsdmiDw5(4R)34iGg~vvEQ}4kRL~dQ+EcLRuqgui*W2y7AoOI zh~7jUTEo=#%8-WLibpT?lzji4A$lE=e3~F16^5gcbC61Xxc9wULRD$GqwFp2H@rRE z!1&t4UNzUP4uw%B_Nzc1UUvx-W~rj|nHOZix_HQuwwpeyBt8HA;SpKPKsRP%3en>M zdl1iMDc$I-Gr8ZdKoe-L!^ZX0Lt?&wYyeT@1ys9@kv{@NlCai#t5Hlx5_E9;{QgJH z40N}BZqHtdKS}t&+k5N;dTa8vwz6#hY1{HlJ|8yRzDtCIgdv>2>}<<B+<S8$(x>b4 zzwP|7bA@2O^~Ec@CRc~@7<Y6oD$thmjqRR0{QSHQ4ekJ+UevA*ytgJWdoXwPWbdhJ zZd}=yOF8e)b^hhIwtT0E6Qbm2wJc5;yEu1KSB6_J%(7X1TxF(z$q6_BufWIFcK^(S zB>T#cH*FF>jfX5T93YnA*c6M^r@VRBRLGlChGo5*B}~d|S7Z?5l!*D?^(wZce8ncA zr&-HXeCH9W8MVkAPNfUgS<nJZIP3n74Nf^stwjxSY+_Q4wkdLcH0Qx|tkf<jf`iy8 z5@KxE!Jv(bJQ(AvG0d~E?UA74aN84^Ea1ZQ+(x5**S6R5a4hu99bbPoNkJ<R>&D5w zPvMl3l(5BifXlkuvGtb%J{XvO9Eg}dsIvK(EM1E6?CmFfA$Fe}?jqZtN*+0+{P~b0 z6o)1%ZR)6115;D#b>EW*UnYv=NiC*NrpdI@%wm+uxlT`C2@_mk!8%d-Fs;`R4fFJ| zN+E?>^=7#^=f^DF^Sr*uY7;=hob`!$c>?puMMs7z{m}BP7H)3>9{TY4RoFf&Le)B| z_c~@CnnS)RpEBb0Df!YD#q((Ivx~4vAl>_o-tDvvtMT~)9+lIBwOwsaD!gHC1{$>c z)*Qc!II4gphh^}eX~p1%1`$m_5Q5Ek-aOZK`;BYg3b<frfI+^h+2ypK2)}H}s_~W~ zrIlGU%w*Tnk3NzstIyDBJos{Z7yo76E;aD!FJ<QGak=O69Dq^NeWAPC-!&8qP_J6s zoH25*U#%_zTW}{yH-zvov&%u&nM#QK7ONL2;Bo#ge{W_%mr79}m?D=i_85+~G%eQ> zqJ6(OjM9)cr-98uEYYR<1uF_l>9ruluC`9|BcBC^TEybJEeveq@Pl`}wwDyfVfwlH zu=%L+7n2v+WPiiFDL4sp=Va%)lKnqd;l_{O8vG^=hY%uhNH76=;o;_*B;$K5rvMbg z`K->!D<H<++N!x&^TNB5E>{g6Jo-yPe|#>A^_A}!w_6r)D-2*<Ed^v`r@y{+NVK}r zXGfu8eqH;<WLJG&Bne;CEmqwJIy~^!gZ?$X3!fjhOYZDbwLCd^XiK)#YV|(u9P5<n zR6Ja8(sGLvXcoLxzY-Dn<Uf<PE-{UvE;Kg{U$x2Z<GzBK=X5LqlrKK}^+ppRv$Mq! zX`6C1pI-=%Ss#$Dv(T8BOy&`O+|)~_m6j7|l$o&7qwYyyL*e3?j^gB?F&8S9ks`r` z&!?81K%Hv)fZF&F_weiHpv$c`kCa<e3JlepJW6nTz|c=tJopBkfQI`M>JNexk%3Pt zc%!Zf*q&Tvyw<6v*r!B(UMI(p<@G$30=wh=#eWw_qEmhwz*+h1Zpev%Os6CB)FB#K z6x3WBxI_6;m6h{csaoH+#VFR7BK<J7zcIS6x3;b^`zFQm0h04P68X6!ZYq7a%Tu@D z`xh^tWhJaR_S5L^M-4v08{v)`#=Ua8`V0@fR!!R32EjFCk}-G~XDs{Zj8)vaQCTn+ zK#S)^TvK!s=LOE0v@9}Sv`N32{@Jl=MI;|rd4Q)?qH5&QRQyk-<+I=^HZ7+{DL{=2 z0M!es#d)Faiq6$5f}z#wOvr<Zwpsa`4K7*CLal9@(4!AotIPj@YQ2I&Ghdcc-tQaa z_Ss8HSj5TB`@B`#m>t)A=+RX<*cxDxWuW%TBR<pM`1%#KN+rbE^FC+-`z7TD0fVw9 z-dp<Q53ZMpq-gb;XVv<n;}w_w=)s(MWAJ6Q+wMJWskvG&($$Vc&H$xGVX5F9$>a^a z8*zUr(!ti(>4Sq=JrljzP|&_kp))_w<edZyn-=(`(eAE-^_$osAkMC$Wt6~ip4Y|i z=4%h{HSFHTAf%a2woBaB03iJAQs`~HJe?bZic2|urbCpVbj;)7=C)4#PpHoLyH~;8 zfbodU$C{`@o(4i7(f<#?<MM$435DPDl)ydQUJ@gJ>?Dw<T0>D3mUJ83!-)401?DTS zI?%D&Jz+Zit_Jm?Ir%Pb(n003hNbf01frDjGlkd6+g{9Rjz@f@5yz9GJx=3<`xX#I zw-xz$LsMe7r*DoM1b3COaF^(;yal|wv&ynbu@_M8aI2x{GjOIR%;wFLP`0zDT*E{7 z<L=-}Kd$g7S7C>@BdC%(#nodp-_~3Zi5iiANAz_G=3e6ih3Oo&U4@O;QZ#%3Nh{y= z<;IERWNkV5(C{AKy>&0ZN@RsLwSfxQP)UxIq5$pHXV-O)^AOaZK#U&L)kTU8h#V6u z&9i=hsHv>V?t@|+`11dlBg?G6{C;c7^_-(5C0tAYGC<V?(_dx?DNHByd;>{Q&_m_s zmB@W<t@>RL4BSc>xMEenFo2dl&a+6()29Z~iLwG=C&09d!R!m6ywPsl9@0Zin!@d{ z8mlif@2U;;w7<)daj4AOk16_aZ~3tfZLnkshhjkAAK(;xIRq7do}FlvNVSi-oTiK; zKV(n)`gx&E@>>9{q=+IzIPFs(FlZ8zh7N9h&6-N6qbh+J`hUNF<B`kN;VCz=4evi( zT#bIpAKZLGp1e!He$t7^#Y4c=j|^Qr8#MMWKPfac>=Mw_5+SJ9(Xnk>v3@QDD(+Ue zk@H_iTUFXH9jDv-Mty-Wo_@Z{Cst2>g=FHXTQa}Vl#@RIp)7Pisk{v&e~B@*`Nin0 z^D;G9<<U~giPGN&qo+i!{rLy4EX-`-!P4&DbEp&_JDF3aO159fyoBYrp7b`z0&t`@ zMJQepFJKAP4euL$yd@?T1rUgIaxZ8PsmswN^lo9@WR0+kI;>6(7j(7S^n4HPVONbl zJ0j;QE)<qMv-{b|B`}<Z?vPu<t|nJp4hhM&9XIs9sPO)^#RM-hsQ;0@otTsYuH)fa z0}k*Xde$xl37HK_XJt4z%(p?T&HO#AXwg9eJoo9Wzw8vqqUIPA%Jkw)k>;ehz&9wP z-Df~@B<`rjo_rD-xE<^=+4Sg{KRcVJUc}-~W)T$M0wmVlR}eYMgj4^u^CSn!LP}VV zz&bN&tsiq@-XPg1WtEfL$idW!;o$87L_ltf3!}EnTv6#qBB}jjyMKNZT0cWEf0+~H z+hzU#30<!%Dvj^&q$3m-IS8!Iictr^2m7lIB0O`uXq7dc#KrvPkcza-Xw1Zy-e6yJ zU(HoXf&qAC`8oDoxDv44kuk0!WhgzuZBNS!husGcm(NcbHk7$%CqL0|JETv$%Q!Qb zO>}DFn`y&EsZFQ1>9CzxIjFs32Y{fAx{A5i0)LubBk6oG@}W=9#f&<+^w-hE;OaMi zPNb&SZ~s3byK}ikB2)Dr+&iZ96ju_-PG|XVDLYB%wcj7Zn<O`VTMR_<0Le5RKx9#A zJ5~)#a|Tc13bt$&scCpu7j{?cI#Mr<Ue?Qx0ykR4p~wg@;bpeRo9~fak?_F@-|dG3 zY0>N3;NG}lG|kPr@>wjN;c?~QJ5(@`)}jkiR697rnF@al(bDg^aU;bB9LhJ40<AXw zaigMTWeij>S6AD;w?gH>lnt}5G<*7sO5%k~$4{SYyWTrLhNfPFA|>I#6<@9r<=(vo z^-Rm~+IZXe&k`b>-soi&hf(dyc%8I~ogDn+=DmtnGlJZC;Fo5LiV{lp$APcU&wf<R zeQ8@rknnYMuVj(GI(RGdb4ny1v8V(tKl(&3fE5fM;Linal=)Q%_k*a}Y@F)Jbt<Sh zs-FN@)an&&h6{OqEw&d}fcB1@$Uq0HBc#4=c;ApK5X@Pn=KNL?qeiy0<j>Q)FIBdM zxzJUzj{(5o(T_o2)m4qqMJc7|ZY?a_w`s%FZgkA2SvWEI8o7tTXBQ4APd#4oL=%Ro zl-s;}9+bSs!vX4b-z6xsqKWOhe{PBNB&c^6|6negK7p{<bY<0<K11bT?Y!vOhf-_l zyLQImu#uC9s7}NNvYj{9#G^~H+LWS8SXwxM(vE2Yf%#+U8CK<SwI#fo@0Zo@zH=ag zYqypsR7&tO!HV$(4Rt!nAC5eznNxjDZjJr~G==tPui+q|;fg$<P;o?{PnnhMu&p=p z>i8ydnmcf99-{Q`TtK2&b2uv%s(G%v9c&iMstmJ-cXI%?gY&#Vl<7#75m&>K*h+Cz zelwzp$7HU+$KW>hmiV=@uT2O)THq9JPwP9h%CQpC(F%C9@$7Uce9P_pK%Z6e243;O z))wmYFGXt#nMd@lu++K`p9|`TE?0m4$vuU>SV3{>rTIw^HjR<}-;pqH`aFwtRfJa) zg@W3JRiAWkTyL}D#~?u8apY*xyAG&3Z#ZLS9$_Mg=>S;R`qA)p@Y=_Wuk#<bZ<&t| zHZ{ZT0LP=E0XwVP&M<aba}B2q1qNPCKw{M-{*KjVB(UcubwhIKAsmKmm&|G6&(IZ( zmjZ=UbDbUlSc&(`vroZEX35t(zy77D^|^FL{P%elOeedEtE03BKWehD6VSjKH6?ys zAM$<&pydn2$PhpaSQyOxN;}Rviur8MEtD@E`MV;oOsKB>ML|3jU$~C{iJ8sGBjHQb z8H&&J2JCvK+vCeb<qoC-$?{s)T{Ba<X+gihz4P1TTx%<NR)!kFwp;=aS1J^GvRNpf zkRfO*8w;K#CXk`z&sjUZGNx>(J(Lbdnj-o2c~NSbApMpP=E7A4sWlb(F%KCv?mc2x z6Olf6eqcJf$E9I6m{#^9A^44<Ed5~GIU2b7vLAm`a`;Yy?nlfR(i$4B!&dk8%ejT# zee<P!3%E8_qo3H_%epP`fSNr)kn5rwoNaktZK>-b_A%y(;A@N0DV9;mtxgYF{^7Hv zF8H>=z1Hy9(S8@hK(RpBZ@yd!7HU=Me2C`R!X)?+<OWZ7qH~5F<zEU36V-mGaeu=7 z5OROhH!01$_uh*e-*&sn8ngpEN&^^RTMe0qTRzY&p&6KRmZ|?zxIsrh4sW{3epSna z{yDOH`x|`{QrS~r#4UOOJvK{DSL7h71Wtjo%_qd;o~-X+q7t`x1~0e+Gzz%`FFXvJ zhqtdLJAzWL=pUoc4<606497f2AY>CJX@F={pYqiZ6wT7)vNx4R3F*|dGG6zF56p${ zjwHD!*sjE>33%^WbL^{xaDia+5icftYZD>bM1wTo?1x80dGM#?g~U5J@TwuUOTgAu z)Zy=mw^5wi#k_VJfc+n{k%wrSevtspEnxgi?v{tCvE!J(lngYY{c;9M&-CNmN$mE! z%g~s&)sLQfTwTiH<lu(w>yq+I&isv}dp?K_*&nC-`gm$9IUo@wJa-8SCrSW@0zO)_ z<vuNxGz~wFVh9&ZUA^cZt|<8U^m;#+&|Mh*7TUL+i=o=nwj(ehordpGk+1Yeckd#G zl<;^buyLdt&@MOSvPsC)&D#hCH!k_711SeF<y>O&_T4YGGGb0iKm=`%j7`h^tD|&? z!W3p40H>?nAK0t(FD0Vg0Xi^y-A2r&twCwn_vk_NKG1E3KB9gxcN)F*k?oQz?-tXJ zhmeVsiPR<zChj!KpTSgJsiKd0%8-Ejt?^SRM!nXpC+W8?U7Ll=iCv5=JiXxH&ve6p z(7Tb?*7UZ5w6)K5F}}xPM}TNf%QdS&`@I((CHE1U2Yg{MAAeskUc(PXipAppn6(Vg z)wgVv0Dr$3W5^K(!1(Mpx;ZMuve?Hte}z?fo1q;>)Sq&ES6?p@)_B?G2IM6pdR088 zH&fYWbu9gy`Mx6|P>lRHEf_}7R~c(A+{mgA+Rr(3kOL}1vI<{(SN0JH5s}C&Ux}E5 zp6`1pVZ4W`iB_IMRm`{2`JqSg1Tf;TYOI<2a={qfOvZfVzaD!2F8XY8^;sX#qMv)4 zAW{(iPV&#sv2=JlyOw8eW`9_}vKpa(rZS86F&n#!0rAtV^IBd3dPg;};CyZ;fM0xA zP635V=Pz?_#(6QOe7Zsyk|XtctY3;3IDz6IGPwI+Vn!Qb)QP@F_hEKmM1$UxT8g45 zz_9!p<?u_n1I%7TZXt6{x;-6GDQ(L8IsGK&p@GThy5Lv38FZ3M3t)tHC!BB!^zchs z%Jb<5AF&Jat&-as*~C6Q;fld`vL3eQXmaaz>2Lhm$%}l!%V2f_>DGM&@GSjH`?CsQ zq-;b?o2vDOqr&pc<)n~e!T0EssViUZj|M`IIDo3V$zKXfgRT4$y6Y(a*+vlW>>@vt zQVNJ;AfKBr!X}QH?$&lshU%S3{AliWq5!kR{nzAAekLd691@J#pPAS??|#<KngOZi z2PCd)LA5^xy4RLa<BqPYx=;9trxqFAcG0LenXR#0pt;syZ<X!ap0D=1-*JU7r-^X| z{dgT)>wkTJUHZFt!o={*WAZa0UWi?oFR&&fzs6><o)|sx5%bc)-+<%N+)FznkN<un zSv0~GqX+Tx4H`q_olP{aMRqEBd)ev^!i0!@^s^#ajD>P1T;PG)6+z%m{E8`dTOF)J zb4P5=wk)-OdmHkCr(7JkBE&f4G#FfwX`Msh{1aA6LjmuV9f$M{xOLE{M@bC=dknJG zjULnd?xU>h5Er<KFLBp6!|QRmiE0Yvyf5(dmjoUUfB2-%TM2^|dC(=Qq0_dQFq*H$ zs$*>0tT5O=GY<veszR_=)3MvnIx>-IYt}T;S9Dqx_v2F*fy>AFx5pdlu4h6Efh7N; z0Cu0p86Zp<&d8^N4+`zo(j4?Ks`iPHCI@Y4Be}a?q}d*mD(}?7FpM_kr;(4Dd*+04 zzD$k>A6Ia(+~-a~@n=lLkxVEeiKek<A#{3(-y!#eY!>|}VL+f@sT>Y<p7e0#*!5wD zh{#14UuZQS5ast`X>)X|!hP!t#o5>-e(aq1NS4)c*@@dA6H4lDP!M()h-y^^4W{78 z;4SkcoZpb~+Y6KGGtkT%GwlJ^ta0rdqHrDb$*cnv?*c|WW}So2IxNH^Syb9N1pOQL zC?)G*>oD{AB2nhlj3WzWi&9E*bP{sDqfEBIdN-C?<f0ciob@=I&koFcbQCF+yU`bJ zwvnNKDQ*}0Gn;e2A&ujY17h$d`Ar)$x$qaCzKh=%e@B(tCCehKLbUv<S_(|-yssUU zOH?p)M4Y$KG_}ieaD_ZiapDV0aa)RGpt~NIyu#{raNR6GJ&+t>Ug1D^-8zD<Bc9h< zgL2BN&i_(y@Tk{$G_WnbV3no+n6j+{W;~>%gauS)Dl$0tA5|oY?obOlZdf#5zL?%M zui(lZ`MmH2T)S^V@`rvc_VvMw(}^eyx|zv9k0T#nmJ~u!H-|V>tLkq;L+K^T3?b&; z8@g%{2L=Ig?4zb%K)YYgR@X2yIf<8dW9M~wBFH>HH3e<tP5!eb|5SUCrzw}a7j{%_ zy)?RM&MM$y*TQmT8liMgf`w!MiN^~?VIAu3z_`~067~>h<Y74Es;f{iLeLr__uus? z1^uU~B_YPXT^#6EaF7y-IX|ief7)W<Xp$P|;0uykXIl5TT-m^Ehje8+C1{ZB<N$$K z_mv9Cf&t-bltTK^7AEv(M9}%2(4W-L&OyOGt3ik@e(ulfXoCFk*N^5pd7^j6($&_P z=XWr~1`*wB$2mQUNgu8(^9=l@Fb7luOSSScK6x9Bb1Zbet-Nxxd%J&v-mAtv^cK!= zqyc(RVY~|DXz=OmB986elG`9=C)wBJfAzs?k0&k?jglQ{a4vv#o!p~emRge-;&?sY zwcQV#(^3`Me3Bg|qUjooWQ!K<T_WoejlVhKWu_8+fCw5-c^Z6=YY6lP13shbm62uD zarpi;MD^5c{RMl-rpdB;t)6%ZOW%r|L2jm#_A51B=OfJN<6G%Be3pz6FU&?<{N6@o zgo~+s&Hyl;fxs<7K8q9Cn(;{J#v>R#@!k{wzQZT+n4=0=wl}`5ss)6&uAEF9szFmw zO5=VvPjuaPlws)pHCjn1|G^p{m9Menpv-#Ai%FSEC>y-a&8Yx2G&Od27P<3r@a#)) zdBNM2i8Lu$q|=t464f~n6JI=@+BmsQ7`k*CQqPQnEpmL-&F$V<A+^GdS93b%T3~pI zq;+n^;*0%1@RyLv3bDjX;>*(Rn$(YjQP>l+0dl6_pzg)|7<4tlA8L2RCiw)X9S-r! zE<yY3k;5ib_8$@#>|diUOd8d(Y>AQ`T?E|FqUM;)Pu-L6`gfAnNKZ%Y%tu>-s18Y0 zLUQ^J*|s+c20Yyw$KkuExytq%!XNH6u1P3P>_qP!VE>ri5l+I7rEcdMDvg$L;|{S{ zla}Tjq1JB}_fscJM~Q&Kvp>k^L!|erZvnmUS$8Xnr`2E^IDU5QkDBg|!1nhMV6Q3a zZYAr;JThG1HfqkqSP8#c>g(_RE@ttD`cPOfwiQ`}$64ah5aEfPaUZ^4t@FG`YN5zf zP>>kpY3aG<{!027N7;k_5)M1&DR!k?)7{3KYdE=qtYPb!8E2QSgs)4ZmJm5oO0@sc zz){V6B;W)#-4@~}t$V7^;}=NMHMAVw^WulxlT=&^jg?6)CZ3={X`(b{NUQopUwMaH zDUGfyECv)HKJa8=^}BBgx&F883%i+tG!{$UdR?ih&s8f68YYXUZhe7&f=Ixy%$0mj zZ^)BPcFvU&NN=wP{Dr3@^4*IJ-TL==X0i=@K)uN4q+Y-xRw$xO*5>mSJ!Fl^22U5C zwUHtq!e_8{6v?rd#Juhfp?N=~VqTV!+@vrZbKWeub1|`U8kqjbQ2X1wklv}qt2??9 zX|j)wdCpwRP{PZVk_!@LE`^_&$^LrC!N8z{wJSI1WZ1K=Of2Fd{v{S9wg#T^jym1U z?yWP>>I%a4Ag#ZWUW>80!=Sk8jpf7_!;#y5v}itLyD?TxB&1{0nJ-Ki&eN+p?dcmb z_s)v}>^4F;-^2e3Eb*VecQdd4W^1w$562tf)&NyB^mBxR*^d+{$$jDWEceofp9YvA z-TEiGCc6*gWtVlZjsprcEO`9kF5al8XbB(C>93^T+^URO<IRb#QWmg@{1TAdaraIP zH|F<yyFrNo24-mM9$;^0O6&_0JV&=b>nvFO#(zLbT<F-AVW3crh$IKC$gY{cS#g6& zhd;Rfp4i<K<-cp@k+rhbm?pURqYqhvN#8%lKK}A%SMP^5=iNrfu-KE_2&nO3uS7`b zrIr4c6(>z7mhxm-2K5?`ohxH`_Au<VG0RDDjJ+yXBu44Dy7eLVm?Rl5-Qh@x*$-S( z|7^JnJ0j7Er+2i=@v|xEf7p5I6aSZjQRT3ra6NVW>9CzYX(fWs#CQQ`+{3*5(YMC= z79xA=h%^aiaQx_TVB*G6Y;wnmKY`fV-J}ffmCC1i|G<7_LOR{Nc>G;@sih{OT2u8$ zMV8yUWxd6A^F$~3xQSPc5`O7J`>UnM*=YVwKU(`XH0J<f<+wHmakG7i{_Bu;mx=g3 z8q$SP2S4J{`l&)!QOI{j-4pwPM0TIV8v;XXyOuk_vSPz@pI1Q<8vBu8<Jk+NOKo7E zvosT6b#T5&(A!6OLV2rS3<$;AfT+Ey0HXn<=Wwy8wU@yx=Qcgk!U=ycFl|-Kn!W9| zR{t8=9@Ungr6z_Ep>=cY?9>#~U%duU#~FbsK;<1PILGFhE2HypPKI~mtS4~3<Pd>1 zLpo|jsub&bb8uKn-)5BShRDpX)_?1GYU%?^$lG{IN`t>5_eKXURnI|oEZ)5w&~Pxc zcSCdpLcbPBV3Jm>H?l{9PD0#5mP2tRmhKrdx6<YeJg)6jJbCC3qnigt(2S)7+;xvn z3jsEq7ZtUV&VhT{cG#Qr{Yv3>xY{0(*j+p654S~n0S)WF6f7A72Z$vVZ^W58G07;) z)zHVsy8zoliz85dNHd5y)L8k|-r1!q>dF6fm{D&XV67u=-cJ0E&T^DFLkj4%{syDy z9iz*jrN{>_z`<L=sJIeL|D(2P>*e5bY@_ylpRf4XnQX!dbafZ0c6crZX{SCnhaKl& z`Ij};@#$qa>kxpbb)-1DYm6SGq7sQ}Jt1hW=0C1w9k7m92lKjjG1Mo0$kgsIEUW~> z*YGIBv5T?PzsCM<zQp<$tGC)^EdG!|tp3fS$rxmL+||36^}<(n*P3tsH|Q-GZfK7H z1#&E=$B_FgpY>;bui#sHWv}Wxb{yr6f}H&OOni0Aq?5$;`CL9e^vT(%a3U0{#}ooR zw$_Gkavbf2mm3$X#-k{2omKn>3Q0<}mBhS>m}%JF5GdbmZ87blHGS~j)k(=9tlRXE z>8*f=i02=a&w7all>;~06n<NY9FMzNg+|qK4qQX1ce_F?B)g3&nZ%a)Ac|XgM|j*? zyNmmOKPI-e+lJBXuCmU=*^|fs6$gwu$hto`&?P$T?PHe2;}>crUMPeu5z=2NyqGp8 zSZo|VyN2C1&3`LpBDqXDs!Q}>AjqqNVr;lZl-70uOG>Xb)Y4xH7ks~L_zTv%*{P@i znfcx)pFH*@civokwPH>a61q2VE|)$iKU*4a##rPOoo#c)9a%njfgT3dSr{q2<@efC z+Qw+@^SiiQ^|J^}e+2Z5jXv=zHb5zxQzM)MzOHguCRy5x5{4D|XkP4`d!gWlfe>he znSbXOE!OG6HcP?_8ip+HtkvE#$GT^WSo4)mgD32s{EMPaZTi^=J7AZ^j%&raD&Ib* z5(aG}tCmZm_fKltMVnUV<OTRzDx5{^<;K43qC!9n)7M3N3}FqvHJL&UqE>}Ul&vX{ z(t{_ft3;D{g?h0OkCKP1;4sA|E%JQKp*5Dow@8?99NCsvts?5Lz-X$JCgn^$#ymOy zQfLx2rrYqu=2o9br;@`94_NR8SdTWf_!l$y+q-uT*N8&B2B#!kQp4rUv9OGvUj{{K zob-ojXf%535XtwHB^sxLgRTT}ppIV<yhg|elYvEVaK7#I30(*5IRchTn`5fYlQP|D z)r9x@HmBqQT-k7u{O2rneZ%ZT8Lnyyjd1mDbh~xoEvp~x@kGnkV}}y2qe+=H-nP%q zFE$`cgJkv5gq#V|aexw>b11s?Sy5UgW4h|kQ!_cbp^>6>s+2St7~iV8ZY4|J2fZIK zWFsbCb{Oge`sD};x9L**_o5JSE}gx4ZF$U>m`)M4d`&N3O(Knwr1#y<v@YwXcnw8{ z9$viMZ*`KFdtKjh0YFsV)k39RyfGKuPc1Q<_Cf3Woa{F5JeXD_G!Dqob+=!M8;#Z6 zKF*H66Ty3e{UxT0MD4vfT8J+6lV(Ds$>5ePFI2F7g91O3q%)b?E@}c(xV=$-j*jaB zTBcmX+uT2X_*{HtwttM{><baP6*=vR`M47;`Au&ufkD=PC^~X_J9+Hz`ayuR?LOeu zjN%0hU#05ZGnU&T;xya^!P%q;|CBTHH7(}n%S-o`Cd$7}eKMpHQ6oYy?bMru!YVT# zt}Dtkn&4#OspVK+R~E}@nTe1CXc4#vIS@QAOY)`~da_V#gigtRu4af#+MOqqKDXT2 zID=V)o^qy$JXV^Fh<w}-sJ!UOZ>3T$y%lkMGy!CiWnC|_3oR`-X$wMlIl-*cEfWNK z!Wu`2Ly9Nhz_KAZgrT{K4aFE&y278o6b`Ob+fl3TlRCQdOO@;qs^5&ZKc*|h=yFr2 ztE5N7d}6`<xVIcjA%1KEZ^Xk7Yo}Ih7nC~*-~0CTTUCieGN?w7b@5O2l<w)TZOiXR zVj1fI3t<y$i@Y#zOQ1v@_$q`#F74>$oeYWo#cwz&QeUWTAd)ZjL9!=CXF43}zAV?x zB?rx4<8Al&NhQ&^Q`lPBpC|LhPbKsSZ`@(!lEEXx5b&3R3Z%8WyHwEwYbRbCs&giC z#C~1l`nSENp-#a!yVVDEKRKz&LE4^QdCg{|xQAny+xMXxRZ^pb_s_RWE<GP)l?)f_ zc^LR#&DLG+Af9I9_SV_k$ci)3c&&a6QLbAp2+n~$oxzf1tsi+eTq@*w)s+#|g&k5g zKjgH>WOA-6#aT4ppQma%`iKSxk(wCO@8%2y7}N-I`>*wS{fe`G`eqmOQtfU&xhX`$ zt_NM^dG&bM#t`wbL+i_5iiiI$=ngSqN%<QnEs0=%E?Oy=e0<i&I++we=5ao6I7RbW zIG<{if)VHso4*ksK3tS?B=k)-B~rP?gke!UAnSbN(jPrz(ke`H<EQ>9G4k)lo2!mp z)?Kph6m7qL*yjCMS{s<fGG9O$&l@hueN;9<W76bySL@YROBsHvf1bd!zB>D|*e_V6 zJoIvVJP%n0HDlyV7hrHw|9ob-RyO*(FfYVLmrmNgba*`-a7DVvQjMH_?)?Dn0}k?s zEAe#Cl0GdDRuARtfLh<4sP*6x>VZQl<lIX&XH<Rp<T6DB=Hg=cf4ewUdUVMH$8zt6 z?H$i3pF~!|4diZ0XbmmYw;+wWLvEWyxX|b%ReNCF<nZmp%Lf@Y<3kgx3mDEyh^J*2 zbv)pOs5GSDi@>CimEODWQOn<%Pdk;CZniTZ!ns57MtPhMK8!oqb2DR~;zLGgqdisW z{g3Sc6R-V+3E{HNyonF(i`(ocJ>&Zb9+@E(OHr9}`d1k%b-&g}LohN2aHT`M*#qIL zlj9oWI#GRR>cC<u+7ktH^eeL4zzDc4`U0|0CDGCExyGN3cqUuy-x?E18gi#30Ev0@ zJOVeEDe`1_>z9Mo4@{Td<%Ii*+Qe#vs?#0<GLNJ0%Xe9I&7Q2fa7D$+be9C<Ogg)Y zI4(D`4@<^>IUyqK08A$SNhj#HS^)K|Ugp7oi3xJGFr4*wU2*<3PEFINHFjScwOaOn zyq_Tmx}Nm>rRasIs|MBJB)_iGHZb9}ZuKC#ySWc>#_LZ2XkE0D`Z3P*28Kc9--lGk zAN=h;(=znY{A^h};Bh*F;Z7hNz(V`NhhCQcXdhQ_pJ83>r}7Deye$6`1$C3<$dVP| zi#`L`#!~4qTgSVJnw!Bi8E>K3)vT$NC6wf>#<M4*v5N?Ma=UPE-7=HHc;@T$)l>3K zRSMbX?LFzfVjorM?&zxeBdaT&)VG?XP&9W0y-Yfpim~%+GaXKE7NsbJ&w*e`DH&J@ zSj{#2aZ5{g@PFNpIQ0pA6De*fn9z;WnXJB79*5G^k<Uu@QWM|@T>y=RzwGjvv3Ue; zx0wj&7flJdP~Uxe#!#vu!vO7EA^3na!gq(%Uv^}c4Q0t;S$K;5);!bzs*ql3)X*yY zu*&vK_?u~Qss5ZE``ZV<qE#8ULTe?^kg#n}8akGgmVUFI^-!FC#o`x2;vs<?&`f)K zXte~xeK;Y!kfdDj(xztxK1$Ho-y<Qs&_{I<-E8{T+7u18mToU1--f8M#Nbc9TXwal z&25zRKPNOQ%JMRCM}$=C%Qq&nm9Y=op4geJ4V*0^_#X9ES<_BEe+FHazIC}D4DbaW zt;$GBJ04MQnx%IB7VT<`)yT-6y6SYeqeF*hy_aPDi=LJk9}_-gua;++WYc30PY50G zo_T&p1H+HxJ3bTpb7yARap^0>k~0#h5)`p+^b%>pChvAV*A!Dov#Q=azlLlO)SI}w zXuI>9R~SA9-2m0#mMZ!#xxXm3+^Bp$2efd0(!o~|vq7X<LFB$OQhQk*?D81CB{GhO z`r6M_{%pMBMUHsh6VaV$MVa-QN{QnTXEsP*NIhBeAft&faX<r7I^1yWju9>MPgDrC zY7BCo6SIHzLv&x_!TY^$eeQgBi>|D}d1p8AWsIFglU9#B9=Dk?9sT-C@%>^sAR-X^ z;F7Y!?YusV*Ozo+61sUWh|eP0%)ennLtFhNUN8q?I48l3Ij9Niv(XNlinn8yCu*NU zz0r*(wq`p9TDGWnHV-4P4LYuV{W9rs5E<-JY3(Z5Mel~~__XZylk2ivkjRiLt^7Zl za1Bp>P2ZAf7Aw~b4OaJyeh9G5ivuGbWmMjo-d~DMlbI?k?gE_g{J)UU?3b@qY)(Q7 zzhyqUVi1e~A4eWn8&zsWeGHmq?%}^E8;0*_tVA<aTUS;ujoq6`98FG(>V*b!;MV{! zKHF1x>7jSy>vo-m)M{Hl#?TnP2G#Zp@Y74Fxt|9Ex4y{)cY(vtRr}+~+#wD0ox&aQ zMophe*x>t}C*8a&b-uSbf^s~~)|`T(SKUrm%1T$15VkR_I7ZP<FjMZ*W89gWtsAs^ z4OFQpRW5c>bi64TS!0-``PQ@iHyl~UGmL+7rPz;seCj!WZ1iCU0MWO27x0hmj4GbJ zWd2G$(kWW-=Xn9932Z-;YJ58C6WpF-&_;cBhbsirw;xzS&S?sLVWXA*SbOhUop)CX zR8~ig{fKuF@ltYMLNQ#Whe>jT!{bJR2+SYFQ#anMFPUNz+Ga!B%AQYd1&}U8(TR7l z?)Z~>e_>>0<`!+@clg?p${|{r+p<0&j{2~kyNZow__CMQEFjJOrPp|UC}#5Nk{hX+ zdBoR#d#&ASCYWv&SB*4P+eydVc-`uw`#(gkCC?V)ko0@xI13cI?c}-^^^ZtccMQx1 za2e!VPNCgh_;#)B;?Dx2|5B((QrFqGnQ$r^@ze32l^Y)IA~n_$OlsNwixRDK8nw8@ z*Ltz%Pih^C2qM*G*$rpva#|9ut~*4Xf%5!~75y(w{Osunyy%vlVAHgG=dcf_DZ>@L zSs#6OjY#tvByeX-vB@{)NGemdcOd-%%{Z<8*;At~z7>3lh024Zth`nloGMe{4!9nb ziR8vq?`j*}-96QO1c`d*GG(hptK^*F4A3Uj&FeDqznX8cbNwdpCJ^Vb(3km-ZNi<e z)#KT@{GhHw6J7Z362JoZJMvei$FxNG+Flj6)XJ(`e%v1)_(svwe;xa`jFpmekM#xC zz9Rg_qiS!I_t$RumxNT=P6Rm6*XZ%`tO?wqcyolqo9j%3dX2fnvHFvV6K5!Y6t^42 z4|hq&%+Y6TM2fNS{!qTRF}W{Sz)gfpHmaW8IkFzIA5E_eN|XZhSsj2#Ni$nMGmbI_ zC4zckynVfO6&YGPv`xud=_f8JP6zeubEz(OlFj*Fb%ERtar3KC#Oa03TbnU&Zo>Uw zu6vUg&3e65Tg1ajRr4yVhAqhk(Zb5j8+=@PyAa4)u1WP^z;O#L1K5=SFYH%6b~yYW zZ_syt?$p&fBeN|_owIzgcRj)z-E|>$x9RBOmY2onwp_`){oAHK6YtPu{%`;mu9kIn z>ZLEqmpNK;zu{Cq4_vB@G>8l#%ytz-lZ*XvYcu&z^skNfRl;u3oTe3w9Fgju$Brh4 z)JC>YC1-u3<BQA8iilCK*O{c1q<eFqIJsc8!bI5{32bOtN*N2FH~2EN)|<BaBhc99 zy-R?^dB4PW;z`#(YNm>ohs1d@BfRCM>Don}-I9!d@QZ66)_ZRgV!!IqC>VS3E#|}g ze4jf~vN|uI!{u_Z?5a-)S`hiW-a551vCDOKyx(1ksFvb|{fEgdU~ay<`<HS8mRb{# zg6?a73=aS8IqeEdxY}>SZn6#!l{4{VuCcOOR!^#Zh{KX1`94Z5dSm`}oq=c;yN%Xa zr5Pxk)PYVbal2`n6-hCc9B#%ec}BBb0f)f|$8`f0gxDu1a$h$;dQ6Ro=^YElXfi;2 z(Eu1%un@oXFTjnLi$|<!D*9?sUL{Zb`@`SUuR4_}PJ!#*b&~M)FgzsV^YV=|Sj_9L z{Yba=hnvaa+od;5?_Bw!n+Y`sL|TZw#PYVt<hS;cHaoQ8IGjPDjj3(2Y1`*^y(Pj! zury1tYS8YNqnlib<S`#NKS%10JKS-Qm&eK12oHmfZ%Y<yffbeE6Ddx;Ds!7*jo@kR z@EO^}r~$%1l}g~zhoYqra-UXTf~TrMmq}^$=(`F(t|njt@4lPbd-={HMNm+`Nerf4 zzqU>vEOML|deA+LopNew*Er?e0E=6QZs(3gLzRcZcJYr$<o^2DF(*&&TLyoUCwell zNWKD6MK5etq)61Q^uHAwv4R0$7*++n+VGHi%!6@mTVt%#EhcJm0Sm9*we%vgV)i)J zdVGnW-PD};Qr)6`;z!66_j+z0-!^ss^>mah5lYtWwd}ZU&_N!#m`44$P&y^miUb3y zh%ca*tDTGFrckcv1El<lw#W_n&+j>em=3|Vk!R+HSEr)$9ufpo5)01LfC%G2GnE2s z5YA+kpJt41AqFyw|73gLVQ(Dr_(k_+0N<)cSbUC3XZ8B*$DKgz!6P}&Bak_H>z3WA zndNzo3_?5dJpXt>k`==nC#ix}JKclRnBHGzl1m5wA;HicG7*5@C%82Kl9`qJRQ9U7 z!Y!JJMgMs!zR0EIpVW~YOB*Q>;mo5~3_wPGrDvPvS(fh{f3oHOdG>E@=JsEwYh*K9 zL4))6B(Cfm3D~!u#F!Kk@soQ8NbU&p{>OT?_r?hy!7rnSKagHhaBu?yvfA@AT2SSv zT$8S}5OlT4BQHTxUEW&Mr)&LH(an!XIM|J|qKUVtd<`)tmd|d~oCy_qj9N+Ghk-!V zeAb2RhHqBNKX<s6lzgaNXH?n+bZ*Z*=Gl(xL*;JId6$VQBQ#cLnLv9c{cic)JMdMU zf!~5x%a;${r*b2U`ElvU)%qIC0@al7-Kx5P>Nr=Qlljw`;tIaM5q$MQkWHMBCY~v~ zyDIR!E{hGFnD!*Y<Cp0J=T9-a%b_)F4<FL|T<s5taBP@7FcKe$;85nfn~Mxl+FdGC zpBQP@6QbL$-}YnNBmRk)(UgsBl1tT<)ld?Xfp4Toq!j#^Ze(rKRkaAFI^TTf5DN1U z6m;<7Sqc0u;mKE$?9mNYJ)bOud&S6m>1CpN>g7AO#O{n-o9CW+w%AS#m(Ji|0QA^q zVuH&YYpP=#{zzrArTkQH3$B~LF^q7EIVj(IG-zuhM9JVbNrUkR%%74B-fB3Ug-$N4 zH*v@0I^GYHf7jD5zIQe`j)?&}LGy=o$94guY}dL*0Gmpam-_V--bH#m^y$L+45g#! z>TT0S5A6q;A1{>;U0MG|P=+_CU4zA?pCS~~ftC+pLStj@iGLWagE2z9Dw?SIOjf;~ zgOK5<MJjIQ!`zg}(z|`>0@kM_rUb|04GFyB!JWeka0;LgtY(%jY!m$k_o1mY1@pV| zgY%xo&gQ1*WtBF_OXjTWlyG0;BUU+E>f*f?>iG0RT265wwOTkHLH)J2lWQmhk3}x! znTS0r-46{<NVLDZzYoClnfCssDJl7IbM0E!N<OF(Oy}^s4BH(SQI$OYz>bdwu7Lku z;=bM@(Ti|;gi-#$&TL)#+ASBF9}*h63;0#M`W9+t3^TYW-_(NrxuS%@t`>L3IwSU5 zNs(t3ML|A3PYk%7-FST))oYP95B*j7C8X%Nf%1m>#f8W7+g!hNDP5P3-5j|4fJzXi zDA33W#-hFBb-u5{4EW2nv@mb2y2<!Ko*p5l%u7a(X*KLcLPsw4i1V-pu9R0#V1+5x zIj-8u!eJPgVMrxpXlIqhE%Rz9{r}|juflYpPOUFEOr-)(Bass2*Z3oE5HI=f9Aa@e zbBAV4n{U&diPF_v1M1<Ml}HCYA%X89s?y6Q%IbCD&&)#3LPC91qacuz39GE<zeP|q z`(MesqW~UQQ$I+8e6Xfd|K4M;y(%cbe!kz!R9)>AQsb5ZS9<Pn^1*Fv`(W)isXi}z z{1*L7_7RL*A?Y&-&J$=Uv7kP!V)d_14;1U|eZR(ve`nZSd2_J6f093YV02r0wBwh> zYoc4PfqdRrP?Ia)tuUfL9&2WI$uYH^Y14is9Q4+f%u1aEGcV|fhKegq+NQ~!gD^LB zA|<u=HyV#PXSDxJDq*S}RImOpP_SYP(9K#LCQC5(E!IkU!@9DKK%(5?7yf@Dr)KDF z5s}ZeCx29gBgbfVEPq8rns3Baw4Z5TXHR)OuVyiw{BV;`Zi39Sfcisj+Z{1`-0w*< zZgCazbOnWnTzH6Aspe(|3dC=~82BPGfAkQtxQG3y7z=S`D`WB*Us|aNKm58?(14Wk zOf;G16~9_0r(`$Y8=tmVJtf)j2Iua?w{%%8e8apEY!VUN!+v|Qr<V18H|G8<M7=Lp z3Suo@m2ChQ1^il!)zyDVGw;u?xP>SYPMx6EdDc_@1bUs%)*O|liG?Q&{-~yYjHS!c zJf%epDTb$;4Pigo_^Yx)kB!J{UCSJ9AITkzh=DdR`rsrrFBace{n_o50!ggTmM58s zCTUCcy&xl+u=-~Rajrh274=`=Q;VOEn@z=PV@MEa0+XkAx|p0uVafRd3U(f7NEgR) zZOLRmyECTiA2zl6pdY|Y%MxDTs;=nPgfV+*I>G(kM*-u01}Utb;2G{ntX$mALHh*4 zsE#UP6PzqN-JLme`hL8aQivc2!7f=@4TcQF?)Ck{=q;bmgj%(yPwedMLqfd=uqdU< z8P`{WrP81!g;H{if;YnJU(H=S?Yoj7bXe}eI=|QT2uxBQb>_YWc3e;i4Q^zbZx^1{ z<!TJXIBhSI{PB=zk9*fgg8G*@&Y%Q15^5jeAml=gtoUU(WGJ2%*E&zEw)?K8*^YWc zlYrVyFDswKRwY@XDIO%h89wPCB0KyIQyxT3yLI!Lt^kvaq5Z~(w15x`RVU{{x$e}f z&)t|Ngak5tT{$sFRg_-0s7S>`0G4IT`z&_R{O^4oR8cuXHl$#Kw}pkW7I-3ODn8|9 ztciwmoTv0qEE7>n4U_pS&%~F#&XiJhM@s+Ta9D%tg;fJjzd0lJJi(Lm<$cs^B+o%n zaXqE=ec8qLoqkh3C)XLZ0GVZzkyhxnmSrumI+?F2fon^-f_k=aN)10g4SaXH4>{Lv zn^Rcq&$3KOP!;vA>QL6U_o3Mf$&&C`=90kOrS}j6kb+g?rdy|kW-zwD>z5LuUE$(C z@k;iEA;gIj7SUiHSu;KE-q4<QMOUf(>q6EJdz{6}^?|n|uy!3m0hznMZ^Wwpz$t{k z@8~qR-Wl|5)pzQjvJs+`K0yqx#)Ct7*DB?CsFz@JlvU}H{=;DVx%Ub8JFj1BSSTvC z@c6bN_0_oy=%$xAiOglWSA~rea~FE97fw*z7i)7P!9_Ym8@e4i87(jrG41zyfZ^P^ zEeEDzux%h#-@D7rM1*TFWgjr`&?{!XOx+(Ktx9EXz5F1H(y>yQ%;xht{de_B__Z*6 zt<SP1A~VH}3J__i&Su?S41`^FBY`g>uE?IQFB|2LWa`X$g(BqPPR$SD<1z%Nb|uZ7 zX^ghor{&l4?Ls#G<a9tG$@Z55n{-*i+wXd~EJbe|tA(5ok#Wy$DM_9_uTsIzp@`tB zANy4xjrIt8R34h<ps^4lHFdq_S8wVKicj*|^OFdWJF2vAZHrWsXD@#B1@RAd-uF!X z)U5gC@O@v|0CSS$G(isVHLTsM$f7Ehe2|)QoeZsxcqJUZIMO9Zv;7+M=O<q!#c&G; zVQ!1D7sNQ5WEfBh%M)hdQ@S|ZquD;JmmR#+==(g&cjMtt-6mqy{a|nZ>m8mC;+t*< zrWd2i0FLP6bg}Rj7mk?(vPAG?BZ0TQtM6~tB<Wp$Fuh^ZWeYePK3-fiVhtGhPc(IC zUMPS@en)^kbqTCka!~;7CJ%v(a~dw2sTx;03hlG4N8^uyc^9e|k~>KwJvepPs1B#C zA5D|*OUT1FCQ#Er?u$zzMv&gKo%ahfP5Huw9Y8vrts4q><pLjv4lba>VR`n@(4}-G z^uF8C?w`k(^R+iOUnq2O#8VFty3i#Nq=uW_S>nQP?wNZ{Qwqfg2*T|f)$3)K4scb> z_nK$pFxlNO<G0n;excz-_x&t<hFcKi`@qO*%uR*PkLu3_!l4f|f~<Hw^@pa@2iFL7 z5veN`e)Ms7@r%E)ZR-qtzSR+(nVf|yZx?hqVpGEVR$2k=a(SeZ)H++M)km?0&gX4T zjNtC6h|}XLt{bDRwuZOor?mJvER!=~&G@x@;r?p$Y}IGo4)4t#{CXUXT+4>Ptb%!X zGk3UuKXHP#-6-wfBOM~_j(p%=e$f@3pOuGOc4PesXb9AJrB*$j#K%C&9FSMBFp%I1 z>F&RLn~}+MQf{fdrEsrO@xOq#T`njgUy}Ce@gdLIY=+HAx)474Sf=#r!a;x2$ZQZ6 z*=txXUcuIIX;JL_>v;+tXaT|7*FUIJOxxgByHhBYXfsIexJ9xEfp4T;V1sY?OV0eI z@Ggr76c%|=2a`-OM|XPM9hkvRT;)vXF*rmau7tN#<+yr)A%u`zEAm`Fze1A8c8o_h za8X(d`pva`X-;pA`ahDc!mr8h?W3TefCvU4B`uxOFgheA(hY)ih;&XwkR07H>FyW} ziZYOt0Ru)T112$$j=`Sy_V@k)`)oVszR$U?>sv*o1b$+m!OAy6Kh7k(`zMZzKXQ`B z8x9pguA<6b;SE!*`ZFAdC1J;E`=|taz`=qv2xEA^KrZTwSNA4F5H=Sr%SRPGw7BWR ziSM$c#t$R^IRXO5X<&-={ZPfB+bq6nOa3Qk)k9{#t{0V$><QM<;ShI1L5P7)0GDox zT-K`KyH0lq=+K1&{lHkTZVcs*W3G&UNOHALx9*E*2=%W}IZfihOqb9M!fCqyDxU&4 zZ}k=)_o+Zcl0@<<Sn{eBQ!l-Rs&H*PwBe)Mzg^JkL*^coLtrkc01rV8+wadde&Ul) z6I)^(EwLv`>fS=_=#SZFZa`~S46_+B72cno;J_D|BJNxw_Ut$_L{8y<M1PqJAiNC{ z<)`;-pGeP00HR5R)%7)%UO~vKj#K_0LiHS!^~#Nd39{ebDdLvSYG{+ZnOZDbZOtVp znt^l#X$(s;Zl%S;b8(261LdU8+OjT&4N!t!%ls@`Ay3D@87k^ve<T6s3Z0O_C=d#& zTsp+f;Hi9;_0cOnT1iqbL|RV~V1pg~&s0@j;X)5<$UZF(5B<FAMwX^7s%&bGRNUIQ z!y39@p@TWt(MdA>G=>+Nr)9cb)8SKi0jOX8&iZhCAAJ|n88tqrRv*5eK*Pp#fM{?H zmOmM9(eSxj*97WG3630+y~MN$6lq%EZqB&cMN4A*!;T`6bmcEn)xEvmP6HAa=B+Ep z`>RX;GH>_qAso>+eP2&U6XTd2Z?Ee3o}H9Gua1sA9vhKRDqwkEhaj#91*m|je>rH1 zkcxDUo^q=j`Sz=I3eQGsG+K7oSR;HAf>v?ZB%Kp^=UzC;^P-llL}TMP$c1z4RItB% zlkSY5rzhQ_+s|6EQelyI0rn9yr(ET6e}?3ueva?0UWAYr{6_@+w+Tij&hDN$rCnB9 zO_2|TIeag=uR%|ot+Ym8oYvi{zTIYzAEBaPfP%6-k8xZKnu4IIH%^XzM}z+n-I??x z?RDBV*>a3Ftydgi`BTFsd4&2WGUh%_fE%au_)|Kl+FrzYZyune=&ysPm;9ST%+eW# z6}}(+Xoh8cVrUkY4X70S{lO(+@u-!;JB1dgR#0sk9)6-pf+6Y(o;R04e<ASv5Nv~M zatw}PTr5$uP_Dl>>9qTJ>l`_+<zmM^=T*_>;B1eV_9_^VCQX7=xMms&IGip%JF1)i zuy=KTfzby#;J<HZJ}2UM_`Q-y36QtGAqWB?zQ{JPJxT3=cHkU<oLeL=h3z^(QuKaW z+)CE)D*rZmYPMYePI74QJ)uCxX{D_FgW8PhW!%L(fCXfbY?E;BxJ9UNgd!M{d><zn z0chE-#V1Hn4dJbQ_NL9n#Fd`5<#v;qR9CJ0XONLc0w3nn3`O;Z1iV!xA|jxsov+Wg zR<G-qtJ`XQ>hjQw>Q6>sqCXIu#+V3TTTb`&T~T0)sA+>x?Hi|x3k!%91ZecUy4!4Z z1>HLMGWT0#QsW_DAaIbfvvnn&_JUns&|*}+bWNU`WMI8NZ-}J>Hze}n^wQ(onoB*S zHR)2*vkRRZe6NfXv_H}K!{X+K5obpl_?bjd!rhB(;M6PVJHwnjw}Uro`!;iX{Xl(z z9CCS|V?l|pP<GBa&!_31QoCV>V<e1<*Y|d%fF99nRxW~SA#Hbnu%~kf#-897Bj{Td zHz7EkgZ1lONZXZ_Ot|>K)RxLv*PO9(xPc4Dd-wf(8c0^K)eX;=@Rp9Fk6n!6zV<bm ziWj}o2zLWcc&p2gSO%QhUwho9Q-xm6SyjEDSv~3pH(0l)xZrbPxaTVPYwdSYEAI3z zVXG3#@CU$siDmiAk3FdAR&x09b8AXn(x#<!F#D(GQ+S2S>LY%5z~9AM$*E$C+t*8x zsTPGY*CGBDX#RHh?Kxa{y*D-`<vsx*a-!fbJQly-y{=pq7`9Jpa#FCtn_`j3^D578 z#;uZ5iw}{kW&&4ZSw0h2zS~kmvicNHJhOlIJb!yeOPoFJ{T{5c5aMuBGp+LI&@(7Y zn+UUu-B>2fDcArqL5d^tmQ(Lyh~pm1!C8yv#PwU5<DHf0eE`pRR@!6+etWp|Vl)`2 ze3H^fVcp2`JsE<yrTO5y9hR7dy7d^sh8@;h-Uo$7)|r~=_K0aP$735`-TI?vm_Rs^ z0$F0==DG@wQMbO$k-l=F8l&?RwmtiGawTK%M}(t&rnE_$PxeiSs{41Iry_D#xyv+k zn_^lJ`)=@UZlPhC1fM1UU7p3dncri7Eqgm0iFcjP56^cZpuNEXRpH-Hw<5d#BXam< z&*_i3Zuq@39aT)sYjuydA0Jxw{d{7cm@*$L-;3^d{TYa}Ubx-HuEL@JA5n2_=qGny zIp*JCGP5572@`HCcGVfj`}vT^px!I1ZD|SfFZ?cKGuo^-6~#`&spJn}gL~6fmr=)j zlYRl5sS7JZRd2f2Gr|wJ<@^-t&}|&|S4+w7!H804Ak`@`OW<%!Ux-1inZQq{PPSig z^4I?nef9bBWfJu1z%Yx~(MDP*{Cfvrcko#XxQQwL{gdh)Th<RK@CQ4tPqO20L9+-T zPWY6mWhL)z68qymt1Lyr+Vek%^A^<SGnPbitCoS63zYJ)YZ%XI7+?+$m<aJC6ieF; z>JHyLsvl$S!~sb@Nb^S4!X?@yyuEOFxN`owcVW(H)#T#btw{A4UH6K!cUoT*dJ&<g zRZmr1$P|=jDXJB$x&erHZ3pJntvToM?5Mw$G6i(Fg>?Fzf&yHG_Pt%z+<480?fz~Z zjnLaY8zO~(UHx;s+#cNVD0S?m2+g+GYeYz6kn(uLceUjh76%WhT|C-<4_l!`P!s4~ zN}2DfFZ^<L;4j64OaKgSD%^?^dQzn~y=x`Y{~&&tA`DjL!>U<YN*ieNHQSfJ#iQsi zl71goy}H9jC7FsEverU(j}XH9mY?ZPjXaEI=d#Ju30q<Yjs~|aUGqUMyxLr9z!r6F zd%r&q=XOY;s4TWkVgjul{U%MdGu15xCMbRT2BvTjFj4e+<JS4&p+tPLD(U;4U~g0d z#+Wl(GZeN9+udZ3PwajX9@(JRy9Kd9c|&t{vB_XR9*Y5yhr9~LHU<d%GTy+cE7!>M zd4{Ro(EOr;mNmBD-9W$>Uv9%woH7DBIDT1BxB%!u&#Dq(^D$gt9L@6Uq0n0YebnDA zgT19kF<*sa&@Py;7*a7wO89w_XZ~p=Y9ukVjvB}|sNrT2YVbU-xgjZ?F}a{jxoR)x zh4^cq)O)-?H62zyebG058hAWslRZ8lK$uk8fqgAF2E=?F6dkSO_ZGi@Ph6jr*e#a& zbv*eOx=^Lc*DO}O`IPpIL3&AKA{cL2;cD93WA1D_4r}KPo5*)!LG^O5es*{lePy40 z0ONxe09C+T4LOG{2b|_>@+w<drB%}~ED*7?nr{#Pt=sO^^h4tlXj%%f-*FKF`@OH1 zViy&P3~tW3tyaW-2H6Enag>l{8c(i^+A|507}>u4D^fV>Z&kB%u<2{HTkw5ftf*xn zM<U^mjrGbh9=Si#m9O1E#b(=K7@urX7;-kbq2JT69_1!R3Oe|!E*auPd~sUkvBw#E z$K!b$GXzE5&9aLn1@MQU2>!;f>T&go>|b%9<A9_ZE}6pK_q#H4VI><I(NwuhjIxDA z(pbQkty^5w6S^Vv#8z*!iSZ)rs#)yZ7dKsbp-XvI_^~o5;Q41dfPM*>h<r`AQM91t zpC<QTEt1ZCB|Iub>;>#a<yuQC+ynJa#xm)|8>(buO^WJw&41LbV3RIB=Cf(<30WYp zH2l_$qp!<mN4L$(U6<DTLs|+UuwWraGU(Q=?_XimkdlIqYZORGN*<3C+9))PV~X5u z`cU;0Kcpb7aLx>i0t=*B3|V>JE7y1{2^k13EPy;2>TKzwJ^1nbPFzm2`_S7G_On1h zkNmet{-v+r!f>XK+@k&w$Y13mviKlvF;y4dO#e%^!mF=<h)I^fv}JJH(ST~9Jt2Ka z@;{;`be$<)m5M0Fw66VLIP$$Dq-6@CFdHz3q4y!7p%OE4jC(5_Q*ih4?Ch%A|DEqX z@45TOTVy*k6%63uBmu{H3G7Sj@=ymMJg}taQ!TAxRreX%ya8dkveUT;AXwcn=$g9i za%feQVH>O4u6{xFGXDq#%uf$=+Rqxii(xXxmZHPL5(kr>zYO{&Oxp%^Pxa5Ds_2en zcX2Sig6)rUXK6Nam7Fax5$%elJip#j5u*-E)CYV||5|nmchd(q`w~I&4fiX^41q@I zABnqB3Dbm;-&)gv!%a<I2t)$L33lQC5&bg+Gpu>quFUC$WA@3E?Z0;|gY@`7?<H8a zA$}iS)W+939DbIy1N^xDyN|+$%jF-O4JpN5tw>zjS5%#B86gcnj<eIxu?V!B+6Yr# zU5|wq$j;t5fye#E-nC;G<$tZ?i7nIp?(33+)U$tEaV^qkR%Dl9bV7G26n;GVXKeb@ z9BBsE5-$SjC3m);`<cK&JH-#0N1HO{6)Xth&L9o0-A=WNsoCZvGkVJ_c5l&PT`Y$# zRf2gR+=^sNQzf(N8d5)o4k>6d^@hyMHD?=@{CuCue?v^`i_xxz-a<Jq!rr$YWv@Rl znXVV$N4Fgegcqg;<qXDCNT^Dqfniq*T54;xj_NPHNJr|ldY-mEM?+F;ZRAJ9GD5FJ zq3y*L147b7#eGcuSTB;8`1rf!TexO&yMRctCl#|NgdcZV*jr_ONhwI}zG!aETPQe8 zmnL`lue~gm1S`^4Y6bD8qgYLqh!t$)oS@iV6T{v-aO(2!o8S5<2CnAm(5qYMUW=pG zt;y`eU1`+GrF-1ye!W(;jnS@OFDi*st_ya~L&8AOS=y#|Uj|83ZMf(-@Drtt;kKZK zC(ld7O<1Rh{ZjBPXFi3Xis05$e|WcP_U>I@2E`*tmQKh?QNh!j<F)Tea8FV!{r2<y z0hFAQcKT}*$r<&EjT|$pf;tiR2>nH)u<WUL;-lTE%-)Zjecl{#>KYY3t4!5lP3F>X z;8t2)wB#NCY<~<Ws|TV=W~1gn8?$-=1bTTHK$@kniaOa88T!pUWwzxsX7yRe)V5y6 zzM|K_hDyq*>u1VFcEJ&Q#|?{0;tKl7I&Icvh8I<*%GuZRzeZuB6_~kt(;UIi^Lukd zPno?j6PSJf37NAUea_iiDJcp`rA>H^*!nl^9rm#_{P(FmBf4!*Y7*L0(H8;J&6F1m z8t|!^u38?><^>IRp}SICyMh>Q(j6p#Jbj+B_mFDQy)!d1d^qpqr3Z;eo)q&g7MYL1 zz<slGBbewpu^W(r$(Mm=K;9ewK4s#tha`=*`1^_GdyiVCeD}b0GHbIOaJP@WkIUZP z%EmxIA@t0Bu)&uj90BBv;pPjiD$D^YJeW<~7BDOSGk`4IT;{~PPrttCJXE}pr0N1O z%My%I8eH4WGd)7pBo}^kyk=EFG2Z*sRKvNRir!U!99pGc<u?S02kip2Y^|9{#dfO2 z^ZwKJSr%yqxC1e4ZELz%YhHri(edNrScLohrkTcy0h%QSARXq0!yqnqo-lRfqWv9G zjfp-DU@CFY<?Zppyj!JQHn>|ogAhdhjn#99e?DOr%(^=_;e6!{DxPFF`WF$S$6Jf} zwwb>c`83K*#rRLtG*Lm6{2Dh@3xW0s;Hf@QKrq60;onpLL^N~!u}LiHx0anfDY$!` z;rsJGu@n0J5Mjm9`}|~ot^^wB;mN!@Y|#Q|@%)9GPzXIb3-9eVj_r-%Te1L>tJ2Jp zMq>4hl0Rq%dl!B~TJ7D6L~k|43M@nfc#^q8WkdXH$OD+#Ms)?B6RFFUyJITGSAljA zSC>*wB^K`v8O@{c!tC28ZCpKf)%6rDh;=i2totk|%^rY_)ugu2tA|xjbw#zy3*A1^ z7VG}}O8Vo?<nk8MpVVfkUW>vcHAXH9shoOiVkxNax>p{&Qmt#xYnc)K_-(`ZVufBf z0b;pXr3HHWz*Hu^<Viu7x+GOc2xdFvCDy28y4a*m$*U)Ooy4IqjL=*C%>eO+)n#}l za0nrdz*`YuiK>peg0r6CbAm=tV1E8_=g1xg2Co(4p0Yg75;q_(cp@h5HYlDzI=+Q& z=lRMY<@wmn%&dNNqu8s9V{-YA)Fcz+N#o&ly_oMC!WjDSI!zXU0pV8)9a~q=AEM%n z>}5>jiCH{`#Qr1F6-z=$U%481T@w0lJgk4(p1Y>Sos#*dlj}LY&oS6{3l<zAfHC9j zt09Y9ws`jEowg6cV1F@_?u`n6tS5@K6R&8A+d0C*>H#Xq`xw>-Jur9fq~=0@NE;Mr z<l2u}l-m-=uiN4i6-WXDHkL1=G0>95vi1~@dL;hoMcoI*<bW@e6|Si!@R=pLyQW;i zwmL+J`dx}J8UIo|pQRO_7CmxEq@#Yx4-2<Ww~`-Jx@ih@VOnD3MO+&(ROuu6m<k;{ zK^&*Gc=B*ZQQ44%L+#4Ca|dVe_WeMYQ#RG;=~Mw|s~mW&uAEb7$X~_X!iyFvj>NC_ z+YFYe%}zb!kQ6a3^;W0s@LC=YPMZYqwKjQN>#DF?$;4q3BPkuW-)^xug^T=bwc#oR z;`7fT?Sx}p+rPf?Iwop}2+;tbPM^t7P1%y=Yg(*t5UTq2An})HW!K+wWa6_oz$dPe zAC|xDtUfH?Fr&Chl!(NI5jxK<&&tu7Y&10%*A)<EJM8EV;5qYb=FZremu-rrYK=RC z$Z#*P);0~Evp(REKgk+pUz;u7hr+|}U<-lv#^|948qL4&+j3h9&kFKs7*8U=gLAda z?Kd_2-F*NC==S`=IZ#;Zo#basQ5iM0cA88%x|9>IYpLIm!#3hx(z_S_#?Eqy=p}Vh zlioTS{u4MMJG~@+CVG>fdBC38f63!)g48<Wl~h@(qYY=dp;uv8C*9-<Xd*W*xc!MI zxN><Uu+opy6r&hE0Z4^`uY#97_iQl!!qyh`glLt$u=J>q07S3`IE*|QAt}eb)#epc zWuL-G0XA>OE-!YW>WZL^WKaO0N0)a^jaPcD%ep`9FXKzjzPm1hOWBjJZil(u`ZP)0 zlq|wqH+7KoVn)czThJjzyjJLyG64HdL53@ztVw&Ab0Ur9VCUz=d&iiHlYQk3G_|bd z;>x#3i>wimhD%U7)%Z?fUnH{5cqZ1lNV5}ewPJAQsqS-*f3@hzT7nnpBqjD2+rXaz zqk=Mz_PC}Xw%?_{Z4n|Y74klXGa1FlPZ%68tJ+O>JyNEeT<jxJ+p;skFY)4|TzUAB zFS68^%+klW!sBDDp0x)5xll+ox9930dxLpOxd6VXJWn(j40o}a^4mI}x~vCg<R`W> zaT}z$N6T06s94jiy<{*5sAfHegH+j#ZFoT!j`rIc^e3lP>r!oQK2*7;k*B*36?(v{ ziX!kjB*(vr?OBD>vTR>ogh}nAE)Cn0KT6Up4oodnx=FtJV1l0qg&<equAjhWMV&6< zr8G@C_pd0t0SdO|&H3bpj3cUJ1z5B^p<t`ADAOk=d=P>Bi#sX#ysP0l&Qa{F?x{hI zxZ(ixUI4!=T#(y2%Q!*xwtrCAr4wqgw8g=Byhf3ge*y18cX-{hpWwHz(+lQ(94i<; z4}jCPqzcAV7@)^eyZ&w3;LCZNY%iIg{;Sls0TjaTU-i1HaG|GH<gw=a3$sg@jot~7 zKQ!=(veRJF5?mgz&}?{-`RlqIw<I*59ud=Z>lXmdns?uzvEWZi6cbgDHpV0&7fUkq zXGVNq{7~3#0Ma8|2Rfm@+rP%UL=c+v{wL0F5NO>9ouOj8M;^sN<qimsTjwqlTHYRw zdfaq<#vW^MzuE82!1@U;F7at6;<D*9{LsP4sbK@B6Swg@m0ei!Zmq}z#`mOu&n^vj zjsFhsynFhE(<5RB_6xzHm)=gzR1=oFm8W)n<T1p7fr^F%R7X(<y;FsK?FDRbq^qWR z9>2Te=BYpsfqAa3zl_^={<T0O2|<k5bpEg7t~S5BNIlMLwZym0Ju2&ccyH-CWCrCD zA}+$;7~vWJ@of+fLOx8sn%=!sGzz}#jWDz%FgjM47A_YH1Uf!VoGU#ZQqXbwJH#W) zXG$i3OCAgVrd^ycY>~k2vsf!G!Jx9$B9}#Sb<j9KzB3gPun+EtedE-r_Sk(C7%dOj z7Aov}_68d|8k~xMoX>m5kXLKlZ<8g(GTEjbFngyo8J;<p+V0o+gudypH1tDXFIDI) zy@&nLPi{`zk;5fFzIotWnRV7>6Lf5M>%Vke!k~))n}L$p?B$xeCK$)s5(N%ZF5g#B zX`<}!;E(gZpZN@Pd$}V(UKubNWuDnFeQl;SeJA7ekR>S#1rIf_qF;GEO(zWA1Jmyu zo?aT*@mG`RyapZp44i~t99K*g-0@;Zj<IQRd%v?dONkg@$wKzhdYx8%%Z2UD3j!}F z$ok}IXSB9zdziE~&q&wPH<t$hj?#8-$_38rUtdf#X}>M9T4A0MLZ!s^;kw96kjUff z)nrO?VK1=C&mJ2>y=^0qUi;+!jMws8qkeKoG4;tOnUf0{P%^?MNH2q;`A6+<qt7F< z$=)!}8IJFMQ#7-lY&Ta0Bu(_*0|6KAnGFxu7{2qQ6q3mq#hZz_HeDzfixE<g0rLM| zSR5E?(~{o?N0VM1%K?jZNf6)r{v$h0U<G-v<UW*rR5U+jYw4_*BT!(&N;-6S85BG@ zL&2;84pz%4?zH;0A}Fo=j>=m0+C_MRE2CUuz##_AaCz0+2TOd>8~Kh7!)*F^RSecw z0WVXZx_I|MP!;yA_Y+`(dZ#3J`O!;715gj67xwR#?vejJkE_*7mmR|>2Q7c6u53yd z5|AKO#@2*<$V|u^?EtvZe?;m6gqHKBAy9>@rem^IX)2!;kphMh+rR{nI4T!^i9{>s zfDU&1t+P)r{Y#l6S#zE3GWkgE)pw-Bjp*cMLT0?x9Gh;_zzeQi=BY-v49v~i=N{<T z{(3ve>;w$jxC(seg~^^aa@06Ys^SL=rC6{JB{ILfen8p3NZ)4SoX7YPTPQMrS_5X< zQ8qCCsCEax_mM_kw(z_(qa;o^ddlj4P#V3!B}<v)cq%sqvTdH_aG*UPobh<){FO&j z4co(Ryvzt?Av2qzzuho#MH#;=kejQ0y`G@*qG7;zmlPcAo6KJG<DshQx(b{gTk-q2 zY{kLwqxp53Ga@e`2!``zu^CF{i#bI1d_R$<@S#2`zDHUCsN$|B->!M6k=Rm}IAKoC z%D36fXm?)@Oh2^MT};TrRO~=|tH(REZLO7sd=QySfYkLuJZ;Lqi&u?uCi(usjmP1R zBo2^5UN?tKx@Ga!BXU9R)hmVUt$kghQR+<c$S;WGPx~PU1g0u$E&50PZAJPYf`j@; zFHg$Jl~OL6R`}eR!%x2YPug8|&t$#Uj)!|#g%*3mgiyrHy_N52&{p6vMT=sPB|a>~ zuvm$toP{0tjjA7|aDC}pQfZ+qHGL{88NGJDeWQgva#+s3zh2frHBHHR?F;djZo&N- zNk;!uoa$>shQi-vME?<0a_@%&70!&}`<m94AYMxtYX|8nBSdh9l1pvl+w^yVG}`n= z!HV|`P}zWSncq*eGif6omO|r^Qfu{cDVpq2z8md`o9lv-z89BN4b~^bs`lNfta%YF zEY3sz#~0nlmorPQ9Qx`xhx;R{#2<QnE@u*uT8@NQ#J9r(_Ne}SHC`S1!-riJ-f0=+ zl<$k}M;?@C=hV%YM%@c+WwQBKf6c_Bm71C@qTGmkW3GRNBaY81=ky;97eMAnms_Ed zP8C?aLTQYuC|bS|vGRtm{{oVxr(I)0PLiyi^EGEe>Yu^tN$CwAAI_Z|p&7QcS^40Q zDf7KO6ctU(H&{^c9zw4#9WO0_+h2L+?|Sz^l%+6kLi#fNIai*TMW>yE=M6f%f{gD) zQ{?g1N(P?j&o@9s>t-b=!ok1b7*6IXh5N(XnxaNAa_TQ2v0uRO*$X^TYdMLfl6i0{ zM-jy9-F;oZx^9p$_e<l!0$CUFI}MxDqll9oEoV`3zjiS#fte^L^)by}^7X%AEzo1Q zuD9@!PzhP-Ujx)hxi|&<UThB0JGsA7L*Zv9HP4b472yK!;BTO-EvffbPrCuL{PF?l zBHy6H=Jfrk{fniP<UmZrbe;LKME;u4y$G2H9XX$5yP?ZXhU>W=AJxY_LD=_F%llB! zaFri<bVs)h@6;B?QKA7TN|lbUc%Hv~a-@v%@DW>E*XmFw9qpG!AQeuSHkRP2GTSej z4l)iA#t7nGFk{_Dt4B%ZFk<nC?|(#IQdhx*=QoRiG^m@q*~0_$3xw5h*j(;S(v}<n z<4x6X{PP;a>qqFn&!3Iik0Ld)Kc(74!jOwOf}5?cJfXm~*$E100Jdr;pyEd={RhoD zr<5}?G%Or|c(S9KXzGg-ZHxA#uhG6hG_L2u{wpiCQTFyq9UmSp4!x-ENK_xsb`pP6 z)W^kJiv8}y4E^XymXMv5%!TzR&tkX7eJf-Zshx*iSC~jtgZ^|W85b?sHf2?nW=Y|d z+BSd#!NQlTL9NS!&P`uvvQ<K%!G(aam3cZxld7bwB~W2ABMM+Rd)UTGjTM5eVgg4! zDS=2VJii7O|9#YNlWaA+ERMGfP>9~_t@;e-v{8XEXp7g6r|h?y1Gjce9xr;eRsTqI z7CBq+hW3NYEHtiXlIxQ;DZ6#&^<X$GOOnk{o}I&wtYYJ6k<bX?{!a9j<-OjpYB7P~ zX3Ye*joTN1iWjgf+&bhay-#j=>k1Hj0d!w(^}|SdGVC?@3=nBd*4+#tA%B|8mD^_v zTEW1OZK5c5v6{t#=>(kdpFrT#vstl=e#R=VHTNV4@_p$|>`Q`!6?t#C^Xjtiod5FM zLiG~GIKD#Xy=1nKctNrkatUAyD$R5&Z;c-mKxI-2U9}o;yKK2MvB739VkL<;?B&i7 zThmQ@p5@6yJN_G5pbo09$AFXbOKlf+>lL$E$kcr~$k*|i%gcbu*J;BA4s93NzLe8> z6`7gTd1+){E_{%=DFvL#+{vuN_+^o+N)^`h91a%_x|HmKk}{cB)lG?t7p@w^Ci#Hc z5~thKt*yzVdQ+L|a_JbmMes5E^fFhSb5K+4u*w~G%7SeZWlZ&dK6g-Jm1!FIY1xqx z*seGP*CDu2BIDt)+QhAgrqT-?h~bab%e?jPJcjALLjNUF7-~Oh35p3HlikC56V4Rc zNCNy18vtdsE-YnWfEal(8_UFMr2W?>__l6ARwHg)tJvE?%^}*3?d#y?a26wT_*q4- zj(&x`H@|?d#raG7gSA|ToYNc@VIft7tUQRf@D4?!XA-_7>B3nI0kJ;L(Q-C%)8Dvl z5y9@1oe{+R&p@qqVQgFCyD*#{pKxQc|2bv%7ap{86c=IwHwEZLjeGKBA8fcL=Wxi? zs0X6A&?_mgqu@fF$A|S`TFwcv>nmR%MGPuwFP7Qv@<MXtZ4U`{-}bEr<SR^WpET>V zeAyG=x?=Q)^`t=2vdA?viJr^^npOH#v6+er6#c&9-7GKm^zMX}N=9{<AXUTYMYwoX z<HB#w$2*%4ME5%_#L5U3jf{KKqVar?E4iGTJk?<f4wXIouH@Y#{GebGN(NBAT+p92 z9#|ypjzLKJC9lXg5!SFM329=>Oc{gWH9a8}rq6(7Bhip7rc5FzmjO6KKgL{a!8c8# zMWqoH!7UF1kQO5f1)>P&*v>WYBf7tDWthDS|07D&q+X6KO?i`w#l6uBQ2!jHfb}{# zu5wzI$fFChmcC68_)u@qAWaG)ba{Lb*cRPV`9Vwok-&y3q=*~bFa4@Wo+$dfxm6?Z z)rTVrIxSDCfPuT(O$ii3Ez01~2jwMBJUjwvkw>BPm*J0!TquNJutPyD65z{_{3^`8 z?LjmU4q>9>zLzO<Kb-Ko(<J^qZT`LGql?)pj?`x~9$G!4Vox$+NyqL3N`w?daONHf zN_enWd%!CebZ|ibRE_YHJY~{4j0gUaTrIIabA$N6@%?R;$?+6m_R#in3u!H#y>&!} zi)FyriW=nK`;;Ft^M!wJ9_{ird!KeQ(~Rne!PL7j6S%7cw=F!=7;d^YGd)YHZEVCT zeIj>+Iw)Sc)uRywYI#dVbG4iVl8`yB{Ak>sHF>X&I`fT9L5Uo5_A$=b>vagjHw8|% zU+yD^ffqpo1m@%G8zK)qx<tcrO5P!8v9gdA#PUUdooUBS(+@52n|xp5lb+#mJ21!# zhbmd~>!SRyk3_1V@2%HA&%IZV%9@=wNSt|X`I10m*nn~wJh0GD=2f+0>gJwzj*t@M z{V7NGLjHNsyMdNyJWTMyg~c{`Z~r5Tu)m7)t8Lc~JOGnFp9in}P}sRA0u2*Ex5@nZ z{`!mDtMZNEA9PYg{)GL0tlHi#*GnxgR&UwG9=%?!H@`Ke{z-8|Y&|W`x_p*eQeu;n z*|^VRh)IEr1<7`}{~yQMH)bB`RH9Osg@L=Wm|lg!iImXgN8f}$-~P=(&)@rg2dz-x za>T{`Sw34cQ`*OuRw_ar$<l<7!%wxpyih9Xu;2&yNc7TtKpGJ>096`%XIs)`+Zq6} z!gKeh@<aQ271GhsEs-05>r46M#LvHXa7+G`v(9{Hq8rokmVD-meYrqkWyY3uH!R%U zZ_Chq*Rd_xqCmlzLJJ>0{a8U^3(%GPNA$?oJmE?D%bYfgkC{t1HrXg1Ofr264X6(G z8|_gO)N)f^?TxvS>W$ceURT3Sc(l+eqF1_t!=9f#^wo_)93FUKO#K*E&X2G^S01mK zK0k!fzbUYKc=s^+U}Si?U{w-%-j`9_KBc<}`6>Z(VkaobAq$qhp?!n`=T^81XrYw8 zk2v<z^70k;U*Ltv3%KVY&QQJ-mMP-FkSOqwG3e?Hn8W(*m|?BD+Pq{|)l=>sca88C z&a<-+x{y8XZBP~3*fmKGY8Xe#k$vRQ%FKd$rmVl@)92-o5Sp}1`F_g)oQ_s;S$nTS zH5l!l`$ywvM$-ls<-89iWO#;jC#cYjVuzL(9Q4zz6_hpPr6#R;=`f8S=owTZiVTuk zNu`&smmGk{uZiN)UR=x0bIVtglHFI-Umi?<T8(V<o640gZ~sVc@zX)pyepdL94>cq z<ywTiHHPCCZcktLk^9_ecfBM*+W*@)-sNDqHF%v;{8#t^<`;AJo~(VF`OKh2XPEQF z+{SxN%&%yK^>WK<ui7PmLRU$)4|z<aIqb<@Kh{DsTJd#|fx099+2X?FTgU@3P;hH? z`C~d%wmRt#?~!Bdbb}?LvaLnSUWSAC#?McjEvTZ?eZ$`=h5GkWL#yI%bvV&eEXVAu zDipY;k$jbUVyZkIUdjeg63VCO0I0CA6St$ks6yW#h_S1%lNmh<_CB)TF<?`=HL4=> z!2i$#YV=QXsjz_X`dZ+9tF1H|a(~Fl{)=$F4;tB6d^+XUN#Z|Ok5(A?i6vOaGgaZB zg{z6WJ{z&bBhFqij9_|R+G|)=5)h@JPPsfDKl$*p1>bAU;fq)d8gL6T7ErNPw@_Em zp&u*-w26SpN$|YR6Z`dBk~M7U05wXH$X0~Vz@C44QvP+AosHc7wM2eNDjIR7;E6q| zPDONG*f(Er(X45BMzx^&Lr-fSfH!nc1x!T8li3~UZcHxAchDb~*)|T_wcxd1xa-zN zg}Ze!;=+N8hJ`RLy)hcpJpUYdBf|e<6!`Ql5C`p><!!~mj#pPprCep>CIReQ_6_8s zRYhD_y4pcI>}jbMsD60(j5D#|%dr~vs$PcMtTDEq37aMzSAXIsOwAPLsQod!Z`3z| z#Wnf2xCUnGhef&%W8U0TY0dxeAJMmvziKoB>7uu~qH=M0cX(mxT05xnu>QM3Q^5I} zOJ-Rb;yXl~!{xpX37|}B_-#4Y6cXZdq+6mh{g|Pl(SHP?C=#)SICHbH>S=B3uwNrv z@msphhS@}rR^oECd_CTsgboX_J|-co-Nye|z5^1f-vd$^GP|A(@$j|C9IoLis2O0m z*CzV|5n<t$T)}=<u9#KVc8QeQC($RVa$2^H^}F`h#=+Rs&K=`jU-BRh+LgzN9>vN= znNA%02=0O<+qkwzg-L#_apdZ>Kii);+P98g@AXPj0QLKh+ntU-vU&lTBmN_&lm~)% z7exU<jU|RgB_=6sE>v6AM!aN^K?gFrl;Gcwmy!ZDLCgDjS&`|9X|6@o8f{W>$96DO z3_6n~Vr{ihHc`Yo;yQ`%7#O_0?(mB${Cca7V)%LB!jA~*8H=Rj81<Xba2-L7evJNj zn2*R|JqJFRdQ89a)yjf(;En-8Rww80Z@e7+#k78^Mdv=6CBsN`aXdWncje-e2Vy_y zqH|<B#Hj2VVnIo>*b~i@DX(Q`)gi%Y*aC$Fq)mi4HHhy><*RP4*zDGW0=cYK0&Mm% zbf<)qS9rC2v0<d@(3WLJN^nrlza6X&Jdtwvm>6X3^Nfv({{|fJ+`;WkN4FCCD~|X) zZfm*S`i|tEbNqz?dAw2{LB1zt^u<h9^sQJ1O+(xSS3)D;pxvvSt+{yd&Iz>3BM)zU zWzx%#)04^Y6V99uIPc#M5(p{g0Fb25l~omRP}ot}v7r+tH@SW$K6^%$w6`9*Dug_D zrCU2J$pE<9vEc`qarzzOs11gu1YgWtt$60zAM-B^f>l$Nu+9!AZ$$q%K$h~`^)`=5 zipiQx1)rZecidfa02}~LwzR!=j_Gq*?*WF2pXI1F>-}zzSoeL}zyQ5xji|Yzlf6K^ zD>uu*5jAhaxu6CU=x*4zx`(X$_wctps%|D_1AaNUfc;nI7TaF;VJaP(9t;YGuPB<2 zCIaP;R`P63dg3hI-HIxCh=o<(KgO1ua6{XyrDl|PHAB;7eE>mM(8X5T<fw_qp7_?1 z+V68_@<>A6#yXWXwmrm%{KHU?U9apOJmq2h*Q&|!E!5V9fmZL02lIl+c%SR+PKMH~ z%?DKa-E;`}Sv8Zx*936NX~mLQU}97nG@H>I5a~W(H&-G)kBMFL9V4f@WkUS)7?)(7 zp{;-9$xc}+95(~sD^9D#z^pI!mCcs|_$@s<ZBgua-S?Og2LGgU(u>XFu2u^R$vFAf z(n?P+?v@A)p8@q$b*))zfX~Cf*%GCKHj`L|{*}|KYOZ+Q?hXqJK7Z|KmhJ#<=e>}^ z1)TB{^}_%f3k_f#lIYCwk|X7UCgf0RJ2-eIMZ;|~lEcn2C4PF92eg6!XI&b?y|1A+ z9(Up~jqx^oiP?Y#9p3OFPL@2Ub{e;?;vA8!c4eV-@k#F-fIWF#%A+NG+yz&p#W7XF z#A07JRNhK|UH6_Ys6@z3wp$!jzR}owtw`>J+`vLxEf!aA<2_?VRmc<Av_^>g?UxMf zx>|Bi9w^2B%8qQ>SSOAI42{S~D^3nC?w&H0+pMH)$j^P}_i=yurekLZDC?_!D?0{g zjz=t~iTA`p78x3)b`W*y>adCqi+TFJ%kR7_=|UCy`{-VQr7UXxS35L!Jl5&sq=v}! zM5*+=fpJ4H#AZ_j&T9QD)&!@U62JZ%V0=J`6M#r0qf7>`R>^Gj()rD2debtYtAgRM zME=~iR+HPZ4}DwQ`IHqos_=u-`;)<@xg+)FHuse0jxsJ*td;acrMde+yrrc;w3|>e zWqw<G0msYL`mY0dRwaV(q$hz~A0yE(Zz!rByZ8LeOjR3BBbH|9uc(tN5Yz-hOD8<% zH+g&xqmJdSLjr2Z=GwJsuQ;e%w@t1estkRB`XJG$G6R2=&Q}%^7Riv7b#+niK&3@J z$eew-?4?nxZGy5K-lwWPh?=JVuTYk}O!#w0d;iAx_)Zlwk7a;ZW=Ct)D}x)@IY+wF zSd8fOG1_@Xh3iXl(|<YH*B|%u<}wU458<G(j8EwXIjG%8YxrNaUJqDkKh|^SdJ-@W z3<MfJImv~tN-C_t1o+G6ms({g9Le8{?sGqFs0csDEoQSvYt0E*$t?_DFiG7AlS1^n z*27R&!aw{MYwAXl@B+UA-af(2uc^TLZqOk@?@3qHeI57R*j>oh`u>aC6%f+YB6I=} zFU)**@_4>2j>QVJ^zAsW;YXN*NFydhmX51%tOeg%ETk-yj^s4<=`Juk31?TXuQ%M9 zYD{xOG@lS5HJ`J0XRlpo?i_`7UWSX0x<zNw$bE4IW-TSZT7c#w4dC$XB5@Bb+b1cL zT83|H>kb12!G4^_S96W0(c5gOkB&TsSJi!=fPafyNfO$*`hantDaOSUIPF3HUU`ID zK!^wUYfVgD=HH9cbH}XpUPo4~$;$y5>M2Z_uD}oe9k(?_Po`+47+a5BDa2bBK|mn* zNU+dQ!kco7_JFJlw}m1G(CeCosBfLf$I_JO$<tr!lt1gIV7RN&zaq!wV7D9aS56iw z-SMiwfn7)jCNVoTkKxo-0|Kp4B2Pz>wN~V=2K(h^DV6#r-~My~b>-WKz@OI3_y7}p zYYX6v{_JWMH^Z;~y!){$SmN**XaC{|APAe)ujUsE-<(GS>x|fOr~*cWq)<rR(;T*R zwYB?B9qi8z-rfxMhF;)S3jD+dTU{yp#*>AkNXJ{wH9YeJifk?kZ5L4=TuSmQQ-_z* zK?jEkir~{>M*Ds_Z@m<wx-8$~ivVvI+FLSL3)Yb9>JrM?QF;t={qUFPU156k1Znsz zXYaak%Eu;S?IJ?6vgqAQpL2hlAy68e5Nw{#Hw!-4-PYOJz;3h*k2#^_!9eayi<eU& z{Y~>B-vJX)FGJ_aMH8w_?{Hq}ew-%bGBJLEbeSCv(ecL_xGsj2e(BLP{^d@82vxAm zzbCSirnl(Fq5{iZ)Y>CS8Q4W1p1mmj;B$5`b&rsKR8I4y{<Yi5gtmH_s!FG9SlBh6 z8(viHJ=obuK-n`@R1d=}6ZXGWTt?O}6`)!+DMsCel->b2jzj-z{1Vh0oYYFt{Nz5A z+aK*CoNvDf!Ab*Wg)MeP=BAs@=v|#~8(zy)jfOGE1W)rdbmi6usccKW@I$?CKKsWw zll?^o+XvssoI2!cz7O1)_uns^wXBkTYRuaD;n7?3v4y_CTw^KyB$bHC7qNEQ@fDJf z6N5Ii@SRf`)IMj>6)MG`<0`=@pxMNk`(-{A-i{=>^k>=*A>(%D$a~=zcR!+D|3a`s z?p|-p)?D76EJb$$V7#1dd87N9={809H)zmVH9XCu&GhQaP13dHgN&V}qy6*Q^2}-D zJLT#>C-gW206K6;A?!s}l|Z|0UlDz(pRE<@eIN$eE^CmuZ~J(G!o>Mc^wj&e(-fG< zNl=FFt?`rsxN_4-5B8;K=;uq!-Vxv_s6R>ayDfmGenmCZdqQ4zmM`9A6P~Hbq*hO` z2ZdB30FhPj^S9y~=^laxcx`9SCl8YNmT(h3`&;_g)gc`uJ|peVWusDv1Ca7T*rVFt z01L%y!+Fn6R>ZqgX*ps@3<l9_Me91!mqO_ujiWmZ1b@Og4z6YWtA2`D4}FiUO0Si4 zt4QqO&vy4g0^^z1;h*fuTDS90zd=TkBD}Ddf!GR+{<k@aGo9!2=3ZF@Gw(?{c@5XF z@#DrH0z&z{ErJe-4;?Oj5N~CX01I|<^H!MJQlnEhEipHLH4&gVb6ww4%jk65=w^QT zy_tyYS7;97`tiwHb44M&&WG=JRT;3x+v<TQHSN)hK3>du^iaE2S&;IQEx_Be`8;CZ z(J`+u37RLp!fO`AK~_zHhR#{5o*%pFMr^hrY&PUG3C@P(8`VUVDSm$*;*|LZQkN<g zrBHxy_b<z(_jswh_V~e&-mGcI)6?U#D!pONT9kSqMVbqa<Na^X!Ta}vZ7BdPZS!@e zREb*|ZFd$cb^C>tlx#3TA$@ow8!a4hiuSx-cX$V81fb6oj(*$jC<D!i;uKn10oLE> znRg*rfLAccDM^;e>yaJgUY97v*a#RtfkHMf1J<g|7Qgre@1;N-r1i|-SpYAdf(#Hn z`O^|GkM>yaN52H}w^;(bH^A1wykM^^RXbXyBq(v{MS>4h#=ecCzE)sF+@i)ubbz12 zq3J&&JyE8ngDGhK@j5Uou*jv;{wU$}@|{#6*Ha<9lw}fRsM^e2`&NlIA5S|Kei-oz znD6cc)aWmPJpuat>PQrLEa3)cZ_woHXPU+=0^i5@m^#vMWP>iPMmI_rDL+De(5N_v zWSye#U2W|r=u-(xIKJm-@}vxU`XeZ%_O)*pKlzVkikzL9gM7gE6!&f?e56t`CjgPf zOY{)L0QMwhs?L1>5!u?*N}ee}8JSaI4Wva!51d``2JMj?#^&h+<x`Ni*|(9N{p;!c zm@q4~Y&Q3GxIeZ(Vk5f0oJ8b5iG77Q?G!M#QqX7m?5_PFDI3ms4B9=zsi2JYhN0VL zt3Muy^eR&Av0If3l9DulU}dJUhUWcgHR=&17qxH8@{&%1CVbH4F3A_PuLSDjq8ZW% zU0Mn|!uzYM@Zb+dtsi#PHdug}^O4d;=-B^z7Rk>>n^4PGwggc+iU28WHx%-HE|8ob zxLb`S_#*?ZLR0<wt>r=2M!{yrJh2D&CCTU25aaU)(1qgFH+3JK%$PkgHRI?AhkaoA z4uG0Im%j+yF)M7c^P9OF4#^BB<dGcO?`5v~g|O!{NJXRto5bhl&pHg8`W+OInqlcl z_mfJRL*+HfI|(9^{LMt~{@I|ym}ZmH)jY`S7HpXf&U6ZUgPnj-PZxligj&CGy4s@X zQG4K-Co$rww>C(Jo_u=3+%t1yh2z1X!zsGsD33!D4$Ne#n+J6@0{1-@_SU7e46lm8 z2E!N*|0|y6p!UWXzj7LM<e>)L7s?%Ud&pUNod>Al=py2#`27KGm(AZT-@kU=2y2x3 z2NA^ARB`5Oct7jE6~1mO7<_Pe=~tnB)7q?O@&2Jl#7)hOZ5wFFK|%mdEvi;Bt#<KA z5dR&bA0a@gK4WDLpx{?j$&{@<9m(3{OJwZebo1tfuA@VTqkQkeo|zbXP0kP_`~#8+ zlxz<s^1WnmNH9|1SG&bX(G2_QyJ_49H4twfn7e`=VXxPdu+S85a=l}JO^5h-PkIvU zWt|~m(){n(5iLhonM}HAQKRd=s6?L*0Xw-}ykTzf?G@z~a6R!y%LiUSWV#v6(@aa7 zEm_<7Lpu(JrR9z<&nmxVs$N$N{%xh`0lY%bw!!v>rEEp93GStb3@mRD<HskM%U9nB z=IKy&uar;5*s)UpIo^52h0cQ=d$<2d>oWdhah`O9d-3=g2Tx5y9y_Dr&%Y1PxGUgw zMgw5pJ8TTCr!iQ9LJkxKNDTj_alFgi;TezZ_dNRc?e-NdI}{eBU=dQ*q9s^r+$s=L zY}3O~7#tRIR$+>^T7rqGrPzH;O5xa+#y0Ki`wl8)`B?st%j%=8)({?g4=Ahqf-rR^ z?JjK58}^-#2kI&Aea`xI)pLY9pWS(b<Vx2lwh)&jy|zqcjM!N^opi0MQt|Rc3t|Lh zGjGfs^rPSqSGKuT)RKH$VwgZ#dMxEYv*<S^QKHa2S<lPUliEof&sxkKf$a96UOE24 z0efIJAZecIyb<Fjv{~GANMg^RL4SODQn?X#c{)Pb`lCIs<)Mx=DKHzF3_lKv-sn|# z;m8jw{^dsOL{4-Eo;EpB2*W=YWm4ZJOUes|-zjvTH8KZ>LIZcs^_@u3f)oVm@6{g{ z*TS`=vG~<pg3&8!_r3bZ@)BIoUrEcu*Q5<TX!$Cx$3hjcg`6P!7W_TZ{YR?-dAOr{ z014jQv`2-bjtMcJpvNHKYx4;knPBTtX^+gLWkLVab6_7ijAaP(K`z$neqKsp{Bsb0 zQ_EB|;1)}$FW^;vSf2Ywyw>cKp|0{);f|JDvk8}P^801dzX?ElT1Q{Pr8sR}|G8t6 zE}h5Ay&lZuTAoocHV#*R6D?5jx^skB?((cg7+lf&b@21R-xuK+zzw+HXE6;hyc@V6 zpMw6P!*Sf<PAzLW<)XJA-U|XAE8fqEoKRxNAD{Q%f%C)EAr*BBf7HL=8XorUu%z03 zjVKHQE#g-4AdhB*m9DGUhVvlr9-OP+_8B-W{q*`yL1{i%^zrLKT6rRQAVBn*C+ls` zC&;40%(ugoN)muj5L6><KH@`~UEBXAfmVd2Hv$Db?w^fPPbQM(is0|B4ggPGWQXYo zE~jRQ=q`0PLH_Rz&wPN)eOdM3%)3z)FXiqOpx}g5C|qfy_-@qyb7&4hGF!QFE5gE9 zMd*iIZ@xVWxmaUI9qIP`8=F*AH(w&MWnE<WqA`%UKT*5V+);Uy8?D8jokfpn7=@J? z(O86)iZ?ZV1d++$Cc!`ItHM_N6GF2m@3N$l0x($nyxKG46?#wz)nXQlw}mHF0}D2n zd2N$Sx7O88U0OtRJ#A-r(rX&#o}!iBWR>d2zbtVHOf;;rAK%tK7JBEsG2D9-Tj3SH zyj@>ULiGg3)AwVF<zoBW?@1O(xe$VQV~kx!t{dCfIKDga+by7zSDC*w>~k8So&^Qb zL~K;QRX#{TxAVI2dvYuJFjThdcc=qG1=K%Zs*FpKjGRK31&21b*&)Rw_Ja!uFHx>M zuj%43TNcS;Gey6i4+`iaz%4<EXpNHobY%$LB%>3mSJXwI^!;}^cNF)vW#nfYFcxUL z{g3bOJll-+yJ^#SvSv8x*)O4x@pzEw=*5lYO)O3dBaJ`bf)diZ&imuQyq9l+5^PI8 z{}Kc<k@maBEefc;Hts24X8N42Ke2-Oj8pd57GiU86!OOj;~i;PksD-h6(CuSS5;{* zj=oZ_A0;!!`_b|3{{xrmOWQw<x#VeIF9z{j*>riQtYjCj4&SL5vhN~2OO;gaE4c3V zFW&wVMmqk<ix+gBRmJ#SXiST6HXeyPH`rBc?6?~vU=@gWYd1OvNl*bb(e5lo)_tpv zFrz1CL|>bMtHC=d*rLOFTB`8;6Fk}R8M4w^m<p`F+NRqD+PNaUo(enZ?b%iJ7hoMZ z5=@CTAgquQ`6*-=dDzEXxGKz$UbQ5BkUs}Ji)Q9hw{O!Ywr;n72@m{{kdB2Gc<<{W z*YFk?_3Ih*yGd^4&aKrxo~vj4IaV~1aD&qfr9xJzA3z@0j&g54ikzvpqlLuJh1~Y? z=)%BSS6X0B0uGU5DL^O#&Q`9C0`9d8PsX?mP-m*gyE4!d-9In*+ULucA96IqA4CrM zoHZd=vh7nb<Ni_gR2*Ft?sA9Tgup6K(TY$x#RXO>t3p_Y#7a;JRNof==+izi(L3o& z055txz{>XJ(cTw^{uvLV2J0}$weNgA+4UHOz*M1r=g0~6>fjakf~QC3vtqVCj3cc0 zvLH+Y67H%VH$8R{{83$tiZ%HFaLtOcZLH4oq#bQ`V@>Mk(gYA;$%YqDN70M8zj=wB z-)aVIPCKstBf8reM0v$MK3A?)OpG-hy2I3c@5K6<Ln;ppY{w|;!v_DK^J;GT+%Np2 zNA$nR?vJ8wXe?h<8^wHgFRH%@w7ONiqP>tw47fGg?8cK2vLE(i0;@<Sm#jn@rnD-T zFBeO`?2O^rIHPXvBDPA4jKg0N_Dl{~R3U`d*V;6>;}ZoiQZK`9Tw*Ffb9u7kSkhU` z7ezs2B7mvX@i}$j!salZ4w5UhCNFX=ds-?k`f6H}oT}}XoI4%*0>Hdpgl5rvCkw16 zvCR+5fByo1^zSLnA*Zpy3!N#ltdQ=>2IGG|g%^aD(Bn0wQ}w<<^8JfZH}7~>L@PI` z+v!h>iY1L1c9)n?-7cI1nilofidW~S6(gMK26QKyxmp@44u8UAp)(`7+w9GkiU%o~ zMobW;mG^DYnW?&C_M*Zd{?Bh=S&Yci^yXr{eizIQ+7Eq8kU}0d7xO#jKik#218VMp z<zA*L@fDjEX*CnK_zLW-_PIE7$cXFM>a~{;f<T-=*lkJ7v$QksJaE=NNct4mWN;T= zT+qZIVMG`tTcLtrE@;vbt=5Jc-!?)YegudZE2%=m4PI;(1Ll0M7$rv~Fi~4WGLXwH z&Mqw?$<i0VaK0UP)rH)DxiH@gjC)^|dMVB1M-U!;l0Sww5I%gr`Jg+H@iKU7Q8ic6 zeDUjRcr0<f=AqG$x;H}S$oRN>xI8^QhaYYCL-wWykXJv~SPbPc6Yk$)?Q@~h`HzTd z<G4;&3@@?r?sB|amsLkh-8(G>ifIE&DtFNqC!};Nwgv*~KcA@6W1s?@@p<a|`Y(Nq z)B_<RD!u>Jg#E`K+Z;QRpI3r<67FgJA5CW&*W~-Ye-ITEq*OYT5Rs7X5Rj5mx{>bg zE~ObIT_Q0+5XsRY$S4`oY?KTbHEJ+~F+Ts>@9*`0%#&;PeRG|4obLn4`b`>Jy<}>p zlB+3aP7t+&*YJi#dYoNFEpbG?pj&<CB^LF)ngFbm3(^7q(N%V5``W3#Ns|)mGM*!U zfPn#@j;)i&vM7k!IAIw!1+kI3c<f>F)I_;*jAoXUfQ!}F8wdV3lgzD3s5pCJf*^XT zMAh`Z8}^(-90*brKvtz<@2@AdB$D}()TiSIg{Cb_U$N7#ho-M75)yzN%MRrBL1;h~ zsianyy31JG=bKaEi)3%u=@GnY$64s(EF^H0$w-*7M9z4QfO`fc1^npR;^7RQlm~C0 zqXdGLByNt(afXGAj`_4|DL;kmG>=AX(F<$9u<O=>S>#qjew@co0Eko-vogGsb8B*| zJ9)tA#^kQ*TOT2bK~_vshvT+PCHn9qcs$l?jE)r>j0D=k_W{=npC8wr$iK2dS9)be zG-lwZWf(6?{}oVQHu>{#QXx2pYaGP&=qe}~DDmX~H&W5!_>X|&Id1l3^Tla7uD5s2 zX5KY1KC4`f?L%ok2N7paDE6n23EzWRuO*dH|84gi6<n3(`CiauXvCu&<P*p$jh*v{ zS7gCtcg+BK7h222P4U3rOoiDYQ=1V%Oaw$QjnJlt0(lOoZN!ru)_=&<ujGX?Q+%id zX0GVJuT%cSVr2*yS@64O52rdIg59sjD_h4Mle2wpr5&!50iW<fe&|qeC2c>K+VJu@ za_ej#NP2S}vNZ84-{regFFD&$|7LZYG`YD>B`gX3YRF%x5}%Ng**MOgSr}7Bc<Va? z=+ga^@2E|fIgnUp(&`AQxm%7}3Uw7xv*I(lI<EiLQ0{tbA8Wa7AN0<BV$Gd^S@sB{ z|LQks@xEYRV4VEGx>8|#TizDY=1c-Bpv<X-f!n3~kUN_^fRiFn$+=+0Gj}a_BAu)w z=T!ot7q%`V<%dgam4o2=f%je{)8tbAP@Sm9*p<iz1|Aupr(L6qpMH3Ux?{KBwE!#{ zo0jEr1X16?cu?=j#@=x5D1K+oVlU0T(tBSx9^>om*Y*l5b`-}i;Pn|I<9F@SlU>u% zjgu{*-uGs44PWUGgZA~gxYf4JXpq;+j6xoNEZ?aU&O-EZo46588&D={)wHGK_ZPU_ zN)Oh7EF+-N!+$h&f7yJob^SeYQEH1||IH4Rna4D+^njb?^M=Oz{|LHLRY*L7(MM}N zzO`H*dndo$=DB#tOmX>(;ft9QBIhc&;Ws}3&awp7onV%7?|@Czw$9@9&cv7VOSdTb zOcZzpA~Z{Uq(U(IWH^7dQuT>fPjN^Y%sE<*qs{H`Sz_uSYc^C1Fq;XltrN87W74d- zNzJ~5q+FJ2o?Xj2Gq4H~CUdQnc*J?#Ebjhe=+(R5`PekNK>~y*QDOJZA~$5w**Qzk z3;NX^IB%QJhgLpZbzWFMrew9_Xf-o%@piB7RSdljHg5@*DRy;o>IgOkIUmxnyD}fQ zt85N1kTqUQqDz0|+zT5YVqu*iBE~zxe#K_3wHgV-m7ZkjB$j`o$WD_uKMd7VGksL3 z<q)ivj=0O^Bjp%qDG6i~Gk3E+S#$G7mLunj)-jjfM)P~CuRranO{*!K<_Fym-bAv@ z-OIa^=ppo*TUwudX}jRrh*R^xDZsTODzBCh<xz}z6_^Z?+wjuax}0W2C8lA61)<k3 z`k5l-&L4m69Fv<2=sV7ottQMe{rN(wy`OJF_Ub0`rZ&ZyW~2<hJTR=^8xdI*2@`cN zO0-Q^t5~KP@t$drUuYEzO{@Tk_J;43Q$-Q<BX`l7hGrSOPibAun$wQRFv?mC%T0IN z(qBa0|L2|csP)B9t41~b(OWbr{x+&sn56KEK!S~Vfn`kAYN_|*X0iQ5dJlq2N<a1m z@IsHAay0T?bw_FpA)WT_;>E?6jik0gLuqfRyyg50{NPMPNJPZBgR!noq1iL4{|GcM zQQwc?dCe9=Bn+ZBIk9|V3!w9W1h%zIo_PMvY$%2T=pPW^y{$zP&7JXu%H=+L8}WtD zOWoCCJT3riIx+P!yF8lr^;Us4`H}WNb*UgU<P;(3OhWhxL;#E_>-9!Ao9IRF3QkDq zzZ<Z!yg7@X4J;%RXK{1SAKyv`5dp$oow!iP;==|zZW+(sNACvZd}9|<kUa(khbCm+ znzd|9JcOf`lGnA%4=p(!FnM!B>;^mb9x{gjUXDVe-4<HJ*d@xrqOU(B`DOr*uT1*# zIK;ucdnY0S$xcxiAqZNwh1bGWv<4qM4+eXxB0+M+d!d}h6)(L{VJWwn|AF=H{_HY{ zTi8BEFs87`9Ljkh|Arcf3W#oItx9TC=K6V81C$h*aKL1PW5H`rTm#>GqdFeD89S2+ zAfbG?{U5ajx%2(5O9{2h?>$at4Xs9b=;-{&={Lw!=U)}Bd!EdPYk1k$(9mkq+1}aq zU5$m4=FNWu9fg1MJJvBb7anu`MXAhPFXQ7&nPO>GEbo(hgG$jMXI1KsPMq=%8F0*v z>5quLh6bIB(2Ghh-X#sGe)ll3WN(*W`5d`%6i_B)${qA-4hef43N~{u^Xy?KEe_by zNC;T>U9E8mtxDIbPkXlc{2o(SOg@mwgkrzigy#Fr#p|Zpwvm)^Xjk49D*<PnRk{)i zsXBQWhMO8DZCUvVejaN^r3cA4GVfU^p~aK`BX}4zWLOxTWPFti*!kQnc+6R8w9js+ z+s^Q1YWNUjuT^V%sj?S2wi-8|TDQBVa!x=d+6(9<474SgCI0|Nug<qXb|w8b9e#rC zYJ8NUqK=aNN5gP8Bn=&sWAT+<M^mTV^77q<f5{gqj79AQzGR+>tWP8!BX;uwcvl+U zK?|y*^HCqDV4tJ|&X0^bZ~Cg#s!s|b1xm?3ecPVM=|ZLB|G*+AbGDuNE$-HRc@lpS zVHJ@NvvM&mYu9j0MgGkCII+aomev``A|0W>0zgrJS6Oh=yymz^Rva$@w2P;{EI)MN zx%JcjmMqZJHDdSY>H{F2wHl8yDXovE@nyap6Wx@6qAd`Cscn)id<oCd!wyU2@P^g) zmZw>-^;mSC9xiKa#A0pkQYuWUdLD(|81Ru=yVtwbp-e=AEzQbGUvSIq{tt;UYt*C@ z_*|-!q%t)vz46T9kiv33M6bbLV|+_sPf(SK?CwR1kL1W<D6&;tU1Q%{YWJ9D;F-*V z?-*DHq-qnYXKCFi5>zlRGB58>jT&{j`p&ftvn<m86592g7RSPwL-vP78@$kdQ~;8k zo^<bY#&D%a?LJv&{R7qRsP=#UdYZnK3F<WzoB>vVvh*~r7ANj$I6JyR(55n}yklMo z*F^h^0ne&3A4oYvOQq{4<pUW&_pg8k8d`g)Mz&e04pAqzd2@n%k}<;!3k#?X@LGd8 zoV1W)0s2aJI#v3=edtQpxUKPMrs3zU+XAYzG*$c>AmNhU<lXs7>5m;z6n}Hye=PkA zyJ!cxT3rFP*f?p{EG17VmHuM;8)_-SnYH<nl2_fX`ODwR(#{FO3ftkpF7!p^lp(1X zc2JJhO4d8d{@?wyn~wiztmP;yx(-~K4=J+a!;YmL`&|6ck0&brCicRXFO}rQtpN;v zd&!lPW}v{ArPA}J24Dr6=?V!6p-d2^DF}LeK1=zDb>|0vAd0bh0Wlp9G8=iS^)Bpd z&@2gyTwNa1Khy<xhS_T+#7^DJJvGe5u@O^>Bg;)ISqyw~@8$Oq%RhGbJ&AP*c2I0@ z=u|eAfp5^&-%Z?!D){6~kDG|S4;-RFH^Bw_O<XKUXO|U4D;pa4lY+By`Qv$wCV#}~ zkOVQr7GCUE>TDjAjA!;uw?S<mNMnE9veh)qRJ$`<2QkJkzmeeCpV?n)RexSwcG_A& z*-uN^9hRfLiIi=GC;Xg#nl$}n{=>G3+0k9VE~RVMi?g+R@=7z#WT}}=eM;VXD)1L$ zysoGC+oUCHHOeKS_Y)Bp*=aos-&R8+9y2$Q25Uh9)(CSPNp3Wx1HF9z8%Awm<fK}h zN6b`i05bzD2e*dpdegByl~Y*B+9JDN1bjY}I!Wp0x!ES0*tT~Z$5ZgrKreRx2wuO( z&%xqQkE{6+mB^~tvA?#~L&GQ8;_4oIkaC%0wLuIb-joik%_&G}9D6!7=KzuE&LpE; z1U8(d1FKfc-yBV)S8n}yiT%JPZO_`3LBT1j!__9OpHqv2BXn5o%M@7*|HQC%hx$mO z)us^Nc3Z&CFIl&PN<UI#EtehH8<6i53&vOC7Tl@n_2Uw4-z%vJwrby7Py3I+xZ-Sz zrs9`#6+8^CJUA|{qAqpkd`Ef%>>4SzYd6>Yc+ng%4f6xb02`vNeJ)|sd%~~S7wV@; zy?oMWIr_kQ2-z+@KKphxt#9!RzubU(I4h1~7xA6B>-UstBjlaRDPjFXG8eIO)lu$i zu0F{si=G2`SR3~HS5p!bOT9sola%xQG|wNU?xH_i2Q2tSGsd%?NB+tB8@1bCnZd{6 zU--+j^=O$5I==0Ac(z*_IUFTfXsnz)!%FS|Ac$Bb+X*F5kg&ibQ@H4lRs;#i^ST+O zkd|%4ew!5s*nCa5=cDk@geb@>A2RdemH3FI>JO$Vx>?Mfg}f2lHY(e)!@~O|E48Lg zBB<U}>SYLAADqzldz1ZRa%t{AR3lYKS6kWvj5=BJ?wa`D?r(*i=L0aE9~IMoLN&y! z$X~+QF+!#u<OgKHMu|aHV=Ha4_al%eSyuu3Mc6XRQ#&6C@O?5nO4Ikb!Lh&6)D`%; zyhSqo^-;G0>k+h;AUt^6LP#ZZGi_A`d7pOSGZx4RrKP?7F#F`c&4UZeUIQ?{jQ)SI zXY<SH#*$6n2hM6YC>v`Y1i(MxyYxEE?(c0`C|kD=m9W`*dPx8v8@(cyYZL%Nq74l6 z5nmEb$fPs3hs&v*9fl?qbGpkhud?0>BDF5@Ac@poiMrmak3kGPcjumf5R~$Zum9gZ zFVMF&d%$<MOJu4$#EV*)A%k7~_DfsDcaegK&v3s;hnZU=7gih_uOckH1ZQTiW`zgb zx!_x!89A73fuTPC3e=X2-z0zw$a?cYv_*YG5F3zE%Aq`YP~w|{i}1Vdd~9#CJZ1KJ z`yG3D%ZUirVJ((D4T$Mr3rp2diTEK+zQLDrYFt~Jv1>hMaiQlQl-zHL<^dNPH*O*n zRcek!zcUUFh-aa(_3=%A1}F{L|Ay*n7A6=v)jvq7zMKDy5zPvPq=HX=U=Ks|#jrVJ z9La-+GZjS^`4Z11hlPl7mOU?)6~%jKUzMVjIrt#Qj>XG3`!4Jw$dqYIqW8u<hI@~b z6&ro%+c}ts)>w+2&7EpIZJnK^`HR^{!)Q?-Z+4h$iwN<n_}ynsP5d6BHI|HV8*0cc zRq!hyKx_F1Ii!tt{8)U5>zEB2x<KAsq2UG1YpS>4J5v>HW4=t8UeE;@&?dG5pigs- zyNC<qo#Xst7LgN~?3t3tjw8^VDUUtGh{3_GEiCv{-hg!gRIJl@%{}i8HyvReoNmFy z;#xkve+UXCU#iGa_uzU^^BJ^z@049TMQ06W8M_=IYN@!W_6*V-;C@R-&Ov^c`+2|0 z0kQVw`L6yq-ny6P>Yk$cC5*Z6wpD3Y=m^NXLJ3zJ)-H1?*@B{9-%n63OD;wdN$%gk zz@}gClvLijceZcM*|8xWKrh#A7YK8C9A`Rfa6~DdOnXqlnl*xw^_~gr+j_@eUTqE+ zF`81zvF{6i5xym3%T)3gy;^F!ZPt<YV~k%vrK2!~MR>szf_kfr)u1>lyk~Nxf3r=? z%0nJ6L%syi6%q+$%Wwi*gYvtKjo38l)ZRQ??@iAO#zD!RB&R9H4J0i7uYQUfbT+i~ zN9~Ghu92J35EYa#rL;NWQ}JrY<`so@%c%d?qefLv4#8w5frkWv?p!F@P+tV5Otiz$ zw&C~MyG(cIu-qpe#+L-^whOJ=%`29#B3sIh(ZY%LX|*M*Jtv4Bp$EpvB<ODWHh*0; z%%j+pqI0OPK}+a(5ZI(;NoG7<Czr7X9)y}{0|02xT6XbaF)QQqCl*kfV}v5ZRImM~ z(mZh{@`&QD*&J`P!JMh0Uy{(GOs~f{!hRqR*`A-=QlI4vIucAM)9D=F2l`yCYpoo= zhj+=OmIQ`k-5#)V=B8vVw8=_MM=qStD*4~B^=Y<D&D~Ibb_dr%w8eat0@#y<HnfQ^ z$*3j=<!&2(usb}EK8bOeS>Z3WdHVh7!5a5=`(<0vp=`%Kyn5-Lo^Gc5<JUvb6!m^6 zy=>QvY1x;9G@mw4hGDrOHB8kFr-uOXjWnW1+0B$>?S|?E6%U1{bi2t9f{HQw(_cV0 z;-9SISY32-o*xHf99@>+Yt6oP@c+>Gb|)Sv!&Oe>*NDG`;6nV%vzJM_Q)SHS=6$;? zJ(qtAT)ytW^$-JN5TxOed)+ra8qbGg*lF6!9F|uy>t2kls+_~%z*~cXZpn5vEt;jF zV^F^T3&Jd=sHGL5AnQ9r)^d8{w?V@A)iY`M#Z8au_so?y>7)<d8S>~$f?jVWhcG$L zV$oVk&h8$+oip=!6DOJ_F0=oxd&w^W^#G~aLvD95$IN}!?!@-Dy*<Q`i1Rx)MQz6d zbAihK10YVoR%U-V9EYt{7h`!nMQUuU^;yj^JHa{UT~z%dIdRzR+hE~Uby?h_PW3<~ z28!&8(e-nr#347sSn!h%dl{E+@35Ga(Q`*<t+h!Tpas9VQ!5)o7Z(Y)OMA9_G2z}o zz(}t6peoYfBhyD2ef!ClCBM4IV4vHK{$eZRaC4At;)6!dRdtX864a+X=OBD*S!9*b z*BeNUKE1z<<SGh;qV!i<5V_Q&UOzU;R2dp>M_5_nYk1_M`0CG0P3dIhe)w^D3v*8% zeh4_Yql$7?=dmQs!CAZC7|uW@_90-+lZ6woi@U#UzZKQ%woC1>ZxQB2EZ`nW#;<+? z<3Mmzky+a~?E{h@@{ou}XUk3rD}4BYTthbQy9}ZUUgqJy*OE${8&V5W6(56Ofrph= z-M?UTqd-moae0#P%8rE@f9=3VUy0njVMi3ra${Y6x0RoYgA>cxw+zmiBD>alp3RQ~ z(>1mh8mQo~)hm`T!rs8#7{(chTfmX-fNW|@<w4cU5aVXWy?{gcAU`JZ(CM*xm_V*o z`hWnPeuCZO^L3WXDwn`9z6e+i6?2*L(u)}5stCQc2IjsOjKFr{!e!hCJ#|msZKSR* z)6UlC*G$4F30VN_kyH?D*F7`kdY`RzEpIcq#v|zH2+?YjYPliI_pKn2vpZj%d0_cr zI?1MQ3ihk1Mc){C9$A*VbVfU&?*gP%8jO!LeDL6*?1b3(ojRBK7m>cg;oCBsEa8Cx zXajVmhFNy}AQVQ-by3bLCdu6ORs`X?y~5MpB{NQqbOEjO2(I<W?KXJWQ|%wuQ37&M zel_MUfS6$#X?6TM;iz}wLQqOgYau@;ne}-Vds<aEfC|!pX4>>2-aNH~rL&^|8h!6- zwgYL~sU>`fxQ(>Ugf48HRTB%O51MM4h8X7C!FwYSQ}#%wfnll8tFx+>HQ+%%{lu@l zvO#LHLFxeZ)2+G8@1c-GBU+7`TR=Z{Mk{mD>5ju-4S&$O>FJOH6m<!6DB+E_5oabs zw*%vUNk;bY{!=EZ5@}XFjiri18fN>)6|{+5@mtO)`qSxmQQG7{+^IQyl3JwG@bGqj z4n*yeY-M0LXi`>cPBdr3DMkEutyvZh0DjFZ^hz5flO}hmIapA076|qAItRTdmtfC8 zh-|j@onOSK?-wmYsrO2|+UQU1(!Nq`z${C3CNo+k&qi)bDRQ)pc{63kwxhC^fuQqQ zR93-r8Lq%6X^)8|rv(X)RCb+u*bA>Vsuwc;mLit`;1-WU1UNpx;TAkQP4wmzpVTB^ zk_Xay<_c`%zCK$X*Mn`Gtlab{pmfvKj#K}!Pc(KX`1BG9X$bN9k3bdT^zBB2dI=NH z2NElh4MMNh?t5`t5_cuqc3DJm-)ru}R3V%O_>j&@qz-N(g>l{`08g#`C11HpvP#x3 zBRXHUjA+En>gUs09nxX-4)yHr-X-F+-PJ^s`lym$p1g+)6l9A0kBzp3nV7q&LmEOp z7x1;T{dz>fZk~l}KNV1=2gq0FH9V#k7J~De0=<ORlt;tTEVCId)Ee}SvoTN)l#mor zdx&j=m$W{h?Xa5vqE2_gz-`>N{FOKP$8&2~y=#1jSWduIh0SwnQGLJ7PyM$qP;_WL zXCIiGW7-=9US8F_Q-6YokeP<*Xg_yTy)r`4p%3^kk}9|QB#6L1p(UTBpV2f5w0A+G zZGPLB)DPehqyI<ithJFAm2Po1HSvx!xl3SW8Qc3p<b%aZO99}|+i*n9A9a#ux%gFg zw^GjCO9Uu<NL3WZ0YKGKCF4JUzg?1^vZFJ->!=BT{8c;jNkan>P`f>J?Q^0u-K%6v z^lB7w@iB^0-$y)_EV*%~aV3tv)735{f$QH2@jZ|>aFvJ{R)TMRS8&HSUK+Uc7s*iN zP<DvvdO5IfBd%4CQLP*=WRR?JebWR?!QEj!Fo`4GH}eb6By|-%jBic_1U{cx!S?m| zT9YG=jPp0xtJ47IKG_=CIJTu-QYu%*8Wxm%S8Dw2zyoQ=9_9K$nz~ho>S0O6JNn6G z<|tYGUh|&mTu(9_>P*$@a95pT6)4)|1|cEMm3y?~Rin=C_eJ=gS&VG5$l~K&cuPK% zVRIk>CqEw_nDHf5s}tV-bdKzmt@R74uPl+}>|QLO{x(gnNGZ;;Jgdo@UXlK0*mk^( z>F(L?zBZ5b^I*?scI}I5%1j;yQmh_l(@o#epZC>l78x~cIfvzf*8UaD0OCX&$DjYm zL1RCWdYyG;xEy$<It>wXCPsd?=tz#pALIKszJ_01+eJFqAc>~4y>=PB#~u><XMn8Y zcj6Z_u(;R>e}znYhPTJ)959`-^3-l=G+#4Qd@lfAvbU&Gy6Eoq-(Mh}Ij(3b;Ze77 zf84#FNGrrqPQVnfy9ZbnYV&Tin=Nr#`>{smrsYmdde8jt_M&wqNt#q}3_^d2_<JzS z$=p7QUM)NI8*VYl{PSx-zB`SH5C)m)vB=qRQI$HO911r4;A8d~=vbC_=Q#WQ-N+|s zp~$Ob4T8w9E<ju!2EG`OjB$?L*S5~%f6PvQ2apH-(w<%$rB({QRheh;#Q?WzbkTVZ zm6g9A^8<S|O>{T=z6O<BvpPU`@Mnqn^wVkKp0_=_>{9sj>!5efd_l1(s6M2@K0Y#o zH!?#+;7!4s;I_#R>g?$xnoLwPK-*5$+SB&dJ>F-5?N8!UukHZpG@?h#PuH{Xot(vw z&7TZ@FLy#tiUP~S5sMrlvl<URyFq!w8Y6<%OR-%6l>vak#@;&Tf#ArW^DovNqzTBh zbfbm7zKB`0lDO{26OvQ92DOe$-vOYyd{)94^N=F$t@$f6evFsW1?wOJ0MQxRgc?#i z0o$A`n%!ZGn*r#gmq0xh@g#oGH{iW%s9JXYJ27B<{zJxAHUtT9Bta`%Q6rsf_cCAI z-qscaE$$xePZ#{&y%3hxk*@!3+s4U6PvKE4e5BjciO*-7$J|R{Z4M4Q;`-)Y3cPZT z96*Rq`C=@cG%mv&Uy-(|x=4Wmu>V)F8opu48~T9Gic3!Cf9%k?n9lUZ*Ps=xY5*6e zHY$Sy7<*Ol;B*V#2&Q*lU@oB(%=`a;-1|e+^t#LNH=m8gNb<tbeLo_Z$XE7U={)M$ zZ7YX3Vw71zM^p@?sb(5wQ(rFCN5CDMGfH)reLdEEBc+GEq{3EkfmN!W#Bk>GTqg&L zybMXQB>*J+7aT6%u)j@Io~$MQfG>Nn=QnG2O3HIf$sO6Qi)s(UNoP&?Y&{u@aau54 z0@;X8>cpsX*sPu?n$}GCyj<nm1;mgp;75A9nT*B!@<MkR-)+i<2O--<z6>Y6be!Fe z{xZjx$zz))^m_0A>aaJf8ygZHPnuFKX)L~>XJ5)-(Is=T-^R^m<(TAx2l{hCUOv(R zUugwRM}8o6Gs-)3O`p#k=1cuw!#L~R^xDE_rh_Zxjku2APlavyytf4yLsI~t{jUDJ ztYnpti*I+}?T8afFIj28M$^K69N$UM`vl*w&$cjnBM9<cz?W*b8t!ZN<m#x^t*^PT z3aT03<thU3V!8;1#@y<ko{>TFf4BnLtZ7G{pxC)sR{@6VeAeAs_k2%213rx#tg>~w zm*Cn0b1k+6Rz-b9`S9tVl$A7A9fjB2){Mbez2@bYSM7^l;Xp_~QtoTmx4!4$em0wN zCN4}%--%IO9`**6fEOwiJ@S^7gFT3}C&?02$4J;c03EBxpUe&3ebv$T;DZf$q%7ti zhg-z-vMnRL;xR;PRj-DgU0y7r^v%Pz&vjzH_Wn=XXC0hSp1lbYEX8SVfdFx%a6kWb z$OJc;azsE{HNC`P=x=xCW%pu!Dh`QD=E-~Khtjh-eKwGMm5;(&;`#u<O#%S8>G`$Y z^o@i(#`t2nG@cK_;|4N1Q7Ivz0Y{pcvhO5t*UL<K;kww5){Fm`lUfmNb(YAt8RcEX z3F%?&Fxj-eh&jW<<28=Au#d(nl+~LcsT;+Dg(>PslbIIDOWOQOcd4RJH~m;YAL(@| zgbS9M``-V)PkF;16^PcKsA~+qPn^5dHN&^6<{<C*7V3FoU>v|V5bVWkIc+>^*0rrl zv`w6L%v{@j^6H^~Y%W0JDr|>>!99Ep8J_g*MsgvLkq=&~m#~n6?R87D*cuzLS2EFb zxTRr$V?Lb&d(~Ka%Um@ebC8a|=@#K`(Okzi=oGzR?#Z$KaEtse9pFRv)7j&+0bZQL zHptr(a3L%EJYB~*l5OYtvk%WnPLI|4Vc-z3YnCfT@u4Z<-5R<iK3pu9#p3Q-n+x5` z3P`J~gkoMXM3`zsCNip)mR8&=YCeNUT#<1G^Z3q8FPOgIL~)tyg(}dhoD97J3O$dU z9HO$exJ5Qt#mMxps2TR-$6f!**h&tbKyR+%3^B~<ORb@^>%HvEwGD}L5*mqICly^G zqmI2$n^w&QFXhdaH+-As#7E5w4d$VGMoK&?ZQnKBMS~eQ6-v|XP{+iLUmvbq8tT}) z#<lv8WeQxz+Ih)81=M1(!4I>_BhInwbwv-leStx7uAo^3ALn3p2i+->`97)va|Dn7 z`fRAg%}|K&4;HgAtf46o7|7gZQ*FKiSM}kHGhY??P^YXt!yjZ>EDW_8u2(y@TH!62 z$x}0r*a<+f^z04h`Wf@<^L=L2HNXwaAN{XftE_6Fsq)dPwOH<0aL=US!IjYlOTeW{ zNWLmEtC$(I&AQJ^+XJO1ySGQsUbv3OTnJAxkC|1|&J4W`K_Y{)Bvom52)VM@qA_n= z__KhVKXEMLbcEp{6dw4!-~wP1=kr+C$BNfGeZ5gkUE{OjV2{P?Jqbhk*2<r;w4IWC zj9z64n*kR`dV9J*12Owro0E@jtHs~(1y+hL&~H^mjFkC~3hi5LZ@p#}lMcBepPm1~ zC|dt%CJQAGA1_^@==wj4fNPiVJc!v#>i-DJf5gA|?W2K-9u9p7|EetdvvWlmJlsHZ zi?q+8XdR12>pF{5xWs5l+~dEWe$u|qAA-dmX{~({=Tzx2dmU|U)x?dT?HhuYP{>=Z z)HDVg)^Qx~)6WLxrWLlM5s#Wg%WQo(<y|~D(paCfEQgZgcXKm2SAL{Xl{U96+fbF} z76I1F>VP`@9o3sQUupF~9==I+wOKE_v)vhqBLiKYurYXSix0W2!H$khAolC<#>J>> zkhPKnt!DwCL!1e;YzMT*n)+0TKCJwap5v85gjfo2F#(;SnW@5OulP$`AGNd-zBe3` z0;!{}bzEBAx0UW`J$U__W?ZC*a<#b2=1Z&C@i5nSp9|GQHt*Aq=V<g=k9t_fugMlo zq4hgzm;ZaZ)4)v2DxFQlOzrUTS-z=B)Fst0;rW5ILs`yqj_i`%F<AR2<sGXT%*9u6 zUvte>!v=<*^sK_Fv*fEiyKR`2I$<Sy>Ym<ZX$XLzo&_q(GRuVr_p{3E-bIMnN{d~b zpJOY8wD}C_%I{J}sLHDUv*UtSs3lW(dSOVt{`~Kr;QU!%^jvO+r+zXrm~MyIV>R!{ zz)$OA>if7YBV}Jf=q+tYlw5HQD1)Q^xh=MS2<VK)1DcwKkdi&4?)G<egw*H(!7JZ1 z%X6lTNp}tq$w2FaGy(i!IqOX8(+qq88(BfJh<!(zW2BXpi*H@2oiQLCEC)OwivKNx z0r!gAnnTLBLfo*|?J^t-kWMJpSy~4hC&$SDJI*CEM2uF!-Ednvhe5=~7<*m+bQsV< zAH6l>aP_L{&&~R4(D|>6tY>lQqdorh;iDoC{T&IwwnTsz7uI!l?;h@;M-|)<rU(2N z%n(AJr!f}((0w2A+VTTxy9}K^$Y_<tfSyo}Oo-^6tqG<0W$%G2_n^y`B=7^fK@xwT zEeNR>jWkTL3_^NXUP;Y|o+*%*-jaD0R=1+l;Jx|<qPCIOmZI4JA>&vlyb9IFiR_|; zT(Y|Ls4x|_(YuS-pL~;-`U(K$I)AxJPF=pC=M{&e%UkCK)3B78zS4ex%Oxb++iE#I zJFrza1!R05D1GE9e&iZu>9w_Z<&0v(ZXN18K>=B`K}%oTavSecBV8jH2hvF{pM7mU zd)nTF;dD88C&xL~MTji#vaPf`veYG@kjU6Vq>~a8tw|w1lX4XZHqCfX!>Cj6XObiJ zil{V~S!%oTlY+=cQIr7HD3veF({h%q&PY=*x2-*(ople%9wUuCgN3+n#{JfHS0h<e zxlcIqB7{Zw$Vl#YO(7R(dx>Tda>T)`fMmvd!@-T}NC=`_g)?z-mqD8(j4XNv^r`SW zr>$tKg^fWH&$w~sTtAgsUvN3Hq{kby_R-ixw2Uxjeo}1adt`*#8sslX7_p6p*DHge zDAC~}Q;jGDI5mOL>Kn1PaLHL38LKPK0@q}@>HaZd*Bd|?o0I=XkgZZox}*BuE?UVc z=~?b=q0xTQlAf-OOuJ_1+Yq6q6~YAMyVGpI=IjVw8gOUgqyN$JGljeS+6P|1V9yX| zs!U{ppq!ud<w%ixzgqeky_$M{%M2Pk|GYJuvj1~}rCgoF{sICL^19@3Rha1YmuY1< z=grHPKty5H`B4T*p`Y^$8)rvN7$J$7J42_Y%m71r_Hb~dAa?B^f_b&Llg!U&X;IVu zH>a>99oxI%wSN_?mYl0Ajqt86JwFM2^a;|D35$|AdYfm9(_nVW3;O4Gg&CG|Y?Y(a zobsH7=H9&~*6uo)>2t%DRleuyHj_?Ub<J!MC$Oe|3MBbufW>1iX^ownCT$Wm;t<M) zN3t^Ey+O0z=@l8ZxNkQ$jtd_Lh6J2FW{M$YOxSAmnK_!M#uLRzpoe`|GZml3IBz65 zxn)?c<hqWm0N_XuZ}eNZ4s%MCJ74$cn?E@U{eW@7?2Ksf?DVKFx5+qlLU{}dqGJ`3 zN%tlDb;uxH8PiwjD3Ii~Iq$w_5B^*{bQOE)L-<jj$rf;<)>~Gt(d0NG4W_f`>tG$6 z1%zzr=4+~z8t!1lOf!-EOjX=KJF@zWxoa-6X^?a5XL<7*wRL$WOi4Rh1^H6LHza3! zmE<kl4e_tBiKO3OU|IWU1j(EnCF|6zG7-yQ8<DuTe8zNEUGI)&FTR;$=NpqhEN2Et zZb7?6fi<3<{Ei7rd){>}r9zMP%$Uf*Agz0Mk}iY>Uf^rRe+@E8*=`YCBYV_qx-2Z& zUHf0*1a6zBcCQ2ba4e@Me%19AAMbSbzQbj~`W9N1+`YYB0+&?2eLl5XI0IWh91Xj8 zo)Z|Y`}-~1SnM`jZue*u3E9$cuYtKgns0laM)Ylod0<3aB^0=nYjcixbE|?VMYa|X zWQEtRW=Cm?xr(k*j+l_oI1~WYwG7MOqc<bAe>8M>wSb&wg@q$^_|eM-1t4UI)}M{? z)1N2D$JxmFrPxtuL)*ALz<s%@N%Pyc&Fr%TNBV*wzo1sWh*k~TuP##huXd+iAFtQS z#AZ$Ec&~}Hn%zn82sF3+vR^)`SSpxYA_;8>F)r(b#QD!`P`K^A&XlCTH%YP!7`l}{ zUg<5CYKY&&tkoudItSFe1}2qp!K)i5SnY4dY#?zIN4W5jmdl-Aa=Uf)OMXwDEytqe zoQ5aK|IbowwqVu9gTsg4BtD;x^*J4&><p|vbO?>AI=)SWw_F7vX>hQG&f9ox(CTw` z0Ul<MDhKB19IZW1Q!Xl5(bG=7H^%lpZzv*P-tr7uux*?|ds3^o7Cuvbc76n!4ex#M zV#{vE4)cg?TUl0HwbdTqGXCV|*H9XWh|G6wru8<&))Kx|=U!zYa*y3_2>oPBpJ-$k zA=mnLFMu*{tEn_>bNjWO#O?6a!G`(9?dGmbACEG)3GBYAIYzIW&-xMRb2vzct3(*4 zQ!k`n$hYhwmMgCHto&up=7WJp$j^YuSR9|7l_i_YN86MXVHGfYjA}!OpJ_He594N? z`bUPnee>#q8DqdVak|Vm_C)CA{hl;dd<ZZ3g{Y=(c*g2VpeX=THV(l;&(N9)6$FeA zdkR_JdjLqqTCe`waVMu-h7vk|E^ZuqEIK+%4oS*;l@%ClWQ&K1Eqi04vpA$4?Qib| zHbEtEJIVcLHxChy^xQ#T(qAkgz7EUn3vOc0nRhC!v#G8t*wkbWBNx8odY4ew1y056 z?Iz5xkxbl@aQUvaO1ZZKWNI4{X{$-v^l8<2`4=&2Z`uVZc-{A|9hXD(ri%5Z@+-Mt zyvfWlbju@LrvT2ZooyqX)}r>#>_CZrMB-XH+@%T1cw6w*7?QEl`V_UWtE;qmc>ozi z6M3phq83tgMHIDgTkxl+!LZV_9&`ynJ7m`M5^evFK%LhYo8kyqO5$Zhr)n2Z!QQ;K zhl8}d;8`TZYBD)FA$?=Ol<owh`s6b493{7wt**`oHA6rdRoNx-Hd#5+t^=?1kLa@P zB3m!%ZYPH!191`~SAMl!V=X?2a&|kK0H%jfQPFlxfl)_lMc5Xn!f6>Q3$*q}L8+eE zJox^`+$Xy+@_ShHjj|5Y_WVl@v+&AfN7y0pMF=Z^(7gQ)0p$+eHknNURF#1HXr;P1 z#!*PIcv_c`YoYHEq13>g)UivK&QkjRx4sJ?ywvPp!rtjlP(S(h%%E*xBoF<61W`!V zco)Z9=I-dT0W1wsTI&hScQOe2Xx(pad>P)+;i0?Z4Qv@4oewW#X232PG;*^L%0xh& zUB;r8z})AAy<tKEe-9}aCwj~B+8OJ>D%ee&PkiAEZD=^2em&pZkXzTedhj2?+xcG^ zG$A>|QYQ<t55$y{X!ytyj{P)(5d7fTH0>T-67{W3U(N~#c5te3R%r_|U=1rAcXfWG zxz@Dn5gWXpQY>9<j@pFE2ks(Tl{hgb6MQ26q0bjRxP3lTuXdwS2;}c)2|nYu)^nGn z5A90J5rTfTJBdYr&g$QDiIc4L#d*6nZ@VhH1@|3LL1)VLrz?}TwcZHSfW?YJ@ZZTi z(ajR9mVJZz);-e(2z0=-#e~kdY{Nvt+NuP5Oz`gFT(!S`s-op6$~5gf;J0lEq-Mu^ zq0d|OvvKC0otknTgG48M3FpEe26J0Ko0P&<q&{tFHwl}Y6_B4h4h#+4o&O|~(mvg) z;c6Cn>FDXTE){}$axN(w!k}@{)aZWYQ0VP8pm0}ThH1S-9sN`E+lL%mdsUoTJ4OM8 z6JfRb1I5V$4wrBE5Vw9m5FwgWSreDf@y5GU<uJoFsuJgI6f|<o*&HRgAhN`dy&>jL zEtEfQ6Cd{eg5};|1sBprrd=jNpK|uJHY&JuhWVo9Pq2cR3#ifz*m4%9fr?YiTw+$U zl`h;SMFSJpthb^d8~W}T3Ct;C^ck~G4RAwBJ{EXJAF%7gmx<ou2i=qFMj=i`oTn63 zlD=`7{2aBE8<Sl7>pRn+J!dn=pnIww<fe$(Y=m>LuIxzxf@dE4HV_+jKGSTO2-lSu zO%l7t0m^5Vp3D0TvIh`2MJl@q_~rEQS=rHHiQUV0;R^8n*R*5_b>H1&%u~WHj{r*b z!YTNd&-W+MZXZwd09P5J;{OQBc4rz~jNSPL1Sd<vG;Y4pX`9F@3`=3l$``kI9YMc| zSCY2AkDpJ5Vl=c8J2@aj_qL05(0}Dm_PeA3m#>oIkbr94t&|w!x7Dnto8Uy*6ToK) zt%nEAa|$`<q&YvwWtrQ(xI#%Xf#exfK=X^9IG#G>p?P{(3(E(fMD9v5(o|EwwesAP z*ZH9Qn}EGMSZDujMIhA};!7~0d3bvb5?}WZ!8`p1XfQ?NoZ*_J&KNp;0^L5eK}o;< zJh`P)3_|{6Duwj!t7r7XK2n%T$;0P8Eeu)*W-$RVx^ew`Pbm6Qmo9cf{J>s)y;7iK zDY(ZU{7ESk?4sPQW^}_z-;C{`L$;%2FDu2`PKPa5$J8pBcu!-fBD#?akPs2d4Xwpn z5}+cZ!={wr8+>ybv|f%;?OS$EP|nI1Ci6~T?wgySGnn3dsVhCFcD;~!!Z4eFIF<M0 zfo%gFtWv|1E^iECB&bEXL1*ikZ&dmT$%G_2u2^hSVDeUQtL_Y01E$;!_lnnmmvLPE z;qJ^)DVhaAGAR!~ngJu<oUZ(c7_D6W>5@1C@)07A_<SJ=UZrU2u#o-PY)2%r<{c+> z%NO>SL6qa;C;HpyP^?!ut1TDfe+2Mh)zce>xVJMSWwv6k#IKG8w<B9iqyPw(^OG2> zRZF<qDTwBe!eaT<8T~$@y;A8>l1-nrUy|UX0Ms+VokgJU&8}m8&K7q_vQ*zYlwyp= zdD0Vu^NS*6BN++|W2To(vH|i5)A|)=4g97a>-H;QJ4LB$8^VXlhOH1SF!}GR2kkoz znU*#}(`nIGFFlG-C1=tPc$(A>e$!6GzM}xRC@hKB5r1K4=y&SQWTk*ZVn0Z3@+%|| zXVF_Mt%n9U0O=F|*2+C%BhbWUlEWd`LvBOY(CXx6?#^^3-ude<X-X+%=hr{)Er(PI z78so(HJ(8b1D&L)c)76k@Q{nI?lLs<)+W=Z3PlrYygd;S_!nTfV*sV-f$k9bTJw;C zztv&-U0;w~E02l2uQQR^SFcflr}?4Plfkmp0gt2Y8Sl(kgf|4T+VcGmOba-M)M$Fs z(vo_$Nvp_>2y_9@8Ol2T*M-V1Ly>0kZcCxO%!MS$Ag){z1@;)O6x*<$Ecdv0_#eTY zp(h6hXA=D|%axympBG9bN26_MJ^&UAOaL_06Jk}*Z}RB1$n+8&&SACmY~~;5S44qK zR}L{G{sQb$$MoslZ*9SmBSU_UbT-uov#um`p*AX~ealdDB&f%k=c!fMEmf@b_V=4< zt~B1%#eb?g?b1}9#w0yo6wL}08xc7d*_t*u6~5;Nna6&;iCTN_wmur9Si`!4lDW8k zU>w6^;*noK<D7JT!HzcrNf3j99}xfDrFfVIv`ysB_&_l4IQcXSuvfI~k-smKt=3)h z<bJ@qWj0D4Gb8`a_wS5ta;dy=TPD{2k9~{oE33m3kZ;!CX|;<idlq|FZ|Kr1miIb` zw)86?sq-)W30f20JVShUc8OS>nSc=IDFKiPduno;q##8LDqbpg%G^ExKLS{X<UiX% zJ4EN1F8_3Y6u%u8FevmNfu9|Vm-pY9?yu4j)*l95s&stX5NC<XN;yL>&fRMJsb#QK z_ORj^bej~baEgk>Ak)CwD=zn5J}r6ww9QNmN)EmqddB*u(>}&oeBWsyHHEir&5r^& za7gKJjYheJ5aY*=IHV_|JHlH&isk&x${QuWe!GGVdcLsr1Hw+8QmzJA=|c6ck!=j0 zh|o{B&d=5tbHZCdi-#5<hQq-Xg?W}vhW4rVNM$GnM<g%xZ6)`l{lA{%rgj%UQ?Ox7 zq&bS^s#->Y<@3sR4#-k%gLR4^RRC9VgW{?$%(2h1cqc<^qHJ3JApNccW8}KkAi$up zhD2RvnMp6RaJ0V)kT_%Rkq!{0_s=_+Lumld??L%3H30sj1e*p=S-h#K4UVw?+<ZCo z;ek$|OyHz6J~FA0rreu8gQGEAO}#%obItK$#~ZMKob}m|Zod1&eK8CBUd~Ih|9k`~ zgRNnAwk9hukC~9CCM}VHX*$YEUjLM)Jw#Y<tP)aN_UtuMlpYKM%EXetXE!f6l)G(( z_K37sfOl2a*bLG9=l)prhA)$Y&tpG;$>A(*MZ5~waYHZ8W+-^dA9<eb9&XBqg!*wZ z&fKPyV2XHTIh4%2RX>7z4oTAv*p*YvJ}QZA&>4<8SrWtu1_03$`WvX2gN{lfE*3D= zcM@HPvfgG&w~|g6{>rh2y%L<l=xG4}#+W6tcW0r&L4juk{>YvO97M4Q1>7#b-dl{E zU38v!*3HQNg2axLzR_FJY5W&H{iQ?sla2Z`o;7;rkh7yVB7cP+8k@Ej@{?s+*uRbk z8A*;XUHLy2`Mx_MgXmJtvGKYPM2$zjB7e0TJ=0j`BvkhT!(63Q8H)e4c13ad2ojH; zYHe~ZwOdI$TQA)^_D%U8>{;z0O#Vay2+|<Aou<n+d;oF{^Vs5>=Vk(8G?*zv@Unh} zaS`|4aptrPprKkVY}|QQhEK@9vxcp@QCsR7#hZN#?=%SgCAKY@dB}HKBPr!l_QRHy zUmgzZX`9kG?9oIvE>~7_c+%3{xjGvGUe)f!18>HkvbEpy+Uz??^AL1!h27}2BuRsD zt;Jsqp=-sf*1tzL2O!Rti_r0fhBv)hm2*FaI`u<5RIk>f18`@|A^OLat+Q3`rekKi zbYZ_-Do|6`6@E+xPP*HN{;roaf28QxaOg7v^6Q&N(*Q#63iJ39!o>e(Nyf?=v)HDL z6|&tuMX@gYt!es#XzfOOy=+pVqmZ-G$pyY`X}#`wwFxokSX5C@OY8+G{MA0F7{_4p zIhnHO6Q2{_QlqZg7s@WV?t7W!s-kw;og7E&X!k_Gy6R*$l3W6}rn7PMj`HGR%a_^R zBvp#k&ww}Fl>h!;{WxjsL@p~Kl#E3ge*O?DD*%`_rJBZZmaG^V*!P)lsyg`e|3?tI z1*IFgR@OR@`}o9Ncd71Uk!>&x(U!JyhLpgb-@Kq3w58NHn4O6INGGQ)9k~BD9PaY! zx1#dgtj^ttP&?06`7)x|1!f#W0i$t_+M0I4(k&r$U^cb)@G?r`=1WNq%SU65*QFB- zdAa=eW-jonk#n~4$4s`zUu{IXd{*E8Td(a(!$!t8n5v7UKI8s4_pRi3IcN34hlZ*P zB|WSyhAPP$*fo^tQlEWbcz2fdE91*TuEtBXb#l3u277$u;QgK2=|PcOtJ3z(FMK?6 z2}W-wz2r-e=R^xOTxlT%ONYgU$yMWzn8JD}Fh_<+2p?V2cF^HdraDS73!R!_a;Y1e zboi=D7w@7;*(TIaEHgY9m@Cy9>L}FTKkkBmpnl^ioOb3Q2^dTOX+Ve{TG#FE@NTOh zLu~hAPCwM@CH=Kj#3RH{Goz37?iEQ6@;${1n*qpedL;em?rJ`R*>ZjuA}~`oa^dB& zq2wh<iVQRTRplG=U3`Vbs$^R(PBvguNQ~GsHzhpse*0Luigm2&LsV%iN2D*lC<-u` z{1xnn7SqGmB)9IcwYYtk^-Tc@UjO7=OWFi2#btR}YYP+A<~qRMk_QdTv+Ke=U%fON zd#Z>5W3z~c|0Bpl&H%=I6^mW>5c<hp(s3o`j`EoC|6i{`3-%2_@BNCeLTocaDJ_AY zp7K82`N|?$onyhMtpS@l@Tcp=>(EPS%+xop5L@Qj;4bo!IoGWmtr|OCnZDBZ0OTfe zTrRc&dG<y9Pw%TH=dX^F5%c<Cz~VlN=n}Yz-#L5yDNy(K@r=+}=_%OcS+{N{iU!Jp z7g4Ty7HQvqaX&8=_)tv-p1nA_n)#S#jBr|SOu5W>_C@OQfDmyr8GLmkdb?`QTzykD zgw6xULgWrRwk_>i0DHuI3HC_BXU_Y#BzD+!5c&Xz2N7>+s#~`L1lhN?9mF?sW_S}> zn9O?&NP5oa-)*u(q^HvoY}b`ZhZYk%ZxxK*_LnBs0V^$3J}r?%*a?u5`ECOo32Z3v zDhf2lN%ImqqqmBUHuL2+`Yu2enwaU&Y8t5vLY!kI8D>S_<toU$Z`i6`Z322-KTw(O zZUO#}c~|XcBdiOpYMh`k1w#KhVVK3*G3&-|%AC{m>94!v9}@g%j&2%dN7&PD+QAd- zZS7VEICZx|4<+*&0+wKuY<nf}Ra>Q-4o-N}2v;N%OQ(KDM&js@yEA=nR3jzDDb5JW z^PuCX(11yKmX@@@$`8LLG#BVD9f>z7@Q3Zg!Mj=-$)O2FE|fjUJNR(~SpuwPfXVNC z#|Z&Auu;AaOk={jdSVG#7GQ8J{-zu7hix@1;EX$Xu}qq=h5s`txx02<(DEB5LQ0Zt z`oyPg5O2e(D}`*>=7t3Dcx)Iy6^lxtI~1zZ`9>ZD>=^$RX`yE~QFeYJ;6fT2UHVjV z<^Qbv<W|@|wZx#^Wtwv#lQL^qHRSHpd6f){0sL1LT;1Uo02}PkeZ&%yRkHk!aAqPi zyi-_aVvQrcO<!E5h-%pTU44}QjG3mvoiC<XoC*OZ91~sKXEpZ4Z?VrYZV;`k9Wj;o zzdE78CDV>ti`u-b<dJ6%U9cTJJu%%ryjY~!bS$!Ilcw>^*pXEVbV)3GdF@>3PHB<o zx@jg+psImoek#Ek4~{5yWqsR|sd4$t$iX0hb*ZdLszeZdcEhlY6D@edsMF>Om=(#c z>Qm^A%BrZ&e`)*O0uh?PE_DkF;(~ku@jRCVs>u6V@r!9f-1ILGbWZU58yGzLlaTE% zBt*M3%`|^S4)(ZV@m9n!1^PjcFQC*uzhP*ibf*G*diCkz4@$*9$;1Dzo1swcnQ^E4 zAzMF_TZ=7j04n2;D#8EM552|cd9S5Am}YkG{Wl4%)uM~t>CZvdi9<144!|950R5%6 z80l;}rd(2f=QAP-a{HES2l2kHO2MP4Ppwf<L3xf-IiP~Oa)fwmU!|lzOLBD#Vs<Zh z^7%*nT{pboOhZH~yTwltb&{E!Uv2Blws-aLhp}=!I;NmiKB-?7nJ3DFj+?H5BbFU7 z_Ig@css|1JjONgJy82;L(VKl+poHsFQitEX61#`c=?-)ys^0Q$PeFlYDYUaaB(EVD zV52-SYFH*S(EVQ~K66sH)T+a##F<rSAVcCvAca?eML5Umd$vRlRsKpF#fUBvu!N8S zEdf!!pK%`{(Hu>|AOEJr5HI;&T=}K|ZMivP#2CGJmtqAlgtxwlEY|OydoKoJGZH>& zdVhD0o(WJig}Bic{2WQJXtwx*v@sjHr?BHiY_)3uTQq8{i)Oz^5@ij#GcS9ELhQrA zkZeAFGym_ia^}9U{~cPJwmr*EXn2>pG-qyxnm~u0*(WsI$=UOLuYcnMmogQ(sk}2} zdPEDCzjtQco9-$uR?Okuz#ArfNI;D}Nc=KK&;jr}p#$94flP-jOS`>|rtW0-f@+d= zv)%8<6J#u4iWK-*dbkeZsS4j>-zq?46HOtR&e6+yo$YZGzcsL-!MuixUVY9ysrb7$ zvHJkzC6t8k@D1mwcAaAWE4sIl$u+xrYMB}w_kwS-s0HrbCgNi_IW4j+^8U-fk9Lo3 zHXU+LC$}z2-?YshfN{0nJ0o<@L}+@7JepNt3<Hs`;=1rsfmL5bH(v*DFFUf@-~2~_ zGe%wpRR4L^CtHBePuMp3t1BxBlmDalV@ipzV4JqRh&6MA@YB1U5VC&<z5CH1Y1_$t z#6o81J|0XET;z}5-HSNa@ecO9Z8LW^`>E-ZSrhS0qz<$J`F1$N{5#GCU(I3@M{c3& z_3B?a{l?usn4n~jip>4zS1}F*zF)9-5tw$o*>}*2nWG^>)kS)aK$rR_0lOLCsMVjd z4g`t3<ff#;GyWrp#n<^>cg=m$Biq*EU?fl>T1mMj4f34~zJAeqfIT&>JBE)nH(z6# zuIqrrDGg|LfdgcJc4VQA5)w+^>vmVK2cjSV5t!TSGhYMNDOuuOXo@4`|El?h=P8qS z4w8Kq|9o~!3Gq&9qBcAoy7)d$GR#+Qy?y6qn_%+5d!e4em^o@fQQZ^E+VcJ}&QiD; z-@T3x!R~8#x-yu4?fvpnNayOQ<PvOkSm*ReQ=E^kfQMVTTPE>oAz^;-rHb#QkUYcF z&gnm`hOMocJSl&+BRj`oL|i~ik|tovki>n<IJt0pCP98rZu<z^m;v~n7K#ovt?=61 zotbK2KLlN4uk>>tnvHwFzCP{Bd(VsgkHFhV-VaFxd|Ho`ZZClN&$($1MK4XIBaE-! zlLbnGLtTK@%Kij#{r_X>EF79@-#(6lD33^kAf==tjnW}Vr=)aukM0??FiJvFrKP(= zYV?31wZWtrFeWVw_PmGZ_x=O0o!#f0`?{~|`}y<<$39eI7R~wH^`EtJTP~5~of$t$ z4ENd_w;WagoI$M4Wb^YIDSvqO%j4X`&5<xz=YUKk7x>mMp&7929DH<97~1z|gp`vk zu)+8yuy=V)6qEHY!StLJ#-dH`aJvIYk;=ilcx%q$KJr>EI??xD{8zV?t{QHBJiqPO z?E6IAr7tgWUkZGgs3DzmK(h-k-X5Eq{RkBYB0t9}r`O=0%yEiS+Di4`U-eq=vJ<3A zHV5HQmO$Xq!AwU+t94e)n|p85|Dxk`4^b>S^=gK;fXWOj-uN0f9snGOF>KeB^4kQ{ z4Qdr>Mg$!YKQcTq-{xkx8f1C((jM{>r$5QL3|%C_6<{Lr^U!oe-O1zrPh2a-o46w} zaP}I@yj?YqeamH2MztrOTP8rF3WD43d~YghxOGc|(cnY{awI9+EG*rt<ld!zds8on z%PQH$Ne6b-ve@F)BR^lduE9LY>tmKf>7UYqF@~ihz^_ktCH1r2%8^QC%f%b^VN(d} zh7dafKj~R@O<RY$bdU874I(JndckMH{E(!f(o1~%2ZeME)rdDQnfInhFIZs=SF)J5 z$)nT6X3eoqc$wFBPTeAZPq0Sbb+4*QmEF&|oW$5!yjc5laVJn+U1V2mlgWe6RT5tL ztIE1iX)+KRQTIdV65n`R&Gdot`sh)n`Yn-`cl6tM!o5p<A_a$|_1Ytv(+-k8K*<h> zc|=K`w6=2_#bJe5$IfhWeKAQu)_LV%O<Yq<EM>&gO!!q6651>d1EdRT!NAZ-ma(Fo zg9+_dTo4q+E^8!pJ_Ii2F~7G4aY&k^qQ=LPUskdJtHiBF{_nKEaQ`j*L?XsWQPw%v zZi0T@(-#Y$H883h+2A;AeLuoIkrU-ZPQMRYNmbi@p(f5h<ky8`!Cv^^Wt1bmDXEK0 zX4bsp+<Dbl_hJ~q^7F+K5re#uC{s0me%WA;pFAsBKbdPK4V<%Dty;`gd|70jf4kS6 z3<;sKfyqYvy@BjkkAWjgoV);V`Wut$BMy^;bv<r~Ur^%Z^c?%$sNS{+2eeHmMegr8 zi~t}C=Lk+J{P?f`33jPcajs6ez?Ri9lQ4ABo1shD7j-dRf4gedraG+u?q@{IB|nl9 zxK^bhwhCz$!s>nV_Y1P@;1HB)9f<8kw>@;c4JkLHf8bPivJL^Jd^j5{8ZW;-e3E(4 z8w_JQga~P0-c=Bf=gUFlSO<zm%%~vI&<hzf`xmwks#>jWe2G=_V?VD#0JM>xc+fpz zf%J~8k8)Bh60D^gE;GGx6rwI??nzlNVDDezTY&F+bjx&J;JFA_KrI`aBv2e)Kf@87 zS2N(DN7wyBk|4yMW((D)kDHUR2<Rj<VY_Cgl0$>@IA`b4K4!BjT3*_B2#}B5{@VEA z@T^XihP>Orx<Gpt_r$})b-Fn<ZS(l-!^cfD^z{{PW?^8aEndTf%iPIcUG46CJXf}x zgJ>M%AY<4#B#Yzn_~iOom*4#->aU4XhGSb;?3_jj55NtmdDbY|tr@w$f5VlOh5M$? zunqrJRM7nSb2;n8@1O0)Q?;X7x69WhDkw|xe3G_JRgd3~@8!J*V&C4NgkyNI#*}50 zYHZ#l>V#izjttOr?)}w2;Fh;OD;ZZe{vaTfnwymQUo{H};&c*B<<=dhIR1O6)EUTX z@8DLJErWXTPecHEnEqb^@gMb53Q>?z%<Un8XpvqRpeAgxE&|mf!@p{@9^hEdr7nW5 zB?HhJ92A3sp-(5W2oEg6{@V!y_%i+nHD9PrdeKkaN2J1sJY_vwhkQZ|#6n4=Zc&<> zODE6`@EjbGGu9=gwODpNTd~ewwvC4Ezhk<tQx*e$m|XJhs~3w#B+NMgW<7x3<cZu< z&v6jsjx5_DqEhTFCCrn2gouOA=v0PG^8A3uubz^6>_L%(>75?zb}n<z{y9)7-3}Ji z=Ksw5GmdM@F5&D-1ih3e@{@;lhQlnVC;nN^7J!yYusbTfZ$Md@+&iUySB%=8on?c1 zh#cPf!|1kD(5lFY|5=nK@K~=09s6j*Zi)`GxXyDv=FA0o{7ZURi#))W%|O{7b5bi? zTA(;~Ba}QN>|j7;RAtuRRaf4=GMJR{{B_1%9MTR_ct|6~_0JsR{r9)~mI6Tk5(qd% z{7cXbx(?O5pjZ^-s4fdR==J(be(1ONcUEsKXl{?TYQv4fz34&W-hA3n$o4VqbNW^5 zY@ZyFg!jHspiPtj(sz7s9Hq;dUV<}@W%tC<0e|pXWC%=_cWL0c5|sW9N1=(|E6u~h zyh<aQ*cdroIPw=)!Zx{eT3K<+z-pPvbf<pJzC7f~>S-4gOj%$wBm`_U-zqf4uLOx! zJX#DUV*PtT2skj?dhy{u9N8B3*>Ng8IrFSH*Z0MO^yf&hGmNPgOhnl;S+yH-)40=4 zH)46QZKjB2{@G8xHyH#JMS*YYM4P{}Rr<s&*#x)Xjq?M+fCA`9A&p&a`;#omkz{be z{u!)P`=o}6GU8aLDRnVMjhpBe&|CtkRxyvtEmhfPE3$G-*Ni4!uP1<}@H92^K;Gyv zJ5SZ^ueafjAbz1O;D8aRE)q+Pr<Bib{|5R8tQ=0@^^ZUo?iWXaOdI46W8#mn;+Qm+ zkOQE)*qf>N+Aeg@wjJ_<DYodb;N>CS*RY-9UjpQ!1#hA-ia>Vt@pc(BBF|NI+<j=% z+zupX%}f^F)t&c4>XUI)U(@FYu0YK;HmM?gJQ?x1tnPazL}Z(AaQI&WBbi_{Or|6L zg|i)h7A(UITz3)t_*Rn0h2K>OT>5D4NAx@?xfnC5h5>p5{E1!<Sy4E@6ZD$uPmeiZ zX0nghedR)<Qjo!PwHvMq$eNuk;?N+{>7P;@$)Co_PfPPquu^q1-Hq1I1<gQvs7(3* zA1--<QR8do<eL5Dho{N?odlCJO<gwReBd0t9HYjysxmKesUJ`~R1{FJIj?61b=Qrf z5Pshy)8Th%;G@i)`8Yg1(ED#MXb(|(S|0XMWOzO(>)^uS(?N~&MuI;^@!Rd#>O3bR zTbjs?(z+oTKxvB%n2HZBY%mZ1Y~h<Eg+oEewF{y|wA<6O#$NCRfs*(j`+!LD;zhl@ zAj{kAy2sK=+@!Ki{5WIAN17ha8(|ZmUUqnDcn^=fy|9#9K;(o>pZYE6BI{jnx142O z`S<6Ju(aF8>$v!b<9G|XDpB&Mi=7{quYRLA7A_1xKQVh3vw-I28-DuzK@f{ovg~#> zD9LMh+Ktpj!r;>|;^W|!?0GkM@e*&y+3C1sC!*lbTP^rDa2-{uGxYgRfUz2jLP09x zZ?BB9<i^=nZg+U)2KtyU+wPxCCQ1y@(^N^O7^F-L90{}k2^^m&%Yji0S0RAn{)N}W zC8`~h3$VcAM>{aiqAOg=K!jH@xXwg_>8p)XimDO-alJyPbbUm$b~mNEe6(>$I(QFd zqP(#`49Q}3Tlr{&%w)>!nyL*_wg6=(DbR}75mQaMuM(@h2t~w=FyMKCu4X`43E%Tq zEz}&-&j!2|eMURON|_Je|JCRAH!CC+dhzDA2+>DU70_PVqy$zeJvyVP4yk1KEH%*L z6=f11Li~S)Wtl@=0^&uLU!9;h1?7j8YjCM6M>N;xrd;J^9p!@eC)?7qSgr!j4#o}> z7Wb<Lfo0vD;L9_te(k89>Hr%;sM(%g_}fo#gb-fKG-^D)oHHN(?!h$EHtqttK9@rz z>Uz;0i+m2QP$g3*fBiwGhh3Zex#}C_(Br$TP8?o~*RcQkPdhJU8SYdeh@0@!jNT-S z@6oW=@M49i8QuzpA?)9CCZLV$dxF-h{4Sx6F5S;!_7q=-=N{*~Jh|^hytC$9B9J68 zMC~bym3ERoDZjP0>}fV3MyPGm8*`9`pZ6+V)kX0P+cgI%N~b?m1Xu0=?+(kZ%U>~W zCTqf$rX&7>t6VJ%hAc5eK(G>I=onnh9WNDqY^&1O`*F)~_(EH1Jzh0j-L1&H^5D-H z$7oVU`kQ3ph(oz5tEM9lyN6WmE1v87n2#+5T_`xbOZfSshhqjk{UBlUqK&thu<z0F zBq(LBs8#g#v;(}dxWxxKAt+_++dIO3(<2>z?eWAYvaXZj9qJGR2X_n0WxA$rW*lHl zJcvIB{I>Quy=WJ(Os5elZ*sA333hl8)tcZy1Ntc=0(@A_S?zEBPcyds+xpi12-$12 z3BE7ID5&y3QAu6i&rpCmcZy$xB#8j+z_UFaH)ju<(5N=EGe4d;*1)zBfrYbH8GVq@ zkLma{CXOQT%1t_0XAafh$e=eI$|FQLsM-k*Z5|X#Y`|+N)M?CkOExIX@G=eOlE*h@ z`_${gu3Xx8#t&MLdWS-;mb(FwU=U_9hp{;KlMpz6_5DJB{#|jH_Hv>&7ks11rrfM+ za1tEIE9WP`#6$@+GIx$CDeWCK99ro9zLK3I7D-xzF-LTv&yM81nEvFv>^LTVFnQ}J z<m#HdIs}qVpF+CR;xzHmi$dkRcbhQ5M;yBpWpg*@%p{fGO4eSO^-E^KXQysq$@8yv zYm098(w!cD{lj-_5_VPxJHqpXm@MtOJER#weyR>Pa{!0DB`TI(Qooe47l|<vn&itH zJ1V6TXIJG%oZp974(8O%^POUu6Hg>=@Ow({{5MAYL*ic?mO99u2|+q<Ivhr^hSh9t zB9d*;CG`zuiHqYTVD2k@puy_ftfR&tV$_TYASNUPZhaNYeA6^QSAU@^#51j07_bsy zsbUV&DUOujY=#%6ibe^9{fx3pTDFshbayZFbf_{A#a~em5d7)>mtZ5X;(?df%le$R z8b0MXluX?g=t>3{VJrLkfJf>@(tfqmgX7844I3C?0nlwtB&ex0gZ@BPvp@1a>P56L zlSp-h%l%Vf&6dheS!-r%7T5f{W=FOl(N(DNcy^DzQyd2j20{80eDmF;p<+w4mWHXk zVbjnNxzd>^o0nBX84#j$Bic4`anQ(X7%<5_{DTx%{XKQHCCWQua=Vm0A@rID-P92| zY@>fKIq$pS&?<s~>Gaw)eIjvew7R0+P$JO#m6s-HDRLx~Za`@Fq2`aZIcWzw!YDK% zsmd(fw%zI}`nff^Sz;E+C0Uo``47=^qq80M_Qnj87*y)Z-<N^RbxV1^!4>Keu<&rE z+S-d>1l#cByJ5OE%m18za&hCUcj@z|0z-FpB$)q%T!+GKTVp+Z*~W5N1p)#>!3FBo zY1$se4e|a*rmwSFN6>%ISkrk$%|<^N9+4@Z<vbQTWd@Iw+PF=%T5L+KbqbcFshV%& zzsKjVOwzBCfJ!H%AoYDk72!fjrK?I0m5d906D|U+UTlOxByXXwaQcg1A)HBiui0tt z`~!;GmkOOG-EYP)J*L+PJ5YK2-!zLF9i8<H)C%<&@%q+*)EiBs!hyH<KB%N<wK3e2 z+&@9jvz#<f^9^jE?Z%|QN$^vw7KJHPFiREXyxigBfxnp$F3Gy6=rO#W;{GcW8gf=- z(a1nRE<snon-k&a841qScT!!u5O^C_<X{p4OqS1%+q*eLV-#MI>COY8a(s9>J47p* zPbh3S?&3?URF_n!o&$%tiG>P{uMQi%dh~)M<^+v4;;Z7fQOOt6b?^6uB1=oPThGfp z1}mwEAqq~U!jYgJcxg?S3I)V%-mOnhpI`UwH}{h(G-*my@j#T{aDr0}41IZC$`LR% zxPeqQ4M%(|Uw0~<m;GhyyyhHfnnu5Rmj^xDQVI^S33Lwo^y(2a;!{2uR%i5mnx(3B zu0U*0M8NjBd06Lf5ag7pZ_W8?Ao;#M17!*<6MYKpl0;pT>4LsSTt6%af*s$07)?5H zrmsYHXr@^gE`yU*;LFV@HR`a4O^fa+KVeh6yL^&_`B8s<Uij`n##|tEjs+Jr?dUN_ zDs^K`DOeZL^s<V*U{rF^SsQ!eC6Ko*y<O8%YHDHV|8$>fj?qE1g3C5Jr8Sr7Kd6f; zk%&ogUrp?Hmo4ZhV4OLA|C9Mx&sB70viz*X2tKY6d-p-hU*+&t>{6oenFjl&^Jx8m zafXY^lRAJSU@&}mf7-uT>`RCm*F$=XZK)Vf0$4~!&Z9cAoYjt$FOBo@QohkC3=s7I zW^!>@NIh@k;+CkW=pcWxXR5MYW6jr%OQ7iGuTkvWZH@PXeU23uK(cfls=fTRJeR{{ z`dNdyEDXv426Cx4<efJ)Ks(holuE;`$XH;p$xJyFt%J2sguwHaC7A0FO(yLs4emi% zpWY`Fa3^Kf;#p2I<};hm#%^Y<P58sU6kvs55*vXq&tJ5Sb9DN=mdv@ZXPb1^%Gy9) z{Y}j^*p$lH8GxCNbKGaUmCCxt6Y=|syk}dx0ibj9zsE%r1P@sTvMlUj)jZssTjKmV z5(LaMfK4;mnyd}HSqD6s7opjY=jv$}+TO=o9fpV8a8djLP~07os_KV&sf^oilb<5T zrv3;m1XRqQ4NXU8Z*kcQmhcNo0BhSzw3I)OiEUAKl2xe3C;0sGtRkCtDS@tvCCW4H zNpgnpANk&MmRZD<DEobxPNk+&YO{~H;q~7II@*7+M(&$p&NotL%3Iq-A2YOj{rAa> zMd$9TZc;C(!UB4Bzk9X!Gi|>|0FWY|L7Ik)xvYNv<BiI&X!j#>%fIEQ%WFaf|JI~Q zhnd+yQI%}$F!$f^5QDeWOT7Cpv$9=!5(|H`YOgm*|729Gh){nevMG6Lb7iszM=R<f zP0A!+xba%h7VWBlwNIw`2iqQOb~UI~jdHzX&10wMhSy@_lMGxk*c`k)yrqYGH*x_d z%-N5#xv8SQZB@q%!&Tb9cOk%5vck=cX-(q`fRwyO+I_RKEU>)(VcJ0SVU(uz)``%@ z=br@=|F3#28FR1^{rdAax32g&4uU*vNmx(HY;ooKAQkr(r<(Q4?3`0BHuUtYLY*sq zq4!OAZ24`kwe6Zy%u*t7?zy{KXKGxvzc5&%>|`@L;4Lx>Y;NN-eH1L!3=o8I>`)H8 zmG<d_9CHNdn=+TVHAB!kfKM|M=Y5>#=}{WcW_|&xy-<b9bcw7a#vxni@))1e@lc5| z<QW&_0Q80MXSIl>%v3&McBWD9gN<afn;@29Q8wH#x4%N&R!E34Hpa^QPxu|#O%7*0 z#$tr~r{-r5%XRdz2?52999fy)XApP=T?T$1qEznxXwFLo(o~gCn&zk#bVgJDybb|$ zAZ3-Q_!WJwPq)WznX?bS;=W<+g;%a}3hlIh`EbNRe-WC$d}!!MuAr8B7Bt-S#fW@e znJEqU!8GgQm#jpYg+-Xw<MLpnSHB^hP5@=F%wq*4)p7q_t0MEgn@G}1Ngkb>p~dTS z=ej@oaHh*ylzcGl(tR2h<9FA!-t`+8DqvoqM)Mf{r&7k}!uCsLnChc-yW3%336>$` zjG>QqK5L!nu+b1N7A_sJcCteOInR%{nX0PXWoQ25QPgwZA_9QDb#Uj=3k!*-WBOz( z&qw$eg=-dCA}*Q2#*x+#xn(Sns>wc3Wbd#46dI0__IalUwv1^8R?gvIshVGXBlfIU zhz3X@bshm#c4&{Q{Sn_*A^m)hH$o^j=Fjm*RJW_)WON$$!@1gJ_lCro{gF5ab{>1! z${rk$L;VBKG-_|IgJ>D)^N!<egJ!MOCTBvt<%TQsOx+qkJmqIIY~(R|rn2JvM`CZD z9`o1GLlCL-A_WbK<6B~@#{RqqYCYQse^wO-($NoKHr>)G7@+!s0ftRMWkhl{^qBnX zT};(J{7GwrPsR@rhkGH&%MxGM<GMMxSsf?TKC^MmpXHwV%m8zLo}GUCJ*vxX0aa4S zkfz5b)w>Y?^yd-~VFxll`eu|*`C}IvArdwzjSfc+E+md=$ySMg&Mo1SSn|LjbpV+( z@~YdZ#`4SA6%PXkYO}urzst&NQ@DZI4?VBoPi?9nyzSZiEIRp=a=m7rWfo({oB*ak zXb_;*xE@kGyhX)-FU&g>(BT-l+yC+w$k<f+l<=Bty3I^F4O#}ICzrd@JEeE3;c7`= z?0<XQu<Eiip3`h8EuYm3@hT?%=<XTo3CToGtG%>kerTR%*z){)g92$}#Od8Pw`9A1 zEOnKv(|`m!xQVS+kL9}NOM=mVjSNh~tIH*q-HxQG1xCxs1mD)}1dqI|qPFDAS+W=? zcdT=d*F8@N8d`^$TLVtfG+DD9z0Qt0lfmxN`y;-cm3rL&u!?h+t&3yy7#Z6<ew{v} z($E73QvG@D3nK_U$7<rod7>J>&h+)4Cv4n)ScgHpq|udkdJ=k9z(*MffZh2oi)i&V zdSugFsYg+t^j7T%x898mCu3=Mdckx@=mi;+$9{tl)wcgMe~FkaJbZ}+)MO+pZwY-D zx>cHn37pD0EsGRlVg9~*R~LC+c!}>w|3;CdB~0TMfb-lZsSmj50ajWdu+qZfXbahc z;=(RSuE$;v%}4_F#!ao3X#654gq~)JGCDnWdGi=%*$Q}$JSy#}7!w&Zf2fK)eC$D3 zA{jcfz*{Nnlvnuh>2Fh^0bR;tLhR)^){qTyzhfY+Ki1=q5bhwt(+41{>JUTDHRm(+ zI7e7J6IBR6ked|aX$OewYf|~v3rd^#5c~D{F7Y#>NJ_+nk4LJoz&Yi1K}X7Yk8EgQ zaq6$f{#yQFTXvu9D0^R{WPo!H!^HVCmjXvsgN1irC$7xxnDKcXGbZw!30~L9-L9&4 zm&OZvCD8C+T_JBsQedvNuQ+F4r4BT+MUjs)=7)ltP+gLXFQ2gyDzvKd^=y9jAx+s^ zIERI(+QbPw7|I&bD4_>{iG)d|033>T>q`mJQf9JEI(c&8n2P_^Z@W4S<fIue5Q*9R z(JF3y=VAn-g<dtJzzFBt03HC9g{els6jE`*uUgTEjD`hZXP;Dv<e46^voyG-m=&BR zQ8KXP0cg-N?v~W&&z`{N$KN+!RBt%ElH-^3ztra>?@0~S@b+(^X8(qJ9BXF{jVRc^ zJo$mQEC!XTyzJ`Zs}MU_w>c)93=P@t;ww_7>RITYNUz)G$i3s)>xa!w(rbA)>i8?~ zdmBe^T`3O`w``W0%GB9Ac;-wgJ)_dmS99jL93w)y5xCcZI4W7p6U7Xe`gcGBbPkGr zkKRLkM=<%zyAz8zzjZtnE0Ul<APto-6TYi#p}za8sv7glW8vx`(%z4~r&>zauLl5J z7-h`ervtj@R}sO<_?<pg#9n^>_aYvnWk&#cPD+&wrqDfyt^sD5qWFbH;zw_Ux39gj zA`T?&O1p$iH=T~F*dKVSim?0X$sWiSt|a!Fakqy?gUN>Z)}9~n7IKh@ES#5^Ot^sj z%D*d4A(<|G)TX?BZ!A9UBW|FeqdmPB!W3e>Veh<!7S4)WTr3`Rmwk{jlIu#5{qtWs zY5w%u|GqOP()(2a@|#<y<FmI1Q78ED4tNcpzyO6##boNw7C+})iYx}^yW-H0=JVS# zBWv(KXOSOyt7WZ`AjCCrL5lQL?1W*3VmTb+j|@M1SLG9+k=dreyw2Rm+7Ac}-HJyE z-L%gT7Y?Da!kQ$5K5NOq5wWl+x8x~XY;4e+Y|9)Xnlw}TL(9S|bnTc|<c$k)#Y3Wy zD;BBQrNq_@iuOsHq`(KP+yUeO|0MbnU_z-)jn{^YdYuGUA(!i}XWK3m*1v7<A-c?3 zpOdP$|33aqY8v}@L2A3yJ>;bPrSs`?HwM1B<%rP*VO3QmnMzMB#&G{zDt+LN#<s{) zF$HZ=Ai#@~?RwgE%HXy??+C{{iu}ZxmE@-@Kw7sh6+#AjKY#e+%-xgY*(&(N_Mu$& z_U3`yr*0l;GlT_4bG0eDXuPiW!btOkS$r}Sj<s#+{5(=4@h(-E?G#|;mRSK3PfCgU zgo{U-e6%yb<V;GNUU!~Oi|4GX>4$rdn2lewC=xQo61-_cBLEFq{>6c3l@YVL5cAit zL7wn6<R740)P!g<pit#odO#btW4xKKea{O3XfI{ASnX}ydmF!{YLlavV&C%5qZgL< zG)W-@+w|Bs7X7jX9(=zFBR?28J)7MhdbQn6UZvsTMXJxfB=WMaR)EouJikD5yGtdQ zN$lZ+t-6PIV8fDLFdf)R_Da8?bxYfv0Q1Qro$y<U%qi;-mQ!g{!_*|U1Lk>-EeTr4 zRCit%F0jhj-BuY`;v>#>P|_GVu~G(1c0_>;rs?C4z8<Gz5%&DAhk&s0wS~GS<Y0Et zyJAh#oPR~p95i{CF?4o*t|cSmen9=#dWuYnq^`|dd4OaUfZ)CPm%y1TEhup{m0z%p zB}gu4gYrt|$NTuPw_Pa*B@P|IYQ}~1`s}P7!_rQWo<tpCEzaw(7|-?ZzdTOqA0gyb zqCU{s3DQ49`pXRepc<-cTM!Ba+-(kcIxEcxiw>jZnwYoR4}vR#Q<!5M=_#zrn4D%x zB#Y8aiW7b+wTo_eldS~<2<xT1^n=L!44yp^1c0sQYE696A#e2QtN95A^^)dw*zMiz zt>(wH3E{s>50d&Jr&V6v_cSF1k8SuegT<c!GtE%fXcJy{N1RsCVD)9AwyXsdOZKr; zW;ZPm-&1sl(M`gWJ>Sg8FpAiMvD`A~>W9X?^%TVr^^3OzR7Y|*{u)G!t6s7;*57Z_ zkvmMai=llTovSwnDDY@@b?>b%AGQ1Q!I*WrECICJDJTvMay7p$5p^3+64gC7wu6YE zA<IA9&>Rr7N^B0yA~!Z#e4ANlCHH7~Y2o|AK#e=&xsROw{0&#Tva~rbX3=lqYRL1I z?OnN28@1;ZXZY^dyiLVj7mm$I?j&P?Mm@hE`Lw)}@0O7k&Am4S++@D30Z=Qjc9WS- zLt|u14*RE+1Qi6hRQt<$>4a+~a})0nCXGTn0c_<;S8<8Ys?_1&N&Q^U$Pc|-)LDLx zzUl}lMX9DB$^WYTYzr@V5|coB2>0sQHYu=ajUyV8Th6Dgmyp|j30B61X`>dsc|Uzj z-DWyGkST9+0HutDhVxvQ7Ofe>Rt(>Wpr^=AGTKAUu?1R)M@q-4Oh+o>P^;H^=$#aD z;epItp@qb$Ls+T%Y-*0wJE(4YVV=k)8`=F!7V@ybLXU^1M?}$zNg`$NdyrM*@NcL> zfO~EEaY270M<aUk`@BcK+dH{n4s${@68KT$jq_IH{O=sC>V=hP7dZhO?azx`sT>rG zPlIk<Ft-<2X<uLz-r{?#rljL)*t*P$+vc`Rz8m&e+7UrO3xO{-qn!b2ulI{H4;TS% zTO5iX14IQaqH~gwzB@Av7V=A+Oin~B{Y{b@W6q{p@*9IwK4Dd*o@(0{`6o@l7+_~_ z_Wbn|^BuX?f8@Yh#~pCy@M}ppspt{%K3L#d&inc-!W?k8oM4u|#%u9xJv(^Gm;uo$ z{%)WjEnV;$qlur5bGK^_xQ!G;E%~D4=9^gOPmv@wk2TDqV@#|><r61Z6+l3!h}SR9 zx*>F|FUdVAj$JR1dPu1EKqaJxgi6&+3y@xhRU)0{;awbe?7aUlweFCsS6Da$b;uOm zz<35ERWy$>@fM4--N<%=f7x1!o)Tn=Ccv6LKXL}yFR05o<H0u`gx%BZQnPDOZnuc5 z-Dhtdl;OQS;#Qh-!D!YZ!d%EDtRhaoqv8s2dv275=b{XbYk5}$0qca+kOqpe(+S0B z|4<tOO9z(kv-Q9ix}$E7Z`ec@S(A^4{1Y>pj=7F_$Cng6=jPa&@}{pQMr)hn5YOIa zSqD$aRaxDncwtX6UX%=NzEPkyW%Kt9d2;t5%LhR3f&4u_9B1@lSq3S{Ur(fqVKGyb z-~j>LN*>_0t%!=tenN|bhKQ{=1gQ7;iOT9DfV)&{ito54mI4MSWi!mfkk*HgU(CyE zOOZ{@Pb#%la{K?ouZ>`oAPsIMnvOFLROJ?5M`KDEP7a=-F7eH`L(M|#tdGZdaty=N z=y3ywkQLwnr_vO0UH!(7N&ca-Nk|6N^199tQ^V^|i+h!IU9P?G-SCO(`S3Y#KoIZF zk5sGFoK_V#OaQe25&LZBUcZ@sFYhPt&rly$>fvD0i(Qd?k^H`I`5R4${vT<)n-MDV z?^p?4)|q9~xypGDn*Sgln>pOEN%ps2PXo%@varmjc8wNut7^h5tp@;}0n}8@S$jk( zx_jAzwdTGD6tw_>A;io-!%Qq(A~ImL_OJ&aQ=tGhs@p$>PU_?J>sxPs-)!17?Ar~; zIYxZe)&tlRRfs?s0B(>Ud;bm0og=}yu2IZch@)mS1Ipn823&T983z-kY^u4-G5->n zUCBCzoT3Z7`YP2m|3JL}FTwJE_;O1Lnee-wrw=9zWQKJbhD?_PE?knyU{=E+Z>qu- zD~T~5J?2O9SyxqiiNx%Nq#QHMp6$D*G~IpsF@TbN7qBOiN1U|Vr<z*SJMVIO=f=r( zq`*A?mMpo%@xC(l4DAkEh$8@qW-H6M=?36IEmfrEQNnqCX_@@}=`7|sFe1B$s-xv_ zE0ylMFBPCsWL@)|_47!6*Nua-;$e#EvUrYp%D2}0kr4i<@DP>@>{5<D?diC#N-%+j zqPYqWWh)fQoi-_i`13yw+S-#mzXj41*9;8jKxFL3>)wcsBk@To1F$XK+@62gd(IB# z@<-IIV$x?PGPqx@8=bYyDSl-}stkfy?l)hVSPGlnBsW`>`TejfmO=w{V*fmx^*gb= zMppojisTf&uJj2^T6Yec3h|Ys+AJVUm7T@8wYJ>1pf!DHm(DMI3%j?VhvXHjkDfR0 z=NGJasL<Vo+p3xXxdeMo?;T}vaBmvN{5g{$51T@rUVDn_iiP-T|4ZQVerbn=(=z{m zW$aU&R%blN9J`CjzXY>1>n_+_J3zSZ%=<RuY{eqs3C3PigFPjMMG~SS&fT(VXdTSE zmCE--@!MHk7;JSt!SD11S3B5hgHMu#<L%Z2vy-l?*}1M=a_|{YIq8}$K2YBT*S>o1 zEl<t5Hl&6{&^||?_0%m7wiE$voSp8`dqhi#6x?pcR)rN2wF)T0>{+B(Zeg`FboMT- zjqyXyMfct6ya=}Rw3kr>z+z5ZX7eR$C7t>BDIn=xA~HV@Xt3u=ry@<7+H}uo`hxqh z)|4%m0a&f(nQ@oyUXg)UA|jMWHDzeTi?nd7(`&z5Ex>GadiCZ5;B$hWZiq>ruw3Kd ztIZwGQ7cJogPus`q%m?!XsgUFW1eiE3fqtiOW4&;&<)+lHGIhgsR^r8pPB@1aoD|w zG6R&a8)Dno>3wPw{v5yG&PJFAL#m0J5`>V@{6&mm366tWGdovVBXK|(JtZe0(>f`o zKhanz>gKZ17l9j+e+&pNFj}Jfl=GS__VfeQSG3yD7WcE#@A#fK&4r1-I=y-JcHkBK ze2V7o^uP<JrAD2jp*3UL(<9GlFy~ybWkr9|7g~LAz4PH{Uc(?sC3C{%-9t7*xo6Bb z=<<`Y(>rhnuFYyD^Saxry%(>baP&%P&FRIR80C}+ft=MroH!!pI2cw_)3Rwuz3&^b zHAiQXgbdh`v(h{(FEKvwyftUsrx4a{6#-@q`7-pw-BPN<K*P3wJVkX_+776f^ntZn zEfcM6#Auy8bsVc{794it1UfrK8*aLAv^2YziIy1`1#OUCp$g_wGH8_Pc&(CFJTX^Y z=zMeWsH%m=ag-#>yY0;%s-aYa(kN%UqMmdXSwn9U!k(ItFYL8l9fniZ&gKcvKK~(? zI0!Wmk$2X)bWccg+E&`Rp~{t~k0<aoc`Yj-JGePQLe7iM;K0O&AjdO1PpvK_?|j>Z zgZ|NbRO>lrrNVN+W0Cbue_^UE$t;=V$yvE#s=Nn>q-h-A`7!$`j8%I9qxqV-qiXOy zivP8G&9qsyRNw@sKfuVPx>M)$-YdDRaZ*$9YJpj0Cv+C{ioY6(eyrFLL=^%musoHn zar5U!@E1J~PF7Txwdg;96lkCH{y~n~&E<@|5+;59w}b4uK_LVH12GU$Erh2hzXEPX zK3tpBEhvEeP~&ZlBQD4NOhQJ|F98)$lO$1Rl1?f)M|f7ZeVX(~Xb-%}sI`TdSTq;} z{gRJ7MC&N`X0P<|4ei<!Q@s96wC!ac4l=4*cl&ZbC@5A~{5bd`6d)aD8yE>G*AR_+ z3KrY3Ctk<g?C~szTl5<x508XCgni2g^<tNbmpi~#-o#mu-M6Z2&l5I_B9te^v6G;s zvSkKt5c8f_R#FNSP{avgjhH56@+Z`Yyh(hRC9zQL>xQLlPN79<QEQnt_m0{PF{Xes zjE<9cozZSzsOpT`vih*_`%p5;L#+P7V4xSZ>QPPdE@`af=L5+QJrZ6FSF{_+r?FO% z3IMAC0<0BkAekoQ-m~QEud;>&>k%OU0z?~YUAyQ1;Xon#5xqHSnt)apG~(}%fUQyS ze`3urj6DI@@2>D&K*tguv2A*r=I&$Y$nruUCi??zhsNDVMd=S0fw0FnwTxnb?XHN4 z8%mtNSTNP%qub-&`)N>ltahS9{L_5QM+F0_PxD?3%pLlLa`wp&o}Yi3{UQU_UMPO= zJ_uVPsyZtW6ow{!9?4xV)x=HLbM6ibA}sHE@QX0H7RL_<FG&JdyG|x0_O;u6zTQpb z$#e8Pda0-zKiyU^4j|Q}YoFDgx_e7zdkoBTO?$kgpA)C8hvaGaLiKk;4NmS;<Y@4T z@6SFF;5Kv~8IrrX)atcGOBE#U&6`iO=>`5kfcKgKMchKLq`R#WcPf$zpZ<c=-IHDP zZupqfMB*he^s(PLK#c1-y?(q9^`c)eV|UEeOknb`PAc99gvxd5lGBc><`8lg|6twb zn3?=mM(TX<O~=gFSpgOg`Fx4U;_s@%{X#P2ce{CJ11dA(9DaPHZD%U{Hb%D%5!nrW zgS}}AssG$UrwDwW!=8P^*UO))Ug7h~&r=$y<6a^)Zy#@hpyJFO@T<MneX40&tNKDm z3Gx;0{7zi{aycJERTiK>%5R%=xandB3<A5?1s7VQXFkWuy=LL-tl{|u=AkqF?Z(`a z@<+)6*bJRDdY~2v2^h2UJBB?m`^L4I5Dw?MSrfViZ0I8Vj4xBX_F#fHK%QBu@KML{ z<v)2e6!zN(yO4AoU-vBD<%6rbeR5KI=KCaI>8kk&u)_;u6?&Y=aV-ZrvcUYtZ1fB; z#*yseLfz&mas6yZ-H6X3_z!b?L!8Z!1^a&upQ2`yB8U;(T!nzOOJ!F-7r2MjJTn3g z7&X$1K<BR^BB)x7uB3?;N2=xMh@h>V5)<9YPUu?c*d;D{fO70b6<tOjmpJvqokcXH z`($ywzD3TlGqP!>U}d;;lf4;er!B?Vm_;VI217VusUyF7y7Ifki(Is_F9IG*6I?;A zb!tk(&VB$#5#m|6pVHb7O+jK~fcSby9D`oTd2}K8g=1?fH!Ei4C;D1yD&x$1m{ldc z*k(!%DuW}NRkv1CoR$!K5}c5fDFZ#mD)kagM>@^iihDH<C_ts`YP#f~{|tC<tHAI3 zg~Ky41kAr&e#EBAaLQ(9H!d$1i|?M@Ox<+Xdzl!PjA9Su1_oPSZeD}4J{&o-`x2KV za>OfdY2R8;(w?<h-`110mm7-vDGR)nm6`@J4(w)TRo{gbL&dQ`An#76Y)E(Z1jomN z3UBh7QdcT`Pu0ho(`#W>hg<e;Z;S|3vSP{^0Qqi0(OW8#7lTJDqT^Axe4q!YuUR*e z)J&Deeecs$!CJ}WBhVvP!m&j0#I$lIpAekEO~MS6UQ?V1K@{`JDxWjogR+)L={`~2 zTCO1E!SqG0=i-4gkexkx$j`t5^3jRe%geyB+4~abXsb?6!4;?ZKWBv+cXjKE#%|sF zEnko)m4*kYW=4^xl~OZ!WoY$M=y+L$@Uce<6fmawlu`~wpjo$N(DP(1Qu+q6Ml0+` zxXVkN{;p6RgVKr^c_Xn^L31cL*Py{%u|>0ew-HHx8s<AhPLI(xK6bBdp(`U>yu0%F z8asy8YF1;*>#3Wc(CT@XmH?FfE6F1q8LMAi_&FZ9lVjNlQ$r(Kv4)(<G~C+PNUMRW z*_Ilxt7_GnNz8&;uw0bcH@ro;=l6tfZZmqIzV9dOa!Fkz#&=BkzO3Si+|xctLp^~B z-kz|Tu{P|eMc#4UEpu-|&_}$I(6_8g1&pZD`=-xFZy{iw?0eaZc^KtACxt|I|D}k- z%TtVU29eY==PhPGhVQKYw*P51C!Qmu|Gbzh;%gNTLX>-1ZLZ|p{z+7#^<=!BGTKC( zF&yw5y<O0JS3A&pp<l<k{gQ6BJL;2LVEVrVYkG=0tW=o?;qAB?^4iJ?#=fDw0HSyQ z-%Ke*HjUTzWmnohod!{J>j_Gpo|QCaQt>G4+-YSDgmlP6w4N1$h`ijqd{BtP#=VxJ zn^NtRxj~2eX-vd-(hOWJyCoTLKO^mA(3in@Snk9({KY7S%`zuw1h5+gr12mcWKvKP z^iTT}bA1s#U0hO>_dnS3eWxa6xR{YoH3RgI29CR9A>kPh&2q1fSfZ{&P9{V3YYO94 z$1H_363F>q?!1)&7evg?Hhks<duk=uvP!1pb-^NLIX;$~6shFvG~R|kloLdE$bcnV z7_%y;{k>KY+Zzzs{}(u_MlSu74ta}x;>Y$jt<0PWU<1E2p__S1XU1T1K+-?d|L#9` z!%1)b2bX>GoyjLn%W-UJ<q;BCJn&BjoewrCoYifVck6)$TpO^FzJp9&ev*BCrcH1! zR{VK>*EMcN({v53T_)Xx_+WPefK7I4sik(3g`zbi9xRAceLTAOU#0V-MOahqVNEA% zD~%suTr>Q3_Kh{8j=aH+SQ~e9q034>YR41ur%R3TlV?>6-VT(x+w{*cF;c#qKasS? zJ9=RxcAYRe!po~B#34O>V=fWo#>4accl2JqOcy$(QPwz{i_7jD&UAy^_ncWVA>2E# z&gG|M+n_zgqU6$L-bGO@xn$g@A2oj;osu+a9KMc1HN8SPs$|^X85>Kjt3P=FOtr36 zA)$Pi&n>ye#HW<&OZ7e;<ob@RH@&TE$R3q~?H3)hrGrCeDATQSi2U}oI0lqxyb(zv zZ?q0sX!XnFO1sQ5mbQ+j&9qbOn)tH5M|?fbhjxelk_wLccI*-1qT2tQi~txrFHYe_ zZFi)n>Yq=m5W-tZo*~{a)08cJc2Xp!Zd@PV&SknhD;b@uYeab@bdGB?hj?ytw}hD3 zI(ErdBs~+o8kAVi4LL7=oEntjT=nK<8-1YXH;L`NBv%64PsTQ{E0i6`3WtyW-n0)^ zns|)M6D$a1N0BNl+P}m9C16K&2{X(Lh`6YXqsF_fajj@b{z*#XL;a@lYQ=F`Kiytt zxxUO-3hGPY%cK3@dZ#u4A#II>jE-v}Sw4z0mo%-Qbw7xu>sn-~w38Bve7?8QyXsBH zue{<7P{ftb$=)owK31VV+AmB&?;%6pL=KI3$1zwKFqrf6#gh`rUf=Yc9Q~v?JMK&; zjXo?pEyomv8gFaylCXo~OtrrS|74bOEW8)VzC;BVy542^SddApD#jKn@*+A^n#1GV zFi8#wtEhSilv1D%X^6lK*!kJn)Im>p?JRR4c+CKV-doB_As6KTmIePCe|mO`RiGHg zoQx@^KI6+ml8`YQucLsCFL|?ImA4q-xJ@YeaePWkRb@(FTMG(bd%6plr44l1t#foc zSVLvXXg>*}cGW1%q>@vT+KW|KORH$_W;zGArvs0dI0J7v^`}z~p~gvB6x}4iS&mE& z3Jwh28QD{Q|6SJNEe>=LPKV1p7)NByxQ?{L)~{qy+jErz-R4@)mCjPl*xAKd@-E*D zG83yY9Vu6O+`hwb+)tWvz3+csYQ`HGR(oA(m$*R=Ef~#0eCh1>d!?V|RRF-j{Ju`6 zU8PL&sczq@`x|gMoB37cvDdmV>&5R7fu7PEG5Z&*Ns`VbD!E_KVc9ES>^jAiff!a_ z$&L@T4qI8idqI=Toi6zi4}1wN$#n!U$^3wX!=C41f-<l^EhYHy^Gvv3Ic^5g+?m!{ zlG`wcpGnu%!RJ>zB+MQgE0bKvMGES3@FEmFQz^{X$9})3;V_Lj;`~2M8CLb1$H8M@ zQ2eVUg#<+YoeU5Rmxe2X*gcQWKuJ#pSg~MryMf9rT95}M?6*({qUC~?Deyk|K~`J` zmb<ixu+H<;qLgGaJnEn0O(w|ID(IwK&rQl%v^du%!zz2Dj5IeK|Ao6}Rr7;0A3K*x z>S;qt+k5d7?CFo0AC1v|?M!uE4Z!Fl#Q#e24RKU;F_Cv-#n~3?F+7PI>3O%NrC7<| z_pF&4CqK2#1y3!<<`>}Gi)I=jpP0B7w$qus0B)L=n&_X7M}!P_uY>8AG5GMOYX1x_ zPW5|tJ6$p$@FlYHd&gm&;L9KD6)%K(76-o`&0q5i-xtFL(M!n9Rn(;4Jz!Dl;!cs+ zsKLqnOE6Myd;8XQcmu|K!(?0h?q5(E9KBS$d*^c`Uru_H**J9k$eR8y4tb;l?rWf| zX7Tl6N)*&BXlSr`i^>O(;L<K4FB+PQrbrLy24hJjE+he_%L$s}A>F5cjIYx_+OORD za2;X(8!Wf_&G`}4i)5G-$5PtDJCQScz0m@#R;JS{*U6%HnjE-)Tz)^k-Z172mcDA; zn<-yZHzbfWX&0C4LF6H?Z${j;d>WK|8aS{K@ts4m)&MmaJ(pg26C}h^KgPXA(j|IX zh%();%NxT&I{zgworl};xf+t6eGInt%={3;9N~V7PcLwD@n9PIJ06+VR#_{xy$R$} z5KX2omj27sjJN3V)GZTu3nA=WbjGmKCqLC{dJ7~y-s<lOBK<X#oe6xoi`*Q4bq`3$ zC?6!}9sue_5MIeq2JL3}zUt_;{Yo0X;lE^oQB^fdpYOf926x1qq?(WaB>>_IT<KYH z2N@=e?nZqJlt4m4sCG1h@NRxVB9AGOgZz_Ch&s4B<(<&sd9?3*4X}Jhl|X^lCGgMd z`+0%5QyG!`ydQ?y8f^qlq7nMwAKWZp95AcRd^wBxzF<#RvT5=?C}HDwu=bV835;o` zsn#Vn?Twp0#9E0%U;_jLFxaA;DW3<=-0i3-6IZU=^?zqP1^b`Tc02~x3<XBSl<M^5 zEqtLp8KM<>`L&*da7$61J-<hwM%`=4E`vDgtuOW9G;U-cpo;<0Yq}xE;?~fDrYK7r z>FB*v^j!H8qW)^_cPja10TzJm6sXfyc^h$B35u)Qiz(*XKtx%gfF>T{?MX-19=;mw zULSBRlIwfz`u08lfK9G3{l5eW3Bg?w7&yzdtNuSq6tR@-)JZLN`Jp$V=udGA(H2vh zroq|6ev7P+L&JLVOoNTg0*>~nIALPy%K8WbC&Xb{HfQsz0kAXEdI^~2TGGIVsb-08 zKi%>{tF%~;6?!Qn^1!sA`F%ZKp;@%}F^B!q8@!C~gzPf4h(ONShf?B)=0tl(35UR- zjqzgjB$cn-=HX9h&Q*JajB9m~|1+oPm6>O&7Ml+32^38B54P#gWkP2(-ZV{+EIqX1 z^vWLjITFpuA+QFl=aPv#KdmxmO-O-9UEF&<JZuaI#O#(XDm|$BG4#{Rkzr-y_JC9Q zZqRT2)da)?l$%&rXXQ34#$Rp&uBo*EQj5Gh)=cdSERj3!o?~Eg`1W|%<lAIoF%#*5 z?c1_F0@48gwqP@^h>E{-6Uc4!hhxK>E(1!7;@G-cBhBg<jXa}ZTFVW4e`j_$1l8!% zoZEO1b!TtLNbp-Bb}hv!!IB+0jykpV$r@0YX92&A?_d2befJ8ICSGF?F*8uo88C5O zCCacK|N8DC-RZk6%i<m&HE>UQTH#-US2#TeK3i390-WAsWQ@$+*O<REX3n>tY7X%I zd4O+MB&fkjrvfkXN6RRej*TE7l9T^9DF?;6U96kH_~ln8s=iv#<C6G>AO+^1WxFUE zRr7M=-!Y+Eg^ngmddJ|t0$V2WA4`xV&_-pz+}e!o?_f%6&%GmiYwJUd>AY*g7?aU= zCaOoPZy9djRIHXwGN0)Vc{(hL5$D`QHFBZlXr+vGLnhs^k<~<P=e}K0g>ff27t(5D zz+L-~FZ{yjyNi~M=Qx|mD+!!D0WBuU>R$p2_tDV^JAzhL07nAt0Ux<|daQlvyNLh7 zdWcQx!U9A2u5^9=%%@M$wJ|Z{*8Ibs?8$!X2geKg)hWLnyc+9o`<~gHgOTeA0p)*4 z`EK{0X^Kiu3FU$xdNv|HeRyIP06$Och?rH;MqEb7xO^9L2*_VCTxj8%h~X^M(}5?1 zyUvn4Wi(}~7VqNlOk05T;C~c)QJF5k=)GV2mQg78zdR2{f#h%t`lB=02A@EmnCm|T z<T_t4$C$kE?o*_53+ZUf`%|oQ?yU^I_Ggqb*Ho~QSVArxH-hWXkd<_Ed4JBnUigS@ zg2bc&5ILX8a0!q^D3KwVs{%SbF~9>;wkJ`FY;+@Sw61nJ>}*g+@G*xRj+-eo;zjDR zJO`nF`%l<aSPf@aD{$dY4Rj?3xQPXtPOq^RdBNEEOZ}6--@qsho>m9B9U!rh-?I@| z>T!F_N7aLLeIpH1h&v*+Lu>&r+Zhw{*F+x{EEwl(RUt}`StNZ^hD7w1740MGOK{Yl zz^l2FN+uMXqKo1P%z%t|wuk<qvu=Gpye;jI)?0e!s<`IDe-_@fHl9USC}mdA27I~P zUpZylakh!M3sKzOvD@Pt{s>6HT*=J058^bE9Q%~unSVaWLs2j}%f^d09Q(cDwHoil zhhqqV-Ps?sKHUIPzwUOh*)7p$+}ARqVsdrsvZyFJ64EJ(cdmRLABET9NjWl-_!o#o zHZ}7Rmda`1{muV79MvzEq<t!r^E7sNZf%@+M;Qfe0g`Qv&5=SpDn3RMV-!%y2qagy z$a&Bu_<`6PmAt~(I`|mXZ6#P<u6MvX{rPG6)olCQ_~-HrD=G+@kQ*FW=<EznUkba~ z{ZwV?nYN?Luw{Ht)bj;1hIz`7QWG9&OOppl&E<>*<wJMn@Dq|tt1HVUjgcLbU@&{N zSpg^?;QuVEbH?wRYm|`~sFv=#2Qh^>^}xGc3u&}{QYyRuQs%KyuT}qlvGNwvBn9KG zXtiH#v!<)DYm1-X0lP-PNEapPD8Qq{6P{DeW~ta?4ubYn>18lDbi6fQ8ovY0dPu)_ za%phH%7q+)2k-ZKv~p)1UYuUSYcHcVB%H^=JMuacycYK8W9C-${9y&ft5ihwo?@rv zywCeK{MTcsPG31Rq}?Yo`95Y{)=V_Ot|g-Fn&;V-W*Pvc?<Z*D@!hCwMf|l6**+{! z$9z-g%h>0$wskZsXi4gb(+A!a-3@px6>6x9ps~MLhv)a@&t>3&L#S0>>L?gP|DcU^ zv63}l|99<>(3NaYu|!|&IF)HEL)$}6Z+*nqOMk4ETWgi=#7~norEH{eruj2Xu`dM{ zt$;&E*Im?`5!^sbTEw_Q2<`$VQ|Fr$jJ8%pnpL`xJx>^9t>86QXiby+Wy5MGUhLd2 zL^{-+)vB2Bw)zq!+s_C6s?`E<^awW0$@UfueprIMZ=&qsPyGx^5o}L<_4nqkL6@k7 z3bn7y#rH=oz7rY(Fut#8M3k+~Xy1vMeSJrCwj+76xAJ56@)o5te=%j;Rc_MX6GKj` z>q3a!wV~}{fZ0%tmWDO;ZNJAEzrz*?f%Ce=w=<9Jj%3=x>HxIw^K)@@0lp_hV>-~y zr-r89>Zy<EosoODa9x+c7^4N3lq+Y)P_z<GJ~?X`Cr=~{ZkF26-+wZ@2+LsA`{XsY zt=8zj7tLMDmLZs_7hZ*lDrXgHeEwkpPqrM9x2xR#kk@0)YyWrWff3?gf?F6Me=Fqo zBm<=zuS>g(Oci3FtG;;4(l#k~ZIGQe{>YtD!&l%e2yt#pbg>MCAz)zBCmo*`JAH;` zgggc4H@>cK!hnOSzvWTC4TLQE+GD<)D`t6dGXoo-KWLpdiZS}|jb`Q42{y6<z6JBT zb?k4_?Vc*Sv{w_cG_KPApFLnb6Zv^OQWpFxBue9%XyFE84K`v5|D#^mD!fHK53`oN zTBO(RN;yP4eS(><($SzTRj4Fy3n)fduwI;cztTCY4+4IbnXJ#XgVT+kQ_4lrz>A3; zxV?WF@q6f2GZ;N_?zFYedH@Bs*-A#vixh(lVnoMhQ49zS>f-!|_FA2*N#%MAB~l?{ zQlG@TA|rVn`$w2O0-!S^#=NLUUe@}j_+)A-gRZaqVG=+w>5)N%V*j-EoAqhJh3xXb z1f}W?%panJ$3hs{pS$)08_K!_JhR+CIg7-x6Akc#EicK(UIq{<1p=0T352fX9>qJw zD+!PyUajx<hSgw!IiB4riBs~Y;fcHv!xY<-cRj<~$*pGUmrFjWXF6s~1}13ITy;Vu z!MVS<R({7PeqC;wX}TVBfqE^=_dtR#bXNZwCFZBoMrzK}4ZkiETKUWvEw@=Bxt$#D zD$bR$*f*XCMujo~H5j0il)cCab>(IlZsLPqC;T5v=N(Vw|NnoHC|eTQD`g*KbCSI? zv)8dXX2?87r0h+`v1eBHR^-^S<D7#!IGHCq<9PqBKHuN}-E_`%uIqX|$K!E-IRDw! zMA9Kywv=zD)?L{=O-NpS$^=FZI;R>JwM9CJ4*FneL1(@>WVm$1zn1SxY~;X<;`1Jc zKVoeUK$FltSLQ-)Vs0!jOuhZn<tA}fWRedhN?snN+5u*I*2DVswf)cz05@+ue^BRn zZ&=WP4V_^5WYjbKj9?nP2=^}3Rwa(#|KzPa;P8KKOqBt#MwXg_D?%g{X#TFBe&Ycq zslidav5p}U@5OUa0;ZC;Bh=Vn4AZ@8_J>0#c-wXV;V%2vN^nR%5R7f5;X7mb^|qK` zQ=+cDVX`DX-)B1s@0QW`TIBt09U5My!-Om6>ywJsxyzegA`9aES#?P@-<c>FW<hZ! z-=C!ysCl$5esyGsRyE0b%hki!ve`5Z?`znn<`If4U+Dq}`vlD8S*6MuRKc#N{5+JI z`Rt#?xfftSOw=aKKF-wsz2Y`jNq}xnsKR2uFiwa1|EeDtYdel~X^*I+9gVPGKN7>s z^YObsadH(h)He-eS#x5*Rxi(o$r!(v%Zm$mZ!$M(lj}<YN9e8=;@#*YoEXmAO!kxU zvg<#?@Ib33zd3!W4obI|2pdTzDeM;lk5t&KeTAA#t$s01J@QOv^qFR+f&rdwCVTrj zPock88_ul2O*&d*@=pS}0m6xnerctL^vtAa-Vm__>$?(ZG4GReV%;_-eh|xCqi$d^ zJWUo)mjZ;<c*o@qFqOdfo4>QFq22GI1?r%0A7T2BU|C+~_4ew!O?-HfzLr*PNz)*g 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 cHr{OG*BXeoo3k;;9`Ft15et69!Vw*-;1 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%0DR#4W9YjFvHlX@~ef@Q<lGbE1WO% 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%0A|i(=3IDRf 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ඪIX10X|@J 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 Jm)8AV{y*!jYY6}V literal 0 HcmV?d00001 diff --git a/talimatname/genel/m/mdm/talimat b/talimatname/genel/m/mdm/talimat new file mode 100644 index 000000000..0ae7f651d --- /dev/null +++ b/talimatname/genel/m/mdm/talimat @@ -0,0 +1,68 @@ +# Tanım: MDM Giriş Yöneticisi (consolekit destekli) +# URL: http://www.linuxmint.com +# Paketçi: yasarciv67@gmail.com +# Gerekler: gnome-common intltool gnome-doc-utils xorg-server pango zenity popt xorg-libdmx libgnomecanvas dbus-glib webkitgtk2 + +isim=mdm +surum=2.0.17 +devir=1 + +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz +mdm.pam +mdm-autologin.pam +defaults.conf +org.cinnamon.pkexec.mdmsetup.policy +resim-1.jpg) + +derle() { + cd $isim-$surum + aclocal --install + gnome-doc-prepare --force + chmod +x ./autogen.sh + export AUTOMAKE=automake + ./autogen.sh --enable-ipv6=yes --with-prefetch \ + --prefix=/usr --with-console-kit=yes --sysconfdir=/etc \ + --with-systemd=no --libexecdir=/usr/lib/mdm --localstatedir=/var/lib \ + --disable-static --with-xevie=yes --disable-scrollkeeper \ + --enable-secureremote=yes --enable-ipv6=yes \ + --enable-compile-warnings=no --sbindir=/usr/bin \ + LDFLAGS="-lXau -lm" + + sed -i -e 's|${prefix}|/usr|' config.h + + make DESTDIR=$PKG + make DESTDIR=$PKG install + + #PAM, we use our own, not LinuxMint stuff, problem?... + install -m755 -d "${PKG}/etc/pam.d" + install -m644 "${SRC}/mdm-autologin.pam" "${PKG}/etc/pam.d/mdm-autologin" + install -m644 "${SRC}/mdm.pam" "${PKG}/etc/pam.d/mdm" + + #configuration + install -m444 "${SRC}/defaults.conf" "${PKG}/usr/share/mdm/" + install -m444 "${SRC}/defaults.conf" "${PKG}/usr/share/mdm/distro.conf" + cp "${SRC}/resim-1.jpg" "${PKG}/usr/share/mdm/themes/" + rm -f "${PKG}/usr/share/xsessions/gnome.desktop" || true + + #PolicyKit execution scheme (need some tests) + install -m755 -d "${PKG}/usr/share/polkit-1/actions/" + install -m644 "${SRC}/org.cinnamon.pkexec.mdmsetup.policy" "${PKG}/usr/share/polkit-1/actions/" + + #Why on the hay this directory is created empty in etc, remove it + rmdir "${PKG}/etc/dm" + + #Fix mdm files conflict with gnome-control-center (usr/share/pixmaps/faces/*) + install -m755 -d "${PKG}/usr/share/pixmaps/faces/" + make DESTDIR=${PKG} install -C gui/faces + + #Fix gdmsetup.desktop + sed -i -e 's|^Exec=gksu|Exec=pkexec|' "${PKG}/usr/share/mdm/applications/mdmsetup.desktop" + sed -i -e 's|^Categories=|Categories=GNOME;GTK;System;Settings;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;|' "${PKG}/usr/share/mdm/applications/mdmsetup.desktop" + + #Fix erroneous path for certain applications + install -m755 -d "${PKG}/usr/share/applications" + mv -f ${PKG}/usr/share/mdm/applications/*.* "${PKG}/usr/share/applications" + chmod 755 ${PKG}/usr/share/applications/*.* + rmdir "${PKG}/usr/share/mdm/applications" + +} diff --git a/talimatname/genel/m/media-player-info/talimat b/talimatname/genel/m/media-player-info/talimat new file mode 100644 index 000000000..5d3ccebf3 --- /dev/null +++ b/talimatname/genel/m/media-player-info/talimat @@ -0,0 +1,20 @@ +# Tanım: Medya oynatıcı özelliklerini açıklayan veri dosyaları, post-HAL sistemleri için +# URL: http://cgit.freedesktop.org/media-player-info/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python3 + +isim=media-player-info +surum=22 +devir=1 + +kaynak=(http://www.freedesktop.org/software/$isim/$isim-$surum.tar.gz ) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --with-udevdir=/lib/udev + + LANG="en_US.UTF-8" make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/mediainfo/talimat b/talimatname/genel/m/mediainfo/talimat new file mode 100644 index 000000000..80f3c41e5 --- /dev/null +++ b/talimatname/genel/m/mediainfo/talimat @@ -0,0 +1,19 @@ +# Tanım: Video veya ses dosyası ile ilgili teknik ve etiket bilgilerini gösterin. +# URL: http://mediainfo.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libmediainfo + +isim=mediainfo +surum=0.7.69 +devir=1 + +kaynak=( http://downloads.sourceforge.net/mediainfo/${isim}_${surum}.tar.bz2) + +derle(){ + cd $SRC/MediaInfo/Project/GNU/CLI + sh ./autogen + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/m/meld/meld.kur-kos b/talimatname/genel/m/meld/meld.kur-kos new file mode 100644 index 000000000..1d319936d --- /dev/null +++ b/talimatname/genel/m/meld/meld.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/talimatname/genel/m/meld/talimat b/talimatname/genel/m/meld/talimat new file mode 100644 index 000000000..d7bb026ce --- /dev/null +++ b/talimatname/genel/m/meld/talimat @@ -0,0 +1,16 @@ +# Tanım: Farklılıkları tespit etme ve birleştirme aracı. +# URL: http://meldmerge.org/ +# Paketçi: milisarge +# Gerekler: python3-gobject python3-cairo gtksourceview3 gsettings-desktop-schemas dconf + +isim=meld +surum=3.18.0 +devir=1 +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + python3 setup.py build + python3 setup.py --no-update-icon-cache --no-compile-schemas \ + install --prefix=/usr --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/m/menu-cache/talimat b/talimatname/genel/m/menu-cache/talimat new file mode 100644 index 000000000..14b4d7364 --- /dev/null +++ b/talimatname/genel/m/menu-cache/talimat @@ -0,0 +1,17 @@ +# Tanım: Freedesktop.org uyumlu menüler için önbellekleme mekanizması +# URL: http://lxde.org/ +# Paketçi: milisarge +# Gerekler: libfm-extra + + +isim=menu-cache +surum=1.1.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/lxde/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/menulibre/talimat b/talimatname/genel/m/menulibre/talimat new file mode 100644 index 000000000..fbbf40dff --- /dev/null +++ b/talimatname/genel/m/menulibre/talimat @@ -0,0 +1,14 @@ +# Tanım: An advanced menu editor that provides modern features in a clean, easy-to-use interface. All without GNOME dependencies +# URL: https://launchpad.net/menulibre +# Paketçi: milisarge +# Gerekler: python3-distutils-extra gdk-pixbuf gnome-menus gsettings-desktop-schemas gtksourceview3 python3 python3-gobject python3-psutil python3-xdg xdg-utils + +isim=menulibre +surum=2.1.3 +devir=1 +kaynak=(https://launchpad.net/menulibre/2.1/$surum/+download/$isim-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/m/mercurial/mercurial.profile b/talimatname/genel/m/mercurial/mercurial.profile new file mode 100644 index 000000000..fc961828c --- /dev/null +++ b/talimatname/genel/m/mercurial/mercurial.profile @@ -0,0 +1 @@ +export HG=/usr/bin/hg diff --git a/talimatname/genel/m/mercurial/talimat b/talimatname/genel/m/mercurial/talimat new file mode 100644 index 000000000..5cefbd13b --- /dev/null +++ b/talimatname/genel/m/mercurial/talimat @@ -0,0 +1,45 @@ +# Tanım: Python'da yazılmış, Git ve Bazaar'a benzer,dağıtılmış bir kaynak denetim yönetimi aracıdır. +# URL: http://mercurial.selenic.com +# Paketçi: milisarge +# Gerekler: python tk + +isim=mercurial +surum=4.3.1 +devir=1 +kaynak=(https://www.mercurial-scm.org/release/mercurial-$surum.tar.gz + mercurial.profile) + +derle() { + cd $isim-$surum + sed -i -e 's#env python#env python2#' mercurial/lsprof.py + cd contrib/chg + make + cd $SRC/${isim}-${surum} + python2 setup.py install --root="${PKG}/" --optimize=1 + + install -d ${PKG}/usr/share/man/{man1,man5} + install -m644 doc/hg.1 "${PKG}/usr/share/man/man1" + install -m644 doc/{hgrc.5,hgignore.5} "${PKG}/usr/share/man/man5" + install -m755 contrib/hgk "${PKG}/usr/bin" + install -m644 -D contrib/zsh_completion "${PKG}/usr/share/zsh/site-functions/_hg" + install -m644 -D contrib/bash_completion "${PKG}/usr/share/bash-completion/completions/hg" + install -d "${PKG}/usr/share/emacs/site-lisp" + install -m644 contrib/{mq.el,mercurial.el} "${PKG}/usr/share/emacs/site-lisp" + + vimpath="${PKG}/usr/share/vim/vimfiles" + install -Dm644 contrib/vim/HGAnnotate.vim "${vimpath}/syntax/HGAnnotate.vim" + + # set some variables + install -m755 -d ${PKG}/etc/profile.d + install -m755 ${SRC}/mercurial.profile "${PKG}/etc/profile.d/mercurial.sh" + + # install configuration file + install -m755 -d ${PKG}/etc/mercurial + # install -m644 contrib/sample.hgrc "${PKG}/etc/mercurial/hgrc" + + # FS#38825 - Add certs config to package + echo -e "\n[web]\ncacerts = /etc/ssl/certs/ca-certificates.crt\n" >> "${PKG}/etc/mercurial/hgrc" + + cd contrib/chg + make DESTDIR="${PKG}" PREFIX=/usr install +} diff --git a/talimatname/genel/m/meson/milis-meson b/talimatname/genel/m/meson/milis-meson new file mode 100644 index 000000000..17241018a --- /dev/null +++ b/talimatname/genel/m/meson/milis-meson @@ -0,0 +1,21 @@ +#!/bin/bash -ex +# Milis Linux için Meson sargısı + +exec meson setup \ + --prefix /usr \ + --libdir /usr/lib \ + --libexecdir /usr/lib \ + --bindir /usr/bin \ + --sbindir /usr/bin \ + --includedir /usr/include \ + --datadir /usr/share \ + --mandir /usr/share/man \ + --infodir /usr/share/info \ + --localedir /usr/share/locale \ + --sysconfdir /etc \ + --localstatedir /var \ + --sharedstatedir /var/lib \ + --buildtype release \ + --wrap-mode nofallback \ + "$@" \ + -D b_lto=true diff --git a/talimatname/genel/m/meson/talimat b/talimatname/genel/m/meson/talimat new file mode 100644 index 000000000..9e58c85e9 --- /dev/null +++ b/talimatname/genel/m/meson/talimat @@ -0,0 +1,26 @@ +# Tanım: Meson hem son derece hızlı, hem de daha da önemlisi, mümkün olduğunca kullanıcı dostu olmak için tasarlanmış bir açık kaynak kodlu yapı sistemidir. +# URL: http://mesonbuild.com/ +# Paketçi: milisarge +# Gerekler: python3 git ninja + +isim=meson +surum=0.46.0 +devir=1 + +kaynak=(https://github.com/mesonbuild/meson/releases/download/$surum/$isim-$surum.tar.gz + milis-meson) + +derle() { + cd $isim-$surum + python3 setup.py build + python3 setup.py install --root="${PKG}" --optimize=1 --skip-build + + install -d "${PKG}/usr/share/vim/vimfiles" + cp -rt "${PKG}/usr/share/vim/vimfiles" data/syntax-highlighting/vim/* + + install -Dt "${PKG}/usr/share/emacs/site-lisp" -m644 data/syntax-highlighting/emacs/* + install -Dt "${PKG}/usr/share/zsh/site-functions" -m644 data/shell-completions/zsh/* + + # Milis paket yardımcı + install -D ../milis-meson -t "${PKG}/usr/bin" +} diff --git a/talimatname/genel/m/messagelib/talimat b/talimatname/genel/m/messagelib/talimat new file mode 100644 index 000000000..16ce24e91 --- /dev/null +++ b/talimatname/genel/m/messagelib/talimat @@ -0,0 +1,21 @@ +# Tanım: KDE PIM mesajlaşma kütüphanesi +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kdepim-apps-libs kmailtransport kmbox libgravatar akonadi-notes kidentitymanagement kf5-extra-cmake-modules kf5-kdoctools boost qt5 + +isim=messagelib +surum=16.08.2 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/metasploit/talimat b/talimatname/genel/m/metasploit/talimat new file mode 100644 index 000000000..24348368a --- /dev/null +++ b/talimatname/genel/m/metasploit/talimat @@ -0,0 +1,41 @@ +# Tanım: ileri düzey exploit kullanarak geliştirme ve test etme çatı uygulaması +# URL: http://www.metasploit.com +# Paketçi: milisarge +# Gerekler: ruby libpcap postgresql ruby-bundler sqlite libxslt clang + +isim=metasploit +surum=4.14.24 +devir=1 +kaynak=(https://github.com/rapid7/metasploit-framework/archive/$surum.tar.gz) + +derle() { + cd "${isim}-framework-$surum" + bundle config build.nokogiri --use-system-libraries + sed 's|git ls-files|find -type f|' -i metasploit-framework.gemspec + export CC=clang + export CXX=clang++ + bundle install -j"$(nproc)" --no-cache --deployment + find vendor/bundle/ruby -exec chmod o+r '{}' \; + + install -d "${PKG}/opt/${isim}" "${PKG}/usr/bin" + find . -maxdepth 1 -mindepth 1 -not -path './.git*' -exec cp -r '{}' "${PKG}/opt/${isim}" \; + + for f in "${PKG}"/opt/${isim}/msf*; do + local _msffile="${PKG}/usr/bin/`basename "${f}"`" + echo -e "#!/bin/sh\nBUNDLE_GEMFILE=/opt/${isim}/Gemfile bundle exec ruby /opt/${isim}/`basename "${f}"` \"\$@\"" > "${_msffile}" + chmod 755 "${_msffile}" + done + + (cd "${PKG}/opt/${isim}" + for f in tools/*/*.rb; do + install -Dm 755 "${f}" ".${f}" + echo -e "#!/bin/sh\nBUNDLE_GEMFILE=/opt/${isim}/Gemfile bundle exec ruby /opt/${isim}/."${f}" \"\$@\"" > "${f}" + chmod 755 "${f}" + done + ) + + install -Dm 644 external/zsh/_* -t "${PKG}/usr/share/zsh/site-functions" + install -d "${PKG}/usr/share/doc" + mv "${PKG}/opt/${isim}/documentation" "${PKG}/usr/share/doc/${isim}" + rm "${PKG}/usr/bin/msfupdate" +} diff --git a/talimatname/genel/m/mhash/talimat b/talimatname/genel/m/mhash/talimat new file mode 100644 index 000000000..f863cf00e --- /dev/null +++ b/talimatname/genel/m/mhash/talimat @@ -0,0 +1,20 @@ +# Tanım: Farklı hash algoritmaları kütüphanesi +# URL: http://mhash.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=mhash +surum=0.9.9.9 +devir=1 +kaynak=(http://downloads.sourceforge.net/mhash/mhash-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --mandir=/usr/share/man + make + make DESTDIR=$PKG \ + PREFIX=/usr \ + MANDIR=/usr/share/man\ + install +} diff --git a/talimatname/genel/m/miam-player/talimat b/talimatname/genel/m/miam-player/talimat new file mode 100644 index 000000000..311eab5a9 --- /dev/null +++ b/talimatname/genel/m/miam-player/talimat @@ -0,0 +1,29 @@ +# Tanım: Çapraz platform açık kaynaklı müzik çalar +# URL: https://github.com/MBach/Miam-Player +# Paketçi: Cihan Alkan +# Gerekler: qt5 taglib qtav +# Grup: medya + +isim=miam-player +surum=0.8.0 +devir=1 +kaynak=(https://github.com/MBach/Miam-Player/archive/v$surum.tar.gz::$isim-$surum.tar.gz + http://kaynaklar.milislinux.org/miam-data.tar.xz) + +derle() { + cd Miam-Player-$surum + cp -p ../player_tr.ts src/Player/translations/player_en.ts + cp -p ../core_tr.ts src/Core/translations/core_en.ts + cp -p ../uniqueLibrary_tr.ts src/Player/translations/player_en.ts + cp -p ../tabPlaylists_tr.ts src/Core/translations/core_en.ts + cp -p ../library_tr.ts src/Core/translations/core_en.ts + cp -p ../tr.png src/Player/language/en.png + + /usr/lib/qt5/bin/lrelease ../player_tr.ts -qm src/Player/translations/player_en.qm + /usr/lib/qt5/bin/lrelease ../core_tr.ts -qm src/Core/translations/core_en.qm + /usr/lib/qt5/bin/lrelease ../uniqueLibrary_tr.ts -qm src/UniqueLibrary/translations/uniqueLibrary_en.qm + /usr/lib/qt5/bin/lrelease ../tabPlaylists_tr.ts -qm src/TabPlaylists/translations/tabPlaylists_en.qm + qmake-qt5 + make + make INSTALL_ROOT="$PKG" install +} diff --git a/talimatname/genel/m/midori/midori.kur-kos b/talimatname/genel/m/midori/midori.kur-kos new file mode 100644 index 000000000..0a4d8a2f4 --- /dev/null +++ b/talimatname/genel/m/midori/midori.kur-kos @@ -0,0 +1,2 @@ +/usr/bin/update-desktop-database -q +/usr/bin/gtk-update-icon-cache -f -q -t /usr/share/icons/hicolor diff --git a/talimatname/genel/m/midori/talimat b/talimatname/genel/m/midori/talimat new file mode 100644 index 000000000..69157254d --- /dev/null +++ b/talimatname/genel/m/midori/talimat @@ -0,0 +1,25 @@ +# Tanım: WebKitGTK+ kullanan hafif tarayıcı +# URL: http://www.twotoasts.de +# Paketçi: milisarge +# Gerekler: meson cmake gcr webkitgtk2 gtk3 webkit2gtk3 webkitgtk3 vala glib-networking libnotify librsvg libunique1 desktop-file-utils hicolor-icon-theme gstreamer1-plugins-libav gstreamer1-plugins-base gstreamer1-plugins-good + +isim=midori +surum=0.5.11 +devir=3 + +kaynak=(http://www.midori-browser.org/downloads/${isim}_${surum}_all_.tar.bz2) +derle() { + cd $isim-$surum + mkdir -p build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DHALF_BRO_INCOM_WEBKIT2=ON \ + -DCMAKE_C_FLAGS="$CFLAGS -w" \ + -DUSE_ZEITGEIST=OFF \ + -DUSE_GTK3=1 \ + -G Ninja + ninja + DESTDIR="$PKG" ninja -C "$SRC/$isim-$surum/build" install +} diff --git a/talimatname/genel/m/mikrolock/mikrolock_tr_TR.ts b/talimatname/genel/m/mikrolock/mikrolock_tr_TR.ts new file mode 100644 index 000000000..f8002d9b1 --- /dev/null +++ b/talimatname/genel/m/mikrolock/mikrolock_tr_TR.ts @@ -0,0 +1,632 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE"> +<context> + <name>MlockMainWindow</name> + <message> + <location filename="mlockmainwindow.ui" line="17"/> + <source>MikroLock</source> + <oldsource>µlock</oldsource> + <translation>MikroLock</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="46"/> + <source>Your mail address:</source> + <translation>E-Posta Adresiniz:</translation> + </message> + <message> + <source>To remain compatible with the Chrome miniLock extension, enter a valid mail address.</source> + <translation type="vanished">Chrome miniLock uzantısıyla uyumlu kalabilmek için geçerli bir posta adresi girin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="126"/> + <source>Your secret passphrase:</source> + <translation>Parolanız:</translation> + </message> + <message> + <source>Enter a secret passphrase which consists of several random words.</source> + <translation type="vanished">Birkaç rastgele kelime içeren gizli bir parola girin.</translation> + </message> + <message> + <source><html><head/><body><p>Enter a secret passphrase which consists of several random words. A weak passphrase may be declined by the original miniLock Chrome extension.</p></body></html></source> + <translation type="vanished"><html><head/><body><p>Birkaç rastgele kelime içeren gizli bir parola girin. Orijinal miniLock Chrome uzantısı zayıf bir parola reddedebilir.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="278"/> + <source>Press this button to get to the file processing screen.</source> + <translation>Dosya işleme ekranına gitmek için bu düğmeye basın.</translation> + </message> + <message> + <source>Generate my miniLock ID</source> + <translation type="vanished">MiniLock kimliğimi oluştur</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="327"/> + <source>Enter your mail address and your passphrase.</source> + <translation>Posta adresinizi ve parolanızı girin.</translation> + </message> + <message> + <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">mlock uses your email and passphrase to derive your <span style=" font-weight:600;">miniLock ID</span>.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Refer to <a href="http://world.std.com/~reinhold/diceware.html"><span style=" text-decoration: underline; color:#0000ff;">Diceware</span></a> for a method to generate good passphrases.</p></body></html></source> + <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">mlock berechnet Deine <span style=" font-weight:600;">miniLock ID</span> aus der Mail-Adresse und dem Passwort.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mit der <a href="http://world.std.com/~reinhold/diceware.html"><span style=" text-decoration: underline; color:#0000ff;">Diceware</span></a> Methode kannst Du gute Passwörter erzeugen.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="55"/> + <source><html><head/><body><p>Enter your mail address (or any other value) as salt.</p></body></html></source> + <oldsource><html><head/><body><p>To remain compatible with the Chrome miniLock extension, enter a valid mail address (you may enter anything as salt value).</p></body></html></oldsource> + <translation>Posta adresinizi (veya başka bir değeri) girin</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="135"/> + <source><html><head/><body><p>Enter a secret passphrase (minimum length: 20 characters). If the length does not exceed 40 characters, the passphrase must consist of at least five random words.</p></body></html></source> + <oldsource><html><head/><body><p>Enter a secret passphrase (minimum length: 20 characters). If the length does not exceed 40 characters, the passphrase must consist of at least five random words. A weak passphrase may be declined by the original miniLock Chrome extension.</p></body></html></oldsource> + <translation><html><head/><body><p>Gizli bir parola girin (minimum uzunluk: 20 karakter). Uzunluğu 40 karakteri aşmıyorsa, parolanın en az beş rastgele kelime içermesi gerekir.</p></body></html></translation> + </message> + <message> + <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">MikroLock uses your email and passphrase to derive your <span style=" font-weight:600;">miniLock ID</span>.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Refer to <a href="http://www.diceware.com"><span style=" text-decoration: underline; color:#0000ff;">Diceware.com</span></a> for a method to generate good passphrases.</p></body></html></source> + <oldsource><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">µlock uses your email and passphrase to derive your <span style=" font-weight:600;">miniLock ID</span>.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Refer to <a href="http://www.diceware.com"><span style=" text-decoration: underline; color:#0000ff;">Diceware.com</span></a> for a method to generate good passphrases.</p></body></html></oldsource> + <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">MikroLock nutzt die Mail-Adresse und das Passwort, um eine <span style=" font-weight:600;">miniLock ID</span> zu berechnen.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sieh unter <a href="http://www.diceware.com"><span style=" text-decoration: underline; color:#0000ff;">Diceware.com</span></a> nach, wie man gute Passwörter erzeugen kann.</p></body></html></translation> + </message> + <message> + <source>Send your miniLock ID to others so they can encrypt files to you.<br>Encrypt files to friends using their miniLock IDs. <br><br>Your email is only used to derive your miniLock ID -<br> it remains completely secret and anonymous.</source> + <translation type="vanished">MiniLock kimliğinizi başkalarına gönderin, böylece size dosyaları şifreleyebilirler.<br><br>MiniLock Kimlikleri ile dosyaları şifreleyin.<br><br>E-posta adresiniz yalnızca MiniLock Kimliğinizi oluşturmak için kullanılacaktır - gizli ve anonim kalacaktır.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="424"/> + <source>Select the directory to store the encrypted or decrypted file.</source> + <translation>Şifreli veya şifresi çözülmüş dosyayı saklamak için dizini seçin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="427"/> + <source>Select the destination directory</source> + <translation>Hedef dizini seçin</translation> + </message> + <message> + <source>Enter the directory to store the encrypted or decrypted file.</source> + <translation type="vanished">Gib das Ausgabeverzeichnis ein.</translation> + </message> + <message> + <source><html><head/><body><p>This is your destination directory.</p></body></html></source> + <translation type="vanished"><html><head/><body><p>Dies ist das Ausgabeverzeichnis.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="473"/> + <source>Select a minilock file to decrypt or any other file to encrypt.</source> + <translation>Şifresini çözmek için bir minilock dosyası veya şifrelemek için başka bir dosya seçin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="476"/> + <location filename="mlockmainwindow.cpp" line="383"/> + <source>Select the input file</source> + <translation>Girdi dosyasını seçin</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="549"/> + <source>Drop a file here after selecting the destination directory.</source> + <translation>Hedef dizini seçtikten sonra buraya bir dosya bırakın.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="617"/> + <source><html><head/><body><p><span style=" font-weight:600;">Select the destination directory and the input file.</span></p><p>A miniLock file will be decrypted automatically. </p><p>Any other file will be encrypted.</p><p>You may drag and drop a file onto this window.</p></body></html></source> + <oldsource><html><head/><body><p><span style=" font-weight:600;">Select the destination directory and the input file.</span></p><p>A miniLock file will be decrypted automatically. </p><p>Any other file will be encrypted.</p><p>You may drag and drop files onto this window.</p></body></html></oldsource> + <translation><html><head/><body><p><span style=" font-weight:600;">Hedef dizini ve girdi dosyasını seçin.</span></p><p>MiniLock dosyası otomatik olarak şifresiz çözülür. </p><p>Başka herhangi bir dosya şifrelenir.</p><p>Dosyayı bu pencereye sürükleyip bırakabilirsiniz.</p></body></html></translation> + </message> + <message> + <source>List of recipient miniLock IDs:</source> + <translation type="vanished">Liste der Empfänger-IDs:</translation> + </message> + <message> + <source>Add a miniLock ID of whom should be able to open the file.</source> + <translation type="vanished">Füge eine ID der Person hinzu, die deine miniLock-Datei öffnen darf.</translation> + </message> + <message> + <source>Add miniLock ID</source> + <translation type="vanished">MiniLock-ID hinzufügen</translation> + </message> + <message> + <source><html><head/><body><p>Open a text file which contains one miniLock ID per line and use the entries to replace the recipient IDs above.</p></body></html></source> + <translation type="vanished"><html><head/><body><p>Öffne eine Textdatei, die eine miniLock-ID pro Zeile enthält, und ersetze damit die obigen Empfänger-IDs.</p></body></html></translation> + </message> + <message> + <source>Read list file</source> + <translation type="vanished">Liste einlesen</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="200"/> + <source>Select a function to calculate a key from the input fields above. Always use the same function to generate your Lock-ID.</source> + <translation>Yukarıdaki girdi alanlarından bir anahtarı hesaplamak için bir işlev seçin. Kilit Kimliği'nizi oluşturmak için daima aynı işlevi kullanın.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="203"/> + <source>Key derivation function</source> + <translation>Anahtar Türetme Fonksiyonu</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="209"/> + <source>Select scrypt as key derivation function.</source> + <translation>Anahtar türetme işlevi olarak kriptolama'yı seçin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="212"/> + <source>s&crypt</source> + <translation>scrypt</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="222"/> + <source>Use Argon2 as key derivation function.</source> + <translation>Anahtar türetme işlevi olarak Argon2'yi kullanın.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="225"/> + <source>Argon&2</source> + <translation>Argon2</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="281"/> + <source>Generate my Lock-ID</source> + <translation>Kilit Kimliği'ni oluştur</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="353"/> + <source><html><head/><body><p>MikroLock uses your email and passphrase to derive your <span style=" font-weight:600;">Lock-ID</span>.</p> + +<p>Refer to <a href="http://www.diceware.com"><span style=" text-decoration: underline; color:#0000ff;">Diceware.com</span></a> for a method to generate good passphrases.</p></body></html></source> + <translation><html><head/><body><p>MikroLock, türetmek için e-postanızı ve parolanızı kullanır.<span style="font-weight:600;">Lock-ID</span> hesapla.</p> +<p>Ziyaret edin <a href="http://www.diceware.com"><span style=" text-decoration: underline; color:#0000ff;">Diceware.com</span></a> iyi bir parola deyimi üretmek için. </p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="390"/> + <source><html><head/><body><p>Send your Lock-ID to others so they can encrypt files to you.<br/>Encrypt files to friends using their Lock-IDs. <br/><br/>Your email is only used to derive your Lock ID - it remains completely secret and anonymous.</p></body></html></source> + <translation><html><head/><body><p>Send your Lock-ID to others so they can encrypt files to you.<br/>Encrypt files to friends using their Lock-IDs. <br/><br/>Your email is only used to derive your Lock ID - it remains completely secret and anonymous.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="444"/> + <source>This is your destination directory.</source> + <translation>Bu hedef dizininiz.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="648"/> + <source>List of recipient Lock-IDs:</source> + <translation>Alıcı Kilit Kimlikleri Listesi:</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="678"/> + <source>Add a Lock-ID of whom should be able to open the file.</source> + <translation>Dosyayı açabilecek durumda olan bir Lock-ID ekleyin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="681"/> + <source>Add Lock-ID</source> + <translation>Kilit Kimliği Ekle</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="700"/> + <source><html><head/><body><p>Open a text file which contains one Lock-ID per line and use the entries to replace the recipient IDs above.</p></body></html></source> + <translation><html><head/><body><p>Her hat için bir Lock-ID içeren bir metin dosyasını açın ve yukarıdaki alıcı kimliklerini değiştirmek için girdileri kullanın.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="703"/> + <source>Read list of IDs</source> + <translation>Kimliklerin listesini okuyun</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="714"/> + <source>Clear the recipient list.</source> + <translation>Alıcı listesini temizle.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="717"/> + <source>Clear recipients</source> + <translation>Alıcıları temizle</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="730"/> + <source>Omit my ID</source> + <translation>Kimliğimi atla</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="737"/> + <source>Generate a random output filename</source> + <translation>Rastgele bir çıktı dosyası oluştur</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="766"/> + <source>Encrypt the file</source> + <translation>Dosyayı şifreleme</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="800"/> + <source><html><head/><body><p><span style=" font-weight:600;">Encrypt your file!</span></p><p>Add the Lock-ID of each person which should be able to decrypt the file.</p><p>If you omit your own ID, you will not be able to decrypt the resulting file.</p><p>A miniLock file does not give visible hints about the sender nor the recipients.</p></body></html></source> + <translation><html><head/><body><p><span style=" font-weight:600;">Dosyanızı şifreleyin!</span></p><p>Dosyanın şifresini çözebilecek her kişinin Kilit Kimliği'ni ekleyin.</p><p>Kendi kimliğinizi atlarsanız, elde edilen dosyanın şifresini çözemezsiniz.</p><p>Bir miniLock dosyası, gönderen veya alıcılar hakkında görünür ipuçları vermez.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="853"/> + <source>Move to the previous screen.</source> + <translation>Bir önceki ekrana geçin.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="880"/> + <source>This is your Lock-ID.</source> + <translation>Bu senin Lock-ID.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="883"/> + <source><My Lock-ID></source> + <translation><Kilit Kimliğim></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="893"/> + <source>Copy your Lock-ID to the clipboard.</source> + <translation>Lock-ID'nizi panoya kopyalayın.</translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-weight:600;">Encrypt your file!</span></p><p>Add the miniLock ID of each person which should be able to decrypt the file.</p><p>If you omit your own ID, you will not be able to decrypt the resulting file.</p><p>A miniLock file does not give visible hints about the sender nor the recipients.</p></body></html></source> + <oldsource><html><head/><body><p><span style=" font-weight:600;">Encrypt your file!</span></p><p>Add the miniLock ID of each person which should be able to decrypt the file.</p><p>You can add up to 128 recipient IDs.</p><p>If you omit your own ID, you will not be able to decrypt the resulting file.</p><p>A miniLock file does not give visible hints about the sender nor the recipients.</p></body></html></oldsource> + <translation type="vanished"><html><head/><body><p><span style=" font-weight:600;">Verschlüssele deine Datei!</span></p><p>Füge die miniLock-ID jeder Person hinzu, die die Datei öffnen soll.</p><p>Wenn Du Deine ID auslässt, kannst du die verschlüsselte Datei nicht öffnen.</p><p>Eine miniLock-Datei enthält keine sichtbaren Hinweise auf Sender oder Empfänger.</p></body></html></translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="1007"/> + <source>&Translation hints</source> + <translation>Tercüme ipuçları</translation> + </message> + <message> + <source><html><head/><body><p><span style=" font-weight:600;">Encrypt your file!</span></p><p>Add the miniLock ID of each person which should be able to decrypt the file.</p><p>You can add up to 50 recipient IDs.</p><p>If you omit your own ID, you will not be able to decrypt the resulting file.</p></body></html></source> + <translation type="vanished"><html><head/><body><p><span style=" font-weight:600;">Datei verschlüsseln!</span></p><p>Füge die miniLock-ID jeder Person hinzu, welche die Datei entschlüsseln darf.</p><p>Du kannst bis zu 50 Empfänger-IDs angeben.</p><p>Wenn Du deine eigene ID auslässt, kannst du die verschlüsselte Datei nicht mehr öffnen.</p></body></html></translation> + </message> + <message> + <source>Move to the previous screen</source> + <translation type="vanished">Zum vorherigen Dialog wechseln</translation> + </message> + <message> + <source>This is your miniLock ID</source> + <translation type="vanished">Dies ist Deine miniLock ID</translation> + </message> + <message> + <source><My miniLock ID></source> + <translation type="vanished"><Meine MiniLock ID></translation> + </message> + <message> + <source>Copy your miniLock ID to the clipboard</source> + <translation type="vanished">Kopiere Deine MiniLock ID in die Zwischenablage</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="958"/> + <source>Browse the destination directory.</source> + <translation>Hedef dizine göz atın.</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="985"/> + <source>He&lp</source> + <translation>&Yardım</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="997"/> + <source>&About MikroLock</source> + <oldsource>&About µlock</oldsource> + <translation>&MikroLock Hakkında</translation> + </message> + <message> + <location filename="mlockmainwindow.ui" line="1002"/> + <source>&Manual</source> + <translation>&Hakkında</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="89"/> + <location filename="mlockmainwindow.cpp" line="421"/> + <location filename="mlockmainwindow.cpp" line="560"/> + <source>Input file %1</source> + <translation>%1 giriş dosyası</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="99"/> + <source>The passphrase is too short (minimum: 20 characters).</source> + <translation>Parolanız çok kısa (minimum: 20 karakter).</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="105"/> + <source>The passphrase is strong.</source> + <translation>Parola güçlüdür.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="112"/> + <source>The passphrase must consist of at least five random words. It may be declined by the original miniLock Chrome extension.</source> + <translation>Parolanın en az beş rasgele sözcükten oluşması gerekir. Orijinal miniLock Chrome uzantısı tarafından reddedilebilir.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="133"/> + <source>You do not need to enter an email address here unless you intend to use the Chrome miniLock extension.</source> + <translation>Chrome miniLock uzantısını kullanmayacaksanız burada bir e-posta adresi girmeniz gerekmez.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="180"/> + <source>Scrypt error</source> + <translation>Scrypt hatası</translation> + </message> + <message> + <source>You do not need to enter an email address here unless you want to use the Chrome miniLock extension.</source> + <translation type="vanished">Du musst hier keine Mail-Adresse angeben, wenn du nicht auch das Chrome miniLock-Plugin benutzen willst.</translation> + </message> + <message> + <source>Invalid argument</source> + <translation type="vanished">Ungültiges Argument</translation> + </message> + <message> + <source>%1 is not a minilock file.</source> + <translation type="vanished">%1 ist keine minilock-Datei.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="136"/> + <source>This mail address appears to be valid.</source> + <translation>Bu posta adresi geçerli gibi görünüyor.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="139"/> + <source>This mail address appears to be invalid.</source> + <translation>Bu posta adresi geçersiz görünüyor.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="180"/> + <source>Key derivation failed</source> + <translation>Anahtar türetme başarısız oldu</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="180"/> + <source>Argon2 error</source> + <translation>Argon2 hatası</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="207"/> + <source>%1 file %2...</source> + <translation>%1 dosya %2...</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="209"/> + <source>Decrypting</source> + <translation>Şifresini Çözme</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="209"/> + <source>Encrypting</source> + <translation>Şifreleme</translation> + </message> + <message> + <source>Bad miniLock ID</source> + <translation type="vanished">Ungültige MiniLock ID</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="256"/> + <source>The ID %1 is invalid.</source> + <translation>%1 kimliği geçersiz.</translation> + </message> + <message> + <source>No recipients</source> + <translation type="vanished">Keine Empfänger</translation> + </message> + <message> + <source>You need to define some recipient IDs.</source> + <translation type="vanished">Du musst einige Empfänger IDs angeben.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="256"/> + <source>Bad Lock-ID</source> + <translation>Kötü Kilit-Kimliği</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="284"/> + <source>%1 file %2 in %3s</source> + <translation>Dosya %2, %3 %1</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="286"/> + <source>Decrypted</source> + <translation>Şifrelenmiş</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="286"/> + <source>Encrypted</source> + <translation>Şifre çözülmüş</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="299"/> + <location filename="mlockmainwindow.cpp" line="303"/> + <location filename="mlockmainwindow.cpp" line="307"/> + <location filename="mlockmainwindow.cpp" line="311"/> + <location filename="mlockmainwindow.cpp" line="315"/> + <location filename="mlockmainwindow.cpp" line="319"/> + <location filename="mlockmainwindow.cpp" line="323"/> + <location filename="mlockmainwindow.cpp" line="327"/> + <location filename="mlockmainwindow.cpp" line="331"/> + <location filename="mlockmainwindow.cpp" line="335"/> + <location filename="mlockmainwindow.cpp" line="339"/> + <location filename="mlockmainwindow.cpp" line="343"/> + <location filename="mlockmainwindow.cpp" line="348"/> + <source>Error</source> + <translation>Hata</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="299"/> + <source>Unknown error.</source> + <translation>Bilinmeyen hata </translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="303"/> + <source>Could not decrypt the file.</source> + <translation>Dosya şifresi çözülemedi.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="307"/> + <source>Could not encrypt the file.</source> + <translation>Dosya şifrelenemedi.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="311"/> + <source>Could not open the file.</source> + <translation>Dosya açılamadı.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="315"/> + <source>Could not read the file.</source> + <translation>Dosya okunamadı.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="319"/> + <source>Could not write the file.</source> + <translation>Dosya yazılamadı.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="323"/> + <source>Could not calculate the hash of the file.</source> + <translation>Dosyanın karmasını hesaplayamadı.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="327"/> + <source>Illegal minilock file format.</source> + <translation>Yasadışı minilock dosya biçimi.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="331"/> + <source>No recipients defined.</source> + <translation>Hiç alıcı tanımlanmadı.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="335"/> + <source>You are not allowed to decrypt the file.</source> + <translation>Dosyanın şifresini çözmenize izin verilmiyor.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="339"/> + <source>Empty input file.</source> + <translation>Boş giriş dosyası.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="343"/> + <source>Output file exists: +%1</source> + <translation>Çıktı dosyası var: +%1</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="348"/> + <source>Undefined error.</source> + <translation>Tanımsız hata.</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="374"/> + <source>Select destination directory</source> + <translation>Hedef dizini seçin</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="393"/> + <source>Process given file</source> + <translation>Verilen dosyayı işleme</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="394"/> + <source>%1 %2 +into %3 ?</source> + <translation>%1 %2 +in %3 ?</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="395"/> + <source>Decrypt</source> + <translation>Decrypt</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="396"/> + <source>Encrypt</source> + <translation>Encrypt</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="464"/> + <source>About providing translations</source> + <translation>Çeviriler sağlama hakkında</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="465"/> + <source>This GUI was developed using the Qt toolkit, and translations may be provided using the tools Qt Linguist and lrelease. +The ts files for Linguist reside in the src/gui/qt-widgets subdirectory. +The qm file generated by lrelease has to be saved in l10n. + +Please send a note to as (at) andre-simon (dot) de if you have issues while translating or if you have finished or updated a translation.</source> + <translation>Bu GUI Qt araç setini kullanarak geliştirildi ve çeviriler Qt Linguist ve lrelease araçlarını kullanarak sağlanabilir. +Dilbilimcinin ts dosyaları src / gui / qt-widgets alt dizininde bulunur. +Lrelease tarafından üretilen qm dosyası l10n'ye kaydedilmelidir. + +Çeviri yaparken ya da bir çeviriyi tamamladığınızda veya güncellediğinizde lütfen sorun yaşarsanız, bir (as) andre-simon (nokta) de adresine bir not gönderin.</translation> + </message> + <message> + <source>Decrypt given file</source> + <translation type="vanished">Entschlüssele angegebene Datei</translation> + </message> + <message> + <source>Decrypt %1 +into %2 ?</source> + <translation type="vanished">%1 in +%2 +entschlüsseln?</translation> + </message> + <message> + <source>Decrypt %1?</source> + <translation type="vanished">%1 entschlüsseln?</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="497"/> + <source>Select the recipient list file</source> + <translation>Alıcı listesi dosyasını seçin</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="555"/> + <source>Enter your mail adress and passphrase</source> + <translation>E-posta adresinizi ve parolanızı girin</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="567"/> + <source>Set input and output parameters</source> + <translation>Giriş ve çıkış parametrelerini ayarla</translation> + </message> + <message> + <location filename="mlockmainwindow.cpp" line="572"/> + <source>Set encryption options for %1</source> + <translation>%1 için şifreleme seçeneklerini ayarla</translation> + </message> +</context> +<context> + <name>ShowManualDialog</name> + <message> + <location filename="showmanualdialog.ui" line="14"/> + <source>MikroLock manual</source> + <oldsource>mlock manual</oldsource> + <translation>MikroLock manual</translation> + </message> +</context> +</TS> diff --git a/talimatname/genel/m/mikrolock/talimat b/talimatname/genel/m/mikrolock/talimat new file mode 100644 index 000000000..6c8616b4a --- /dev/null +++ b/talimatname/genel/m/mikrolock/talimat @@ -0,0 +1,40 @@ +# Tanım: Minilock dosya biçiminin, şifrelenmiş miniLock dosyalarını okuyabilen ve yazabilen hızlı yerel bir uygulaması. +# URL: http://andre-simon.de/doku/mlock/en/mlock.php +# Paketçi: Cihan_Alkan +# Gerekler: qt5 libsodium +# Grup: güvenlik + +isim=mikrolock +surum=1.1 +devir=1 +kaynak=(http://andre-simon.de/zip/$isim-$surum.tar.bz2 + mikrolock_tr_TR.ts) + +derle() { + [ ! -f /usr/bin/qmake ] && ln -s /usr/bin/qmake-qt5 /usr/bin/qmake + cd $isim-$surum + make help + make + make gui + + make DESTDIR="$PKG" install + make DESTDIR="$PKG" install-gui + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Version=1.0 +Name=MikroLock +Type=Application +Comment=MikroLock, şifreli miniLock dosyalarını okur ve yazar. +Exec=mikrolock-gui +TryExec=mikrolock-gui +Icon=mikrolock +Categories=Utility;TextTools; +StartupNotify=true +EOF + + lrelease-qt5 ../mikrolock_tr_TR.ts -qm $PKG/usr/share/mikrolock/l10n/mikrolock_tr_TR.qm + +} diff --git a/talimatname/genel/m/milis-yukleyici/talimat b/talimatname/genel/m/milis-yukleyici/talimat new file mode 100644 index 000000000..685bbb0f4 --- /dev/null +++ b/talimatname/genel/m/milis-yukleyici/talimat @@ -0,0 +1,26 @@ +# Tanım: Milis linux python3 qt5 tabanlı kurulum aracı +# URL: https://github.com/sonakinci41/Milis-Yukleyici +# Paketçi: milisarge +# Gerekler: python3 python3-pip python3-yaml python3-qt5 python3-parted python3-pytz + +isim=milis-yukleyici +surum=1.0 +devir=1 +kaynak=(https://github.com/sonakinci41/Milis-Yukleyici/archive/master.tar.gz::$isim-$surum.tar.gz + yukleyici.desktop) + +derle() { + + install -d $PKG/usr/share/milis-yukleyici + install -d $PKG/usr/share/applications + install -d $PKG/usr/bin + cp -r $SRC/Milis-Yukleyici-master/* $PKG/usr/share/milis-yukleyici + cp $SRC/yukleyici.desktop $PKG/usr/share/applications/yukleyici.desktop + chmod 755 $PKG/usr/share/milis-yukleyici/milis-kur + cat > "$PKG/usr/bin/milis-kurulum" << EOF +#!/bin/sh +python3 /usr/share/$isim/milis-kur "\$@" +EOF + + chmod +x "$PKG"/usr/bin/milis-kurulum +} diff --git a/talimatname/genel/m/milis-yukleyici/yukleyici.desktop b/talimatname/genel/m/milis-yukleyici/yukleyici.desktop new file mode 100644 index 000000000..cfe36f390 --- /dev/null +++ b/talimatname/genel/m/milis-yukleyici/yukleyici.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Path=/usr/share/milis-yukleyici +Name=Milis Linux Yükleyicisi +Comment=Milis Linux Yükleyicisi +Exec=milis-kurulum +Terminal=false +Type=Application +Icon=/sources/milis.git/ayarlar/milislogo.png +Categories=System; +StartupNotify=false diff --git a/talimatname/genel/m/milislinux-saat/kk_milislinux-saat b/talimatname/genel/m/milislinux-saat/kk_milislinux-saat new file mode 100755 index 000000000..1dc84ad76 --- /dev/null +++ b/talimatname/genel/m/milislinux-saat/kk_milislinux-saat @@ -0,0 +1,53 @@ +#!/bin/sh + +# Milislinux uyarlı zaman ayarlama betiği + +if [ ! -d "/var/lib/pkg/DB/xdialog" ];then + echo "xdialog paketini kurunuz-> mps kur xdialog" + exit 1 +fi + +HWCLOCK=/sbin/hwclock +if [ -f "/usr/sbin/hwclock" ];then + HWCLOCK=/usr/sbin/hwclock +fi + +# Title to be used for all Xdialog boxes. +TITLE="Saat Ayarlama Aracı" + +# Now check for hwclock existence... +if ! [ -f $HWCLOCK ] ; then + Xdialog --title "$TITLE" --msgbox "$HWCLOCK bulunamadı..." 0 0 + exit 0 +fi + +# Get the date (returned in DD/MM/YYYY format by Xdialog. +ENTEREDDATE=`Xdialog --stdout --title "$TITLE" --calendar "Tarihi ayarlayın..." 0 0 0 0 0` +#xmessage $? + +if [ "$?" != "0" ] ; then + Xdialog --title "$TITLE" --msgbox "İptal edildi." 0 0 + exit 0 +fi + +# Convert the date to the MM/DD/YYYY format needed by hwclock. +NEWDATE=`echo "$ENTEREDDATE" | awk --source 'BEGIN { FS="/" }' --source '{ print $2 "/" $1 "/" $3 }'` + +# Get the time in HH:MM:SS format. +NEWTIME=`Xdialog --stdout --title "$TITLE" --timebox "Zamanı ayarlayın..." 0 0` +if [ "$?" != "0" ] ; then + Xdialog --title "$TITLE" --msgbox "Aborted." 0 0 + exit 0 +fi + + +# Set the hardware clock (RTC) and then the system clock + +Xdialog --title "bilgi" --msgbox "Gerekli ayarlamalar yapılıyor..." 0 0 + +$HWCLOCK --set --date="$NEWDATE $NEWTIME"&&$HWCLOCK --hctosys + +THEDATE=`date` +Xdialog --title "bilgi" --msgbox "Zaman ayarlama yapıldı. $THEDATE" 0 0 + +pgrep xfce4-panel && xfce4-panel -r diff --git a/talimatname/genel/m/milislinux-saat/milislinux-saat.desktop b/talimatname/genel/m/milislinux-saat/milislinux-saat.desktop new file mode 100644 index 000000000..78c02c51c --- /dev/null +++ b/talimatname/genel/m/milislinux-saat/milislinux-saat.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Path=/usr/bin/milis-saat +Name=Milis Saat Ayarlama Uygulaması +Comment=Milis Saat Ayarlama Uygulaması +Exec=sudo /usr/bin/milislinux-saat +Terminal=false +Type=Application +Icon=milislinux-saat +Categories=System; diff --git a/talimatname/genel/m/milislinux-saat/milislinux-saat.xpm b/talimatname/genel/m/milislinux-saat/milislinux-saat.xpm new file mode 100644 index 000000000..4790492ee --- /dev/null +++ b/talimatname/genel/m/milislinux-saat/milislinux-saat.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char * icon_xpm[] = { +"16 16 4 1", +" c None", +". c #000000", +"+ c #C0C0C0", +"@ c #FFFFFF", +" ", +" ..... ", +" ..@@@@@.. ", +" .+@@@.@@@+. ", +" .@@@@.@@@@. ", +" .@@@@@.@@@@@. ", +" .@@@@@.@@@@@. ", +" .@@@@..@@@@@. ", +" .@@@@@..@@@@. ", +" .@@@@@.@.@@@. ", +" .@@@@@@@@@. ", +" .+@@@@@@@+. ", +" ..@@@@@.. ", +" ..... ", +" ", +" "}; diff --git a/talimatname/genel/m/milislinux-saat/talimat b/talimatname/genel/m/milislinux-saat/talimat new file mode 100644 index 000000000..fdf330a2e --- /dev/null +++ b/talimatname/genel/m/milislinux-saat/talimat @@ -0,0 +1,20 @@ +# Tanım: milislinux saat ayarlama uygulaması +# URL: http://milislinux.org +# Paketçi: milisarge +# Gerekler: xdialog + +isim=milislinux-saat +surum=1.0 +devir=2 +kaynak=(kk_milislinux-saat + milislinux-saat.xpm + milislinux-saat.desktop) + +derle() { + install -d "$PKG/usr/share/pixmaps" + install -d "$PKG/usr/share/applications" + install -d "$PKG/usr/bin" + cp $SRC/kk_milislinux-saat "$PKG/usr/bin/milislinux-saat" + cp $SRC/milislinux-saat.desktop "$PKG/usr/share/applications" + cp $SRC/milislinux-saat.xpm "$PKG/usr/share/pixmaps" +} diff --git a/talimatname/genel/m/minidlna/minidlna b/talimatname/genel/m/minidlna/minidlna new file mode 100644 index 000000000..99ae2e948 --- /dev/null +++ b/talimatname/genel/m/minidlna/minidlna @@ -0,0 +1,55 @@ +#!/bin/sh +######################################################################## +# Begin minidlna +# +# Tanım: ReadyMedia is a simple media server software +# +# Authors : tnut +# +# Version : LFS x.x saravane +# +# Notes : +# +######################################################################## + +### BEGIN INIT INFO +# Provides: minidlna +# Required-Start: +# Should-Start: +# Required-Stop: +# Should-Stop: +# Default-Start: +# Default-Stop: +# Short-Tanım: +# Tanım: +# X-LFS-Provided-By: +### END INIT INFO + +. /lib/lsb/init-functions + +case "${1}" in + start) + log_info_msg "Starting ReadyMedia..." + start_daemon /usr/sbin/minidlnad + ;; + + stop) + log_info_msg "Stopping ReadyMedia..." + killproc /usr/sbin/minidlnad + ;; + + restart) + ${0} stop + sleep 1 + ${0} start + ;; + + *) + echo "Usage: ${0} {start|stop|restart}" + exit 1 + ;; +esac + +exit 0 + +# End minidlna diff --git a/talimatname/genel/m/minidlna/talimat b/talimatname/genel/m/minidlna/talimat new file mode 100644 index 000000000..1155cb92f --- /dev/null +++ b/talimatname/genel/m/minidlna/talimat @@ -0,0 +1,44 @@ +# Tanım: Bir DLNA / UPnP-AV Medya sunucusu (ReadyDLNA olarak da bilinir) +# URL: http://minidlna.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libexif libjpeg-turbo libid3tag flac libvorbis ffmpeg sqlite + +isim=minidlna +surum=1.1.4 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/$isim/$isim/$surum/minidlna-$surum.tar.gz + minidlna) + +derle() { + cd $isim-$surum + sed -i 's|#user=.*|user=nobody|g' minidlna.conf + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + install -Dm644 minidlna.conf $PKG/etc/minidlna.conf + + # Man + install -Dm644 minidlna.conf.5 \ + $PKG/usr/share/man/man5/minidlna.conf.5 + + install -Dm644 minidlnad.8 \ + $PKG/usr/share/man/man8/minidlnad.8 + + # Service + mkdir -p $PKG/etc/rc.d/init.d + install -Dm754 $SRC/minidlna $PKG/etc/rc.d/init.d/minidlna + for i in 0 1 6 + do + mkdir -p $PKG/etc/rc.d/rc${i}.d + cd $PKG/etc/rc.d/rc${i}.d + ln -s ../init.d/minidlna K10minidlna + done + for i in 2 3 4 5 + do + mkdir -p $PKG/etc/rc.d/rc${i}.d + cd $PKG/etc/rc.d/rc${i}.d + ln -s ../init.d/minidlna S90minidlna + done + +} diff --git a/talimatname/genel/m/mininet/talimat b/talimatname/genel/m/mininet/talimat new file mode 100644 index 000000000..d03f8130b --- /dev/null +++ b/talimatname/genel/m/mininet/talimat @@ -0,0 +1,24 @@ +# Tanım: İşlem tabanlı ağ emülatörü +# URL: https://github.com/mininet/mininet/ +# Paketçi: Cihan_Alkan +# Gerekler: help2man python-setuptools python pynetworkx net-tools iputils iperf openvswitch +# Grup: ağ + +isim=mininet +surum=2.2.1 +devir=1 +kaynak=(https://github.com/mininet/mininet/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + grep python Makefile + grep -rIil '#!.*python' . | xargs -n1 sed -i 's:#!/usr/bin/env python:#!/usr/bin/env python2:g' + grep -rIil '#!.*python' . | xargs -n1 sed -i 's:#!/usr/bin/python:#!/usr/bin/python2:g' + sed 's:BINDIR = /usr/bin:BINDIR = $(DESTDIR)/usr/bin:g' -i Makefile + sed 's:MANDIR = /usr/share/man/man1:MANDIR = $(DESTDIR)/usr/share/man/man1:g' -i Makefile + sed 's:install $(MNEXEC) $(BINDIR):mkdir -p $(BINDIR); install $(MNEXEC) $(BINDIR):g' -i Makefile + sed 's:install $(MANPAGES) $(MANDIR):mkdir -p $(MANDIR);install $(MANPAGES) $(MANDIR):g' -i Makefile + sed 's:python setup.py:python setup.py install --prefix=/usr --root="$(DESTDIR)" --optimize=1:g' -i Makefile + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/m/miniupnpc/talimat b/talimatname/genel/m/miniupnpc/talimat new file mode 100644 index 000000000..2be9d3d0f --- /dev/null +++ b/talimatname/genel/m/miniupnpc/talimat @@ -0,0 +1,16 @@ +# Tanım: Internet Ağ Geçidi Aygıtlarına erişmek için küçük bir UPnP istemci kitaplığı/aracı +# URL: http://miniupnp.free.fr +# Paketçi: milisarge +# Gerekler: + +isim=miniupnpc +surum=1.9 +devir=1 + +kaynak=(http://miniupnp.free.fr/files/$isim-$surum.tar.gz) + +derle() { + cd $SRC/$isim-$surum + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/minizip/talimat b/talimatname/genel/m/minizip/talimat new file mode 100644 index 000000000..e46602402 --- /dev/null +++ b/talimatname/genel/m/minizip/talimat @@ -0,0 +1,27 @@ +# Tanım: Gzip ve PKZIP'de bulunan deflate sıkıştırma yöntemini uygulayan sıkıştırma kitaplığı +# URL: https://www.zlib.net/ +# Paketçi: milisarge +# Gerekler: + +isim=minizip +surum=1.2.11 +devir=1 +kaynak=(https://zlib.net/zlib-${surum}.tar.gz) + +derle() { + cd zlib-$surum + grep -A 24 '^ Copyright' zlib.h > LICENSE + ./configure --prefix=/usr + make + + cd contrib/minizip + cp Makefile Makefile.orig + cp ../README.contrib readme.txt + autoreconf --install + ./configure --prefix=/usr --enable-static=no + make + + cd ${SRC}/zlib-$surum/contrib/minizip + make install DESTDIR=${PKG} + install -D -m644 ${SRC}/zlib-$surum/LICENSE ${PKG}/usr/share/licenses/minizip/LICENSE +} diff --git a/talimatname/genel/m/mixxx/talimat b/talimatname/genel/m/mixxx/talimat new file mode 100644 index 000000000..9f3f78831 --- /dev/null +++ b/talimatname/genel/m/mixxx/talimat @@ -0,0 +1,18 @@ +# Tanım: Dijital DJ'ler için ücretsiz açık kaynaklı yazılım. +# URL: http://www.mixxx.org/ +# Paketçi: milisarge +# Gerekler: fftw libid3tag libmad libogg libshout libsndfile libusb libmp4v2 portaudio portmidi ffmpeg taglib protobuf qt4 taglib vamp-plugin-sdk xorg-glu xorg-mesa scons + +isim=mixxx +surum=1.11.0 +devir=2 + +kaynak=(http://downloads.mixxx.org/$isim-$surum/$isim-$surum-src.tar.gz) + +derle() { +cd $SRC/$isim-$surum +scons qtdir=/usr prefix=/usr faad=1 +scons qtdir=/usr prefix=/usr install_root=$PKG/usr install +} + + diff --git a/talimatname/genel/m/mlocate/mlocate.kur-kos b/talimatname/genel/m/mlocate/mlocate.kur-kos new file mode 100644 index 000000000..656f85d2b --- /dev/null +++ b/talimatname/genel/m/mlocate/mlocate.kur-kos @@ -0,0 +1 @@ +groupadd locate diff --git a/talimatname/genel/m/mlocate/talimat b/talimatname/genel/m/mlocate/talimat new file mode 100644 index 000000000..410aeadfa --- /dev/null +++ b/talimatname/genel/m/mlocate/talimat @@ -0,0 +1,28 @@ +# Tanım: locate/updatedb birleştirilmiş uygulaması +# Url: https://fedorahosted.org/mlocate/ +# Paketçi: milisarge +# Gerekler: + +isim=mlocate +surum=0.26 +devir=1 + +kaynak=(https://fedorahosted.org/releases/m/l/mlocate/mlocate-${surum}.tar.xz + updatedb.conf) + +derle() { + cd ${isim}-$surum + sed -i '/^groupname /s/mlocate/locate/' Makefile.in + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/lib + make + make DESTDIR="${PKG}" install + + chgrp 21 "${PKG}/usr/bin/locate" + chmod 2755 "${PKG}/usr/bin/locate" + ln -s locate "${PKG}/usr/bin/slocate" + + install -dm755 "${PKG}/var/lib" + install -dm750 -g21 "${PKG}/var/lib/locate" + + install -Dm644 ../updatedb.conf "${PKG}/etc/updatedb.conf" +} diff --git a/talimatname/genel/m/mlocate/updatedb.conf b/talimatname/genel/m/mlocate/updatedb.conf new file mode 100644 index 000000000..633c17482 --- /dev/null +++ b/talimatname/genel/m/mlocate/updatedb.conf @@ -0,0 +1,4 @@ +PRUNE_BIND_MOUNTS = "yes" +PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset cramfs debugfs devpts devtmpfs ecryptfs exofs ftpfs fuse fuse.encfs fuse.sshfs fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs shfs smbfs sockfs sshfs sysfs tmpfs ubifs udf usbfs vboxsf" +PRUNENAMES = ".git .hg .svn" +PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache /var/lib/pacman/local /var/lock /var/run /var/spool /var/tmp" diff --git a/talimatname/genel/m/mlt/talimat b/talimatname/genel/m/mlt/talimat new file mode 100644 index 000000000..37550ff24 --- /dev/null +++ b/talimatname/genel/m/mlt/talimat @@ -0,0 +1,28 @@ +# Tanım: Açık kaynak multimedya çerçevesi +# URL: http://www.mltframework.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: ladspa frei0r-plugins libdv sdl-image libsamplerate sox ffmpeg vid-stab qt5 jack libexif swig movit eigen3 + +isim=mlt +surum=6.2.0 +devir=1 + +kaynak=(https://github.com/mltframework/mlt/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --avformat-swscale \ + --enable-gpl --enable-gpl3 \ + --qt-libdir=/usr/lib --qt-includedir=/usr/include/qt + make + make DESTDIR=$PKG install + + # mlt python bindings + cd src/swig/python + ./build + mkdir -p $PKG/usr/lib/python2.7/ + install -m755 mlt.py $PKG/usr/lib/python2.7/ + install -m755 _mlt.so $PKG/usr/lib/python2.7/ + install -m755 mlt_wrap.o $PKG/usr/lib/python2.7/ +} diff --git a/talimatname/genel/m/mlton/talimat b/talimatname/genel/m/mlton/talimat new file mode 100644 index 000000000..7c392acb4 --- /dev/null +++ b/talimatname/genel/m/mlton/talimat @@ -0,0 +1,16 @@ +# Tanım: standart ML derleyicisi +# URL: http://mlton.org/ +# Paketçi: milisarge +# Gerekler: setconf python + +isim=mlton +surum=20130715 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/$isim/$isim/$surum/$isim-$surum.src.tgz + http://downloads.sourceforge.net/project/$isim/$isim/$surum/$isim-$surum-1.amd64-linux.tgz) + +derle() { + setconf usr/bin/mlton lib="$SRC/usr/lib/mlton" + PATH="$PATH:$SRC/usr/bin" make -C "$isim-$surum" -j1 all-no-docs + make -C "$isim-$surum" DESTDIR="$PKG" -j1 install-no-docs +} diff --git a/talimatname/genel/m/mobile-broadband-provider-info/talimat b/talimatname/genel/m/mobile-broadband-provider-info/talimat new file mode 100644 index 000000000..ce6e0c05f --- /dev/null +++ b/talimatname/genel/m/mobile-broadband-provider-info/talimat @@ -0,0 +1,17 @@ +# Tanım: Çeşitli servis sağlayıcılar için mobil geniş bant ayarları +# URL: http://git.gnome.org/browse/mobile-broadband-provider-info/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=mobile-broadband-provider-info +surum=20151214 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/$surum/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/moc/talimat b/talimatname/genel/m/moc/talimat new file mode 100644 index 000000000..d92773cd3 --- /dev/null +++ b/talimatname/genel/m/moc/talimat @@ -0,0 +1,25 @@ +# Tanım: Konsol müzik çalar. +# URL: http://moc.daper.net/ +# Paketçi: milisarge +# Gerekler: curl libsndfile jack libid3tag libmad + + +isim=moc +surum=2.5.1 +devir=1 +kaynak=(ftp://ftp.daper.net/pub/soft/$isim/stable/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + autoreconf -f -i -Wall,no-obsolete + ./configure --prefix=/usr --without-rcc \ + --with-alsa --with-jack --with-aac --with-mp3 \ + --with-musepack --with-vorbis --with-flac --with-wavpack \ + --with-sndfile --with-modplug --with-ffmpeg --with-speex \ + --with-samplerate --with-curl --with-sidplay2 --disable-debug + + make + make DESTDIR=$PKG install + install -D -m 0644 -t $PKG/usr/share/moc/ config.example keymap.example + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/m/mod-dnssd/fix_undefined_reference.patch b/talimatname/genel/m/mod-dnssd/fix_undefined_reference.patch new file mode 100644 index 000000000..e0567c613 --- /dev/null +++ b/talimatname/genel/m/mod-dnssd/fix_undefined_reference.patch @@ -0,0 +1,21 @@ +diff --git a/src/mod_dnssd.c b/src/mod_dnssd.c +index 6179276..3363701 100644 (file) +--- a/src/mod_dnssd.c ++++ b/src/mod_dnssd.c +@@ -24,6 +24,7 @@ + #include <ap_config.h> + #include <apr_strings.h> + #include <unixd.h> ++#include <mod_unixd.h> + #include <apr_signal.h> + #include <mpm_common.h> + +@@ -576,7 +577,7 @@ static void child_process(apr_pool_t *p, server_rec *server, struct global_confi + + ap_assert(d); + +- unixd_setup_child(); ++ ap_unixd_setup_child(); + + if (pipe(sigterm_pipe_fds) < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r.main_server, "pipe() failed: %s", strerror(errno)); diff --git a/talimatname/genel/m/mod-dnssd/talimat b/talimatname/genel/m/mod-dnssd/talimat new file mode 100644 index 000000000..c1650fc57 --- /dev/null +++ b/talimatname/genel/m/mod-dnssd/talimat @@ -0,0 +1,21 @@ +# Tanım: Apache için Zeroconf modülü +# URL: http://0pointer.de/lennart/projects/mod_dnssd +# Paketçi: milisarge +# Gerekler: avahi apache + +_isim=mod_dnssd +isim=mod-dnssd +surum=0.6 +devir=1 + +kaynak=(http://0pointer.de/lennart/projects/${_name}/${_name}-${surum}.tar.gz + fix_undefined_reference.patch) + +derle() { + cd ${_name}-$surum + patch -p1 < ${SRC}/fix_undefined_reference.patch + ./configure --prefix=/usr --disable-lynx + make + install -D -m755 src/.libs/mod_dnssd.so ${PKG}/usr/lib/httpd/modules/mod_dnssd.so +} + diff --git a/talimatname/genel/m/modemmanager/talimat b/talimatname/genel/m/modemmanager/talimat new file mode 100644 index 000000000..00eced261 --- /dev/null +++ b/talimatname/genel/m/modemmanager/talimat @@ -0,0 +1,26 @@ +# Tanım: Mobil geniş bant modem yönetim hizmeti +# URL: http://www.freedesktop.org/wiki/Software/ModemManager/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: intltool glib gobject-introspection libgudev polkit libmbim vala libqmi + +isim=modemmanager +surum=1.4.14 +devir=1 +_isim=ModemManager + +kaynak=( http://www.freedesktop.org/software/${_name}/${_name}-$surum.tar.xz) + + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-gtk-doc \ + --enable-more-warnings=no \ + --disable-static + +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/m/moka-icon-theme/moka-icon-theme.kur-kos b/talimatname/genel/m/moka-icon-theme/moka-icon-theme.kur-kos new file mode 100644 index 000000000..b09e954be --- /dev/null +++ b/talimatname/genel/m/moka-icon-theme/moka-icon-theme.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/Moka diff --git a/talimatname/genel/m/moka-icon-theme/talimat b/talimatname/genel/m/moka-icon-theme/talimat new file mode 100644 index 000000000..a95f00c8f --- /dev/null +++ b/talimatname/genel/m/moka-icon-theme/talimat @@ -0,0 +1,17 @@ +# Tanım: Moka, net, basit ve tutarlı olacak şekilde tasarlanmış, stil sahibi bir Linux masaüstü simge setidir. Moka Icon Teması (simge varlıkları ve kaynakları) bir Creative Commons Attribution-ShareAlike 4.0 lisansı altındadır. +# URL: https://github.com/snwh/moka-icon-theme +# Paketçi: yasarciv +# Gerekler: gtk-update-icon-cache faba-icon-theme + + +isim=moka-icon-theme +surum=5.3.5 +devir=1 +kaynak=(https://github.com/snwh/$isim/archive/v$surum.tar.gz) + +derle() { +cd $isim-$surum + bash autogen.sh --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mono-addins/talimat b/talimatname/genel/m/mono-addins/talimat new file mode 100644 index 000000000..db4e29578 --- /dev/null +++ b/talimatname/genel/m/mono-addins/talimat @@ -0,0 +1,27 @@ +# Tanım: mono eklentileri +# URL: http://www.mono-project.com/Mono.Addins +# Paketçi: milisarge +# Gerekler: gtk-sharp2 gtk-sharp3 mono +# Grup: geliştirme + +isim=mono-addins +surum=1.3.3 +devir=1 +kaynak=(https://github.com/mono/mono-addins/archive/mono-addins-$surum.tar.gz + https://github.com/Microsoft/msbuild/releases/download/mono-hosted-msbuild-v0.03/mono_msbuild_d25dd923839404bd64cc63f420e75acf96fc75c4.zip) + +derle() { + local msbuild="$SRC/msbuild/MSBuild.exe" + cd ${isim}-${isim}-${surum} + ./autogen.sh --prefix=/usr --enable-gui + make + mono "$msbuild" Mono.Addins/Mono.Addins.csproj /p:WarningLevel=0;Configuration=Release + mono "$msbuild" Mono.Addins.CecilReflector/Mono.Addins.CecilReflector.csproj /p:WarningLevel=0;Configuration=Release + mono "$msbuild" Mono.Addins.Gui/Mono.Addins.Gui.csproj /p:WarningLevel=0;Configuration=Release + mono "$msbuild" Mono.Addins.GuiGtk3/Mono.Addins.GuiGtk3.csproj /p:WarningLevel=0;Configuration=Release + mono "$msbuild" Mono.Addins.MSBuild/Mono.Addins.MSBuild.csproj /p:WarningLevel=0;Configuration=Release + mono "$msbuild" Mono.Addins.Setup/Mono.Addins.Setup.csproj /p:WarningLevel=0;Configuration=Release + cd $SRC/${isim}-${isim}-${surum} + make DESTDIR=$PKG install + install -Dm644 COPYING ${PKG}/usr/share/licenses/${isim}/COPYING +} diff --git a/talimatname/genel/m/mono/mono.binfmt.d b/talimatname/genel/m/mono/mono.binfmt.d new file mode 100644 index 000000000..3075b0dc5 --- /dev/null +++ b/talimatname/genel/m/mono/mono.binfmt.d @@ -0,0 +1 @@ +:CLR:M::MZ::/usr/bin/mono: diff --git a/talimatname/genel/m/mono/mono.kur-kos b/talimatname/genel/m/mono/mono.kur-kos new file mode 100644 index 000000000..d522e0b92 --- /dev/null +++ b/talimatname/genel/m/mono/mono.kur-kos @@ -0,0 +1 @@ +ln -sf /usr/bin/mono-sgen /usr/bin/mono diff --git a/talimatname/genel/m/mono/talimat b/talimatname/genel/m/mono/talimat new file mode 100644 index 000000000..5d43bdac9 --- /dev/null +++ b/talimatname/genel/m/mono/talimat @@ -0,0 +1,31 @@ +# Tanım: .NET'in ücretsiz uygulanması +# URL: http://www.mono-project.com/ +# Paketçi: milisarge +# Gerekler: ca-certificates libgdiplus python + +isim=mono +surum=5.0.0.94 +devir=1 + +kaynak=(http://download.mono-project.com/sources/$isim/$isim-$surum.tar.bz2 + mono.binfmt.d) + +derle() { + cd $isim-${surum%.*} + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --bindir=/usr/bin \ + --sbindir=/usr/bin \ + --disable-quiet-build \ + --disable-system-aot \ + --with-mcs-docs=no + make + make DESTDIR=$PKG install + cd $SRC/${isim}-${surum%.*}/mcs/jay + make DESTDIR=$PKG prefix=/usr INSTALL=../../install-sh install + + # install binfmt conf file and pathes + install -D -m644 $SRC/mono.binfmt.d $PKG/usr/lib/binfmt.d/mono.conf + #fix .pc file to be able to request mono on what it depends, fixes #go-oo build + sed -i -e "s:#Requires:Requires:" ${PKG}/usr/lib/pkgconfig/mono.pc +} diff --git a/talimatname/genel/m/moreutils/talimat b/talimatname/genel/m/moreutils/talimat new file mode 100644 index 000000000..17fd16bde --- /dev/null +++ b/talimatname/genel/m/moreutils/talimat @@ -0,0 +1,19 @@ +# Tanım: ek unix araçları +# URL: https://joeyh.name/code/moreutils/ +# Paketçi: milisarge +# Gerekler: docbook2x docbook-xml perl-xml-sax git perl-timedate perl-time-duration + +isim=moreutils +surum=0.61 +devir=1 +kaynak=(https://github.com/rtlanceroad/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make DOCBOOK2XMAN=docbook2man + make PREFIX="$PKG"/usr install + chmod 0644 "$PKG"/usr/share/man/man1/* + mv "$PKG"/usr/share/man/man1/ts.1 "$PKG"/usr/share/man/man1/ts.1moreutils + mv "$PKG"/usr/share/man/man1/parallel.1 "$PKG"/usr/share/man/man1/parallel-moreutils.1 + mv "$PKG"/usr/bin/parallel "$PKG"/usr/bin/parallel-moreutils +} diff --git a/talimatname/genel/m/mosh/talimat b/talimatname/genel/m/mosh/talimat new file mode 100644 index 000000000..9425fa0bb --- /dev/null +++ b/talimatname/genel/m/mosh/talimat @@ -0,0 +1,24 @@ +# Tanım: Dolaşıma izin veren, aralıklı bağlantıyı destekleyen ve kullanıcı tuş vuruşlarının akıllı yerel eko ve hat düzenini sağlayan uzak terminal uygulaması. +# URL: http://mosh.mit.edu/ +# Paketçi: milisarge +# Gerekler: libutempter perl-io-tty protobuf + +isim=mosh +surum=1.2.4 +devir=1 + +kaynak=(http://mosh.mit.edu/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + install -Dm644 conf/bash_completion.d/$isim \ + $PKG/usr/share/bash-completion/completions/$isim +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/m/mosquitto-php/talimat b/talimatname/genel/m/mosquitto-php/talimat new file mode 100644 index 000000000..52ffda562 --- /dev/null +++ b/talimatname/genel/m/mosquitto-php/talimat @@ -0,0 +1,28 @@ +# Tanım: Açık Kaynaklı MQTT v3.1 Broker Php kütüphanesi +# URL: https://github.com/mgdm/Mosquitto-PHP +# Paketçi: Cihan_Alkan +# Gerekler: mosquitto php +# Grup: kütüphane + +isim=mosquitto-php +surum=0.2 +devir=1 + +kaynak=() + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/mgdm/Mosquitto-PHP $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim +phpize +./configure --with-mosquitto=/usr/lib/libmosquitto +make +make INSTALL_ROOT=$PKG install + +} diff --git a/talimatname/genel/m/mosquitto/talimat b/talimatname/genel/m/mosquitto/talimat new file mode 100644 index 000000000..492daaa4c --- /dev/null +++ b/talimatname/genel/m/mosquitto/talimat @@ -0,0 +1,25 @@ +# Tanım: Açık Kaynaklı MQTT v3.1 Broker'ı +# URL: http://mosquitto.org/ +# Paketçi: Cihan_Alkan +# Gerekler: mercurial python docbook-xsl c-ares libwebsockets + +isim=mosquitto +surum=1.4.14 +devir=1 + +kaynak=(https://mosquitto.org/files/source/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + # FIX upstream by making SBINDIR=foo or use CMAKE + sed -i 's|/sbin|/bin|g' src/Makefile + make WITH_WEBSOCKETS=yes + + make prefix=/usr DESTDIR="$PKG" install + + # Shipped in git. + install -Dm644 LICENSE.txt "$PKG/usr/share/licenses/$isim/LICENSE" + + mv "$PKG/etc/$isim/$isim.conf.example" "$PKG/etc/$isim/$isim.conf" +} diff --git a/talimatname/genel/m/mousepad/mousepad.kur-kos b/talimatname/genel/m/mousepad/mousepad.kur-kos new file mode 100644 index 000000000..5cb939023 --- /dev/null +++ b/talimatname/genel/m/mousepad/mousepad.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database /usr/share/applications +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/talimatname/genel/m/mousepad/talimat b/talimatname/genel/m/mousepad/talimat new file mode 100644 index 000000000..863acfc90 --- /dev/null +++ b/talimatname/genel/m/mousepad/talimat @@ -0,0 +1,24 @@ +# Tanım: Mousepad, Xfce masaüstü ortamı için basit bir GTK+2 metin editörüdür. +# URL: http://www.xfce.org/projects/mousepad/ +# Paketçi: milisarge +# Gerekler: dbus-glib startup-notification xorg-libxrandr xorg-libxinerama xorg-libsm desktop-file-utils gtksourceview3 gtk-update-icon-cache + +isim=mousepad +surum=0.4.0 +devir=4 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/xfce4 \ + --localstatedir=/var \ + --disable-static \ + --disable-debug \ + --enable-gtk3 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/movit/talimat b/talimatname/genel/m/movit/talimat new file mode 100644 index 000000000..36402a043 --- /dev/null +++ b/talimatname/genel/m/movit/talimat @@ -0,0 +1,17 @@ +# Tanım: Modern video araç seti +# URL: http://movit.sesse.net/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: eigen3 gtest sdl2 fftw libepoxy + +isim=movit +surum=1.3.2 +devir=1 + +kaynak=(https://movit.sesse.net/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mozo/mozo.kur-kos b/talimatname/genel/m/mozo/mozo.kur-kos new file mode 100755 index 000000000..89379a5ed --- /dev/null +++ b/talimatname/genel/m/mozo/mozo.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/gtk-update-icon-cache -f -t /usr/share/icons/hicolor + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/m/mozo/talimat b/talimatname/genel/m/mozo/talimat new file mode 100644 index 000000000..5f25cfc48 --- /dev/null +++ b/talimatname/genel/m/mozo/talimat @@ -0,0 +1,18 @@ +# Tanım: MATE menü düzenleme aracı +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool gtk3 mate-menus python-gobject +# Grup: mate + +isim=mozo +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mpd/servis b/talimatname/genel/m/mpd/servis new file mode 100644 index 000000000..40ce0fdd1 --- /dev/null +++ b/talimatname/genel/m/mpd/servis @@ -0,0 +1,28 @@ +#!/bin/sh +# +# /etc/init.d/mpd: start/stop mpd daemon +# + +case $1 in +start) + /usr/bin/mpd + ;; +stop) + if [ -f /var/run/mpd.pid ]; then + kill $(< /var/run/mpd.pid) + rm -f /var/run/mpd.pid + else + pkill /usr/bin/mpd + fi +;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) + echo "usage: $0 [start|stop|restart|status]" + ;; +esac + +# End of file diff --git a/talimatname/genel/m/mpd/talimat b/talimatname/genel/m/mpd/talimat new file mode 100644 index 000000000..813f691d7 --- /dev/null +++ b/talimatname/genel/m/mpd/talimat @@ -0,0 +1,32 @@ +# Tanım: Esnek,güçlü sunucu bazlı müzik çalıcısı +# URL: https://www.musicpd.org/ +# Paketçi: milisarge +# Gerekler: libmad libvorbis libid3tag glib faad2 flac libshout fluidsynth boost ffmpeg + +isim=mpd +surum=0.20.12 +devir=1 +kaynak=(http://www.musicpd.org/download/$isim/0.20/$isim-$surum.tar.xz + servis) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --mandir=/usr/share/man \ + --enable-ffmpeg \ + --enable-flac \ + --enable-fluidsynth \ + --enable-pipe-output \ + --enable-shout \ + --enable-vorbis \ + --enable-vorbis-encoder \ + --enable-wave-encoder + make + make DESTDIR=$PKG install + mkdir -p $PKG/etc + install -m 0644 doc/mpdconf.example $PKG/etc/mpd.conf + mkdir -p $PKG/etc/rc.d/init.d + install -D $SRC/servis $PKG/etc/rc.d/init.d/mpd + rm -r $PKG/usr/share/doc +} diff --git a/talimatname/genel/m/mpg123/talimat b/talimatname/genel/m/mpg123/talimat new file mode 100644 index 000000000..fc45abf61 --- /dev/null +++ b/talimatname/genel/m/mpg123/talimat @@ -0,0 +1,16 @@ +# Tanım: Konsol tabanlı bir MP3 çalar. Unix için en hızlı MP3 kod çözücüsü olduğunu iddia ediyor. +# URL: http://mpg123.de/ +# Paketçi: milisarge +# Gerekler: alsa-lib pulseaudio + +isim=mpg123 +surum=1.25.6 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) +derle() { + cd $isim-$surum + ./configure --prefix=/usr --with-module-suffix=.so + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mplayer/mplayer.conf b/talimatname/genel/m/mplayer/mplayer.conf new file mode 100644 index 000000000..90aa053cc --- /dev/null +++ b/talimatname/genel/m/mplayer/mplayer.conf @@ -0,0 +1,4 @@ +vo=gl +ao=sdl +loop=0 +progbar-align=100 diff --git a/talimatname/genel/m/mplayer/mplayer.kur-kos b/talimatname/genel/m/mplayer/mplayer.kur-kos new file mode 100644 index 000000000..995e86875 --- /dev/null +++ b/talimatname/genel/m/mplayer/mplayer.kur-kos @@ -0,0 +1,2 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +update-desktop-database -q diff --git a/talimatname/genel/m/mplayer/talimat b/talimatname/genel/m/mplayer/talimat new file mode 100644 index 000000000..56e779787 --- /dev/null +++ b/talimatname/genel/m/mplayer/talimat @@ -0,0 +1,69 @@ +# Tanım: MPlayer, komut satırı üzerinden kontrol edilen güçlü bir ses/video oynatıcı. +# URL: http://www.mplayerhq.hu +# Paketçi: milisarge +# Gerekler: gtk2 yasm desktop-file-utils libdvdnav libdvdcss cdparanoia libcdio-paranoia libdvdread samba libbluray live xorg-libxvmc opus alsa-utils pulseaudio sdl jack openal sgml-common aalib giflib libjpeg-turbo libmng libpng openjpeg libcaca faac faad2 lame liba52 libdv libmad libmpeg2 libtheora libvpx lzo mpg123 speex xvid libmpcdec xorg-fontconfig freetype gnutls openssl opus unrar libxslt docbook-xsl docbook-xml enca glib xorg-libxxf86dga + +isim=mplayer +surum=1.3.0 +devir=1 + +kaynak=(http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.3.0.tar.xz + ftp://ftp.mplayerhq.hu/MPlayer/skins/Clearlooks-1.7.tar.bz2 + ftp://ftp.mplayerhq.hu/MPlayer/skins/KDE-0.3.tar.bz2 + ftp://ftp.mplayerhq.hu/MPlayer/skins/XFce4-1.0.tar.bz2 + ftp://ftp.mplayerhq.hu/MPlayer/skins/Orange-1.3.tar.bz2 + $isim.conf) + + +derle() { + +cd MPlayer-$surum + +./configure --prefix=/usr \ + --confdir=/etc/mplayer \ + --enable-dynamic-plugins \ + --enable-menu \ + --enable-gui \ + --enable-radio \ + --enable-radio-capture \ + --enable-rpath \ + --with-vidix-drivers=radeon,nvidia,cyberblade,ivtv,mach64,mga,mga_crtc2,pm2,pm3,rage128,s3,sis,unichrome\ + --enable-dhahelper \ + --enable-xvmc \ + --enable-mga \ + --enable-xmga \ + --enable-mlib \ + --enable-3dfx \ + --enable-tdfxfb \ + --enable-joystick \ + --enable-s3fb \ + --enable-wii \ + --enable-bl \ + --enable-tdfxvid \ + --language-msg=tr \ + --language=all +make +make DESTDIR=$PKG install + +install -v -m644 etc/codecs.conf $PKG/etc/mplayer + +install -v -m644 etc/*.conf $PKG/etc/mplayer + +install -v -m644 ../mplayer.conf $PKG/etc/mplayer + + +mv ../Clearlooks \ + $PKG/usr/share/mplayer/skins + +mv ../KDE \ + $PKG/usr/share/mplayer/skins + +mv ../XFce4 \ + $PKG/usr/share/mplayer/skins + +mv ../Orange \ + $PKG/usr/share/mplayer/skins + + +ln -sfvn KDE $PKG/usr/share/mplayer/skins/default +} diff --git a/talimatname/genel/m/mpsweb/talimat b/talimatname/genel/m/mpsweb/talimat new file mode 100644 index 000000000..0ec005085 --- /dev/null +++ b/talimatname/genel/m/mpsweb/talimat @@ -0,0 +1,25 @@ +# Tanım: Milis Paket Yöneticisi Web Arayüzü +# URL: milislinux.org +# Paketçi: milisarge +# Gerekler: nginx nginx-mod-nchan +# Grup: sistem + +isim=mpsweb +hesap=milisarge +surum=1.0 +devir=1 +kaynak=() + +derle() { + + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/$hesap/$isim $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + ./kur.sh $PKG +} diff --git a/talimatname/genel/m/mpv/talimat b/talimatname/genel/m/mpv/talimat new file mode 100644 index 000000000..ecad9c0b4 --- /dev/null +++ b/talimatname/genel/m/mpv/talimat @@ -0,0 +1,115 @@ +# Tanım: mplayer ve mplayer2 tabanlı çoklu kütüphane destekli medya uygulaması +# URL: http://mpv.io/ +# Paketçi: milisarge +# Gerekler: sdl2 sndio rsound openal uchardet v4l-utils libcdio-paranoia ffmpeg lcms2 samba ladspa xorg-libxscrnsaver libbluray libvdpau libquvi xorg-libxinerama xorg-libxv libxkbcommon desktop-file-utils hicolor-icon-theme xdg-utils lua lua52 libdvdnav xorg-libxrandr jack +# Grup: medya + +isim=mpv +surum=0.27.0 +devir=1 +kaynak=(https://github.com/$isim-player/$isim/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./bootstrap.py + +./waf configure \ + --color=yes \ + --prefix=/usr \ + --confdir=/etc/mpv \ + --progress \ + \ + --enable-libmpv-shared \ + --disable-libmpv-static \ + --disable-static-build \ + --disable-debug-build \ + \ + --disable-manpage-build \ + --disable-html-build \ + --disable-pdf-build \ + \ + --enable-cplugins \ + --enable-zsh-comp \ + --disable-test \ + --disable-clang-database \ + \ + --disable-win32-internal-pthreads \ + --enable-iconv \ + --enable-libsmbclient \ + --enable-libass \ + --enable-libass-osd \ + --enable-encoding \ + --enable-libbluray \ + --enable-dvdread \ + --enable-dvdnav \ + --enable-cdda \ + --enable-uchardet \ + --disable-rubberband \ + --enable-lcms2 \ + --disable-vapoursynth \ + --disable-vapoursynth-lazy \ + --enable-libarchive \ + --enable-libavdevice \ + \ + --enable-sdl2 \ + --disable-sdl1 \ + --enable-oss-audio \ + --enable-rsound \ + --enable-sndio \ + --enable-pulse \ + --enable-jack \ + --enable-openal \ + --disable-opensles \ + --enable-alsa \ + --disable-coreaudio \ + --disable-audiounit \ + --disable-wasapi \ + \ + --disable-cocoa \ + --enable-drm \ + --enable-gbm \ + --disable-wayland \ + --enable-x11 \ + --enable-xv \ + --disable-gl-cocoa \ + --enable-gl-x11 \ + --enable-egl-x11 \ + --enable-egl-drm \ + --disable-gl-wayland \ + --disable-gl-win32 \ + --disable-gl-dxinterop \ + --disable-egl-angle \ + --disable-egl-angle-lib \ + --enable-vdpau \ + --enable-vdpau-gl-x11 \ + --enable-vaapi \ + --enable-vaapi-x11 \ + --disable-vaapi-wayland \ + --disable-vaapi-drm \ + --disable-vaapi-glx \ + --disable-vaapi-x-egl \ + --disable-caca \ + --enable-jpeg \ + --disable-direct3d \ + --disable-android \ + --disable-rpi \ + --disable-ios-gl \ + --enable-plain-gl \ + --disable-mali-fbdev \ + --enable-gl \ + \ + --disable-videotoolbox-gl \ + --enable-cuda-hwaccel \ + \ + --enable-tv \ + --enable-tv-v4l2 \ + --enable-libv4l2 \ + --enable-audio-input \ + --enable-dvbin \ + \ + --disable-apple-remote \ + --disable-macos-touchbar + ./waf build + ./waf install --destdir="$PKG" +} diff --git a/talimatname/genel/m/mruby/talimat b/talimatname/genel/m/mruby/talimat new file mode 100644 index 000000000..f5ebbc056 --- /dev/null +++ b/talimatname/genel/m/mruby/talimat @@ -0,0 +1,21 @@ +# Tanım: Hafif Ruby yorumlayıcısı +# URL: https://github.com/mruby/mruby +# Paketçi: milisarge +# Gerekler: git ruby +# Grup: geliştirme + +isim=mruby +surum=1.3.0 +devir=1 +kaynak=(https://github.com/mruby/mruby/archive/$surum.zip::mruby-$surum.zip) + +derle() { + cd mruby-$surum + make + make test + install -d "$PKG/usr/bin" "$PKG/usr/lib" "$PKG/usr/share/licenses/mruby" + cp build/host/bin/* "$PKG/usr/bin" + cp build/host/lib/*.a "$PKG/usr/lib" + cp -r include "$PKG/usr" + cp MITL "$PKG/usr/share/licenses/mruby/LICENSE" +} diff --git a/talimatname/genel/m/msgpack-c/talimat b/talimatname/genel/m/msgpack-c/talimat new file mode 100644 index 000000000..64fe647d8 --- /dev/null +++ b/talimatname/genel/m/msgpack-c/talimat @@ -0,0 +1,20 @@ +# Tanım: Verimli bir nesne serileştirme kitaplığı, C / C ++ sürümü. +# URL: https://github.com/msgpack/msgpack-c +# Paketçi: milisarge +# Gerekler: cmake + +isim=msgpack-c +surum=2.1.5 +devir=1 +kaynak=(https://github.com/msgpack/msgpack-c/releases/download/cpp-${surum}/msgpack-${surum}.tar.gz) + +derle() { + cd msgpack-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DMSGPACK_CXX11=ON \ + -DMSGPACK_BUILD_EXAMPLES=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + . + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mtdev/talimat b/talimatname/genel/m/mtdev/talimat new file mode 100644 index 000000000..03bdc0abf --- /dev/null +++ b/talimatname/genel/m/mtdev/talimat @@ -0,0 +1,19 @@ +# Tanım: Mtdev paketi Çoklu İletişim Protokolü Çeviri Kitaplığı içerir. +# URL: http://bitmath.org/code/mtdev/ +# Paketçi: milisarge +# Gerekler: + +isim=mtdev +surum=1.1.5 +devir=1 + +kaynak=(http://bitmath.org/code/mtdev/mtdev-$surum.tar.bz2) + +derle() +{ +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mtools/talimat b/talimatname/genel/m/mtools/talimat new file mode 100644 index 000000000..a97790a8e --- /dev/null +++ b/talimatname/genel/m/mtools/talimat @@ -0,0 +1,26 @@ +# Tanım: Dosya sistemine erişmek için kullanılan araçların toplanması MS-DOS +# URL: http://mtools.linux.lu/ +# Paketçi: milisarge +# Gerekler: + +isim=mtools +surum=4.0.18 +devir=1 + +kaynak=(ftp://ftp.gnu.org/gnu/mtools/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + sed -i '/^SAMPLE FILE$/s:^:# :' mtools.conf + + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --sysconfdir=/etc + + make + make -j1 prefix=$PKG/usr install + + install -Dm644 mtools.conf $PKG/etc/mtools.conf +} diff --git a/talimatname/genel/m/mtr/talimat b/talimatname/genel/m/mtr/talimat new file mode 100644 index 000000000..c69497fab --- /dev/null +++ b/talimatname/genel/m/mtr/talimat @@ -0,0 +1,22 @@ +# Tanım: Matt's traceroute - ağ test aracı +# URL: http://www.bitwizard.nl/mtr/ +# Paketçi: milisarge +# Gerekler: libcap + +isim=mtr +surum=0.92 +devir=1 +kaynak=(ftp://ftp.bitwizard.nl/mtr/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --sbindir=/usr/bin \ + --without-gtk + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/muffin/talimat b/talimatname/genel/m/muffin/talimat new file mode 100644 index 000000000..bebef6ab3 --- /dev/null +++ b/talimatname/genel/m/muffin/talimat @@ -0,0 +1,34 @@ +# Tanım: Cinnamon Pencere Yöneticisi +# URL: https://github.com/linuxmint/muffin +# Paketçi: Cihan_Alkan +# Gerekler: clutter gobject-introspection cinnamon-desktop libcanberra xorg-libsm zenity dconf intltool gnome-doc-utils gnome-common gtk-doc +# Grup: cinnamon + +isim=muffin +surum=3.8.1 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + gio-querymodules /usr/lib/gio/modules + glib-compile-schemas /usr/share/glib-2.0/schemas/ + PYTHON=python ./autogen.sh \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/muffin \ + --localstatedir=/var \ + --disable-static \ + --disable-schemas-compile \ + --enable-compile-warnings=minimum + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install + make -C src DESTDIR="$PKG" uninstall-binPROGRAMS uninstall-desktopfilesDATA + make -C src/tools DESTDIR="$PKG" uninstall + make -C src/compositor/plugins DESTDIR="$PKG" uninstall + make -C doc/man DESTDIR="$PKG" uninstall +} diff --git a/talimatname/genel/m/mugshot-milis/talimat b/talimatname/genel/m/mugshot-milis/talimat new file mode 100644 index 000000000..b32549224 --- /dev/null +++ b/talimatname/genel/m/mugshot-milis/talimat @@ -0,0 +1,13 @@ +# Tanım: Kişisel bilgileri düzenleme uygulaması +# URL: https://launchpad.net/mugshot +# Paketçi: milisarge +# Gerekler: intltool gtk3 python3-distutils-extra python3-pexpect dbus-python python3-cairo python3-gobject accountsservice + +isim=mugshot-milis +surum=0.3.2 +devir=1 +kaynak=(https://kaynaklar.milislinux.org/$isim-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cp -r "${SRC}/usr" "${PKG}/" +} diff --git a/talimatname/genel/m/mugshot/missing_default_face.patch b/talimatname/genel/m/mugshot/missing_default_face.patch new file mode 100644 index 000000000..4502e84f0 --- /dev/null +++ b/talimatname/genel/m/mugshot/missing_default_face.patch @@ -0,0 +1,28 @@ +diff -Naur ./mugshot-0.3.2.old/mugshot/MugshotWindow.py ./mugshot-0.3.2/mugshot/MugshotWindow.py +--- ./mugshot-0.3.2.old/mugshot/MugshotWindow.py 2016-11-06 09:13:47.604768017 -0500 ++++ ./mugshot-0.3.2/mugshot/MugshotWindow.py 2016-11-06 09:14:11.431116827 -0500 +@@ -257,10 +257,11 @@ + logger.debug('Found profile image: %s' % str(image)) + + if os.path.isfile(face): +- if os.path.samefile(image, face): +- self.updated_image = face +- else: +- self.updated_image = None ++ if os.path.exists(image): ++ if os.path.samefile(image, face): ++ self.updated_image = face ++ else: ++ self.updated_image = None + self.set_user_image(face) + elif os.path.isfile(image): + self.updated_image = image +@@ -612,7 +613,7 @@ + success = False + + logger.debug('Updating Office Phone...') +- ++ + command = "%s -w \"%s\" %s" % (chfn, office_phone, username) + # Office phone is potentially handled by the -o flag in newer versions of chfn + command2 = "%s -o \"%s\" %s" % (chfn, office_phone, username) diff --git a/talimatname/genel/m/mugshot/office-phone.patch b/talimatname/genel/m/mugshot/office-phone.patch new file mode 100644 index 000000000..dbca2c59d --- /dev/null +++ b/talimatname/genel/m/mugshot/office-phone.patch @@ -0,0 +1,35 @@ +From 8f639e7a29b3bfebbbbd8f520c05637377560bb3 Mon Sep 17 00:00:00 2001 +From: Mike Keen <mkeen.atl@gmail.com> +Date: Thu, 5 Nov 2015 11:47:30 -0500 +Subject: [PATCH] Support the -o flag if the -w flag fails + +--- +mugshot/MugshotWindow.py | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/mugshot/MugshotWindow.py b/mugshot/MugshotWindow.py +index 35323be..b557edf 100644 +--- a/mugshot/MugshotWindow.py ++++ b/mugshot/MugshotWindow.py +@@ -632,11 +632,18 @@ class MugshotWindow(Window): + success = False + + logger.debug('Updating Office Phone...') ++ + command = "%s -w \"%s\" %s" % (chfn, office_phone, username) ++ # Office phone is potentially handled by the -o flag in newer versions of chfn ++ command2 = "%s -o \"%s\" %s" % (chfn, office_phone, username) + if self.process_terminal_password(command, password): + self.office_phone = office_phone + else: +- success = False ++ # Retry with command2 ++ if self.process_terminal_password(command2, password): ++ self.office_phone = office_phone ++ else: ++ success = False + + return (success, response) + +-- +2.6.2 diff --git a/talimatname/genel/m/mugshot/talimat b/talimatname/genel/m/mugshot/talimat new file mode 100644 index 000000000..8a16606d2 --- /dev/null +++ b/talimatname/genel/m/mugshot/talimat @@ -0,0 +1,24 @@ +# Tanım: Program to update personal user details +# URL: https://launchpad.net/mugshot +# Paketçi: milisarge +# Gerekler: intltool gtk3 python3-distutils-extra python3-pexpect dbus-python python3-cairo python3-gobject accountsservice + +isim=mugshot +surum=0.3.2 +devir=1 +kaynak=(https://launchpad.net/mugshot/${surum%.*}/0.3.2/+download/$isim-$surum.tar.gz::$isim-$surum.tar.gz + office-phone.patch + missing_default_face.patch) + +derle() { + cd "${SRC}/${isim}-${surum}" + patch -p1 -i "${SRC}"/office-phone.patch + cd "${SRC}" + patch -Np1 -i "${SRC}"/missing_default_face.patch + cd "${SRC}/${isim}-${surum}" + python3 setup.py build + python3 setup.py install --root=$PKG --optimize=1 + if [ -d $PKG/usr/share/doc ]; then + rm -rf $PKG/usr/share/doc + fi +} diff --git a/talimatname/genel/m/multibootusb/multibootusb.desktop b/talimatname/genel/m/multibootusb/multibootusb.desktop new file mode 100644 index 000000000..17ca8968e --- /dev/null +++ b/talimatname/genel/m/multibootusb/multibootusb.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=multibootusb +Comment=Install multiple Linux Operating System on USB +Icon=multibootusb +Name[tr]=Birden fazla Linux'u USB'e kurma +Comment[tr]=Birden fazla Linux'u USB'e kurma +Exec=multibootusb-pkexec +Categories=System; +StartupNotify=true diff --git a/talimatname/genel/m/multibootusb/talimat b/talimatname/genel/m/multibootusb/talimat new file mode 100644 index 000000000..7da90734b --- /dev/null +++ b/talimatname/genel/m/multibootusb/talimat @@ -0,0 +1,19 @@ +# Tanım: Birden fazla iso dosyasini usb bellege yazdirma programı +# URL: https://multibootusb.org +# Paketçi: Cihan Alkan +# Gerekler: mtools parted python3-qt5 dbus-python python3-pip python3-six mtools util-linux p7zip +# Grup: sistem + +isim=multibootusb +surum=9.1.0 +devir=1 + +kaynak=(https://github.com/mbusb/multibootusb/archive/v9.1.0.tar.gz::$isim-$surum.tar.gz + $isim.desktop) + +derle() { + cd $SRC/$isim-$surum + cp ../$isim.desktop $SRC/$isim-$surum/data/ + chmod 755 "$SRC/$isim-$surum/data/$isim.desktop" + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/m/mumble-client/talimat b/talimatname/genel/m/mumble-client/talimat new file mode 100644 index 000000000..5e7527c14 --- /dev/null +++ b/talimatname/genel/m/mumble-client/talimat @@ -0,0 +1,37 @@ +# Tanım: Sesli chat uygulaması- bağlanıcı uygulama +# URL: http://mumble.sourceforge.net +# Paketçi: milisarge +# Gerekler: boost qt4 speex speexdsp libsndfile protobuf + +isim=mumble-client +surum=1.2.19 +devir=1 +kaynak=(https://github.com/mumble-voip/mumble/releases/download/$surum/mumble-$surum.tar.gz) + +derle() { + cd mumble-$surum + + qmake-qt4 main.pro \ + CONFIG+=no-bundled-speex \ + CONFIG+=no-dbus \ + CONFIG+=no-embed-qt-translations \ + CONFIG+=no-speechd \ + CONFIG+=no-bonjour \ + CONFIG+=no-g15 \ + CONFIG+=no-11x \ + CONFIG+=no-server \ + DEFINES+="PLUGIN_PATH=/usr/lib/mumble" + + make release + + install -d $PKG/usr/{bin,lib} + install -o root -g root release/mumble $PKG/usr/bin/mumble + + install -m755 -o root -g root -D release/plugins/liblink.so $PKG/usr/lib/mumble/liblink.so + install -m755 -o root -g root -D release/plugins/libmanual.so $PKG/usr/lib/mumble/libmanual.so + install -o root -g root release/libcelt0.so.0.7.0 $PKG/usr/lib/mumble + cd $PKG/usr/lib/mumble + ln -s libcelt0.so.0.7.0 libcelt0.so.0.7 + ln -s libcelt0.so.0.7.0 libcelt0.so.0 + ln -s libcelt0.so.0.7.0 libcelt0.so +} diff --git a/talimatname/genel/m/mumble/talimat b/talimatname/genel/m/mumble/talimat new file mode 100644 index 000000000..756b84043 --- /dev/null +++ b/talimatname/genel/m/mumble/talimat @@ -0,0 +1,38 @@ +# Tanım: TeamSpeak'a benzer bir sesli sohbet uygulaması +# URL: http://mumble.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: qt5 speex avahi protobuf pulseaudio opus xdg-utils libpng freetype xorg-fontconfig xorg-libxrender boost xorg-mesa +# Grup: ağ + +isim=mumble +surum=1.3.0 +devir=2 +kaynak=(http://mumble.info/snapshot/${isim}-1.3.0~2586~g894ade2~snapshot.tar.gz) + +derle() { + cd $SRC/$isim-1.3.0~2586~g894ade2~snapshot + + # mumble derleniyor + qmake-qt5 main.pro \ + CONFIG+="bundled-celt no-bundled-opus no-bundled-speex no-speechd no-g15 no-xevie no-server \ + no-embed-qt-translations no-update packaged" \ + DEFINES+="PLUGIN_PATH=/usr/lib/mumble" + make release + + # bin stuff + install -m755 -D ./release/mumble $PKG/usr/bin/mumble + install -m755 -D ./scripts/mumble-overlay $PKG/usr/bin/mumble-overlay + + # lib stuff + install -m755 -D ./release/libmumble.so.$surum $PKG/usr/lib/mumble/libmumble.so.$surum + ln -s libmumble.so.$surum $PKG/usr/lib/mumble/libmumble.so + ln -s libmumble.so.$surum $PKG/usr/lib/mumble/libmumble.so.1 + ln -s libmumble.so.$surum $PKG/usr/lib/mumble/libmumble.so.1.3 + install -m755 -D ./release/plugins/liblink.so $PKG/usr/lib/mumble/liblink.so + install -m755 -D ./release/libcelt* $PKG/usr/lib/mumble/ + + # other stuff + install -m644 -D ./scripts/mumble.desktop $PKG/usr/share/applications/mumble.desktop + install -m644 -D ./icons/mumble.svg $PKG/usr/share/icons/hicolor/scalable/apps/mumble.svg + install -m644 -D ./LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/m/muparser/talimat b/talimatname/genel/m/muparser/talimat new file mode 100644 index 000000000..780331664 --- /dev/null +++ b/talimatname/genel/m/muparser/talimat @@ -0,0 +1,19 @@ +# Tanım: hızlı bir matematik ayrıştırıcı kütüphanesi +# URL: http://muparser.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=muparser +surum=2.2.5 +devir=1 +kaynak=(https://github.com/beltoforion/muparser/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $SRC/${isim}-${surum} + sh ./configure --prefix=/usr + make -j1 + make DESTDIR=$PKG install + # license + install -D -m644 License.txt $PKG/usr/share/licenses/${isim}/LICENSE +} diff --git a/talimatname/genel/m/mupdf/talimat b/talimatname/genel/m/mupdf/talimat new file mode 100644 index 000000000..b18ff56a0 --- /dev/null +++ b/talimatname/genel/m/mupdf/talimat @@ -0,0 +1,20 @@ +# Tanım: Hafif bir PDF ve XPS görüntüleyici +# URL: http://www.mupdf.com/ +# Paketçi: milisarge +# Gerekler: curl freetype libjpeg-turbo xorg-libxext + +isim=mupdf +surum=1.9a +devir=1 +kaynak=(http://mupdf.com/downloads/$isim-$surum-source.tar.gz) + +derle() { + cd $isim-$surum-source + + rm -r thirdparty/{freetype*,jpeg*,zlib,curl} + make build=release + make prefix=$PKG/usr mandir=$PKG/usr/share/man install + + ln -s mupdf-x11-curl $PKG/usr/bin/mupdf + rm -r $PKG/usr/share/doc +} diff --git a/talimatname/genel/m/murrine/talimat b/talimatname/genel/m/murrine/talimat new file mode 100644 index 000000000..afd4b33e4 --- /dev/null +++ b/talimatname/genel/m/murrine/talimat @@ -0,0 +1,22 @@ +# Tanım: Cairo tabanlı GTK motoru. +# URL: http://www.cimitan.com/murrine/ +# Paketçi: milisarge +# Gerekler: gtk2 + +isim=murrine +surum=0.98.2 +devir=2 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd murrine-$surum + +./configure \ +--prefix=/usr \ +--enable-animation \ +--enable-animationrtl + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/musl/talimat b/talimatname/genel/m/musl/talimat new file mode 100644 index 000000000..8f00de55a --- /dev/null +++ b/talimatname/genel/m/musl/talimat @@ -0,0 +1,23 @@ +# Tanım: C standart kütüphanesinin hafif gerçeklemesi +# URL: http://www.musl-libc.org/ +# Paketçi: milisarge +# Gerekler: + +isim=musl +surum=1.1.17 +devir=1 +kaynak=(https://www.musl-libc.org/releases/musl-1.1.17.tar.gz{,.asc} +) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr/lib/musl \ + --exec-prefix=/usr \ + --enable-wrapper=all + make + make DESTDIR="$PKG" install + install -dm755 "$PKG"/usr/lib/ + mv "$PKG"/lib/ld-musl*.so* "$PKG"/usr/lib/ + rmdir "$PKG"/lib + install -Dm0644 COPYRIGHT "$PKG"/usr/share/licenses/musl/COPYRIGHT +} diff --git a/talimatname/genel/m/mutagen/talimat b/talimatname/genel/m/mutagen/talimat new file mode 100644 index 000000000..d963c002d --- /dev/null +++ b/talimatname/genel/m/mutagen/talimat @@ -0,0 +1,17 @@ +# Tanım: Bir ses meta veri etiketi okuyucu ve yazıcı +# URL: https://bitbucket.org/lazka/mutagen +# Paketçi: milisarge +# Gerekler: python + +isim=mutagen +surum=1.38 +devir=1 + +kaynak=(https://github.com/quodlibet/mutagen/archive/release-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-release-$surum + python2 setup.py install --root=$PKG + mkdir -p $PKG/usr/bin + install -m755 tools/* $PKG/usr/bin +} diff --git a/talimatname/genel/m/mutt/mutt.kos-kur b/talimatname/genel/m/mutt/mutt.kos-kur new file mode 100644 index 000000000..b17d3d57e --- /dev/null +++ b/talimatname/genel/m/mutt/mutt.kos-kur @@ -0,0 +1,2 @@ +groupadd -g 34 mail + diff --git a/talimatname/genel/m/mutt/talimat b/talimatname/genel/m/mutt/talimat new file mode 100644 index 000000000..1d101442d --- /dev/null +++ b/talimatname/genel/m/mutt/talimat @@ -0,0 +1,31 @@ +# Tanım: Mutt paketi bir posta kullanıcı aracısı içerir. Bu, e-postanızı okumak, yazmak, cevaplamak, kaydetmek ve silmek için yararlıdır. +# URL: http://www.mutt.org/ +# Paketçi: milisarge +# Gerekler: aspell aspell-fr cyrus-sasl gdb gnupg gpgme libidn kerberos sendmail slang openssl gnutls db libxslt lynx + +isim=mutt +surum=1.5.24 +devir=1 +kaynak=(ftp://ftp.mutt.org/pub/mutt/$isim-$surum.tar.gz) + +derle() { + +cd $isim-$surum + +cp -v doc/manual.txt{,.shipped} +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --with-docdir=/usr/share/doc/mutt-1.5.24 \ + --enable-pop \ + --enable-imap \ + --enable-hcache \ + --without-qdbm \ + --with-gdbm \ + --without-bdb \ + --without-tokyocabinet +make +test -s doc/manual.txt || mv -v doc/manual.txt{.shipped,} + +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/m/mutter/mutter.kur-kos b/talimatname/genel/m/mutter/mutter.kur-kos new file mode 100644 index 000000000..6ba5ccf8f --- /dev/null +++ b/talimatname/genel/m/mutter/mutter.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/m/mutter/talimat b/talimatname/genel/m/mutter/talimat new file mode 100644 index 000000000..9b1a5fa92 --- /dev/null +++ b/talimatname/genel/m/mutter/talimat @@ -0,0 +1,21 @@ +# Tanım: GNOME için bir pencere yöneticisi +# URL: http://www.gnome.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: libinput clutter gnome-desktop libxkbcommon upower zenity gobject-introspection libcanberra startup-notification gtk-doc + +isim=mutter +surum=3.22.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static \ +--enable-gtk-doc \ +--disable-wayland \ +--enable-compile-warnings=minimum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/m/mygpoclient/talimat b/talimatname/genel/m/mygpoclient/talimat new file mode 100644 index 000000000..8de2789ad --- /dev/null +++ b/talimatname/genel/m/mygpoclient/talimat @@ -0,0 +1,14 @@ +# Tanım: Podcast aboneliği senkronizasyonu aracı +# URL: http://thp.io/2010/mygpoclient +# Paketçi: milisarge +# Gerekler: python + +isim=mygpoclient +surum=1.7 +devir=2 +kaynak=(http://thp.io/2010/mygpoclient/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + python setup.py install --root=$PKG +} diff --git a/talimatname/genel/m/mygui/talimat b/talimatname/genel/m/mygui/talimat new file mode 100644 index 000000000..9dfd97ab9 --- /dev/null +++ b/talimatname/genel/m/mygui/talimat @@ -0,0 +1,46 @@ +# Tanım: OGRE için çok katmanlı ve üst üste bindirilebilir bir GUI Sistemi +# URL: http://mygui.info/ +# Paketçi: Cihan_Alkan +# Gerekler: boost cmake doxygen graphviz dejavu-ttf ogre ois +# Grup: geliştirme + + +isim=mygui +surum=3.2.2 +devir=1 +kaynak=(https://github.com/MyGUI/mygui/archive/MyGUI$surum.tar.gz) + +derle() { +cd $SRC/mygui-MyGUI$surum + sed -i 's:"bin:"../opt/MYGUI:' CMake/Utils/MyGUIConfigTargets.cmake + sed -i -e 's:../share:/usr/share:' \ + -e 's:"bin":"../opt/MYGUI":' \ + CMake/InstallResources.cmake + sed -i '71 i set(MYGUI_GCC_VISIBILITY_FLAGS "")' CMakeLists.txt + sed -i 's/\${OIS_LIBRARIES}/${OIS_LIBRARIES} boost_system/g' Common/CMakeLists.txt + + mkdir -p build + cd build + + export PKG_CONFIG_PATH="/usr/share/OGRE/lib/pkgconfig:$PKG_CONFIG_PATH" + + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DMYGUI_INSTALL_SAMPLES=TRUE \ + -DMYGUI_INSTALL_TOOLS=TRUE \ + -DMYGUI_INSTALL_DOCS=TRUE \ + -DMYGUI_INSTALL_MEDIA=TRUE \ + -DFREETYPE_INCLUDE_DIR=/usr/include/freetype2/ \ + -DMYGUI_BUILD_DEMOS=FALSE \ + -DMYGUI_BUILD_TOOLS=FALSE \ + -DCMAKE_BUILD_TYPE=Release \ + -DMYGUI_RENDERSYSTEM=7 \ + -DBUILD_SHARED_LIBS=TRUE + + make + make api-docs + + make DESTDIR="$PKG" install + install -d $PKG/usr/share/doc/ + cp -r Docs/html $PKG/usr/share/doc/MYGUI +} diff --git a/talimatname/genel/m/mypaint-brushes/talimat b/talimatname/genel/m/mypaint-brushes/talimat new file mode 100644 index 000000000..d84a2b7a5 --- /dev/null +++ b/talimatname/genel/m/mypaint-brushes/talimat @@ -0,0 +1,24 @@ +# Tanım: MyPaint ve diğer yazılımlar tarafından libmypaint kullanılarak kullanılan fırçalar. +# URL: https://github.com/Jehan/mypaint-brushes +# Paketçi: Cihan_Alkan +# Gerekler: libmypaint +# Grup: kütüphane + +isim=mypaint-brushes +surum=1.3.0 +devir=1 + +kaynak=(https://github.com/Jehan/mypaint-brushes/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd "$isim-$surum" + + ./autogen.sh + ./configure --prefix=/usr + make + + make DESTDIR="$PKG" install + install -D -m644 COPYING "$PKG/usr/share/licenses/$isim/LICENSE" + +} diff --git a/talimatname/genel/m/mypaint/talimat b/talimatname/genel/m/mypaint/talimat new file mode 100644 index 000000000..41910ab1a --- /dev/null +++ b/talimatname/genel/m/mypaint/talimat @@ -0,0 +1,22 @@ +# Tanım: hızlı ve kolay boyama uygulaması +# URL: http://mypaint.intilinux.com/ +# Paketçi: milisarge +# Gerekler: desktop-file-utils gtk3 gegl babl lcms2 json-c python-cairo python-gobject python-gtk python-numpy python-protobuf scons swig libmypaint + +isim=mypaint +surum=1.3.0 +devir=1 +kaynak=() + +derle() +{ + if [ -d $DERLEME_KAYNAKDIZIN/$isim ];then + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + else + git clone https://github.com/mypaint/mypaint.git $DERLEME_KAYNAKDIZIN/$isim + fi + cd $DERLEME_KAYNAKDIZIN/$isim + scons prefix="/usr" enable_gegl=true use_sharedlib=yes + scons prefix="/usr" enable_gegl=true use_sharedlib=yes --install-sandbox="$PKG" "$PKG" +} diff --git a/talimatname/genel/m/myrddin/talimat b/talimatname/genel/m/myrddin/talimat new file mode 100644 index 000000000..9506cfdca --- /dev/null +++ b/talimatname/genel/m/myrddin/talimat @@ -0,0 +1,27 @@ +# Tanım: Myrddin programlama dili için derleyici ve araçlar +# URL: https://myrlang.org/ +# Paketçi: milisarge +# Gerekler: +# Grup: geliştirme + +isim=myrddin +surum=git +devir=3 +kaynak=() + +derle() { + adres="git://git.eigenstate.org/ori/mc.git" + git_indir ${adres} ${isim} + cd $SRC/${isim} + ./configure --prefix="/usr" + make bootstrap + make + make DESTDIR="$PKG" install + + install -Dm644 LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" + + cd support/vim/ + for dir in *; do + install -t "${PKG}/usr/share/${isim}/vim/${dir}" -Dm644 "${dir}"/*.vim + done +} diff --git a/talimatname/genel/m/mythes/talimat b/talimatname/genel/m/mythes/talimat new file mode 100644 index 000000000..ab6a086be --- /dev/null +++ b/talimatname/genel/m/mythes/talimat @@ -0,0 +1,18 @@ +# Tanım: basit bir eş anlamlılar listesi +# URL: http://hunspell.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: hunspell + +isim=mythes +surum=1.2.4 +devir=1 + +kaynak=(https://downloads.sourceforge.net/project/hunspell/MyThes/1.2.4/mythes-1.2.4.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install + install -m0644 -D COPYING "$PKG"/usr/share/licenses/mythes/COPYING +} diff --git a/talimatname/genel/n/nana/talimat b/talimatname/genel/n/nana/talimat new file mode 100644 index 000000000..40792ffcc --- /dev/null +++ b/talimatname/genel/n/nana/talimat @@ -0,0 +1,19 @@ +# Tanım: C++ statik bağlamlı arayüz kütüphanesi +# URL: http://nanapro.org/en-us/ +# Paketçi: milisarge +# Gerekler: alsa-lib cmake libjpeg-turbo libpng xorg-libx11 xorg-libxft xorg-proto + +isim=nana +surum=1.5.5 +devir=1 +kaynak=(https://downloads.sourceforge.net/project/nanapro/Nana/Nana%201.x/nana%20$surum.zip) + +derle() { + cd ${SRC}/${isim} + cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DNANA_CMAKE_NANA_FILESYSTEM_FORCE=YES + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/n/nautilus/nautilus.kur-kos b/talimatname/genel/n/nautilus/nautilus.kur-kos new file mode 100644 index 000000000..7b04491d7 --- /dev/null +++ b/talimatname/genel/n/nautilus/nautilus.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q diff --git a/talimatname/genel/n/nautilus/talimat b/talimatname/genel/n/nautilus/talimat new file mode 100644 index 000000000..5a8f21173 --- /dev/null +++ b/talimatname/genel/n/nautilus/talimat @@ -0,0 +1,19 @@ +# Tanım: GNOME dosya yöneticisi +# URL: http://live.gnome.org/Nautilus +# Paketçi: yasarciv67@gmail.com +# Gerekler: gnome-autoar libnotify gnome-desktop shared-mime-info gobject-introspection exempi libexif gvfs gtk-update-icon-cache desktop-file-utils libselinux desktop-file-utils tracker + +isim=nautilus +surum=3.22.3 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-packagekit +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nbd/allow b/talimatname/genel/n/nbd/allow new file mode 100644 index 000000000..9af1ff475 --- /dev/null +++ b/talimatname/genel/n/nbd/allow @@ -0,0 +1,7 @@ +# nbd-server access configuration file +# list of hosts allowed to connect to our exportet +# + +#127.0.0.1 +# CIDR notation is allowed also +#192.168.0.0/8 diff --git a/talimatname/genel/n/nbd/nbd-server b/talimatname/genel/n/nbd/nbd-server new file mode 100644 index 000000000..bb85e72f3 --- /dev/null +++ b/talimatname/genel/n/nbd/nbd-server @@ -0,0 +1,28 @@ +#!/bin/sh +# +# /etc/rc.d/init.d/nbd-server: start/stop nbd daemon +# + +case $1 in +start) + /usr/bin/nbd-server -p /var/run/nbd-server.pid -l /etc/nbd-server/allow + ;; +stop) + if [ -f /var/run/nbd-server.pid ]; then + kill `cat /var/run/nbd-server.pid` + rm -f /var/run/nbd-server.pid + else + killall -q /usr/sbin/nbd-server + fi + ;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) + echo "kullanim: $0 [start|stop|restart]" + ;; +esac + +# End of file diff --git a/talimatname/genel/n/nbd/talimat b/talimatname/genel/n/nbd/talimat new file mode 100644 index 000000000..1664c2a01 --- /dev/null +++ b/talimatname/genel/n/nbd/talimat @@ -0,0 +1,24 @@ +# Tanım: Blok cihazlarının NBD protokolüyle paylaşma ve kullanma +# URL: http://nbd.sourceforge.net/ +# Maintainer: milisarge +# Gerekler: gnutls glib + +isim=nbd +surum=3.15.2 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/nbd/nbd/$surum/$isim-$surum.tar.xz + nbd-server + allow) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/man \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install + install -d $PKG/etc/nbd-server + install -D -m 600 $SRC/allow $PKG/etc/nbd-server/allow + install -D -m 755 $SRC/nbd-server $PKG/etc/rc.d/init.d/nbd-server + +} diff --git a/talimatname/genel/n/ncftp/talimat b/talimatname/genel/n/ncftp/talimat new file mode 100644 index 000000000..195bd1a25 --- /dev/null +++ b/talimatname/genel/n/ncftp/talimat @@ -0,0 +1,23 @@ +# Tanım: Internet standartı Dosya Aktarım Protokolüne güçlü ve esnek bir arabirim. +# URL: http://www.ncftp.com/ +# Paketçi: milisarge +# Gerekler: + +isim=ncftp +surum=3.2.5 +devir=1 +kaynak=(ftp://ftp.ncftp.com/ncftp/$isim-$surum-src.tar.bz2) + +derle() { + +cd $isim-$surum + +./configure --prefix=/usr --sysconfdir=/etc +make -C libncftp shared + +make + +make -C libncftp soinstall +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/n/nemo/nemo.kur-kos b/talimatname/genel/n/nemo/nemo.kur-kos new file mode 100644 index 000000000..1d319936d --- /dev/null +++ b/talimatname/genel/n/nemo/nemo.kur-kos @@ -0,0 +1 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ diff --git a/talimatname/genel/n/nemo/org.nemo.root.policy b/talimatname/genel/n/nemo/org.nemo.root.policy new file mode 100644 index 000000000..67d9b1ec1 --- /dev/null +++ b/talimatname/genel/n/nemo/org.nemo.root.policy @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE policyconfig PUBLIC +"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" +"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> +<policyconfig> + + <vendor>Nemo Project</vendor> + <vendor_url>https://github.com/linuxmint/nemo</vendor_url> + + <action id="org.nemo.root"> + <description>Nemo'yu yükseltilmiş ayrıcalıklarla çalıştır</description> + <message>Nemo'yu kök olarak çalıştırmak için lütfen şifrenizi girin</message> + <icon_name>gksu-root-terminal</icon_name> + <defaults> + <allow_any>no</allow_any> + <allow_inactive>no</allow_inactive> + <allow_active>auth_admin_keep</allow_active> + </defaults> + <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/nemo</annotate> + <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> + </action> + +</policyconfig> diff --git a/talimatname/genel/n/nemo/talimat b/talimatname/genel/n/nemo/talimat new file mode 100644 index 000000000..95cef650b --- /dev/null +++ b/talimatname/genel/n/nemo/talimat @@ -0,0 +1,30 @@ +# Tanım: Cinnamon Dosya Yöneticisi +# URL: https://github.com/linuxmint/nemo +# Paketçi: Cihan_Alkan +# Gerekler: glib gtk-doc intltool xapps python-polib python-gobject gtk3 cinnamon-desktop libnotify cinnamon-translations gobject-introspection gnome-common libexif gvfs dconf desktop-file-utils exempi python libxml2 +# Grup: cinnamon + +isim=nemo +surum=3.8.2 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i '/^\[Desktop Entry/,/^\[Desktop Action/ s/^Name\(.*\)=.*/Name\1=Nemo/' data/nemo.desktop.in + mkdir -p build + cd build + + meson --prefix=/usr \ + --libdir=/usr/lib \ + --libexecdir=lib/${isim} \ + --buildtype=plain \ + .. + ninja + + DESTDIR="${PKG}" ninja install + + mkdir -p $PKG/usr/lib/nemo/extensions-3.0 + sed -i 's/Run Nemo with elevated privileges/Nemoyu yükseltilmiş ayrıcalıklarla çalıştır/g' $PKG/usr/share/polkit-1/actions/org.nemo.root.policy + sed -i 's/Please enter your password to run Nemo as root/Nemoyu kök olarak çalıştırmak için lütfen şifrenizi girin/g' $PKG/usr/share/polkit-1/actions/org.nemo.root.policy +} diff --git a/talimatname/genel/n/neofetch/linux b/talimatname/genel/n/neofetch/linux new file mode 100644 index 000000000..fc2b1e3e9 --- /dev/null +++ b/talimatname/genel/n/neofetch/linux @@ -0,0 +1,31 @@ + + : + # + # , + ' # + # + , + ' .#. # # + +` ##`'###, # + +######;##### , + .##########` : ; + ########## ` # + :#########'# ` + . + ;########### +# #; # # + ############ ## +#+`# + + ########### ## ########. + ########### ,########## + ########### ########## + :########## +'##########: + ###########`########## + # ###########``###### + ## `######## # '# + ####; ##,`.## ##: + `#####+ +###+ ### + ############+ '###### + ..####;:#####` ######` + :## +##### '# # + '#####:#### #+ + ########## +. + ###### ##. + ##` + # + : , : diff --git a/talimatname/genel/n/neofetch/talimat b/talimatname/genel/n/neofetch/talimat new file mode 100644 index 000000000..5dadd409e --- /dev/null +++ b/talimatname/genel/n/neofetch/talimat @@ -0,0 +1,19 @@ +# Tanım: BASH'da yazılmış görüntüleri destekleyen bir CLI sistem bilgisi aracı. +# URL: https://github.com/dylanaraps/ +# Paketçi: Cihan Alkan +# Gerekler: + +isim=neofetch +surum=3.2.0 +devir=1 + +kaynak=(https://github.com/dylanaraps/neofetch/archive/$surum.tar.gz + linux) + + +derle() { + cd $isim-$surum + cp -f $SRC/linux $SRC/$isim-$surum/ascii/distro/ + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/n/neomutt/talimat b/talimatname/genel/n/neomutt/talimat new file mode 100644 index 000000000..866df9e19 --- /dev/null +++ b/talimatname/genel/n/neomutt/talimat @@ -0,0 +1,32 @@ +# Tanım: Mutt paketi bir posta kullanıcı aracısı içerir. +# URL: http://www.neomutt.org/ +# Paketçi: milisarge +# Gerekler: + +isim=neomutt +surum=20171013 +devir=1 +kaynak=(https://github.com/$isim/$isim/archive/$isim-$surum.tar.gz) + +derle() { + cd $isim-$isim-$surum + + ./prepare \ + --prefix=/usr \ + --with-docdir=/usr/share/doc/$isim \ + --with-mailpath=/var/spool/mail \ + --enable-pop \ + --enable-imap \ + --enable-smtp \ + --enable-hcache \ + --enable-sidebar \ + --enable-compressed \ + --with-ssl \ + --enable-hcache \ + --disable-nls \ + --with-regex \ + --with-gdbm + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/neon/talimat b/talimatname/genel/n/neon/talimat new file mode 100644 index 000000000..744f611ca --- /dev/null +++ b/talimatname/genel/n/neon/talimat @@ -0,0 +1,22 @@ +# Tanım: Genel HTTP ve WebDAV için sarmalayıcı +# URL: http://www.webdav.org/neon/ +# Paketçi: milisarge +# Gerekler: kerberos libxml2 + +isim=neon +surum=0.30.1 +devir=1 + +kaynak=( http://www.webdav.org/neon/$isim-$surum.tar.gz) + + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--with-ssl \ +--enable-shared \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/net-snmp/talimat b/talimatname/genel/n/net-snmp/talimat new file mode 100644 index 000000000..e9daec276 --- /dev/null +++ b/talimatname/genel/n/net-snmp/talimat @@ -0,0 +1,36 @@ +# Tanım: SNMP v1, SNMP v2c ve SNMP v3'ü hem IPv4 hem de IPv6 kullanarak uygulamak için kullanılan bir uygulama paketi. +# URL: http://www.net-snmp.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python python-setuptools libnl openssl pciutils perl-term-readkey perl-tk perl + +isim=net-snmp +surum=5.7.3 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz{,.asc}) + +derle() { +cd $isim-$surum +PYTHONPROG=/usr/bin/python2 ./configure --prefix=/usr \ + --sysconfdir=/etc --sbindir=/usr/bin \ + --mandir=/usr/share/man \ + --enable-ucd-snmp-compatibility \ + --enable-ipv6 \ + --with-python-modules \ + --with-default-snmp-surum="3" \ + --with-sys-contact="root@localhost" \ + --with-sys-location="Unknown" \ + --with-logfile="/var/log/snmpd.log" \ + --with-mib-modules="host misc/ipfwacc ucd-snmp/diskio tunnel ucd-snmp/dlmod" \ + --with-persistent-directory="/var/net-snmp" + +make NETSNMP_DONT_CHECK_VERSION=1 + +sed -i -e "s:install --basedir=\$\$dir:install --basedir=\$\$dir --root=$PKG:" Makefile + +make DESTDIR=$PKG INSTALL_PREFIX=$PKG INSTALLDIRS=vendor install +# Remove perllocal.pod and .packlist if present in the package +for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; +done +} diff --git a/talimatname/genel/n/net-tools/net-tools-CVS_20101030-remove_dups-1.patch b/talimatname/genel/n/net-tools/net-tools-CVS_20101030-remove_dups-1.patch new file mode 100644 index 000000000..0d027780c --- /dev/null +++ b/talimatname/genel/n/net-tools/net-tools-CVS_20101030-remove_dups-1.patch @@ -0,0 +1,520 @@ +Submitted By: Bruce Dubbs (bdubbs at liinuxfromscratch dot com) +Date: 2014-03-01 +Initial Package Version: CVS_20101030 +Origin: Self +Tanım: Removes ifconfig and hostname from the build + due to duplication in inetutils + +diff -Naur a/Makefile b/Makefile +--- a/Makefile 2009-12-31 14:38:02.000000000 -0600 ++++ b/Makefile 2014-02-28 23:19:11.000000000 -0600 +@@ -228,8 +228,8 @@ + install -m 0755 -d ${BASEDIR}/sbin + install -m 0755 -d ${BASEDIR}/bin + install -m 0755 arp ${BASEDIR}/sbin +- install -m 0755 hostname ${BASEDIR}/bin +- install -m 0755 ifconfig ${BASEDIR}/sbin ++# install -m 0755 hostname ${BASEDIR}/bin ++# install -m 0755 ifconfig ${BASEDIR}/sbin + install -m 0755 nameif ${BASEDIR}/sbin + install -m 0755 netstat ${BASEDIR}/bin + install -m 0755 plipconfig $(BASEDIR)/sbin +@@ -243,14 +243,6 @@ + ifeq ($(HAVE_MII),1) + install -m 0755 mii-tool $(BASEDIR)/sbin + endif +- ln -fs hostname $(BASEDIR)/bin/dnsdomainname +- ln -fs hostname $(BASEDIR)/bin/ypdomainname +- ln -fs hostname $(BASEDIR)/bin/nisdomainname +- ln -fs hostname $(BASEDIR)/bin/domainname +-ifeq ($(HAVE_AFDECnet),1) +- ln -fs hostname $(BASEDIR)/bin/nodename +-endif +- + savebin: + @for i in ${BASEDIR}/sbin/arp ${BASEDIR}/sbin/ifconfig \ + ${BASEDIR}/bin/netstat \ +diff -Naur a/config.in b/config.in +--- a/config.in 2008-10-02 21:09:57.000000000 -0500 ++++ b/config.in 2014-02-28 23:18:31.000000000 -0600 +@@ -68,8 +68,8 @@ + bool 'SLIP (serial line) support' HAVE_HWSLIP y + bool 'PPP (serial line) support' HAVE_HWPPP y + bool 'IPIP Tunnel support' HAVE_HWTUNNEL y +-bool 'STRIP (Metricom radio) support' HAVE_HWSTRIP y +-bool 'Token ring (generic) support' HAVE_HWTR y ++bool 'STRIP (Metricom radio) support' HAVE_HWSTRIP n ++bool 'Token ring (generic) support' HAVE_HWTR n + bool 'AX25 (packet radio) support' HAVE_HWAX25 y + bool 'Rose (packet radio) support' HAVE_HWROSE y + bool 'NET/ROM (packet radio) support' HAVE_HWNETROM y +diff -Naur a/man/en_US/dnsdomainname.1 b/man/en_US/dnsdomainname.1 +--- a/man/en_US/dnsdomainname.1 1998-08-10 15:51:04.000000000 -0500 ++++ b/man/en_US/dnsdomainname.1 1969-12-31 18:00:00.000000000 -0600 +@@ -1 +0,0 @@ +-.so man1/hostname.1 +diff -Naur a/man/en_US/domainname.1 b/man/en_US/domainname.1 +--- a/man/en_US/domainname.1 1998-08-10 15:51:05.000000000 -0500 ++++ b/man/en_US/domainname.1 1969-12-31 18:00:00.000000000 -0600 +@@ -1 +0,0 @@ +-.so man1/hostname.1 +diff -Naur a/man/en_US/hostname.1 b/man/en_US/hostname.1 +--- a/man/en_US/hostname.1 2008-10-02 18:16:59.000000000 -0500 ++++ b/man/en_US/hostname.1 1969-12-31 18:00:00.000000000 -0600 +@@ -1,213 +0,0 @@ +-.TH HOSTNAME 1 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" +- +-.SH NAME +-hostname \- show or set the system's host name +-.br +-domainname \- show or set the system's NIS/YP domain name +-.br +-dnsdomainname \- show the system's DNS domain name +-.br +-nisdomainname \- show or set system's NIS/YP domain name +-.br +-ypdomainname \- show or set the system's NIS/YP domain name +-.br +-nodename \- show or set the system's DECnet node name +- +-.SH SYNOPSIS +-.B hostname +-.RB [ \-v ] +-.RB [ \-a ] +-.RB [ \-\-alias ] +-.RB [ \-d ] +-.RB [ \-\-domain ] +-.RB [ \-f ] +-.RB [ \-\-fqdn ] +-.RB [ \-i ] +-.RB [ \-\-ip\-address ] +-.RB [ \-\-long ] +-.RB [ \-s ] +-.RB [ \-\-short ] +-.RB [ \-y ] +-.RB [ \-\-yp ] +-.RB [ \-\-nis ] +-.RB [ \-n ] +-.RB [ \-\-node ] +- +-.PP +-.B hostname +-.RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ hostname ] +- +-.PP +-.B domainname +-.RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ name ] +- +-.PP +-.B nodename +-.RB [ \-v ] +-.RB [ \-F\ filename ] +-.RB [ \-\-file\ filename ] +-.RB [ name ] +- +-.PP +-.B hostname +-.RB [ \-v ] +-.RB [ \-h ] +-.RB [ \-\-help ] +-.RB [ \-V ] +-.RB [ \-\-version ] +- +-.PP +-.B dnsdomainname +-.RB [ \-v ] +-.br +-.B nisdomainname +-.RB [ \-v ] +-.br +-.B ypdomainname +-.RB [ \-v ] +- +-.SH DESCRIPTION +-.B Hostname +-is the program that is used to either set or display +-the current host, domain or node name of the system. These names are used +-by many of the networking programs to identify the machine. The domain +-name is also used by NIS/YP. +- +-.SS "GET NAME" +-When called without any arguments, the program displays the current +-names: +- +-.LP +-.B hostname +-will print the name of the system as returned by the +-.BR gethostname (2) +-function. +- +-.LP +-.B "domainname, nisdomainname, ypdomainname" +-will print the name of the system as returned by the +-.BR getdomainname (2) +-function. This is also known as the YP/NIS domain name of the system. +- +-.LP +-.B nodename +-will print the DECnet node name of the system as returned by the +-.BR getnodename (2) +-function. +- +-.LP +-.B dnsdomainname +-will print the domain part of the FQDN (Fully Qualified Domain Name). The +-complete FQDN of the system is returned with +-.BR "hostname \-\-fqdn" . +- +-.SS "SET NAME" +-When called with one argument or with the +-.B \-\-file +-option, the commands set the host name, the NIS/YP domain name or +-the node name. +- +-.LP +-Note, that only the super-user can change the names. +- +-.LP +-It is not possible to set the FQDN or the DNS domain name with the +-.B dnsdomainname +-command (see +-.B "THE FQDN" +-below). +- +-.LP +-The host name is usually set once at system startup in +-.I /etc/rc.d/rc.inet1 +-or +-.I /etc/init.d/boot +-(normally by reading the contents of a file which contains +-the host name, e.g. +-.IR /etc/hostname ). +- +-.SS THE FQDN +-You can't change the FQDN (as returned by +-.BR "hostname \-\-fqdn" ) +-or the DNS domain name (as returned by +-.BR "dnsdomainname" ) +-with this command. The FQDN of the system is the name that the +-.BR resolver (3) +-returns for the host name. +- +-.LP +-Technically: The FQDN is the name +-.BR gethostbyname (2) +-returns for the host name returned by +-.BR gethostname (2). +-The DNS domain name is the part after the first dot. +-.LP +-Therefore it depends on the configuration (usually in +-.IR /etc/host.conf ) +-how you can change it. Usually (if the hosts file is parsed before DNS or +-NIS) you can change it in +-.IR /etc/hosts . +- +- +-.SH OPTIONS +-.TP +-.I "\-a, \-\-alias" +-Display the alias name of the host (if used). +-.TP +-.I "\-d, \-\-domain" +-Display the name of the DNS domain. Don't use the command +-.B domainname +-to get the DNS domain name because it will show the NIS domain name and +-not the DNS domain name. Use +-.B dnsdomainname +-instead. +-.TP +-.I "\-F, \-\-file filename" +-Read the host name from the specified file. Comments (lines starting with +-a `#') are ignored. +-.TP +-.I "\-f, \-\-fqdn, \-\-long" +-Display the FQDN (Fully Qualified Domain Name). A FQDN consists of a +-short host name and the DNS domain name. Unless you are using bind or NIS +-for host lookups you can change the FQDN and the DNS domain name (which is +-part of the FQDN) in the \fI/etc/hosts\fR file. +-.TP +-.I "\-h, \-\-help" +-Print a usage message and exit. +-.TP +-.I "\-i, \-\-ip\-address" +-Display the IP address(es) of the host. +-.TP +-.I "\-n, \-\-node" +-Display the DECnet node name. If a parameter is given (or +-.B \-\-file name +-) the root can also set a new node name. +-.TP +-.I "\-s, \-\-short" +-Display the short host name. This is the host name cut at the first dot. +-.TP +-.I "\-V, \-\-version" +-Print version information on standard output and exit successfully. +-.TP +-.I "\-v, \-\-verbose" +-Be verbose and tell what's going on. +-.TP +-.I "\-y, \-\-yp, \-\-nis" +-Display the NIS domain name. If a parameter is given (or +-.B \-\-file name +-) then root can also set a new NIS domain. +-.SH FILES +-.B /etc/hosts +-.SH AUTHOR +-Peter Tobias, <tobias@et\-inf.fho\-emden.de> +-.br +-Bernd Eckenfels, <net\-tools@lina.inka.de> (NIS and manpage). +-.br +-Steve Whitehouse, <SteveW@ACM.org> (DECnet support and manpage). +- +diff -Naur a/man/en_US/ifconfig.8 b/man/en_US/ifconfig.8 +--- a/man/en_US/ifconfig.8 2008-10-02 18:16:59.000000000 -0500 ++++ b/man/en_US/ifconfig.8 1969-12-31 18:00:00.000000000 -0600 +@@ -1,229 +0,0 @@ +-.TH IFCONFIG 8 "2008\-10\-03" "net\-tools" "Linux System Administrator's Manual" +-.SH NAME +-ifconfig \- configure a network interface +-.SH SYNOPSIS +-.B "ifconfig [-v] [-a] [-s] [interface]" +-.br +-.B "ifconfig [-v] interface [aftype] options | address ..." +-.SH DESCRIPTION +-.B Ifconfig +-is used to configure the kernel-resident network interfaces. It is +-used at boot time to set up interfaces as necessary. After that, it +-is usually only needed when debugging or when system tuning is needed. +-.LP +-If no arguments are given, +-.B ifconfig +-displays the status of the currently active interfaces. If +-a single +-.B interface +-argument is given, it displays the status of the given interface +-only; if a single +-.B \-a +-argument is given, it displays the status of all interfaces, even +-those that are down. Otherwise, it configures an interface. +- +-.SH Address Families +-If the first argument after the interface name is recognized as +-the name of a supported address family, that address family is +-used for decoding and displaying all protocol addresses. Currently +-supported address families include +-.B inet +-(TCP/IP, default), +-.B inet6 +-(IPv6), +-.B ax25 +-(AMPR Packet Radio), +-.B ddp +-(Appletalk Phase 2), +-.B ipx +-(Novell IPX) and +-.B netrom +-(AMPR Packet radio). +-.SH OPTIONS +-.TP +-.B -a +-display all interfaces which are currently available, even if down +-.TP +-.B -s +-display a short list (like netstat -i) +-.TP +-.B -v +-be more verbose for some error conditions +-.TP +-.B interface +-The name of the interface. This is usually a driver name followed by +-a unit number, for example +-.B eth0 +-for the first Ethernet interface. If your kernel supports alias interfaces, +-you can specify them with +-.B eth0:0 +-for the first alias of eth0. You can use them to assign a second address. To +-delete an alias interface use +-.BR "ifconfig eth0:0 down" . +-Note: for every scope (i.e. same net with address/netmask combination) all +-aliases are deleted, if you delete the first (primary). +-.TP +-.B up +-This flag causes the interface to be activated. It is implicitly +-specified if an address is assigned to the interface. +-.TP +-.B down +-This flag causes the driver for this interface to be shut down. +-.TP +-.B "[\-]arp" +-Enable or disable the use of the ARP protocol on this interface. +-.TP +-.B "[\-]promisc" +-Enable or disable the +-.B promiscuous +-mode of the interface. If selected, all packets on the network will +-be received by the interface. +-.TP +-.B "[\-]allmulti" +-Enable or disable +-.B all-multicast +-mode. If selected, all multicast packets on the network will be +-received by the interface. +-.TP +-.B "metric N" +-This parameter sets the interface metric. +-.TP +-.B "mtu N" +-This parameter sets the Maximum Transfer Unit (MTU) of an interface. +-.TP +-.B "dstaddr addr" +-Set the remote IP address for a point-to-point link (such as +-PPP). This keyword is now obsolete; use the +-.B pointopoint +-keyword instead. +-.TP +-.B "netmask addr" +-Set the IP network mask for this interface. This value defaults to the +-usual class A, B or C network mask (as derived from the interface IP +-address), but it can be set to any value. +-.TP +-.B "add addr/prefixlen" +-Add an IPv6 address to an interface. +-.TP +-.B "del addr/prefixlen" +-Remove an IPv6 address from an interface. +-.TP +-.B "tunnel aa.bb.cc.dd" +-Create a new SIT (IPv6-in-IPv4) device, tunnelling to the given destination. +-.TP +-.B "irq addr" +-Set the interrupt line used by this device. Not all devices can +-dynamically change their IRQ setting. +-.TP +-.B "io_addr addr" +-Set the start address in I/O space for this device. +-.TP +-.B "mem_start addr" +-Set the start address for shared memory used by this device. Only a +-few devices need this. +-.TP +-.B "media type" +-Set the physical port or medium type to be used by the device. Not +-all devices can change this setting, and those that can vary in what +-values they support. Typical values for +-.B type +-are +-.B 10base2 +-(thin Ethernet), +-.B 10baseT +-(twisted-pair 10Mbps Ethernet), +-.B AUI +-(external transceiver) and so on. The special medium type of +-.B auto +-can be used to tell the driver to auto-sense the media. Again, not +-all drivers can do this. +-.TP +-.B "[\-]broadcast [addr]" +-If the address argument is given, set the protocol broadcast +-address for this interface. Otherwise, set (or clear) the +-.B IFF_BROADCAST +-flag for the interface. +-.TP +-.B "[\-]pointopoint [addr]" +-This keyword enables the +-.B point-to-point +-mode of an interface, meaning that it is a direct link between two +-machines with nobody else listening on it. +-.br +-If the address argument is also given, set the protocol address of +-the other side of the link, just like the obsolete +-.B dstaddr +-keyword does. Otherwise, set or clear the +-.B IFF_POINTOPOINT +-flag for the interface. +-.TP +-.B hw class address +-Set the hardware address of this interface, if the device driver +-supports this operation. The keyword must be followed by the +-name of the hardware class and the printable ASCII equivalent of +-the hardware address. Hardware classes currently supported include +-.B ether +-(Ethernet), +-.B ax25 +-(AMPR AX.25), +-.B ARCnet +-and +-.B netrom +-(AMPR NET/ROM). +-.TP +-.B multicast +-Set the multicast flag on the interface. This should not normally be needed +-as the drivers set the flag correctly themselves. +-.TP +-.B address +-The IP address to be assigned to this interface. +-.TP +-.B txqueuelen length +-Set the length of the transmit queue of the device. It is useful to set this +-to small values for slower devices with a high latency (modem links, ISDN) +-to prevent fast bulk transfers from disturbing interactive traffic like +-telnet too much. +-.SH NOTES +-Since kernel release 2.2 there are no explicit interface statistics for +-alias interfaces anymore. The statistics printed for the original address +-are shared with all alias addresses on the same device. If you want per-address +-statistics you should add explicit accounting +-rules for the address using the +-.BR ipchains (8) +-or +-.BR iptables (8) +-command. +-.LP +-Since net\-tools 1.60\-4 ifconfig is printing byte counters and human readable +-counters with IEC 60027-2 units. So 1 KiB are 2^10 byte. Note, the numbers +-are truncated to one decimal (which can by quite a large error if you +-consider 0.1 PiB is 112.589.990.684.262 bytes :) +-.LP +-Interrupt problems with Ethernet device drivers fail with EAGAIN +-.I (SIOCSIIFLAGS: Resource temporarily unavailable) +-it is most likely a interrupt conflict. See +-.I http://www.scyld.com/expert/irq\-conflict.html +-for more information. +-.SH FILES +-.I /proc/net/socket +-.br +-.I /proc/net/dev +-.br +-.I /proc/net/if_inet6 +-.SH BUGS +-While appletalk DDP and IPX addresses will be displayed they cannot be +-altered by this command. +-.SH SEE ALSO +-route(8), netstat(8), arp(8), rarp(8), ipchains(8), iptables(8), ifup(8), interfaces(5). +-.br +-http://physics.nist.gov/cuu/Units/binary.html - Prefixes for binary multiples +-.SH AUTHORS +-Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> +-.br +-Alan Cox, <Alan.Cox@linux.org> +-.br +-Phil Blundell, <Philip.Blundell@pobox.com> +-.br +-Andi Kleen +-.br +-Bernd Eckenfels, <net\-tools@lina.inka.de> +diff -Naur a/man/en_US/nisdomainname.1 b/man/en_US/nisdomainname.1 +--- a/man/en_US/nisdomainname.1 1998-08-10 15:51:12.000000000 -0500 ++++ b/man/en_US/nisdomainname.1 1969-12-31 18:00:00.000000000 -0600 +@@ -1 +0,0 @@ +-.so man1/hostname.1 +diff -Naur a/man/en_US/ypdomainname.1 b/man/en_US/ypdomainname.1 +--- a/man/en_US/ypdomainname.1 1998-08-10 15:51:16.000000000 -0500 ++++ b/man/en_US/ypdomainname.1 1969-12-31 18:00:00.000000000 -0600 +@@ -1 +0,0 @@ +-.so man1/hostname.1 diff --git a/talimatname/genel/n/net-tools/talimat b/talimatname/genel/n/net-tools/talimat new file mode 100644 index 000000000..1df149a59 --- /dev/null +++ b/talimatname/genel/n/net-tools/talimat @@ -0,0 +1,19 @@ +# Tanım: ağ araçları +# URL: http://net-tools.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=net-tools +surum=20101030 +devir=1 + +kaynak=(http://anduin.linuxfromscratch.org/sources/BLFS/svn/n/$isim-CVS_$surum.tar.gz + net-tools-CVS_20101030-remove_dups-1.patch) + +derle() { + cd net-tools-CVS_20101030 + patch -Np1 -i ../net-tools-CVS_20101030-remove_dups-1.patch + yes "" | make config + make + make update DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/netbeans/netbeans.conf b/talimatname/genel/n/netbeans/netbeans.conf new file mode 100644 index 000000000..a543c09c3 --- /dev/null +++ b/talimatname/genel/n/netbeans/netbeans.conf @@ -0,0 +1,63 @@ +# Default locations of userdir and cachedir: +# (http://wiki.netbeans.org/FaqWhatIsUserdir) +# +# On Windows ${DEFAULT_USERDIR_ROOT} will be replaced by the launcher +# with "<AppData>\NetBeans" where <AppData> is user's +# value of "AppData" key in Windows Registry under +# "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" +# and ${DEFAULT_CACHEDIR_ROOT} will be replaced by the launcher +# with "<Local AppData>\NetBeans\Cache" where <Local AppData> is user's +# value of "Local AppData" key in Windows Registry under +# "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" +# +# On Mac ${DEFAULT_USERDIR_ROOT} will be replaced by the launcher +# with "~/Library/Application Support/NetBeans" and +# ${DEFAULT_CACHEDIR_ROOT} with "~/Library/Caches/NetBeans" +# +# On other systems ${DEFAULT_USERDIR_ROOT} will be replaced by the launcher +# with "~/.netbeans" and ${DEFAULT_CACHEDIR_ROOT} with "~/.cache/netbeans" +# +# You can also use ${HOME} variable which will be replaced with +# user.home JVM system property value. This variable is valid only in +# netbeans_default_userdir and netbeans_default_cachedir properties. +# +# NOTE: If you specify a non-default userdir path on command line +# (--userdir option) and don't specify a cachedir path (--cachedir option), +# cachedir will be in "<userdir>/var/cache". +# +# Cachedir must be different from userdir. The same cachedir and userdir +# would cause problems. +# +netbeans_default_userdir="~/.netbeans/8.2" +netbeans_default_cachedir="~/.cache/netbeans/8.2" + +# Options used by NetBeans launcher by default: +# (can be overridden by explicit command line switches) +# +# Note that default -Xmx is selected for you automatically. +# You can find these values in var/log/messages.log file in your userdir. +# The automatically selected value can be overridden by specifying -J-Xmx +# here or on the command line. +# +# If you specify the heap size explicitly, you may also want to enable +# Concurrent Mark & Sweep garbage collector. +# (see http://wiki.netbeans.org/FaqGCPauses) +# +netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true" + +# Default location of JDK: +# (set by installer or commented out if launcher should decide) +# +# It can be overridden on command line by using --jdkhome <dir> +# Be careful when changing jdkhome. +# There are two NetBeans launchers for Windows (32-bit and 64-bit) and +# installer points to one of those in the NetBeans application shortcut +# based on the Java version selected at installation time. +# +#netbeans_jdkhome="/path/to/jdk" + +# Additional module clusters: +# using ${path.separator} (';' on Windows or ':' on Unix): +# +#netbeans_extraclusters="/absolute/path/to/cluster1:/absolute/path/to/cluster2" + diff --git a/talimatname/genel/n/netbeans/netbeans.desktop b/talimatname/genel/n/netbeans/netbeans.desktop new file mode 100644 index 000000000..e92dfa202 --- /dev/null +++ b/talimatname/genel/n/netbeans/netbeans.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Netbeans +Comment=Netbeans IDE +Exec=netbeans %f +Icon=netbeans +Terminal=false +Type=Application +Categories=Development,IDE; +StartupNotify=false \ No newline at end of file diff --git a/talimatname/genel/n/netbeans/netbeans.sh b/talimatname/genel/n/netbeans/netbeans.sh new file mode 100755 index 000000000..bc4996a82 --- /dev/null +++ b/talimatname/genel/n/netbeans/netbeans.sh @@ -0,0 +1,223 @@ +#!/bin/sh +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. +# +# Copyright 1997-2016 Oracle and/or its affiliates. All rights reserved. +# +# Oracle and Java are registered trademarks of Oracle and/or its affiliates. +# Other names may be trademarks of their respective owners. +# +# The contents of this file are subject to the terms of either the GNU +# General Public License Version 2 only ("GPL") or the Common +# Development and Distribution License("CDDL") (collectively, the +# "License"). You may not use this file except in compliance with the +# License. You can obtain a copy of the License at +# http://www.netbeans.org/cddl-gplv2.html +# or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the +# specific language governing permissions and limitations under the +# License. When distributing the software, include this License Header +# Notice in each file and include the License file at +# nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the GPL Version 2 section of the License file that +# accompanied this code. If applicable, add the following below the +# License Header, with the fields enclosed by brackets [] replaced by +# your own identifying information: +# "Portions Copyrighted [year] [name of copyright owner]" +# +# Contributor(s): +# +# The Original Software is NetBeans. The Initial Developer of the Original +# Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun +# Microsystems, Inc. All Rights Reserved. +# +# If you wish your version of this file to be governed by only the CDDL +# or only the GPL Version 2, indicate your decision by adding +# "[Contributor] elects to include this software in this distribution +# under the [CDDL or GPL Version 2] license." If you do not indicate a +# single choice of license, a recipient has the option to distribute +# your version of this file under either the CDDL, the GPL Version 2 or +# to extend the choice of license to its licensees as provided above. +# However, if you add GPL Version 2 code and therefore, elected the GPL +# Version 2 license, then the option applies only if the new code is +# made subject to such option by the copyright holder. + +# +# resolve symlinks +# + +PRG=$0 + +while [ -h "$PRG" ]; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null` + if expr "$link" : '^/' 2> /dev/null >/dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi +done + +progdir=`dirname "$PRG"` +old=`pwd` +cd "$progdir"/.. +basedir=`pwd` +cd "$old" + +case "`uname`" in + Darwin*) + # set default userdir and cachedir on Mac OS X + DEFAULT_USERDIR_ROOT="${HOME}/Library/Application Support/NetBeans" + DEFAULT_CACHEDIR_ROOT=${HOME}/Library/Caches/NetBeans + ;; + *) + # set default userdir and cachedir on unix systems + DEFAULT_USERDIR_ROOT=${HOME}/.netbeans + DEFAULT_CACHEDIR_ROOT=${HOME}/.cache/netbeans + ;; +esac + + +if [ -f "$basedir"/etc/netbeans.conf ] ; then + . "$basedir"/etc/netbeans.conf +fi + +# following should be done just in RPM or Solaris Launcher +# if [ -f /etc/netbeans.conf ] ; then +# . /etc/netbeans.conf +# fi + +export DEFAULT_USERDIR_ROOT + +# #68373: look for userdir, but do not modify "$@" +userdir="${netbeans_default_userdir}" +cachedir="${netbeans_default_cachedir}" + +founduserdir="" +for opt in "$@"; do + if [ "${founduserdir}" = "yes" ]; then + userdir="$opt" + break + elif [ "$opt" = "--userdir" ]; then + founduserdir="yes" + fi +done +foundcachedir="" +for opt in "$@"; do + if [ "${foundcachedir}" = "yes" ]; then + cachedir="$opt" + break + elif [ "$opt" = "--cachedir" ]; then + foundcachedir="yes" + fi +done + +if [ -f "${userdir}"/etc/netbeans.conf ] ; then + . "${userdir}"/etc/netbeans.conf +fi + + +if [ ! -f "$basedir"/etc/netbeans.clusters ]; then + echo Cannot read cluster file: "$basedir"/etc/netbeans.clusters 1>&2 + exit 1 +fi + +readClusters() { + grep -v "^#" "$basedir"/etc/netbeans.clusters | grep -v "^$" | grep -v platform | while read X; do + if expr "$X" : "/.*" >/dev/null; then + echo "$X" + else + echo "$basedir/$X" + fi + done +} + +absolutize_paths() { + while read path; do + if [ -d "$path" ]; then + (cd "$path" 2>/dev/null && pwd) + else + echo "$path" + fi + done +} + +netbeans_clusters=`readClusters | absolutize_paths | tr '\012' ':'` + +if [ ! -z "$netbeans_extraclusters" ] ; then + netbeans_clusters="$netbeans_clusters:$netbeans_extraclusters" +fi + +heap_size () { + mem=640 + case "`uname`" in + Linux*) + mem=`cat /proc/meminfo | grep MemTotal | tr -d [:space:][:alpha:]:` + mem=`expr $mem / 1024` + ;; + SunOS*) + mem=`/usr/sbin/prtconf | grep Memory | /usr/bin/tr -dc '[0-9]'` + ;; + Darwin*) + mem=`/usr/sbin/sysctl hw.memsize | tr -d [:alpha:][:space:].:` + mem=`expr $mem / 1048576` + ;; + *) + ;; + esac + if [ -z "$mem" ] ; then + mem=640 + fi + mem=`expr $mem / 5` + if [ $mem -gt 1024 ] ; then + mem=1024 + elif [ $mem -lt 96 ] ; then + mem=96 + fi + max_heap_size=$mem + return 0 +} + + +if grep -v -- "-J-Xmx" >/dev/null <<EOF ; then +${netbeans_default_options} +EOF + heap_size + netbeans_default_options="-J-Xmx${max_heap_size}m ${netbeans_default_options}" +fi + +launchNbexec() { + nbexec="/usr/share/netbeans/platform/lib/nbexec" + sh="/bin/bash" + #exec $sh "$nbexec" + source /etc/netbeans.conf + exec $sh "$nbexec" $netbeans_default_options --userdir "${userdir}" --cachedir "${cachedir}" + #"$@" + +} + +# in case of macosx, the apple.laf.useScreenMenuBar property should be ideally in the Info.plist file +# but it doesn't get propagated into the executed java VM. +case "`uname`" in + Darwin*) + eval launchNbexec \ + --jdkhome '"$netbeans_jdkhome"' \ + -J-Xdock:name=NetBeans \ + '"-J-Xdock:icon=$basedir/nb/netbeans.icns"' \ + --branding nb \ + --clusters '"$netbeans_clusters"' \ + -J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \ + -J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense \ + ${netbeans_default_options} \ + '"$@"' + ;; + *) + eval launchNbexec \ + --jdkhome '"$netbeans_jdkhome"' \ + --branding nb \ + --clusters '"$netbeans_clusters"' \ + -J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \ + -J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense \ + ${netbeans_default_options} \ + '"$@"' + ;; +esac diff --git a/talimatname/genel/n/netbeans/talimat b/talimatname/genel/n/netbeans/talimat new file mode 100644 index 000000000..6a3448570 --- /dev/null +++ b/talimatname/genel/n/netbeans/talimat @@ -0,0 +1,27 @@ +# Tanım: Java, HTML5, PHP, Groovy, C ve C++ için geliştirme ortamı. +# URL: http://netbeans.org/ +# Paketçi: halityilmaz1982 +# Gerekler: openjdk freefont-ttf xorg-libxtst giflib atk + +isim=netbeans +surum=8.2 +devir=1 +_altsurum=201609300101 + +kaynak=( http://download.netbeans.org/netbeans/$surum/final/zip/$isim-$surum-$_altsurum.zip + https://cdn.rawgit.com/ComFreek/chocolatey-packages/779f5c96f817ed1fa0d76fd90841873dc6c0ba74/icons/netbeans.png + $isim.desktop + netbeans.conf + netbeans.sh) + +derle() { + mkdir -p "$PKG/usr/"{bin,share/applications} + install -Dm755 "$SRC/netbeans.sh" "$PKG/usr/bin/$isim" + mkdir -p $PKG/etc + cp -r "$SRC/$isim" "$PKG/usr/share/" + install -Dm644 "$isim.desktop" "$PKG/usr/share/applications/$isim.desktop" + install -Dm644 "$SRC/netbeans.png" "$PKG/usr/share/pixmaps/$isim.png" + rm -r "$PKG/usr/share/$isim/bin" + cp $PKG/usr/share/netbeans/etc/netbeans.clusters $PKG/etc/ + cp $PKG/usr/share/netbeans/etc/netbeans.import $PKG/etc/ +} diff --git a/talimatname/genel/n/netcat/talimat b/talimatname/genel/n/netcat/talimat new file mode 100644 index 000000000..fbcc308da --- /dev/null +++ b/talimatname/genel/n/netcat/talimat @@ -0,0 +1,20 @@ +# Tanım: Ağ bağlantıları üzerinden veri okuma ve yazma +# URL: http://netcat.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=netcat +surum=0.7.1 +devir=1 + +kaynak=(http://download.sourceforge.net/netcat/netcat-0.7.1.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --mandir=/usr/share/man + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/netdata/netdata.kur-kos b/talimatname/genel/n/netdata/netdata.kur-kos new file mode 100644 index 000000000..39da94f1c --- /dev/null +++ b/talimatname/genel/n/netdata/netdata.kur-kos @@ -0,0 +1,14 @@ +getent group netdata > /dev/null || groupadd -g 134 netdata 1>/dev/null +getent passwd netdata > /dev/null || useradd -u 134 -d /var/cache/netdata -g netdata -s /bin/nologin netdata 1>/dev/null +chown -R netdata:netdata /var/lib/netdata +chown -R netdata:netdata /var/log/netdata +chown -R netdata:netdata /var/cache/netdata +chown -R netdata:netdata /usr/share/netdata/web +chown -R netdata:netdata /etc/netdata +echo +echo "uygulama ilk defa başlayınca" +echo "ayar dosyasını aşağıdaki adresten indirip düzenledikten sonra" +echo "http://127.0.0.1:19999/netdata.conf" +echo +echo " /etc/netdata/ buraya kopyalayınız" +echo diff --git a/talimatname/genel/n/netdata/talimat b/talimatname/genel/n/netdata/talimat new file mode 100644 index 000000000..c7994c304 --- /dev/null +++ b/talimatname/genel/n/netdata/talimat @@ -0,0 +1,25 @@ +# Tanım: Web tabanlı gerçek zamanlı sistem performans izleyici uygulaması +# URL: https://github.com/firehol/netdata/wiki +# Paketçi: milisarge +# Gerekler: libmnl libnetfilter_acct + +isim=netdata +surum=1.7.0 +devir=1 + +kaynak=(https://github.com/firehol/netdata/releases/download/v${surum}/netdata-${surum}.tar.xz) + +derle(){ + cd $isim-$surum + ./configure \ + --prefix="/usr" \ + --sbindir="/usr/bin" \ + --sysconfdir="/etc" \ + --libexecdir="/usr/lib" \ + --localstatedir="/var" \ + --with-zlib --with-math --with-user=netdata + make + make DESTDIR=$PKG install + touch "$PKG/etc/netdata/netdata.conf" + install -Dm0644 "system/netdata.logrotate" "$PKG/etc/logrotate.d/netdata" +} diff --git a/talimatname/genel/n/netdiscover/talimat b/talimatname/genel/n/netdiscover/talimat new file mode 100644 index 000000000..0c2f1d7f5 --- /dev/null +++ b/talimatname/genel/n/netdiscover/talimat @@ -0,0 +1,21 @@ +# Tanım: DHCP sunucuları olmayan kablosuz ağlar için de geliştirilen arp protokolüne dayalı ağ adresi bulma aracıdır. +# URL: http://nixgeneration.com/~jaime/netdiscover/ +# Paketçi: Cihan_Alkan +# Gerekler: libpcap libnet +# Grup: ağ güvenlik + +isim=netdiscover +surum=0.3 +devir=1 +kaynak=(https://sourceforge.net/projects/${isim}/files/${isim}/0.3-pre-beta7-LINUXONLY/${isim}-0.3-pre-beta7-LINUXONLY.tar.gz + http://kaynaklar.milislinux.org/oui.tar.xz) + + +derle() { + cd "$SRC"/netdiscover-0.3-pre-beta7 + patch -p1 -i ../oui.patch + ./configure --sbindir=/usr/bin --prefix=/usr --sysconfdir=/etc/ + make || return 1 + make DESTDIR="$PKG" install || return 1 + rm -rf "$PKG"/usr/share/doc +} diff --git a/talimatname/genel/n/nethogs-qt/nethogs-qt.desktop b/talimatname/genel/n/nethogs-qt/nethogs-qt.desktop new file mode 100644 index 000000000..55a238a80 --- /dev/null +++ b/talimatname/genel/n/nethogs-qt/nethogs-qt.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Nethogs Ağ Gözlemleyici +Exec=nethogs-qt +Comment=Süreç bazlı ağ gözlemleme +Icon=hwinfo +Terminal=false +Categories=Network; diff --git a/talimatname/genel/n/nethogs-qt/talimat b/talimatname/genel/n/nethogs-qt/talimat new file mode 100644 index 000000000..77d453ad2 --- /dev/null +++ b/talimatname/genel/n/nethogs-qt/talimat @@ -0,0 +1,20 @@ +# Tanım: süreç bazlı net kullanım grafik göstericisi qt arayüzü +# URL: https://github.com/mbfoss/gnethogs +# Paketçi: milisarge +# Gerekler: nethogs qt5 + +isim=nethogs-qt +surum=0.0.4 +devir=1 +kaynak=(http://slist.lilotux.net/linux/nethogs-qt/$isim-$surum.tgz + nethogs-qt.desktop) + +derle() { + cd "$SRC/$isim-$surum" + qmake-qt5 + make + install -d "$PKG"/usr/bin/ + install -m 755 nethogs-qt "$PKG"/usr/bin/ + install -d "$PKG"/usr/share/applications + cp $SRC/nethogs-qt.desktop "$PKG"/usr/share/applications/ +} diff --git a/talimatname/genel/n/nethogs/talimat b/talimatname/genel/n/nethogs/talimat new file mode 100644 index 000000000..ce1e27e91 --- /dev/null +++ b/talimatname/genel/n/nethogs/talimat @@ -0,0 +1,23 @@ +# Tanım: süreç bazlı net kullanım grafik göstericisi +# URL: https://github.com/raboof/nethogs +# Paketçi: milisarge +# Gerekler: libpcap + +isim=nethogs +surum=0.8.5 +devir=1 +kaynak=(https://github.com/raboof/nethogs/archive/v$surum.tar.gz) + +derle() { + cd "$SRC/$isim-$surum" + sed -i 's|/sbin|/bin|' src/MakeApp.mk + sed -i 's|/local||' Makefile + unset CFLAGS + unset CXXFLAGS + make prefix="/usr" + make prefix="/usr" libnethogs + make prefix="/usr" DESTDIR="$PKG" install + make prefix="/usr" DESTDIR="$PKG" install_lib + install -Dm755 src/libnethogs.h "$PKG/usr/include/libnethogs.h" + ln -s "/usr/lib/libnethogs.so.$surum" "$PKG/usr/lib/libnethogs.so" +} diff --git a/talimatname/genel/n/netpbm/netpbm-noppmtompeg.patch b/talimatname/genel/n/netpbm/netpbm-noppmtompeg.patch new file mode 100644 index 000000000..8b668da69 --- /dev/null +++ b/talimatname/genel/n/netpbm/netpbm-noppmtompeg.patch @@ -0,0 +1,25 @@ +diff --git a/buildtools/manpage.mk b/buildtools/manpage.mk +index 47d890c..62e613f 100644 +--- a/buildtools/manpage.mk ++++ b/buildtools/manpage.mk +@@ -251,7 +251,6 @@ MAN1 = \ + ppmtolj.1 \ + ppmtomap.1 \ + ppmtomitsu.1 \ +- ppmtompeg.1 \ + ppmtoneo.1 \ + ppmtopcx.1 \ + ppmtopgm.1 \ +diff --git a/converter/ppm/Makefile b/converter/ppm/Makefile +index 003ef8d..09f05cd 100644 +--- a/converter/ppm/Makefile ++++ b/converter/ppm/Makefile +@@ -7,7 +7,7 @@ VPATH=.:$(SRCDIR)/$(SUBDIR) + + include $(BUILDDIR)/config.mk + +-SUBDIRS = hpcdtoppm ppmtompeg ++SUBDIRS = hpcdtoppm + + PORTBINARIES = 411toppm eyuvtoppm gouldtoppm ilbmtoppm imgtoppm \ + leaftoppm mtvtoppm neotoppm \ diff --git a/talimatname/genel/n/netpbm/talimat b/talimatname/genel/n/netpbm/talimat new file mode 100644 index 000000000..92cb0d81e --- /dev/null +++ b/talimatname/genel/n/netpbm/talimat @@ -0,0 +1,126 @@ +# Tanım: Grafik resimlerin manipüle edilmesi için bir araç seti +# URL: http://netpbm.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: perl libpng libtiff libxml2 python jbigkit xorg-libx11 jasper +# Grup: kütüphane + +isim=netpbm +surum=10.71.02 +devir=1 + +kaynak=(http://pkgs.fedoraproject.org/repo/pkgs/netpbm/netpbm-10.71.02.tar.xz/24df6a5baf36fa8943f046568726fd57/netpbm-10.71.02.tar.xz + netpbm-noppmtompeg.patch) + +derle() { + cd $isim-$surum + touch converter/ppm/hpcdtoppm/depend.mk + patch -p1 -E --backup --verbose -i ${SRC}/netpbm-noppmtompeg.patch + # use the interactive way + CFLAGS="${CFLAGS} -fPIC" + LDSHLIB="${LDSHLIB} -fPIC" + chmod 755 configure buildtools/stamp-date buildtools/install.sh buildtools/mkinstalldirs + +sed -i -e "s|\$(LDSHLIB)|\$(LDSHLIB) ${LDFLAGS}|g" lib/Makefile || exit 1 + +mv buildtools/pkgconfig_template buildtools/pkgconfig_template.orig + +cat > buildtools/pkgconfig_template <<EOF +prefix=/usr +exec_prefix=\${prefix} +libdir=/usr/lib +includedir=\${prefix}/include +EOF + +sed \ + -e "s|@VERSION@|${VERSION}|g" \ + -e 's|@LINKDIR@|${libdir}|g' \ + -e 's|@INCLUDEDIR@|${includedir}|g' \ + buildtools/pkgconfig_template.orig \ + >> buildtools/pkgconfig_template || exit 1 + +SOVER="$(grep '^MAJ =' lib/Makefile | awk '{print $3}')" + +#sed -i -e '/config_mk/d' buildtools/configure.pl +./configure <<EOF + + + + + + + + + + + + + + + + + + +EOF + +TOP=$(pwd) +make -j1 -e \ + CC=/usr/bin/gcc \ + LDFLAGS="-L${TOP}/pbm -L${TOP}/pgm -L${TOP}/pnm -L${TOP}/ppm ${LDFLAGS}" \ + CFLAGS="${SLKCFLAGS} -fPIC -ffast-math -pedantic -fno-common -Wall -Wno-uninitialized -Wmissing-declarations -Wimplicit -Wwrite-strings -Wmissing-prototypes -Wundef -I/usr/include/jbigkit" \ + LADD="-lm" \ + DEFAULT_TARGET=nonmerge \ + NETPBMLIBTYPE=unixshared \ + NETPBMLIBSUFFIX=so \ + STATICLIB_TOO=n \ + JPEGINC_DIR=/usr/include \ + PNGINC_DIR=/usr/include \ + TIFFINC_DIR=/usr/include \ + JPEGLIB_DIR=/usr/lib \ + PNGLIB_DIR=/usr/lib \ + TIFFLIB_DIR=/usr/lib \ + LINUXSVGALIB="NONE" \ + X11LIB=/usr/lib/libX11.so \ + XML2LIBS="NONE" \ + JASPERLIB="" \ + JASPERDEPLIBS="-ljasper" \ + JBIGLIB='-ljbig' \ + NETPBM_DOCURL="http://netpbm.sourceforge.net/doc/" || exit 1 + + # prepare man files + ( cd userguide + for i in *.html ; do + ../buildtools/makeman ${i} + done + for i in 1 3 5 ; do + mkdir -p man/man${i} + mv *.${i} man/man${i} + done + ) || exit 1 + + mkdir -p ${PKG} || exit 1 + make package pkgdir=${PKG}/usr LINUXSVGALIB="NONE" XML2LIBS="NONE" STATICLIB_TOO=n || exit 1 + + mkdir -p ${PKG}/usr/lib${LIBDIRSUFFIX} + if [ "/usr/lib${LIBDIRSUFFIX}" != "/usr/lib" ]; then + mv ${PKG}/usr/lib/lib* ${PKG}/usr/lib${LIBDIRSUFFIX}/ || exit 1 + rmdir ${PKG}/usr/lib + fi + + ln -sf libnetpbm.so.${SOVER} ${PKG}/usr/lib${LIBDIRSUFFIX}/libnetpbm.so || exit 1 + + find ${PKG} | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + + mkdir -p ${PKG}/usr/lib${LIBDIRSUFFIX}/pkgconfig + mv ${PKG}/usr/pkgconfig_template \ + ${PKG}/usr/lib${LIBDIRSUFFIX}/pkgconfig/netpbm.pc || exit 1 + + rm -rf ${PKG}/usr/man + mkdir -p $PKG/usr/share + mv $PKG/usr/misc $PKG/usr/share/netpbm + rm -f ${PKG}/usr/config_template + rm -f ${PKG}/usr/pkginfo + rm -f ${PKG}/usr/README + rm -f ${PKG}/usr/VERSION + rm -fr ${PKG}/usr/link +} diff --git a/talimatname/genel/n/netsniff-ng/talimat b/talimatname/genel/n/netsniff-ng/talimat new file mode 100644 index 000000000..644670d39 --- /dev/null +++ b/talimatname/genel/n/netsniff-ng/talimat @@ -0,0 +1,17 @@ +# Tanım: Yüksek performanslı ağ paketi dinleme/inceleme uygulaması +# URL: http://netsniff-ng.org/ +# Paketçi: milisarge +# Gerekler: cmake geoip libpcap libnl libnet libsodium libcli liburcu libnetfilter_conntrack +# Grup: güvenlik + +isim=netsniff-ng +surum=0.6.4 +devir=1 +kaynak=(http://pub.netsniff-ng.org/netsniff-ng/netsniff-ng-$surum.tar.gz) + +derle() { + cd "${SRC}"/${isim}-${surum} + NACL_INC_DIR=/usr/include/sodium NACL_LIB=sodium ./configure --prefix=/usr + make DISTRO=1 all + make PREFIX="/usr" DESTDIR="${PKG}" SBINDIR="/usr/bin" install_all +} diff --git a/talimatname/genel/n/nettle/talimat b/talimatname/genel/n/nettle/talimat new file mode 100644 index 000000000..7b4cd78e0 --- /dev/null +++ b/talimatname/genel/n/nettle/talimat @@ -0,0 +1,22 @@ +# Tanım: Düşük düzey kriptografi kütüphanesi +# URL: http://www.lysator.liu.se/~nisse/nettle/ +# Paketçi: milisarge +# Gerekler: + +isim=nettle +surum=3.2 +devir=1 +kaynak=(ftp://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --libdir=/usr/lib \ + --disable-documentation + + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/n/nettle/talimat.E b/talimatname/genel/n/nettle/talimat.E new file mode 100644 index 000000000..b3ac6b905 --- /dev/null +++ b/talimatname/genel/n/nettle/talimat.E @@ -0,0 +1,20 @@ +# Tanım: Low-level cryptographic library that is designed to fit easily in many contexts. +# URL: http://www.lysator.liu.se/~nisse/nettle/ +# Paketçi: tnut at nutyx dot org + +isim=nettle +surum=3.2 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +chmod -v 755 $PKG/usr/lib/libhogweed.so.4.1 $PKG/usr/lib/libnettle.so.6.1 +install -v -m755 -d $PKG/usr/share/doc/nettle-$surum +rm -rf $PKG/usr/share/info/dir +install -v -m644 nettle.html $PKG/usr/share/doc/nettle-$surum +} diff --git a/talimatname/genel/n/network-manager-applet/network-manager-applet.kur-kos b/talimatname/genel/n/network-manager-applet/network-manager-applet.kur-kos new file mode 100644 index 000000000..76636206c --- /dev/null +++ b/talimatname/genel/n/network-manager-applet/network-manager-applet.kur-kos @@ -0,0 +1,2 @@ +gtk-update-icon-cache -f -q -t /usr/share/icons/hicolor +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas >/dev/null 2>&1 diff --git a/talimatname/genel/n/network-manager-applet/talimat b/talimatname/genel/n/network-manager-applet/talimat new file mode 100644 index 000000000..ce19c0d0f --- /dev/null +++ b/talimatname/genel/n/network-manager-applet/talimat @@ -0,0 +1,27 @@ +# Tanım: Ağın daha doğrudan yönetilebilir olmasını sağlayan basitleştiren ve geliştiren araçlar +# URL: http://projects.gnome.org/NetworkManager/ +# Paketçi: milisarge +# Gerekler: gtk3 gconf iso-codes gobject-introspection libgnome-keyring gnome-keyring libsecret libnotify networkmanager polkit-gnome modemmanager gtk-update-icon-cache +# Grup: ağ + +isim=network-manager-applet +surum=1.8.10 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/1.8/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i '/#, fuzzy/d' po/tr.po + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --without-team \ + --without-selinux \ + --disable-introspection + + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gir-1.0 + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/n/networkmanager/networkmanager.kos-sil b/talimatname/genel/n/networkmanager/networkmanager.kos-sil new file mode 100644 index 000000000..f09f24dc5 --- /dev/null +++ b/talimatname/genel/n/networkmanager/networkmanager.kos-sil @@ -0,0 +1,10 @@ +#!/bin/sh +for _kurtar in \ +'/etc/NetworkManager/system-connections' ; \ +do + +#sed -i '\|'\'$_kurtar\''|d' /var/lib/pkg/DB/cups/kurulan +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/networkmanager.sil + +done diff --git a/talimatname/genel/n/networkmanager/talimat b/talimatname/genel/n/networkmanager/talimat new file mode 100644 index 000000000..576beda03 --- /dev/null +++ b/talimatname/genel/n/networkmanager/talimat @@ -0,0 +1,63 @@ +# Tanım: Ağın daha doğrudan yönetilebilir olmasını sağlayan basitleştiren ve geliştiren araçlar +# URL: http://projects.gnome.org/NetworkManager/ +# Paketçi: milisarge +# Gerekler: libndp libsoup libgudev modemmanager dbus-glib iptables libnl nss wireless-tools polkit upower vala wpa-supplicant python-gobject gobject-introspection newt jansson ppp +# Grup: ağ + +_isim=NetworkManager + +isim=networkmanager +surum=1.10.8 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$_isim/${surum%.*}/$_isim-$surum.tar.xz) + +derle() { + _pppver=2.4.7 + cd ${_isim}-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --with-nmtui \ + --with-modem-manager-1 \ + --with-session-tracking=consolekit \ + --with-suspend-resume=upower \ + --with-dbus-sys-dir=/etc/dbus-1/system.d \ + --enable-introspection \ + --with-crypto=nss \ + --enable-wifi \ + --with-iptables=/usr/sbin/iptables \ + --with-kernel-firmware-dir=/lib/firmware \ + --with-dist-version="$surum-$devir, Milis Linux" \ + --with-systemdsystemunitdir=no \ + --with-pppd-plugin-dir=/usr/lib/pppd/$_pppver \ + --with-pppd=/usr/sbin/pppd \ + --with-wext \ + --without-consolekit \ + --without-libaudit \ + --without-more-asserts \ + --without-netconfig \ + --without-ofono \ + --without-selinux + + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0 /g' -e 's/ \ + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then/ \ + func_append compile_command " -Wl,-O1,--as-needed"\n \ + func_append finalize_command " -Wl,-O1,--as-needed"\n\0/' libtool + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/gtk-doc + +cat > $PKG/etc/NetworkManager/NetworkManager.conf << EOF +[main] +plugins=keyfile +EOF + +# create a VPN directory +install -d $PKG/etc/$_name/VPN +install -m755 clients/.libs/nm-online -D $PKG/usr/bin/nm-online +# create keyfile plugin system-settings directory +install -d $PKG/etc/$_name/system-connections + +} diff --git a/talimatname/genel/n/neverball/neverball.po b/talimatname/genel/n/neverball/neverball.po new file mode 100644 index 000000000..f6c6e1097 --- /dev/null +++ b/talimatname/genel/n/neverball/neverball.po @@ -0,0 +1,1676 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Robert Kooima +# This file is distributed under the same license as the PACKAGE package. +# Cihan Alkan <cihanalk@gmail.com>, 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Neverball\n" +"Report-Msgid-Bugs-To: robert.kooima@gmail.com\n" +"POT-Creation-Date: 2014-05-21 13:35+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Cihan Alkan <<cihanalk@gmail.com>>\n" +"Language-Team: Turkish <tr@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ball/st_play.c:100 +msgid "Ready?" +msgstr "Hazır mısınız?" + +#: ball/st_play.c:184 +msgid "Set?" +msgstr "Hazır" + +#: ball/st_play.c:325 +msgid "GO!" +msgstr "BAŞLA" + +#: ball/st_save.c:100 +msgid "Replay Name" +msgstr "İsim Tekrar" + +#: ball/st_save.c:111 +msgid "Save" +msgstr "Kaydet" + +#: ball/st_save.c:113 ball/st_save.c:222 ball/st_name.c:112 +msgid "Cancel" +msgstr "İptal" + +#: ball/st_save.c:217 +msgid "Overwrite?" +msgstr "Üzerine yazılsın mı?" + +#: ball/st_save.c:223 +msgid "Overwrite" +msgstr "Üzerine Yaz" + +#: ball/game_common.h:10 +msgid "snd/select.ogg" +msgstr "" + +#: ball/game_common.h:11 +msgid "snd/ready.ogg" +msgstr "" + +#: ball/game_common.h:12 +msgid "snd/set.ogg" +msgstr "" + +#: ball/game_common.h:13 +msgid "snd/go.ogg" +msgstr "" + +#: ball/game_common.h:24 +msgid "snd/record.ogg" +msgstr "" + +#: ball/game_common.h:25 +msgid "snd/fall.ogg" +msgstr "" + +#: ball/game_common.h:26 +msgid "snd/time.ogg" +msgstr "" + +#: ball/game_common.h:27 +msgid "snd/over.ogg" +msgstr "" + +#: ball/st_start.c:174 ball/st_demo.c:308 ball/st_help.c:106 +#: ball/st_ball.c:182 share/gui.c:2204 share/st_common.c:97 putt/st_conf.c:106 +#: putt/st_all.c:404 putt/st_all.c:552 +msgid "Back" +msgstr "Geri" + +#: ball/st_start.c:203 ball/progress.c:417 +msgid "Challenge" +msgstr "Meydan Okuma" + +#: ball/st_start.c:223 +msgid "Unlocked" +msgstr "Kilitsiz" + +#: ball/st_start.c:224 +msgid "Locked" +msgstr "Kilitli" + +#: ball/st_start.c:234 +msgid "Goal State in Completed Levels" +msgstr "Tamamlanan Düzeyde Hedef Belirt" + +#: ball/st_conf.c:156 putt/st_conf.c:104 +msgid "Options" +msgstr "Seçenekler" + +#: ball/st_conf.c:158 share/st_common.c:339 putt/st_conf.c:116 +msgid "Graphics" +msgstr "Grafikler" + +#: ball/st_conf.c:158 putt/st_conf.c:114 +msgid "Configure" +msgstr "Ayarlar" + +#: ball/st_conf.c:162 +msgid "Mouse Sensitivity" +msgstr "Fare Hassasiyeti" + +#: ball/st_conf.c:167 putt/st_conf.c:134 +msgid "Sound Volume" +msgstr "Ses Seviyesi" + +#: ball/st_conf.c:169 putt/st_conf.c:150 +msgid "Music Volume" +msgstr "Müzik Sesi" + +#: ball/st_conf.c:174 ball/st_name.c:99 +msgid "Player Name" +msgstr "Oyuncu Adı" + +#: ball/st_conf.c:175 ball/st_ball.c:180 +msgid "Ball Model" +msgstr "Top Çeşidi" + +#: ball/st_conf.c:176 share/st_common.c:655 putt/st_conf.c:160 +msgid "Language" +msgstr "Dil" + +#: ball/st_conf.c:190 share/st_common.c:666 +msgid "Default" +msgstr "Varsayılan" + +#: ball/st_done.c:57 +msgid "New Set Record" +msgstr "Yeni Kayıt Ayarla" + +#: ball/st_done.c:58 +msgid "Set Complete" +msgstr "Ayarlama Tamamlandı" + +#: ball/st_done.c:77 +msgid "Select Level" +msgstr "Seviye Seç" + +#: ball/progress.c:417 ball/st_help.c:260 +msgid "Challenge Mode" +msgstr "Mücadele Modu" + +#: ball/progress.c:418 ball/st_help.c:247 +msgid "Normal Mode" +msgstr "Normal Mod" + +#: ball/progress.c:418 +msgid "Normal" +msgstr "Normal" + +#: ball/progress.c:419 +msgid "Standalone Mode" +msgstr "Bağımsız Mod" + +#: ball/progress.c:419 +msgid "Standalone" +msgstr "Bağımsız" + +#: ball/progress.c:420 +msgid "Unknown Mode" +msgstr "Bilinmeyen Mod" + +#: ball/progress.c:420 ball/game_common.c:32 +msgid "Unknown" +msgstr "Bilinmeyen" + +#: ball/st_fail.c:82 +msgid "Fall-out!" +msgstr "" + +#: ball/st_fail.c:84 +msgid "Time's Up!" +msgstr "Süre Bitti'" + +#: ball/st_fail.c:98 +msgid "Exit" +msgstr "Çıkış" + +#: ball/st_fail.c:101 ball/st_goal.c:220 +msgid "Next Level" +msgstr "Sonraki Seviye" + +#: ball/st_fail.c:104 ball/st_goal.c:223 +msgid "Retry Level" +msgstr "Seviye Yeniden" + +#: ball/st_fail.c:107 ball/st_goal.c:226 +msgid "Save Replay" +msgstr "Yeniden Kaydet" + +#: ball/st_name.c:110 +msgid "OK" +msgstr "Tamam" + +#: ball/st_demo.c:202 +msgid "Time" +msgstr "Süre" + +#: ball/st_demo.c:203 ball/hud.c:68 ball/st_goal.c:166 +msgid "Coins" +msgstr "Para" + +#: ball/st_demo.c:204 +msgid "Status" +msgstr "Durum" + +#: ball/st_demo.c:235 ball/st_demo.c:426 +msgid "Replay" +msgstr "Yeniden" + +#: ball/st_demo.c:236 putt/st_all.c:740 +msgid "Player" +msgstr "Oyuncu" + +#: ball/st_demo.c:237 +msgid "Date" +msgstr "Süre" + +#: ball/st_demo.c:290 +msgid "Select Replay" +msgstr "Yeniden Seç" + +#: ball/st_demo.c:306 +msgid "No Replays" +msgstr "Yeniden Oynama Yok" + +#: ball/st_demo.c:611 +msgid "Replay Paused" +msgstr "Tekrar Duraklatıldı" + +#: ball/st_demo.c:613 +msgid "Replay Ends" +msgstr "Tekrar Sonlandı" + +#: ball/st_demo.c:619 ball/st_pause.c:88 putt/st_all.c:649 +msgid "Quit" +msgstr "Çıkış" + +#: ball/st_demo.c:623 ball/st_demo.c:709 +msgid "Keep" +msgstr "Tut" + +#: ball/st_demo.c:624 ball/st_demo.c:710 +msgid "Delete" +msgstr "Sil" + +#: ball/st_demo.c:628 ball/st_pause.c:93 putt/st_all.c:650 +msgid "Continue" +msgstr "Devam Et" + +#: ball/st_demo.c:630 +msgid "Repeat" +msgstr "Tekrar" + +#: ball/st_demo.c:705 +msgid "Delete Replay?" +msgstr "Yeniden Silinsin mi?" + +#: ball/st_demo.c:759 ball/st_level.c:179 +msgid "Warning!" +msgstr "Uyarı1!" + +#: ball/st_demo.c:761 +msgid "" +"The current replay was recorded with a\\different (or unknown) version of " +"this level.\\Be prepared to encounter visual errors.\\" +msgstr "" +"Geçerli tekrar, bu seviyenin farklı bir (veya bilinmeyen) sürümüyle" +" kaydedildi.\\Görsel hatalarla karşılaşmaya hazır olun.\\" + +#: ball/st_help.c:102 +msgid "Tricks" +msgstr "İpucu" + +#: ball/st_help.c:103 +msgid "Modes" +msgstr "Modlar" + +#: ball/st_help.c:104 +msgid "Controls" +msgstr "Kontroller" + +#: ball/st_help.c:105 +msgid "Rules" +msgstr "Kurallar" + +#: ball/st_help.c:116 +msgid "" +"Move the mouse or joystick\\or use keyboard arrows to\\tilt the floor " +"causing the\\ball to roll.\\" +msgstr "" +"Fareyi veya joystiği hareket ettirin\\veya topun devrilmesine\\ " +"neden olan yere\\eğmek için klavye oklarını kullanın.\\" + +#: ball/st_help.c:121 +msgid "" +"Roll over coins to collect\\them. Collect coins to\\unlock the goal and " +"finish\\the level.\\" +msgstr "" +"Onları toplamak için bozuk\\para atın. Oyunun kilidini açmak \\için paraları" +"toplayın\\ve seviyeyi bitirin.\\" + +#: ball/st_help.c:178 +msgid "" +"Left and right mouse buttons rotate the view.\\Hold Shift for faster view " +"rotation." +msgstr "" +"Sol ve sağ fare düğmeleri görünümü döndürür.\\Daha hızlı görüntü dönüşü " +"için Shift tuşunu basılı tutun." + +#: ball/st_help.c:180 +msgid "Exit / Pause" +msgstr "Çıkış / Bekle" + +#: ball/st_help.c:181 ball/game_common.c:46 +msgid "Chase Camera" +msgstr "Chase Kamera" + +#: ball/st_help.c:182 ball/game_common.c:45 +msgid "Lazy Camera" +msgstr "Tembel Kamera" + +#: ball/st_help.c:183 ball/game_common.c:44 +msgid "Manual Camera" +msgstr "Manuel Kamera" + +#: ball/st_help.c:184 +msgid "Screenshot" +msgstr "Ekran kaydı" + +#: ball/st_help.c:249 +msgid "" +"Finish a level before the time runs out.\\You need to collect coins in order " +"to open the goal." +msgstr "" +"Zaman bitmeden bir seviyeyi bitirin.\\Hedefi açmak için para toplamak gerekir. " + +#: ball/st_help.c:262 +msgid "" +"Start playing from the first level of the set.\\You start with only three " +"balls, do not lose them.\\Earn an extra ball for each 100 coins collected." +msgstr "" +"Setin ilk seviyesinden oynamaya başlayın.\\Sadece üç top ile başladınız, " +" onları kaybetmeyin.\\Toplanan 100 lira ile fazladan bir top atın." + +#: ball/st_help.c:276 +msgid "" +"Corners can be used to jump.\\Get rolling and take aim\\at the angle. You " +"may be able\\to reach new places.\\" +msgstr "" +"Köşeler atlamak için kullanılabilir.\\Yuvarlanın ve hedef \\doğrultusunda ilerleyin." +"yeni yerlere ulaşmak\\mümkün olabilir.\\" + +#: ball/st_help.c:281 +msgid "" +"2 yönde devirme eğimi arttırır.\\En iyi sonuç için el kamerasını kullanın\\ve " +"turn the camera by 45\\degrees for best results.\\" +msgstr "" +"Tilting in 2 directions increases\\the slope. Use the manual camera\\and " +"kamerayı 45 derece çevirin.\\" + +#: ball/st_help.c:301 ball/st_help.c:311 +msgid "Watch demo" +msgstr "Demo izle" + +#: ball/game_common.c:28 +msgid "Aborted" +msgstr "İptal edildi" + +#: ball/game_common.c:29 +msgid "Time-out" +msgstr "Süre Bitti" + +#: ball/game_common.c:30 +msgid "Success" +msgstr "Başardınız" + +#: ball/game_common.c:31 +msgid "Fall-out" +msgstr "" + +#: ball/game_common.c:48 +#, c-format +msgid "Camera %d" +msgstr "Kamera %d" + +#: ball/st_pause.c:82 putt/st_all.c:644 +msgid "Paused" +msgstr "Durduruldu" + +#: ball/st_pause.c:91 +msgid "Restart" +msgstr "Yeniden Başlat" + +#: ball/hud.c:69 +msgid "Goal" +msgstr "Gol" + +#: ball/hud.c:89 ball/st_goal.c:154 +msgid "Balls" +msgstr "Toplar" + +#: ball/hud.c:90 ball/st_goal.c:160 putt/hud.c:45 +msgid "Score" +msgstr "Sonuç" + +#: ball/st_goal.c:101 +msgid "New Record" +msgstr "Yeni Kayıt" + +#: ball/st_goal.c:102 +msgid "GOAL" +msgstr "GOL" + +#: ball/st_goal.c:215 ball/st_goal.c:217 +msgid "Finish" +msgstr "Bitti" + +#: ball/st_set.c:108 +msgid "Level Set" +msgstr "Seviye Ayarla" + +#: ball/st_level.c:56 +#, c-format +msgid "Bonus Level %s" +msgstr "Bonus Seviye %s" + +#: ball/st_level.c:58 +#, c-format +msgid "Level %s" +msgstr "Seviye %s" + +#: ball/st_level.c:64 +#, c-format +msgid "Standalone level" +msgstr "Bağımsız seviye" + +#: ball/st_level.c:181 +msgid "" +"A replay file could not be opened for writing.\\This game will not be " +"recorded.\\" +msgstr "" +"Yazma için bir oynatma dosyası açılamadı.\\Bu oyun." +"kaydedilmeyecek.\\" + +#: ball/util.c:28 +msgid "Hard" +msgstr "Zor" + +#: ball/util.c:29 +msgid "Medium" +msgstr "Orta" + +#: ball/util.c:30 +msgid "Easy" +msgstr "Kolay" + +#: ball/util.c:76 ball/util.c:122 +msgid "Unavailable" +msgstr "Kullanım dışı" + +#: ball/util.c:178 ball/util.c:228 +msgid "Most Coins" +msgstr "En Çok Para" + +#: ball/util.c:185 ball/util.c:232 +msgid "Best Times" +msgstr "En İyi Süre" + +#: ball/util.c:192 ball/util.c:236 +msgid "Fast Unlock" +msgstr "Hızlı Kilit Açma" + +#: ball/util.c:205 +msgid "Change Name" +msgstr "İsim Değiştir" + +#: ball/util.c:332 +msgid "caps" +msgstr "" + +#: ball/st_over.c:35 +msgid "GAME OVER" +msgstr "OYUN BİTTİ" + +#: ball/st_title.c:140 ball/st_title.c:175 +msgid "menu^Cheat" +msgstr "Hile" + +#: ball/st_title.c:146 ball/st_title.c:178 putt/st_all.c:238 +msgid "menu^Play" +msgstr "Oyna" + +#: ball/st_title.c:181 +msgid "menu^Replay" +msgstr "Tekrar" + +#: ball/st_title.c:182 +msgid "menu^Help" +msgstr "Yardım" + +#: ball/st_title.c:183 putt/st_all.c:239 +msgid "menu^Options" +msgstr "Ayarlar" + +#: ball/st_title.c:184 putt/st_all.c:240 +msgid "menu^Exit" +msgstr "Çıkış" + +#: share/st_common.c:318 share/st_common.c:348 share/st_common.c:366 +#: share/st_common.c:372 share/st_common.c:380 share/st_common.c:382 +#: share/st_common.c:384 +msgid "Off" +msgstr "Kapalı" + +#: share/st_common.c:319 +msgid "2x" +msgstr "" + +#: share/st_common.c:320 +msgid "4x" +msgstr "" + +#: share/st_common.c:321 +msgid "8x" +msgstr "" + +#: share/st_common.c:337 +msgid "Unknown Display" +msgstr "Bilinmeyen Ekran" + +#: share/st_common.c:341 share/st_common.c:447 +msgid "Display" +msgstr "Ekran" + +#: share/st_common.c:347 +msgid "Fullscreen" +msgstr "Tam Ekran" + +#: share/st_common.c:348 share/st_common.c:366 share/st_common.c:372 +#: share/st_common.c:380 share/st_common.c:382 share/st_common.c:384 +msgid "On" +msgstr "Açık" + +#: share/st_common.c:350 share/st_common.c:544 +msgid "Resolution" +msgstr "Çözünürlük" + +#: share/st_common.c:365 +msgid "HMD" +msgstr "" + +#: share/st_common.c:371 +msgid "V-Sync" +msgstr "" + +#: share/st_common.c:373 +msgid "Antialiasing" +msgstr "Düzgünleştirme" + +#: share/st_common.c:379 +msgid "Reflection" +msgstr "Yansıma" + +#: share/st_common.c:381 +msgid "Background" +msgstr "Arkaplan" + +#: share/st_common.c:383 +msgid "Shadow" +msgstr "Gölge" + +#: putt/st_conf.c:158 +msgid "Select" +msgstr "Seç" + +#: putt/hole.c:160 putt/st_all.c:107 putt/st_all.c:168 putt/hud.c:52 +msgid "Par" +msgstr "Kur" + +#: putt/hole.c:162 putt/st_all.c:108 putt/st_all.c:169 +msgid "P1" +msgstr "" + +#: putt/hole.c:163 putt/st_all.c:109 putt/st_all.c:170 +msgid "P2" +msgstr "" + +#: putt/hole.c:164 putt/st_all.c:110 putt/st_all.c:171 +msgid "P3" +msgstr "" + +#: putt/hole.c:165 putt/st_all.c:111 putt/st_all.c:172 +msgid "P4" +msgstr "" + +#: putt/st_all.c:75 +msgid "O" +msgstr "" + +#: putt/st_all.c:124 +msgid "Tot" +msgstr "" + +#: putt/st_all.c:136 +msgid "I" +msgstr "" + +#: putt/st_all.c:361 +msgid "Select Course" +msgstr "Kursu Seçin" + +#: putt/st_all.c:529 +msgid "Players?" +msgstr "Oyuncular" + +#: putt/st_all.c:731 +#, c-format +msgid "Hole %02d" +msgstr "Boşluk %02d" + +#: putt/st_all.c:1073 +msgid "It's In!" +msgstr "İçinde!" + +#: putt/st_all.c:1216 +msgid "1 Stroke Penalty" +msgstr "1 Darbe Cezası" + +#: putt/st_all.c:1294 +msgid "Scores" +msgstr "Sonuç" + +#: putt/st_all.c:1347 +msgid "Final Scores" +msgstr "Son Puanlar" + +#: data/set-easy.txt +msgid "Neverball Easy" +msgstr "Neverball Kolay" + +#: data/set-easy.txt +msgid "" +"Difficulty: Beginner through Intermediate\\\\25 levels with a smooth " +"learning curve.\\Read level introductions for gameplay tips.\\ \\" +msgstr "" +"Zorluk derecesi: Başlangıçtan başlayarak \\\\Orta Düzey 25 seviyelerine " +"düzgün bir öğrenme eğrisi.\\Oyun ipuçları için seviye tanıtımlarını okuyun.\\ \\" + +#: data/set-medium.txt +msgid "Neverball Medium" +msgstr "Neverball Orta" + +#: data/set-medium.txt +msgid "" +"Zorluk derecesi: Beginner through Expert\\\\25 levels which provide a balanced" +"\\challenge for players. Try to claim\\some of the records provided.\\" +msgstr "" + +#: data/set-hard.txt +msgid "Neverball Hard" +msgstr "Neverball Zor" + +#: data/set-hard.txt +msgid "" +"Zorluk derecesi: Intermediate through Expert\\\\25 levels with more of a " +"challenge for\\the experienced player. Try to claim\\Best Times, Most Coins, " +"and Fast Unlock records.\\" +msgstr "" + +#: data/set-mym.txt +msgid "Tour de force" +msgstr "Zoru başarma" + +#: data/set-mym.txt +msgid "" +"Zorluk derecesi: Expert through Insane\\\\25 levels with even greater challenge." +"\\Yazar: Mehdi Yousfi-Monod (mym)\\ \\" +msgstr "" + +#: data/set-mym2.txt +msgid "Retour de force" +msgstr "Kuvvete git" + +#: data/set-mym2.txt +msgid "" +"Zorluk derecesi: A little bit harder than my first set.\\\\More challenge, " +"particularly for grabbing coins.\\Author: Mehdi Yousfi-Monod (mym)\\ \\" +msgstr "" + +#: data/set-fwp.txt +msgid "Nevermania" +msgstr "" + +#: data/set-fwp.txt +msgid "" +"Zorluk derecesi: Expert through Impossible\\\\Assorted levels for advanced " +"players.\\Author: Florian Priester\\\\" +msgstr "" + +#: data/set-tones.txt +msgid "Tones Levels" +msgstr "Zil Düzeyleri" + +#: data/set-tones.txt +msgid "Zorluk derecesi: Moderate to Difficult.\\\\Author: Ian Walker\\\\" +msgstr "" + +#: data/set-misc.txt +msgid "Neverball Misc" +msgstr "Neverball Çeşitli" + +#: data/set-misc.txt +msgid "Unsorted levels\\For testing purposes\\\\\\\\" +msgstr "" + +#: data/holes-putt.txt +msgid "" +"The original 18-hole Neverputt course.\\With a gentle learning curve.\\ " +"\\Zorluk derecesi: Kolay Orta\\Yazar: rlk\\" +msgstr "" + +#: data/holes-paxed.txt +msgid "Another 18-hole course\\ \\ \\Zorluk derecesi: Orta\\Yazar: paxed\\" +msgstr "" + +#: data/holes-paxed2.txt +msgid "Yet Another 18-hole course\\ \\ \\Zorluk derecesi: Orta\\Yazar: paxed\\" +msgstr "" + +#: data/holes-paxed3.txt +msgid "Even More Holes\\ \\ \\Zorluk derecesi: Orta\\Yazar: paxed\\" +msgstr "" + +#: data/holes-abc.txt +msgid "" +"A 26-hole course\\following the alphabet\\\\Zorluk derecesi: Zor\\Yazar: paxed\\" +msgstr "" + +#: data/holes-slippi.txt +msgid "Crazy Golf\\ \\\\Zorluk derecesi: Kolay Orta\\Yazar: slippifishi\\" +msgstr "" + +#: data/holes-kk.txt +msgid "" +"Tricky Golf\\\\An 18-hole course with many challenges\\Difficulty: Expert " +"Through Insane\\Author: Byron James Johnson" +msgstr "" + +#: data/holes-vidski.txt +msgid "" +"Golf Jambalaya\\\\Vidski's infamous course.\\Difficulty: Medium to hard." +"\\Author: vidski\\" +msgstr "" + +#: data/holes-easyputt.txt +msgid "" +"Reshaun's Easy-Putt\\\\Difficulty: Easy through Hard\\Author: Reshaun Francis" +msgstr "" + +#: data/map-easy/bumper.map +msgid "" +"Try to avoid being hit by moving objects.\\One bump can throw the ball" +"\\completely out of control.\\" +msgstr "" + +#: data/map-easy/bumps.map +msgid "" +"Learn to control a bouncing ball.\\Look at the shadow to know where the" +"\\ball will land. If you're feeling confident in\\your mastery of bouncing, " +"take a risk\\for a big payoff.\\" +msgstr "" + +#: data/map-easy/coins.map +msgid "" +"This time you must get 50 coins to unlock the goal.\\Red coins are worth 5, " +"blue coins are worth 10.\\Get to the goal before time expires!\\\\Click to " +"begin.\\" +msgstr "" + +#: data/map-easy/corners.map +msgid "" +"Here are some more opportunities for you to\\fall off into the void. Hit the " +"bump hard to\\grab some big coins and score a short time.\\" +msgstr "" + +#: data/map-easy/curved.map +msgid "" +"As before, but without the training wheels.\\Keep the ball on a level floor" +"\\and maintain precise control.\\Build some momentum to reach the corners.\\" +msgstr "" + +#: data/map-easy/easy.map data/map-misc/centrifuge.map +#: data/map-misc/texture-debug.map data/map-misc/timer-test.map +msgid "" +"Move the mouse to tilt the floor.\\Collect 10 coins to unlock the goal." +"\\Guide the ball to the goal to\\finish the level.\\\\Başlamak için tıklayın.\\" +msgstr "" + +#: data/map-easy/easyhalfpipe.map +msgid "" +"Half-pipes can be fun,\\but they make it easy to fall out.\\Don't over " +"accelerate and you will\\be able to stay in control." +msgstr "" + +#: data/map-easy/fence.map +msgid "" +"''Flat'' is relative.\\Learn to hold the floor at an angle\\so that a slope " +"remains level.\\This way, you maintain full control of the ball.\\Use " +"momentum to get up to the big coins.\\" +msgstr "" + +#: data/map-easy/goals.map +msgid "" +"There are 100 coins here.\\This one shouldn't be too difficult,\\if you " +"don't accidentally make a goal first.\\" +msgstr "" + +#: data/map-easy/goslow.map +msgid "" +"Tilt the floor as little as possible.\\Less tilt means lower speed.\\Lower " +"speed means better control.\\Watch the clock and use the time wisely.\\" +msgstr "" + +#: data/map-easy/greed.map +msgid "" +"Each bridge is narrower than the one before.\\But each pays better than the " +"last as well!\\You get to decide how far you go on this one.\\" +msgstr "" + +#: data/map-easy/groundbreak.map +msgid "" +"Getting to the goal\\shouldn't be a problem,\\but getting all of the coins " +"will\\require some planning.\\\\Hint: often it is faster to avoid\\a hole " +"instead of falling into it." +msgstr "" + +#: data/map-easy/hole.map +msgid "" +"Stay away from the edges!\\When approaching a drop, begin slowing down" +"\\early. You need just as much room to slow\\down as you did to speed up.\\" +msgstr "" + +#: data/map-easy/lollipop.map +msgid "" +"Follow the yellow lick road!\\\\The blue coins are especially challenging," +"\\but with some experimentation and practice,\\you'll be able to collect " +"them all." +msgstr "" + +#: data/map-easy/maze.map +msgid "" +"The ball wants to rebound uncontrollably\\in a narrow passage. Keep it slow " +"and\\off the walls. All the coins are collectable\\in the given time.\\" +msgstr "" + +#: data/map-easy/mazebump.map +msgid "" +"Puzzling but profitable.\\\\Take time to observe the motions\\of the bumpers " +"- it will help you\\to reach the goal." +msgstr "" + +#: data/map-easy/mover.map +msgid "" +"A moving platform can be tricky.\\Use precise timing to get aboard,\\and " +"precise balance to stay there.\\Don't let it move out from under you.\\Ride " +"the platforms to grab the big coins.\\" +msgstr "" + +#: data/map-easy/peasy.map +msgid "" +"Mouse buttons rotate the view.\\Press Escape to pause or quit.\\\\\\\\Click " +"to begin.\\" +msgstr "" + +#: data/map-easy/roundcoins.map +msgid "" +"When you are on the elevators,\\make small adjustments to keep the ball " +"steady.\\You can collect many coins by\\keeping the ball in one place.\\Too " +"much movement and you will fall off." +msgstr "" + +#: data/map-easy/roundlaby.map +msgid "" +"There is only one path to reach the goal,\\but lots of paths for collecting " +"coins.\\Make sure you collect enough\\to unlock the goal." +msgstr "" + +#: data/map-easy/slalom.map +msgid "" +"Follow the trail of coins to reach the goal.\\If you hit a post while moving " +"quickly,\\you will bounce far off course." +msgstr "" + +#: data/map-easy/slightcurve.map +msgid "Hills require more speed to get over.\\Be careful not to go too fast!" +msgstr "" + +#: data/map-easy/speedbumps.map +msgid "" +"When the ball is on a moving platform,\\it will be pulled in the direction " +"of movement.\\Use the rails to steady yourself,\\and collect the coins you " +"need\\to open the goal." +msgstr "" + +#: data/map-easy/thwomp2.map +msgid "Grab all the coins...\\but don't get bullied!" +msgstr "" + +#: data/map-easy/wakka.map +msgid "" +"Here's another coin grab.\\Perhaps you already know a good route." +"\\Teleportation might come in handy.\\" +msgstr "" + +#: data/map-fwp/adventure.map +msgid "=Adventure=\\Many things to do, coins to collect, risks to take." +msgstr "=Adventure=\\Yapacak çok şey, toplamak için para, almak için riskler." + +#: data/map-fwp/atrium.map +msgid "=Atrium=\\Remove the coins from their columns." +msgstr "=Atrium=\\Paraları sütunlarından çıkarın.." + +#: data/map-fwp/buoys.map +msgid "=Buoys=\\He who controls the timers, controls the gates." +msgstr "=Buoys=\\Zamanlayıcıları kontrol eden kapıları kontrol eder." + +#: data/map-fwp/cargo.map +msgid "=Cargo=\\Let yourself be carried away." +msgstr "" + +#: data/map-fwp/confetti.map +msgid "=Confetti=\\Help! There has got to be a way through this mess." +msgstr "" + +#: data/map-fwp/discs.map +msgid "=Discs=\\Used correctly, the platforms will take you to the goal." +msgstr "" + +#: data/map-fwp/inferno.map +msgid "=Inferno=\\The fire thwomps will try to foil your mission." +msgstr "" + +#: data/map-fwp/ladybirds.map +msgid "=Ladybirds=\\Don't let them bug you." +msgstr "=Ladybirds=\\Seni rahatsız etmesine izin vermeyin." + +#: data/map-fwp/mountains.map +msgid "=Mountains=\\Ups and downs are a part of life." +msgstr "" + +#: data/map-fwp/museum.map +msgid "=Museum=\\Please do not touch the exhibits." +msgstr "" + +#: data/map-fwp/oddities.map +msgid "=Oddities=\\Something is not quite right here..." +msgstr "" + +#: data/map-fwp/rails.map +msgid "=Rails=\\Do not lose your balance." +msgstr "" + +#: data/map-fwp/ramps.map +msgid "=Ramps=\\Can you make it to the top?" +msgstr "" + +#: data/map-fwp/rings.map +msgid "=Rings=\\Roll your way through this trap." +msgstr "" + +#: data/map-fwp/slope.map +msgid "=Slope=\\Try not to become a modern-day Sisyphus." +msgstr "" + +#: data/map-fwp/spacetime.map +msgid "=Spacetime=\\Not much space, not much time." +msgstr "" + +#: data/map-fwp/swarm.map +msgid "=Swarm=\\Warning: Trespassers will be thwomped." +msgstr "" + +#: data/map-fwp/tennis.map +msgid "=Tennis=\\There is plenty of prize money, and it's up for grabs." +msgstr "" + +#: data/map-fwp/tree.map +msgid "=Tree=\\Follow the spiral staircase to the goal." +msgstr "" + +#: data/map-fwp/ufo.map +msgid "=UFO=\\Ride the spaceship they don't want you to know about." +msgstr "" + +#: data/map-hard/airways.map +msgid "2 switches have to be enabled\\to open the path to the goal." +msgstr "" + +#: data/map-hard/check.map +msgid "There's not enough floor here.\\Hopefully that's not a problem.\\" +msgstr "" + +#: data/map-hard/curbs.map +msgid "" +"To make progress here you'll need to hit the\\edges hard and control your " +"bouncing.\\It's often easiest to hit the curb at a corner.\\" +msgstr "" + +#: data/map-hard/flip.map +msgid "" +"Thus Neverball is a puzzle game?\\Remove the red to unlock the goal.\\Each " +"trigger switches colors in direct contact." +msgstr "" + +#: data/map-hard/frogger.map +msgid "Ribbit!\\" +msgstr "" + +#: data/map-hard/gaps.map +msgid "" +"Time the switches carefully to synchronize\\the motion of the platforms." +"\\Move quickly across the gaps.\\" +msgstr "" + +#: data/map-hard/grid.map +msgid "Yes, the ball does fit quite nicely through\\those little holes.\\" +msgstr "" + +#: data/map-hard/hallways.map +msgid "" +"Control your speed and your bounces.\\Teleporters will always bring you" +"\\back somewhere in the level." +msgstr "" + +#: data/map-hard/hump.map +msgid "Momentum may work against you.\\" +msgstr "" + +#: data/map-hard/invis.map +msgid "" +"Allow your greed to guide you.\\For an added challenge,\\try to get to all " +"of the coins.\\It can be done without guesswork.\\" +msgstr "" + +#: data/map-hard/movers.map +msgid "Go for a ride.\\" +msgstr "" + +#: data/map-hard/nostairs.map +msgid "" +"There are two goals here.\\You can complete this level\\the easy way or the " +"hard way.\\Of course, by going the easy way\\you can forget about all\\those " +"red and blue coins." +msgstr "" + +#: data/map-hard/paths.map +msgid "So many different paths to take...\\have you tried all of them?" +msgstr "" + +#: data/map-hard/pipe.map +msgid "Ceci n'est pas une pipe.\\" +msgstr "" + +#: data/map-hard/poker.map +msgid "Slow and steady.\\" +msgstr "" + +#: data/map-hard/pyramid.map +msgid "" +"You'll only get about 15 seconds at each step,\\so don't delay. Get the " +"coins and\\get to the next switch.\\" +msgstr "" + +#: data/map-hard/quads.map +msgid "Don't get bullied.\\" +msgstr "" + +#: data/map-hard/rampup.map +msgid "I think I can.\\I think I can.\\" +msgstr "" + +#: data/map-hard/ring.map +msgid "So close, yet so very far.\\" +msgstr "Çok yakın, henüz çok çok uzak..\\" + +#: data/map-hard/risers.map data/map-misc/edge-test.map +msgid "" +"Ride the elevators to the top.\\They move quickly,\\so don't dally too long." +"\\" +msgstr "" + +#: data/map-hard/spiralin.map +msgid "Have fun picking up those\\red and blue coins.\\" +msgstr "" + +#: data/map-hard/spread.map +msgid "Don't worry.\\The green part isn't going anywhere.\\" +msgstr "" + +#: data/map-hard/sync.map +msgid "" +"Use the switches to set the platforms\\in motion. Time it so they come" +"\\together in the middle.\\" +msgstr "" + +#: data/map-hard/teleport.map +msgid "" +"The ball must be entirely within a teleporter\\in order to trigger it." +"\\Remember that the ball carries its momentum\\through a teleporter, so plan " +"ahead.\\" +msgstr "" + +#: data/map-hard/tilt.map +msgid "The floor is as flat as you make it.\\" +msgstr "" + +#: data/map-medium/accordian.map +msgid "Stairway to heaven" +msgstr "" + +#: data/map-medium/angle.map +msgid "" +"Those bridges are angled.\\Each is narrower and steeper than the last.\\Take " +"the easy cash or\\go all the way for a big payoff.\\" +msgstr "" + +#: data/map-medium/coneskeleton.map +msgid "Plenty of coins for the taking.\\Can you take them all?" +msgstr "" + +#: data/map-medium/cross.map +msgid "" +"Use momentum to reach\\the upper platforms,\\but keep the ball in control" +"\\for safe landing.\\\\The manual view may help here.\\" +msgstr "" + +#: data/map-medium/drops.map +msgid "" +"Remember to keep an eye on the shadow to\\help control a bouncing ball. And " +"don't\\forget to use the mouse buttons to keep the\\ball in view.\\" +msgstr "" + +#: data/map-medium/easytele.map +msgid "Use teleporters to go\\where you otherwise couldn't.\\" +msgstr "" + +#: data/map-medium/four.map +msgid "Balance risk versus reward.\\" +msgstr "" + +#: data/map-medium/hardrise.map +msgid "Ascend the slope to reach your goal.\\(Easier said than done.)" +msgstr "" + +#: data/map-medium/islands.map +msgid "Catch the train before it leaves the station.\\" +msgstr "" + +#: data/map-medium/learngrow.map +msgid "" +"The ball will fit in those small holes,\\if you can just find something to " +"make it smaller.\\Other places may require a bigger ball.\\One thing is " +"certain - you'll want a plan!" +msgstr "" + +#: data/map-medium/locks.map +msgid "Hit the switches to move the barriers.\\" +msgstr "Engelleri kaldırmak için düğmelere bas.\\" + +#: data/map-medium/multicurves.map +msgid "" +"The temptation to move quickly\\could prove your undoing.\\\\Then again, " +"maybe not..." +msgstr "" + +#: data/map-medium/plinko.map +msgid "Take it slowly.\\" +msgstr "" + +#: data/map-medium/qbert.map +msgid "You can never go home again..." +msgstr "Bir daha asla eve gidemezsin ..." + +#: data/map-medium/rampdn.map +msgid "" +"You'll need to exert some control over your\\view here. Press 3 to stop the " +"auto-rotation.\\Use the mouse buttons to rotate it manually.\\Press 1 to " +"return to the auto-rotating view.\\" +msgstr "" + +#: data/map-medium/roundfloors.map +msgid "" +"This wedding cake is plenty rich,\\but be careful as you go\\to each lower " +"layer." +msgstr "" + +#: data/map-medium/sparselines.map +msgid "" +"Bump the logs at speed to change lanes.\\Try to reach the top for an extra " +"challenge!" +msgstr "" + +#: data/map-medium/spiraldn.map +msgid "" +"Take it slow to keep it away from the edge.\\Or, don't.\\Either way might " +"work.\\" +msgstr "" + +#: data/map-medium/spiralup.map +msgid "" +"Just as before, but moving up instead of down.\\No cheating this time.\\" +msgstr "" + +#: data/map-medium/stairs.map +msgid "" +"Here's yet another test of your ability\\to control bouncing. Moving down " +"the\\stairs too quickly can be hazardous.\\" +msgstr "" + +#: data/map-medium/telemaze.map +msgid "" +"This maze has no walls.\\But that doesn't make the solution\\any easier to " +"find.\\" +msgstr "" + +#: data/map-medium/timer.map +msgid "" +"That one switch controls all five barriers.\\Be quick, because the switch is " +"on a timer.\\When it expires, the barriers will rise.\\" +msgstr "" + +#: data/map-medium/title.map +msgid "Neverball\\\\http://neverball.org\\\\Created by Robert Kooima\\" +msgstr "" + +#: data/map-medium/woodmaze.map +msgid "Follow the trail of coins\\to make it through the labyrinth." +msgstr "" + +#: data/map-medium/zigzag.map +msgid "" +"There are plenty of coins here if you're\\willing to take the time to grab " +"them.\\" +msgstr "" + +#: data/map-misc/bigball-old.map +msgid "" +"Prisonnier de la boule.\\Living in a sphere.\\Catching all blue coins is a " +"challenge." +msgstr "" + +#: data/map-misc/billiard.map +msgid "Try to grab all of the blue coins...\\it won't be easy!" +msgstr "" + +#: data/map-misc/blockers.map +msgid "Block around the clock." +msgstr "Günün her saatinde bloke edin." + +#: data/map-misc/bounce.map +msgid "" +"Follow the blue coins...\\and learn to control your bounce!\\Hint: Use the " +"'chase' camera mode." +msgstr "" + +#: data/map-misc/bounce2.map +msgid "Follow the arrows." +msgstr "Okları takip et." + +#: data/map-misc/checkers.map +msgid "" +"It's a real game of checkers, but no one wins...\\You have to bounce to " +"reach the blue coins." +msgstr "" + +#: data/map-misc/elevator.map +msgid "Calm and meditation may bring you to the Nirvana." +msgstr "Sakin ve meditasyon sizi Nirvana'ya getirebilir." + +#: data/map-misc/freefall-old.map +msgid "Savoir chuter.\\Follow the blue markers." +msgstr "" + +#: data/map-misc/grow_demo.map +msgid "Use the new coins to change ball size!\\I hope you like it!\\-Dave" +msgstr "" + +#: data/map-misc/groweasy.map +msgid "There are special coins which can make your\\ball larger or smaller." +msgstr "" + +#: data/map-misc/ocean.map +msgid "Let's go for a swim...\\all the coins are fully submerged.\\" +msgstr "" + +#: data/map-misc/stairs.map +msgid "Fall down stairs.\\Ough!\\It hurts." +msgstr "" + +#: data/map-misc/thwomp1.map +msgid "Just let it happen...\\then start to worry!" +msgstr "" + +#: data/map-misc/timer-test_2.map +msgid "Another test for timer accuracy." +msgstr "Zamanlayıcı doğruluğu için bir başka test." + +#: data/map-mym/assault.map +msgid "Le parcours du combattant.\\Ready for the assault course?" +msgstr "" + +#: data/map-mym/circuit1.map +msgid "La course effrénée.\\Let's run some laps." +msgstr "" + +#: data/map-mym/circuit2.map +msgid "Les rampes abruptes.\\Control your speed." +msgstr "" + +#: data/map-mym/climb.map +msgid "L'escalade ardue.\\Do you suffer from vertigo?" +msgstr "" + +#: data/map-mym/comeback.map +msgid "Le cycle éternel.\\Avoid teleporters..." +msgstr "" + +#: data/map-mym/dance1.map +msgid "La ballade tranquille.\\What a quiet walk." +msgstr "" + +#: data/map-mym/dance2.map +msgid "" +"La ballade dansante.\\Let's dance on the moving platform!\\Tip: After " +"activating the last moving platform,\\ turn around the Thwomp until the goal " +"is reachable." +msgstr "" + +#: data/map-mym/descent.map +msgid "La descente infernale.\\Easy enough to start?" +msgstr "" + +#: data/map-mym/drive1.map +msgid "" +"La conduite stressante.\\Attention:\\The platform under the ball moves " +"forward." +msgstr "" + +#: data/map-mym/drive2.map +msgid "" +"La conduite dangereuse.\\The platform under the ball moves quickly forward." +"\\You would do well to advance." +msgstr "" + +#: data/map-mym/earthquake.map +msgid "Le passage incertain.\\Isn't too easy?" +msgstr "" + +#: data/map-mym/ghosts.map +msgid "Ghost Valley.\\Make 3 laps to open the goal." +msgstr "" + +#: data/map-mym/glasstower.map +msgid "La tour de verre.\\Find the way to the exit." +msgstr "" + +#: data/map-mym/hard.map +msgid "La maîtrise de Neverball.\\You still think Neverball is too easy?" +msgstr "" + +#: data/map-mym/loop1.map +msgid "Les boucles renversantes.\\Upside down!" +msgstr "" + +#: data/map-mym/loop2.map +msgid "" +"Le contrôle des courbes.\\Find the right angle to turn,\\to jump and to " +"land..." +msgstr "" + +#: data/map-mym/maze1.map +msgid "Le chemin dissimulé.\\Test your memory." +msgstr "" + +#: data/map-mym/maze2.map +msgid "" +"Le labyrinthe fou.\\You know the way, you see it,\\so why are you taking " +"another one?" +msgstr "" + +#: data/map-mym/narrow.map +msgid "" +"Le sentier étroit.\\Patience and timing.\\Tip: maximise speed at the first " +"slope." +msgstr "" + +#: data/map-mym/running.map +msgid "Les épreuves minutées.\\Run baby, run!" +msgstr "" + +#: data/map-mym/scrambling.map +msgid "" +"Le petit cross.\\Let's go scrambling!\\Stick to the track to optimize speed." +msgstr "" + +#: data/map-mym/snow.map +msgid "La descente rafraîchissante.\\Not so fast, not so fast." +msgstr "" + +#: data/map-mym/trust.map +msgid "Le chemin de la foi.\\Self-confidence." +msgstr "" + +#: data/map-mym/turn.map +msgid "Le sens trigonométrique.\\Turn, wait and jump." +msgstr "" + +#: data/map-mym/up.map +msgid "L'ascension pressée.\\Only one piece of advice: don't stop!" +msgstr "" + +#: data/map-mym2/backforth.map +msgid "Un va-et-vient frustrant.\\Remember the activation order." +msgstr "" + +#: data/map-mym2/basket.map +msgid "Street Neverball\\Choose your party and score 3 points." +msgstr "" + +#: data/map-mym2/bigball.map +msgid "La machine à circonvolutions.\\Easy, the goal is just above you." +msgstr "" + +#: data/map-mym2/bigcone.map +msgid "Le grand cône.\\Living in a cone." +msgstr "" + +#: data/map-mym2/bombman.map +msgid "Les flammes ardentes.\\Does this remind you of something?" +msgstr "" + +#: data/map-mym2/bounces.map +msgid "Les sauts du célèbre plombier.\\Follow the coins." +msgstr "" + +#: data/map-mym2/fall.map +msgid "" +"Savoir rebondir pour aller plus haut.\\The Neverball Arena.\\Use the 2 " +"teleports to unlock and reach the goal." +msgstr "" + +#: data/map-mym2/freefall.map +msgid "" +"This level is full of challenges:\\understand the level's functioning," +"\\learn to fly and to survive,\\grab half of all coins to open the goal," +"\\find and reach the goal,\\and more..." +msgstr "" + +#: data/map-mym2/grinder.map +msgid "Le petit moulin.\\The good timing to go in the cabin." +msgstr "" + +#: data/map-mym2/littlecones.map +msgid "Ne pas se laisser emporter dans le néant.\\Don't go too low." +msgstr "" + +#: data/map-mym2/longpipe.map +msgid "" +"Si si, ce tuyau a une fin.\\Living in a pipe.\\Tip: slow down for the last " +"jump!" +msgstr "" + +#: data/map-mym2/morenarrow.map +msgid "Plus dur que la difficulté.\\Good luck." +msgstr "" + +#: data/map-mym2/movinglumps.map +msgid "Être patient.\\Not too hard." +msgstr "" + +#: data/map-mym2/movingpath.map +msgid "Le passage éphémère.\\Trust the coins." +msgstr "" + +#: data/map-mym2/push.map +msgid "Hé, on pousse pas !\\Not too fast, not too slow." +msgstr "" + +#: data/map-mym2/rainbow.map +msgid "Rainbow Road.\\Do 3 laps to open the goal." +msgstr "" + +#: data/map-mym2/rodeo.map +msgid "Le rodéo de Neverball.\\You'll fall quickly." +msgstr "" + +#: data/map-mym2/runstop.map +msgid "J'y vais, ou j'y vais pas ?\\Do not dither." +msgstr "" + +#: data/map-mym2/shaker.map +msgid "Préparez un petit sac.\\The stomach-tester." +msgstr "" + +#: data/map-mym2/sonic.map +msgid "Un petit échauffement.\\Welcome to Mehdi's new set!" +msgstr "" + +#: data/map-mym2/speed.map +msgid "Plus vite que la vitesse.\\The definition of speed." +msgstr "" + +#: data/map-mym2/speeddance.map +msgid "La danse asiatique\\Trust the arrows." +msgstr "" + +#: data/map-mym2/translation.map +msgid "Suis le mouvement.\\Warning, the road is moving." +msgstr "" + +#: data/map-mym2/updown.map +msgid "Tranquille, mais pas trop.\\Sync yourself to the elevators." +msgstr "" + +#: data/map-mym2/webs.map +msgid "Les toiles attirantes.\\Get out of the webs." +msgstr "" + +#: data/map-tones/bigtube.map +msgid "Speed is the name of the game." +msgstr "" + +#: data/map-tones/blue.map +msgid "Tread carefully...\\and keep moving!\\" +msgstr "" + +#: data/map-tones/bumperoo.map +msgid "Who's the boss around here anyway?" +msgstr "Buradaki patron kim?" + +#: data/map-tones/canals.map +msgid "You might have to get wet\\if you want all the coins." +msgstr "" + +#: data/map-tones/check.map +msgid "Keep your eye on the sky!\\but don't run out of time...\\" +msgstr "" + +#: data/map-tones/city.map +msgid "Stepping stones." +msgstr "Basamak taşları." + +#: data/map-tones/discs.map +msgid "Work your way to the top." +msgstr "Üstünüze doğru yol alın." + +#: data/map-tones/easyian.map +msgid "" +"Collect 45 coins to unlock the goal.\\You can use the teleporter to gain " +"enough speed\\for the jump." +msgstr "" + +#: data/map-tones/easyone.map +msgid "Control your speed\\to avoid a bumpy ride." +msgstr "" + +#: data/map-tones/hotwheels.map +msgid "Learn the course and stick to the rails!" +msgstr "Kursu öğrenin ve raylara yapışın!" + +#: data/map-tones/hurdles.map +msgid "Let's start with an easy warm-up.\\Build speed and leap to the goal." +msgstr "" + +#: data/map-tones/leaps.map +msgid "Look before you leap..." +msgstr "Zıplamadan önce bak..." + +#: data/map-tones/marble.map +msgid "Mind your footing!" +msgstr "Dikkatinizi çekin!" + +#: data/map-tones/marble.map +msgid "Watch your footing..." +msgstr "Dikkat et..." + +#: data/map-tones/runner.map +msgid "Walk the plank.\\After the teleport, go for speed!" +msgstr "" + +#: data/map-tones/skiball.map +msgid "" +"Ski Ball!\\\\Work your way from 10 to 100\\in sequence or you'll fall out." +msgstr "" + +#: data/map-tones/swish.map +msgid "Timing is everything." +msgstr "" + +#: data/map-tones/swoop.map +msgid "What goes down must come up!\\" +msgstr "" + +#: data/map-tones/tonesmaze.map +msgid "" +"Make sure you are\\safely on a purple platform\\before 20 seconds have " +"elapsed!" +msgstr "" + +#: data/map-tones/twisted.map +msgid "Afraid of heights?\\Try not to get dizzy." +msgstr "" + +#: data/map-tones/waves.map +msgid "Surf's Up !!" +msgstr "" + +#. Desktop entry comment +#: dist/neverball.desktop.in +msgid "A 3D arcade game with a ball" +msgstr "Top ile 3D arcade oyunu" + +#. Desktop entry comment +#: dist/neverputt.desktop.in +msgid "A 3D mini golf game" +msgstr "3D mini golf oyunu" + +#. Translators, +#. +#. Listed here are the Neverball materials (relative to the data directory) +#. that can be localised. Each material <mtrl> has a corresponding JPG or PNG +#. texture. To localise a material, create a localised texture for it (copy +#. the original texture <mtrl>.<ext> to <mtrl>-<lang-code>.<ext> and modify it) +#. and translate the material name to match (from <mtrl> to +#. <mtrl>-<lang-code>). +#. +#. Author's comments on the original mtrl/words texture: +#. +#. "Courier New, 40pt, bold. The words are centered in cells of 256x64 pixels. +#. For the vertical centering, the x-height is used as the reference. Some +#. manual corrections were made; for example, the hyphen in 'Fall-out' was +#. shortened in order to increase the margin on each side of the word." +#. +#. Those on GNU+Linux having the ImageMagick program suite installed may find +#. the provided scripts/gen-words.sh shell script useful. +msgid "mtrl/words" +msgstr "" + +msgid "item/coin/coin" +msgstr "item/coin/coin1" + +msgid "item/coin/coin5" +msgstr "" + +msgid "item/coin/coin10" +msgstr "" diff --git a/talimatname/genel/n/neverball/talimat b/talimatname/genel/n/neverball/talimat new file mode 100644 index 000000000..dcaea82b4 --- /dev/null +++ b/talimatname/genel/n/neverball/talimat @@ -0,0 +1,39 @@ +# Tanım: Süper Monkey Ball veya Marble Madness benzeri 3D oyun +# URL: http://neverball.org/ +# Paketçi: Cihan_Alkan +# Gerekler: sdl2-ttf libpng libjpeg-turbo libvorbis physfs hicolor-icon-theme xdg-utils xorg-mesa +# Grup: oyun + +isim=neverball +surum=1.6.0 +devir=1 +kaynak=(http://neverball.org/${isim}-${surum}.tar.gz + neverball.po) + +derle() { + msgfmt neverball.po -o neverball.mo + cd ${isim}-${surum} + make DATADIR=/usr/share/neverball LOCALEDIR=/usr/share/locale \ + CPPFLAGS="$CPPFLAGS -DNDEBUG" CFLAGS="$CFLAGS" + + install -d "${PKG}/usr/bin" + install -d "${PKG}"/usr/share/{neverball,locale,applications,doc/neverball} + install -d "${PKG}"/usr/share/man/man{1,6} + + install -m755 neverball neverputt mapc "${PKG}/usr/bin" + cp -r locale/* "${PKG}/usr/share/locale/" + cp -r data/* "${PKG}/usr/share/neverball/" + cp -r doc/* "${PKG}/usr/share/doc/neverball/" + install -m644 dist/*.desktop "${PKG}/usr/share/applications/" + install -m644 dist/mapc.1 "${PKG}/usr/share/man/man1" + install -m644 dist/{neverball.6,neverputt.6} "${PKG}/usr/share/man/man6" + + for i in 16 24 32 48 64 128 256 512; do + install -D -m644 dist/neverball_$i.png "${PKG}/usr/share/icons/hicolor/${i}x$i/apps/neverball.png" + install -D -m644 dist/neverputt_$i.png "${PKG}/usr/share/icons/hicolor/${i}x$i/apps/neverputt.png" + done + + chmod -R u=rwX,go=rX "${PKG}/usr/share/neverball" + mkdir -p $PKG/usr/share/locale/tr/LC_MESSAGES + cp $SRC/neverball.mo $PKG/usr/share/locale/tr/LC_MESSAGES/ +} diff --git a/talimatname/genel/n/newt/talimat b/talimatname/genel/n/newt/talimat new file mode 100644 index 000000000..285eb349a --- /dev/null +++ b/talimatname/genel/n/newt/talimat @@ -0,0 +1,21 @@ +# Tanım: Newt, renkli metin modu, widget tabanlı kullanıcı arabirimleri için bir programlama kütüphanesi. +# URL: https://admin.fedoraproject.org/pkgdb/package/rpms/newt/ +# Paketçi: milisarge +# Gerekler: popt slang + +isim=newt +surum=0.52.18 +devir=1 + +kaynak=( http://fedorahosted.org/releases/n/e/$isim/$isim-$surum.tar.gz ) +derle() { +cd $isim-$surum +sed -e 's/^LIBNEWT =/#&/' \ + -e '/install -m 644 $(LIBNEWT)/ s/^/#/' \ + -e 's/$(LIBNEWT)/$(LIBNEWTSONAME)/g' \ + -i Makefile.in + +./configure --prefix=/usr --with-gpm-support && +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nfs-utils/nfs-utils.kos-kur b/talimatname/genel/n/nfs-utils/nfs-utils.kos-kur new file mode 100644 index 000000000..aed9abc12 --- /dev/null +++ b/talimatname/genel/n/nfs-utils/nfs-utils.kos-kur @@ -0,0 +1,6 @@ +newuser=nobody +newgroup=nogroup +newid=99 +getent group $newgroup || /usr/bin/groupadd -g $newid $newgroup +getent passwd $newuser || /usr/bin/useradd -c "Unprivileged Nobody" \ +-g $newgroup -u $newid -d /dev/null -s /bin/false $newuser diff --git a/talimatname/genel/n/nfs-utils/nfs-utils.kur-kos b/talimatname/genel/n/nfs-utils/nfs-utils.kur-kos new file mode 100644 index 000000000..213a6f72d --- /dev/null +++ b/talimatname/genel/n/nfs-utils/nfs-utils.kur-kos @@ -0,0 +1,25 @@ +if [ ! -f /etc/sysconfig/nfs-server ]; then + cat > /etc/sysconfig/nfs-server << "EOF" +PORT="2049" +PROCESSES="8" +QUOTAS="no" +KILLDELAY="10" +EOF +fi + +if [ ! -f /etc/exports ]; then + cat > /etc/exports << "EOF" +# /etc/exports - exports(5) - directories exported to NFS clients +# +# Example for NFSv2 and NFSv3: +# /srv/home hostname1(rw,sync) hostname2(ro,sync) +# Example for NFSv4: +# /srv/nfs4 hostname1(rw,sync,fsid=0) +# /srv/nfs4/home hostname1(rw,sync,nohide) +# Using Kerberos and integrity checking: +# /srv/nfs4 *(rw,sync,sec=krb5i,fsid=0) +# /srv/nfs4/home *(rw,sync,sec=krb5i,nohide) +# +# Use `exportfs -arv` to reload. +EOF +fi diff --git a/talimatname/genel/n/nfs-utils/talimat b/talimatname/genel/n/nfs-utils/talimat new file mode 100644 index 000000000..9a1ce8221 --- /dev/null +++ b/talimatname/genel/n/nfs-utils/talimat @@ -0,0 +1,35 @@ +# Tanım: Userspace server and client tools necessary to use the kernel's NFS abilities. +# URL: http://nfs.sourceforge.net +# Paketçi: milisarge +# Gerekler: libtirpc rpcbind + +isim=nfs-utils +surum=1.3.3 +devir=1 + +kaynak=(http://downloads.sourceforge.net/nfs/$isim-$surum.tar.bz2) +run=(rpcbind) + +derle() { +source /etc/blfs-bootscripts +wget \ +http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 +tar xvf $scripts-$scriptsversion.tar.bz2 + +# build package + +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--disable-nfsv4 \ +--disable-nfsv41 \ +--disable-gss \ +--without-tcp-wrappers + +make +mkdir $PKG/sbin +make DESTDIR=$PKG install +# Services +cd ../$scripts-$scriptsversion +make DESTDIR=$PKG install-nfs-server +} diff --git a/talimatname/genel/n/nftables/talimat b/talimatname/genel/n/nftables/talimat new file mode 100644 index 000000000..fa4f8e77e --- /dev/null +++ b/talimatname/genel/n/nftables/talimat @@ -0,0 +1,19 @@ +# Tanım: Netfilter kullanıcı alanı araçları +# URL: http://netfilter.org/projects/nftables/ +# Paketçi: milisarge +# Gerekler: docbook2x libmnl libnftnl + +isim=nftables +surum=0.8 +devir=1 + +kaynak=(http://netfilter.org/projects/nftables/files/nftables-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + CONFIG_MAN=y DB2MAN=docbook2man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nginx-mod-nchan/talimat b/talimatname/genel/n/nginx-mod-nchan/talimat new file mode 100644 index 000000000..e05942e01 --- /dev/null +++ b/talimatname/genel/n/nginx-mod-nchan/talimat @@ -0,0 +1,26 @@ +# Tanım: nchan nginx module +# URL: https://nchan.io/ +# Paketçi: milisarge +# Gerekler: nginx +# Grup: + +isim=nginx-mod-nchan +surum=1.1.13 +devir=1 +ngsurum=1.13.7 +kaynak=(http://nginx.org/download/nginx-$ngsurum.tar.gz + https://github.com/slact/nchan/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$SRC"/nginx-$ngsurum + _module_dir="$SRC"/nchan-$surum + ./configure --with-compat \ + --with-cc-opt="$CFLAGS $CPPFLAGS" \ + --with-ld-opt="$LDFLAGS" \ + --add-dynamic-module=${_module_dir} + make modules + cd "$SRC"/nginx-$ngsurum/objs + for _mod in ngx_nchan_module.so; do + install -Dm755 $_mod "$PKG"/usr/lib/nginx/modules/$_mod + done +} diff --git a/talimatname/genel/n/nginx/nginx.kos-kur b/talimatname/genel/n/nginx/nginx.kos-kur new file mode 100644 index 000000000..6f04d678a --- /dev/null +++ b/talimatname/genel/n/nginx/nginx.kos-kur @@ -0,0 +1,18 @@ +#!/bin/sh + +id www 2>/dev/null +if [ $? -eq 0 ]; then + echo "www kullanicisi zaten tanimli" +else + echo "www kullanicisi olusturuldu" + useradd -M -s /bin/false -c "www user" www +fi + +if [ -z "`getent group nginx`" ]; then + /sbin/groupadd --system nginx +fi + +if [ -z "`getent passwd nginx`" ]; then + /sbin/useradd -r -g nginx -d /etc/nginx -s /bin/false -c "nginx server" nginx + /bin/passwd -l nginx +fi diff --git a/talimatname/genel/n/nginx/nginx.logrotate b/talimatname/genel/n/nginx/nginx.logrotate new file mode 100644 index 000000000..5d0422a24 --- /dev/null +++ b/talimatname/genel/n/nginx/nginx.logrotate @@ -0,0 +1,14 @@ +/var/log/nginx/*.log { + su @USER@ @GROUP@ + daily + missingok + rotate 52 + compress + delaycompress + notifempty + create 640 nginx adm + sharedscripts + postrotate + [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` + endscript +} diff --git a/talimatname/genel/n/nginx/nginx.servis b/talimatname/genel/n/nginx/nginx.servis new file mode 100644 index 000000000..fd01416be --- /dev/null +++ b/talimatname/genel/n/nginx/nginx.servis @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Nginx daemon control script. +# Written for Slackware Linux by Cherife Li <cherife-#-dotimes.com>. + +BIN=/usr/sbin/nginx +CONF=/etc/nginx/nginx.conf +PID=/var/run/nginx.pid + +nginx_start() { + # Sanity checks. + if [ ! -r $CONF ]; then # no config file, exit: + echo "$CONF dosyasi yok.iptal edildi." + exit 1 + fi + + if [ -s $PID ]; then + echo "Nginx zaten calisiyor?" + exit 1 + fi + + echo "Nginx baslatiliyor..." + if [ -x $BIN ]; then + $BIN -c $CONF + fi +} + +nginx_test_conf() { + echo "Nginx ayarlari kontrol ediliyor..." + $BIN -t -c $CONF +} + +nginx_term() { + echo "Nginx hizlica kapatiliyor..." + kill -TERM $(cat $PID) +} + +nginx_stop() { + echo "Nginx kapatiliyor..." + kill -QUIT $(cat $PID) +} + +nginx_reload() { + echo "Nginx ayarları yeniden yukleniyor..." + kill -HUP $(cat $PID) +} + +nginx_upgrade() { + echo "Nginx ikili dosyası üst sürüme geciriliyor." + kill -USR2 $(cat $PID) + sleep 3 + kill -QUIT $(cat $PID.oldbin) +} + +nginx_rotate() { + echo "Nginx kayitlari ayarlaniyor..." + kill -USR1 $(cat $PID) +} + +nginx_restart() { + nginx_stop + sleep 3 + nginx_start +} + +case "$1" in + check) + nginx_test_conf + ;; + start) + nginx_start + ;; + term) + nginx_term + ;; + stop) + nginx_stop + ;; + reload) + nginx_reload + ;; + restart) + nginx_restart + ;; + upgrade) + nginx_upgrade + ;; + rotate) + nginx_rotate + ;; + *) + echo "usage: `basename $0` {check|start|term|stop|reload|restart|upgrade|rotate}" +esac diff --git a/talimatname/genel/n/nginx/talimat b/talimatname/genel/n/nginx/talimat new file mode 100644 index 000000000..761d92747 --- /dev/null +++ b/talimatname/genel/n/nginx/talimat @@ -0,0 +1,138 @@ +# Tanım: NGINX, ücretsiz, açık kaynaklı, yüksek performanslı bir HTTP sunucusu ve ters proxy yanı sıra bir IMAP / POP3 proxy sunucusudur. +# URL: http://nginx.net/ +# Paketçi: milisarge +# Gerekler: libxml2 libxslt pcre + +isim=nginx +surum=1.13.7 +devir=1 + +kaynak=(http://nginx.org//download/$isim-$surum.tar.gz + nginx.servis + nginx.logrotate) + +# change those if you prefer another setup +NGINXUSER=www +NGINXGROUP=www +HTMLDIR=/srv/http + +# change those if you need those experimental modules +# (idea from slackbuilds.org) +if [ "${USE_SPDY:-no}" == "yes" ]; then + SPDY_MOD="--with-http_spdy_module" +else + SPDY_MOD="" +fi + +if [ "${USE_GEOIP:-no}" == "yes" ]; then + GEOIP_MOD="--with-http_geoip_module" +else + GEOIP_MOD="" +fi + +# +# +derle() { + cd $isim-$surum + ./configure \ + --prefix=/etc/nginx \ + --conf-path=/etc/nginx/nginx.conf \ + --sbin-path=/usr/bin/nginx \ + --pid-path=/run/nginx.pid \ + --lock-path=/run/lock/nginx.lock \ + --user=http \ + --group=http \ + --http-log-path=/var/log/nginx/access.log \ + --error-log-path=stderr \ + --http-client-body-temp-path=/var/lib/nginx/client-body \ + --http-proxy-temp-path=/var/lib/nginx/proxy \ + --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ + --http-scgi-temp-path=/var/lib/nginx/scgi \ + --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \ + --with-cc-opt="$CFLAGS $CPPFLAGS" \ + --with-ld-opt="$LDFLAGS" \ + + + ./configure --prefix=/usr \ + --sbin-path=/usr/sbin/nginx \ + --conf-path=/etc/nginx/nginx.conf \ + --pid-path=/var/run/nginx.pid \ + --lock-path=/var/lock/subsys \ + --user=${NGINXUSER} \ + --group=${NGINXGROUP} \ + --error-log-path=/var/log/nginx/error.log \ + --http-log-path=/var/log/nginx/access.log \ + --http-client-body-temp-path=/var/lib/nginx/client_body \ + --http-proxy-temp-path=/var/lib/nginx/proxy \ + --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ + --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \ + --http-scgi-temp-path=/var/lib/nginx/scgi \ + --with-compat \ + --with-debug \ + --with-file-aio \ + --with-ipv6 \ + --with-pcre-jit \ + --with-stream \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-threads \ + --with-select_module \ + --with-poll_module \ + --with-http_ssl_module \ + --with-http_realip_module \ + --with-http_addition_module \ + --with-http_xslt_module \ + --with-http_sub_module \ + --with-http_dav_module \ + --with-http_flv_module \ + --with-http_mp4_module \ + --with-http_gunzip_module \ + --with-http_gzip_static_module \ + --with-http_random_index_module \ + --with-http_secure_link_module \ + --with-http_degradation_module \ + --with-http_stub_status_module \ + --with-http_sub_module \ + --with-http_v2_module \ + --with-http_perl_module \ + --with-http_auth_request_module \ + --with-mail \ + --with-mail_ssl_module \ + --with-cc-opt="$CFLAGS $CPPFLAGS" \ + --with-ld-opt="$LDFLAGS" \ + $SPDY_MOD \ + $GEOIP_MOD + + make + make DESTDIR=$PKG install + + # Make the temp path. + install -dm700 $PKG/var/lib/$isim + # Move html directory and do not use /srv/www as it is used by apache + mkdir -p $PKG/$HTMLDIR + mv $PKG/usr/html $PKG/$HTMLDIR + chown -v -R $NGINXUSER:$NGINXGROUP $PKG/$HTMLDIR + # Fix the nginx.conf file for html and virtual server directory. + sed -i \ + -e '/root[ ]*html/s|html;|/srv/http/&|' \ + -e '$s|.*| include /etc/nginx/conf.d/\*.conf;\n&|' \ + $PKG/etc/nginx/$isim.conf + # install the nginx init script + install -Dm755 $SRC/nginx.servis $PKG/etc/rc.d/init.d/nginx + # install the logrotate file + install -Dm644 $SRC/nginx.logrotate $PKG/etc/logrotate.d/nginx + # fill the right user & group in the logrotate file + sed -e "s,@USER@,$NGINXUSER," -e "s,@GROUP@,$NGINXGROUP," \ + $PKG/etc/logrotate.d/nginx + # Set the permissions for the log directory. + chown $NGINXUSER $PKG/var/log/$isim + chmod 750 $PKG/var/log/$isim + # Create sub-directory for virtual servers. + mkdir -p $PKG/etc/$isim/conf.d + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done + +} + diff --git a/talimatname/genel/n/nicotine-plus/talimat b/talimatname/genel/n/nicotine-plus/talimat new file mode 100644 index 000000000..c1fa26576 --- /dev/null +++ b/talimatname/genel/n/nicotine-plus/talimat @@ -0,0 +1,14 @@ +# Tanım: Soulseek istemci, pythonda yazılmış +# URL: https://github.com/Nicotine-Plus/nicotine-plus +# Paketçi: milisarge +# Gerekler: mutagen python-gtk + +isim=nicotine-plus +surum=1.4.1 +devir=1 +kaynak=(https://github.com/Nicotine-Plus/nicotine-plus/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd nicotine-plus-$surum + python2 setup.py install --root="$PKG" +} diff --git a/talimatname/genel/n/nikto/talimat b/talimatname/genel/n/nikto/talimat new file mode 100644 index 000000000..8224e1988 --- /dev/null +++ b/talimatname/genel/n/nikto/talimat @@ -0,0 +1,31 @@ +# Tanım: Web sunucu zafiyet tarayıcı aracı +# URL: https://cirt.net/Nikto2 +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: + +isim=nikto +surum=2.1.5 +devir=1 +kaynak=(https://cirt.net/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $SRC/$isim-$surum + + install -d "$PKG/usr/share/nikto" + cp -a * "$PKG/usr/share/nikto" + + #install -Dm 755 "$SRC/nikto.sh" "$PKG/usr/bin/nikto" + #install -Dm 644 program/nikto.conf "$PKG/etc/nikto.conf" + #install -Dm 644 documentation/nikto.1 "$PKG/usr/share/man/man1/nikto.1" + #install -Dm 644 program/docs/nikto_manual.html "$PKG/usr/share/doc/$isim/manual.html" + #install -Dm 644 README.md "$PKG/usr/share/doc/$isim/README" + + mkdir -p $PKG/usr/bin + cat > $PKG/usr/bin/nikto << EOF +#!/bin/sh +cd /usr/share/nikto +exec /usr/bin/perl nikto.pl "$@" +EOF + + chmod +x $PKG/usr/bin/nikto +} diff --git a/talimatname/genel/n/nim/talimat b/talimatname/genel/n/nim/talimat new file mode 100644 index 000000000..a2b12bb77 --- /dev/null +++ b/talimatname/genel/n/nim/talimat @@ -0,0 +1,49 @@ +# Tanım: Imperative, multi-paradigm, compiled programming language +# URL: https://nim-lang.org/ +# Paketçi: milisarge +# Gerekler: python3 + +isim=nim +_isim=Nim +surum=0.17.2 +devir=1 +kaynak=(https://github.com/nim-lang/Nim/archive/v$surum.tar.gz::${_name}-$surum.tar.gz + https://github.com/nim-lang/csources/archive/v$surum.tar.gz::csources-$surum.tar.gz) + +derle() { + cd ${_name}-${surum} + mv ../csources-${surum} csources + rm bin/empty.txt + + export PATH="${SRC}/${_name}-${surum}/bin:${PATH}" + cd csources + sh build.sh + cd .. + nim c -d:release koch + ./koch boot -d:release -d:nativeStacktrace -d:useGnuReadline + cd lib + nim c --app:lib -d:createNimRtl -d:release nimrtl.nim + cd .. + cd tools + nim c -d:release nimgrep.nim + cd .. + export PATH="${SRC}/${_name}-${surum}/bin:${PATH}" + ./koch install "${PKG}" + install -d "${PKG}/usr/lib" + cp -a lib "${PKG}/usr/lib/nim" + cp -a compiler "${PKG}/usr/lib/nim" + install -Dm 644 compiler.nimble "${PKG}/usr/lib/nim/compiler" + install -m 755 lib/libnimrtl.so "${PKG}/usr/lib/libnimrtl.so" + # Fix FS#48118, related to the doc2 command + ln -s /usr/share/nim/doc "${PKG}/usr/lib/nim/doc" + install -Dm 644 config/* -t "${PKG}/etc" + install -Dm 755 bin/* tools/nimgrep -t "${PKG}/usr/bin" + # Fix FS#50252, unusual placement of header files + install -d "${PKG}/usr/include" + cp -a "${PKG}/usr/lib/nim/"*.h "${PKG}/usr/include" + install -d "${PKG}/usr/share/nim/doc" + cp -a examples web doc/* "${PKG}/usr/share/nim/doc" + install -Dm 644 copying.txt "${PKG}/usr/share/licenses/${isim}/LICENSE" + rm -r "${PKG}/nim" "${PKG}/usr/lib/nim/lib/nimcache" + rm -r "${PKG}/usr/share/nim/doc/web/" +} diff --git a/talimatname/genel/n/nimble/talimat b/talimatname/genel/n/nimble/talimat new file mode 100644 index 000000000..8b5a9095e --- /dev/null +++ b/talimatname/genel/n/nimble/talimat @@ -0,0 +1,19 @@ +# Tanım: Nim programlama dili paket yöneticisi +# URL: https://github.com/nim-lang/nimble +# Paketçi: milisarge +# Gerekler: nim + +isim=nimble +surum=0.8.6 +devir=1 +kaynak=(https://github.com/nim-lang/nimble/archive/v$surum.tar.gz::nimble-$surum.tar.gz) + +derle() { + cd ${isim}-${surum} + nim c -d:release src/nimble + install -Dm 755 src/nimble -t "${PKG}/usr/bin" + install -Dm 644 license.txt "${PKG}/usr/share/licenses/${isim}/LICENSE" + cp -r src/nimblepkg "${PKG}/usr/share/${isim}" + ln -s /usr/share/${isim} "${PKG}/usr/bin/nimblepkg" + +} diff --git a/talimatname/genel/n/ninja/talimat b/talimatname/genel/n/ninja/talimat new file mode 100644 index 000000000..e879c4dc5 --- /dev/null +++ b/talimatname/genel/n/ninja/talimat @@ -0,0 +1,16 @@ +# Tanım: Hıza odaklı küçük yapı sistemi +# URL: http://martine.github.io/ninja/ +# Paketçi: milisarge +# Gerekler: python + +isim=ninja +surum=1.8.2 +devir=1 +kaynak=(https://github.com/martine/$isim/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure.py --bootstrap + install -D -m 0755 $isim $PKG/usr/bin/$isim +} + diff --git a/talimatname/genel/n/ninvaders/talimat b/talimatname/genel/n/ninvaders/talimat new file mode 100644 index 000000000..33a1c7e93 --- /dev/null +++ b/talimatname/genel/n/ninvaders/talimat @@ -0,0 +1,16 @@ +# Tanım: NInvaders ASCII çıkışı için ncurses tabanlı bir Space Invaders klonudur. +# URL: http://ninvaders.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=ninvaders +surum=0.1.1 +devir=1 + +kaynak=( http://downloads.sourceforge.net/sourceforge/ninvaders/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + make CFLAGS="${CFLAGS}" && + install -Dm755 nInvaders $PKG/usr/bin/$isim +} diff --git a/talimatname/genel/n/nitroshare/talimat b/talimatname/genel/n/nitroshare/talimat new file mode 100644 index 000000000..b8cfb554d --- /dev/null +++ b/talimatname/genel/n/nitroshare/talimat @@ -0,0 +1,29 @@ +# Tanım: Ağ üzerinden dosya paylaşma uygulaması +# URL: https://nitroshare.net +# Paketçi: Cihan Alkan +# Gerekler:qt5 libnotify + +isim=nitroshare +surum=0.3.3 +devir=1 + +kaynak=(https://github.com/nitroshare/nitroshare-desktop/archive/$surum.tar.gz::$isim-$surum.tar.gz + https://raw.githubusercontent.com/oltulu/milis/master/nitroshare/aboutdialog.cpp + https://raw.githubusercontent.com/oltulu/milis/master/nitroshare/tr.ts::$isim-tr.ts) + +derle() { + mv $isim-tr.ts $isim-desktop-$surum/src/data/ts/tr.ts + mv aboutdialog.cpp $isim-desktop-$surum/src/application/ + cd $isim-desktop-$surum + + cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr . + make + + make DESTDIR="$PKG" install + # lisans + install -Dm644 \ + "LICENSE.txt" \ + "$PKG/usr/share/licenses/$isim/LICENSE.txt" + rm /sources/$surum.tar.gz + +} diff --git a/talimatname/genel/n/nlohmann-json/talimat b/talimatname/genel/n/nlohmann-json/talimat new file mode 100644 index 000000000..8be07c62a --- /dev/null +++ b/talimatname/genel/n/nlohmann-json/talimat @@ -0,0 +1,25 @@ +# Tanım: JSON for Modern C++ +# URL: https://nlohmann.github.io/json/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=nlohmann-json +surum=2.1.1 +devir=1 +kaynak=(https://github.com/nlohmann/json/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "json-$surum" + mkdir -p build + + cd build + cmake ../ \ + -DBuildTests=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=${PKG} install + install -d ${PKG}/usr/lib/ + mv ${PKG}/usr/cmake ${PKG}/usr/lib/ + install -Dm644 ../LICENSE.MIT ${PKG}/usr/share/licenses/nlohmann_json-git/LICENSE +} diff --git a/talimatname/genel/n/nmap/talimat b/talimatname/genel/n/nmap/talimat new file mode 100644 index 000000000..49feed058 --- /dev/null +++ b/talimatname/genel/n/nmap/talimat @@ -0,0 +1,27 @@ +# Tanım: Ağ tarama ve güvenlik denetimi programı +# URL: http://insecure.org/nmap/ +# Paketçi: milisarge@gmail.com +# Gerekler: pcre libpcap lua liblinear python + +isim=nmap +surum=7.60 +devir=1 + +kaynak=(http://nmap.org/dist/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +export PYTHON=python2 +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--localedir=/usr/share/locale \ +--docdir=/usr/share/doc/$isim-$surum \ +--with-liblua=included \ +--infodir=/usr/share/info +make || make -j1 +make DESTDIR=$PKG install +#zenmap için +python2 -m compileall "${PKG}"/usr/lib/python2.7/site-packages/zenmapCore +rm "${PKG}"/usr/bin/uninstall_* +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/n/nnn/talimat b/talimatname/genel/n/nnn/talimat new file mode 100644 index 000000000..5df00f7bb --- /dev/null +++ b/talimatname/genel/n/nnn/talimat @@ -0,0 +1,15 @@ +# Tanım: X için eksik terminal dosya tarayıcısı. +# URL: https://github.com/jarun/nnn +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: sistem + +isim=nnn +surum=1.6 +devir=1 +kaynak=(https://github.com/jarun/nnn/archive/v${surum//_/-}.tar.gz::$isim-$surum.tar.gz) + +derle() { + make -C "${isim}-$surum" DESTDIR="${PKG}" PREFIX="/usr" install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/n/node/node.npm.sh b/talimatname/genel/n/node/node.npm.sh new file mode 100644 index 000000000..1c8494485 --- /dev/null +++ b/talimatname/genel/n/node/node.npm.sh @@ -0,0 +1,13 @@ +# bash completion for npm + +_npm_completion () { + local si="$IFS" + IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \ + COMP_LINE="$COMP_LINE" \ + COMP_POINT="$COMP_POINT" \ + npm completion -- "${COMP_WORDS[@]}" \ + 2>/dev/null)) || return $? + IFS="$si" +} +complete -F _npm_completion npm + diff --git a/talimatname/genel/n/node/talimat b/talimatname/genel/n/node/talimat new file mode 100644 index 000000000..91c1b0711 --- /dev/null +++ b/talimatname/genel/n/node/talimat @@ -0,0 +1,23 @@ +# Tanım: Node.js®, Chrome'un V8 JavaScript motorunda inşa edilmiş bir JavaScript çalışma zamanıdır. +# URL: http://nodejs.org/ +# Paketçi: milisarge +# Gerekler: python + +isim=node +surum=7.10.0 +devir=1 + +kaynak=(http://nodejs.org/dist/v$surum/node-v$surum.tar.xz +node.npm.sh) +derle() { + cd node-v$surum + ./configure \ + --prefix=/usr \ + --shared-openssl \ + --shared-zlib + + make + make DESTDIR=$PKG install + ln -s ../lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js $PKG/usr/bin/node-gyp + install -D -m 644 $SRC/node.npm.sh $PKG/usr/share/bash-completion/completions/npm +} diff --git a/talimatname/genel/n/nodm/nodm.conf b/talimatname/genel/n/nodm/nodm.conf new file mode 100644 index 000000000..3b50785d0 --- /dev/null +++ b/talimatname/genel/n/nodm/nodm.conf @@ -0,0 +1,23 @@ +# nodm configuration file + +# Controls the user that is used to automatically log in +NODM_USER='{user}' + +# Options to pass to the X server (for example: "vt7 -nolisten +# tcp") +NODM_X_OPTIONS='vt7 -nolisten tcp' + +# Minimum time (in seconds) that a session should last in order +# for nodm to decide that it has not quit too soon. If an X +# session will run for less than this time, nodm will wait an +# increasing bit of time before restarting it. +NODM_MIN_SESSION_TIME=60 + +# X session command (default: /etc/X11/Xsession). It is run using +# the shell, so it can be any shell command. +NODM_XSESSION='/root/.xinitrc' + +# Timeout (in seconds) to wait for X to be ready to accept +# connections. If X is not ready before this timeout, it is killed +# and restarted. +NODM_X_TIMEOUT=20 diff --git a/talimatname/genel/n/nodm/talimat b/talimatname/genel/n/nodm/talimat new file mode 100644 index 000000000..c167422b2 --- /dev/null +++ b/talimatname/genel/n/nodm/talimat @@ -0,0 +1,20 @@ +# Tanım: X giriş yöneticisi +# URL: http://enricozini.org/sw/nodm/ +# Paketçi: milisarge +# Gerekler: help2man xorg-xinit + +isim=nodm +surum=0.13 +devir=1 +kaynak=(https://github.com/spanezz/nodm/archive/0.13.tar.gz::$isim-$surum.tar.gz + nodm.conf) + +derle() { + cd "$SRC/$isim-$surum" + ./autogen.sh + ./configure --prefix=/usr/ + make + install -Dm755 nodm $PKG/usr/bin/nodm + install -Dm644 ../nodm.conf $PKG/etc/nodm.conf + +} diff --git a/talimatname/genel/n/nomacs/talimat b/talimatname/genel/n/nomacs/talimat new file mode 100644 index 000000000..e00a38a51 --- /dev/null +++ b/talimatname/genel/n/nomacs/talimat @@ -0,0 +1,49 @@ +# Tanım: QT Resim Gösterici +# URL: https://nomacs.org/ +# Paketçi: Cihan_Alkan +# Gerekler: cmake qt5 exiv2 libraw opencv +# Grup: grafik_tasarım + +isim=nomacs +surum=3.8.0 +devir=1 + +kaynak=(https://github.com/${isim}/${isim}/archive/${surum}.tar.gz::${isim}-${surum}.tar.gz + https://github.com/${isim}/${isim}-plugins/archive/${surum}.tar.gz::${isim}-plugins-${surum}.tar.gz) + +derle() { + +# Yama Dosyası +cat > $SRC/${isim}-no-coverage.patch << "EOF" && +--- nomacs-3.8.0/ImageLounge/CMakeLists.txt.orig 2017-11-14 08:43:20.157769041 +0000 ++++ nomacs-3.8.0/ImageLounge/CMakeLists.txt 2017-11-14 08:43:49.094497479 +0000 +@@ -22,12 +22,6 @@ + set(NOMACS_VERSION ${NOMACS_VERSION_MAJOR}.${NOMACS_VERSION_MINOR}) + set(NOMACS_FULL_VERSION ${NOMACS_VERSION}.${NOMACS_VERSION_PATCH}) + +-# Codecov +-if(CMAKE_COMPILER_IS_GNUCXX) +- include("cmake/CodeCoverage.cmake") +- setup_target_for_coverage(${PROJECT_NAME}_coverage tests coverage) +-endif() +- + if(CMAKE_CL_64) + SET(NMC_ARCHITECTURE "x64") + else() +EOF + + cd "${isim}-${surum}" + + # move plugins + mv "${SRC}/${isim}-plugins-${surum}" "ImageLounge/plugins" + + # disable code coverage: + # https://github.com/nomacs/nomacs/issues/170 + patch -p1 -i "../${isim}-no-coverage.patch" + + cmake ./ImageLounge -DCMAKE_INSTALL_PREFIX=/usr + make + + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/n/notepadqq/talimat b/talimatname/genel/n/notepadqq/talimat new file mode 100644 index 000000000..eb95c83d6 --- /dev/null +++ b/talimatname/genel/n/notepadqq/talimat @@ -0,0 +1,18 @@ +# Tanım: Notepad++ linux sürümü +# URL: http://notepadqq.altervista.org/wp/ +# Paketçi: milisarge +# Gerekler: qt5 hicolor-icon-theme desktop-file-utils qt5-webkit + +isim=notepadqq +surum=1.2.0 +devir=1 +kaynak=(https://github.com/notepadqq/notepadqq/archive/v$surum.tar.gz::$isim-$surum.tar.gz + https://github.com/notepadqq/CodeMirror/archive/5.18.2-nqq.tar.gz) + +derle() { + cd $isim-$surum + cp -rf $SRC/CodeMirror-5.18.2-nqq/* $SRC/$isim-$surum/src/editor/libs/codemirror/ + qmake-qt5 PREFIX=/usr LRELEASE=/usr/bin/lrelease-qt5 notepadqq.pro + make + make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/n/notification-daemon/talimat b/talimatname/genel/n/notification-daemon/talimat new file mode 100644 index 000000000..6d9abb9ad --- /dev/null +++ b/talimatname/genel/n/notification-daemon/talimat @@ -0,0 +1,20 @@ +# Tanım: Pasif pop-up bildirimlerini görüntülemek için arka plan programı +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: intltool gtk3 libcanberra + +isim=notification-daemon +surum=3.20.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/notification-daemon + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/noto-fonts/talimat b/talimatname/genel/n/noto-fonts/talimat new file mode 100644 index 000000000..e87f6c73c --- /dev/null +++ b/talimatname/genel/n/noto-fonts/talimat @@ -0,0 +1,21 @@ +# Tanım: Google Noto TTF yazı tipi +# URL : https://www.google.com/get/noto/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg-fontconfig + +isim=noto-fonts +surum=20151224 +_commit=3f1dc1 +devir=1 + +kaynak=(https://github.com/googlei18n/noto-fonts/archive/$_commit.zip) + +derle() { + mkdir -p $PKG/usr/share/fonts/noto + install -m644 $isim-*/hinted/Noto*.ttf $PKG/usr/share/fonts/noto + + mkdir -p $PKG/usr/share/fonts/TTF + for font in Arimo Cousine Tinos; do + install -m644 $isim-*/hinted/$font*.ttf $PKG/usr/share/fonts/TTF + done +} diff --git a/talimatname/genel/n/npapi-sdk/talimat b/talimatname/genel/n/npapi-sdk/talimat new file mode 100644 index 000000000..47f2def36 --- /dev/null +++ b/talimatname/genel/n/npapi-sdk/talimat @@ -0,0 +1,17 @@ +# Tanım: NPAPI-SDK, Mozilla'nın NPAPI üstbilgilerinin bir paketidir. +# URL: https://bitbucket.org/mgorny/npapi-sdk/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=npapi-sdk +surum=0.27.2 +devir=1 + +kaynak=(https://bitbucket.org/mgorny/npapi-sdk/downloads/npapi-sdk-$surum.tar.bz2) + +derle() { +cd npapi-sdk-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/npth/talimat b/talimatname/genel/n/npth/talimat new file mode 100644 index 000000000..7e887c289 --- /dev/null +++ b/talimatname/genel/n/npth/talimat @@ -0,0 +1,19 @@ +# Tanım: Unix platformları için tam taşınabilir bir POSIX / ANSI-C tabanlı kitaplık içerir +# URL: http://www.gnu.org/software/pth/ +# Paketçi: milisarge +# Gerekler: + +isim=npth +surum=1.2 +devir=1 + +kaynak=(ftp://ftp.gnupg.org/gcrypt/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--disable-static +make +make -j1 DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nspr/talimat b/talimatname/genel/n/nspr/talimat new file mode 100644 index 000000000..e3489d62d --- /dev/null +++ b/talimatname/genel/n/nspr/talimat @@ -0,0 +1,23 @@ +# Tanım: Netscape Taşınabilir Çalışma Zamanı Kitaplığı (NSPR) +# URL: http://www.mozilla.org/projects/nspr/ +# Paketçi: milisarge +# Gerekler: + +isim=nspr +surum=4.16 +devir=1 + +kaynak=(http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v$surum/src/$isim-$surum.tar.gz ) +derle() { + +cd $isim-$surum/$isim +sed -ri 's#^(RELEASE_BINS =).*#\1#' pr/src/misc/Makefile.in && +sed -i 's#$(LIBRARY) ##' config/rules.mk && +./configure --prefix=/usr \ + --with-mozilla \ + --with-pthreads \ + $([ $(uname -m) = x86_64 ] && echo --enable-64bit) && +make + +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nss-mdns/talimat b/talimatname/genel/n/nss-mdns/talimat new file mode 100644 index 000000000..a58906c36 --- /dev/null +++ b/talimatname/genel/n/nss-mdns/talimat @@ -0,0 +1,21 @@ +# Tanım: mDNS için nss modülü +# URL: http://0pointer.de/lennart/projects/nss-mdns/ +# Paketçi: milisarge +# Gerekler: + +isim=nss-mdns +surum=0.10 +devir=1 +kaynak=(http://0pointer.de/lennart/projects/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-lynx + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nss/nss-config.in b/talimatname/genel/n/nss/nss-config.in new file mode 100644 index 000000000..55e51123c --- /dev/null +++ b/talimatname/genel/n/nss/nss-config.in @@ -0,0 +1,142 @@ +#!/bin/sh + +prefix=/usr +surum=@VERSION@ + +usage() +{ + cat <<EOF +Usage: nss-config [OPTIONS] [LIBRARIES] +Options: + [--prefix[=DIR]] + [--exec-prefix[=DIR]] + [--includedir[=DIR]] + [--libdir[=DIR]] + [--version] + [--libs] + [--cflags] +Dynamic Libraries: + nss + nssutil + ssl + smime +EOF + exit $1 +} + +if test $# -eq 0; then + usage 1 1>&2 +fi + +lib_ssl=yes +lib_smime=yes +lib_nss=yes +lib_nssutil=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --includedir=*) + includedir=$optarg + ;; + --includedir) + echo_includedir=yes + ;; + --libdir=*) + libdir=$optarg + ;; + --libdir) + echo_libdir=yes + ;; + --version) + echo $surum + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + ssl) + lib_ssl=yes + ;; + smime) + lib_smime=yes + ;; + nss) + lib_nss=yes + ;; + nssutil) + lib_nssutil=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +# Set variables that may be dependent upon other variables +if test -z "$exec_prefix"; then + exec_prefix=${prefix} +fi +if test -z "$includedir"; then + includedir=${prefix}/include/nss +fi +if test -z "$libdir"; then + libdir=${exec_prefix}/lib +fi + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_includedir" = "yes"; then + echo $includedir +fi + +if test "$echo_libdir" = "yes"; then + echo $libdir +fi + +if test "$echo_cflags" = "yes"; then + echo -I$includedir +fi + +if test "$echo_libs" = "yes"; then + libdirs="-L$libdir" + if test -n "$lib_ssl"; then + libdirs="$libdirs -lssl3" + fi + if test -n "$lib_smime"; then + libdirs="$libdirs -lsmime3" + fi + if test -n "$lib_nss"; then + libdirs="$libdirs -lnss3" + fi + if test -n "$lib_nssutil"; then + libdirs="$libdirs -lnssutil3" + fi + echo $libdirs +fi + diff --git a/talimatname/genel/n/nss/nss-softokn.pc.in b/talimatname/genel/n/nss/nss-softokn.pc.in new file mode 100644 index 000000000..7bf8b98c0 --- /dev/null +++ b/talimatname/genel/n/nss/nss-softokn.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS-SOFTOKN +Tanım: Network Security Services Softoken PKCS #11 Module +Version: %NSS_VERSION% +Requires: nspr >= %NSPR_VERSION%, nss-util >= %NSSUTIL_VERSION% +Libs: -lfreebl3 -lnssdbm3 -lsoftokn3 +Cflags: -I${includedir}/private diff --git a/talimatname/genel/n/nss/nss-util.pc.in b/talimatname/genel/n/nss/nss-util.pc.in new file mode 100644 index 000000000..bd5873e59 --- /dev/null +++ b/talimatname/genel/n/nss/nss-util.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS-UTIL +Tanım: Network Security Services Utility Library +Version: %NSS_VERSION% +Requires: nspr >= %NSPR_VERSION% +Libs: -L${libdir} -lnssutil3 +Cflags: -I${includedir} diff --git a/talimatname/genel/n/nss/nss.pc.in b/talimatname/genel/n/nss/nss.pc.in new file mode 100644 index 000000000..e438178b6 --- /dev/null +++ b/talimatname/genel/n/nss/nss.pc.in @@ -0,0 +1,11 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: NSS +Tanım: Network Security Services +Version: %NSS_VERSION% +Requires: nspr >= %NSPR_VERSION% +Libs: %FULL_NSS_LIBS% +Cflags: %FULL_NSS_CFLAGS% diff --git a/talimatname/genel/n/nss/talimat b/talimatname/genel/n/nss/talimat new file mode 100644 index 000000000..d8dc573b7 --- /dev/null +++ b/talimatname/genel/n/nss/talimat @@ -0,0 +1,63 @@ +# Tanım: Güvenlik özellikli istemci ve sunucu uygulamalarının çapraz platform geliştirmesi desteği +# URL: http://www.mozilla.org +# Paketçi: milisarge +# Gerekler: nspr sqlite + +isim=nss +surum=3.31 +devir=1 +kaynak=(http://ftp.mozilla.org/pub/security/nss/releases/NSS_${version//./_}_RTM/src/$isim-$surum.tar.gz \ + nss-config.in nss.pc.in nss-util.pc.in nss-softokn.pc.in) + +derle() { + cd $isim-$surum/ + + sed -i nss/coreconf/Linux.mk \ + -e 's|^CC.*=.*gcc$|#&|' \ + -e 's|^CCC.*=.*g++$|#&|' + + export NSPR_INCLUDE_DIR=/usr/include/nspr + export NSPR_LIB_DIR=/usr/lib + export NSS_USE_SYSTEM_SQLITE=1 + export NSS_ENABLE_ECC=1 + export NSS_ENABLE_TLS_1_3=1 + export BUILD_OPT=1 + export XCFLAGS="-Wno-error ${CFLAGS}" + export NSS_DISABLE_GTESTS=1 + export USE_64=1 + + make -j1 -C nss + + install -d $PKG/usr/{bin,lib/pkgconfig,include/nss/private} + + cd dist/*.OBJ/bin + install -t "$PKG/usr/bin" *util shlibsign signtool signver ssltap + cd ../lib + install -t "$PKG/usr/lib" *.so + install -t "$PKG/usr/lib" -m644 libcrmf.a libfreebl.a *.chk + cd ../../public/nss + install -t "$PKG/usr/include/nss" -m644 *.h + cd ../../private/nss + install -t "$PKG/usr/include/nss/private" -m644 blapi.h alghmac.h + install -m 0755 $SRC/nss-config.in $PKG/usr/bin/nss-config + + _surum=$(printf "%i.%i.%i" ${version//./ }) + sed -i "s/@VERSION@/$_version/" $PKG/usr/bin/nss-config + + NSS_LIBS=`$PKG/usr/bin/nss-config --libs` + NSS_CFLAGS=`$PKG/usr/bin/nss-config --cflags` + NSPR_VERSION=`pkg-config --modversion nspr` + for module in nss nss-util nss-softokn; do + sed $SRC/$module.pc.in \ + -e "s,%libdir%,/usr/lib," \ + -e "s,%prefix%,/usr," \ + -e "s,%exec_prefix%,/usr/bin," \ + -e "s,%includedir%,/usr/include/nss," \ + -e "s,%NSS_VERSION%,$surum," \ + -e "s,%NSPR_VERSION%,$NSPR_VERSION," \ + -e "s,%FULL_NSS_LIBS%,$NSS_LIBS," \ + -e "s,%FULL_NSS_CFLAGS%,$NSS_CFLAGS," > \ + $PKG/usr/lib/pkgconfig/$module.pc + done + +} diff --git a/talimatname/genel/n/ntfs-3g/ntfs-3g.okubeni b/talimatname/genel/n/ntfs-3g/ntfs-3g.okubeni new file mode 100644 index 000000000..d8513b458 --- /dev/null +++ b/talimatname/genel/n/ntfs-3g/ntfs-3g.okubeni @@ -0,0 +1,3 @@ +Check the following options in the kernel configuration: +File systems ---> + [*] FUSE (Filesystem in Userspace) support diff --git a/talimatname/genel/n/ntfs-3g/talimat b/talimatname/genel/n/ntfs-3g/talimat new file mode 100644 index 000000000..168f25b0a --- /dev/null +++ b/talimatname/genel/n/ntfs-3g/talimat @@ -0,0 +1,21 @@ +# Tanım: NTFS-3G, Linux sistemleri için istikrarlı, tam özellikli, okuma-yazma NTFS sürücüsüdür. +# URL: http://www.tuxera.com/community/open-source-ntfs-3g/ +# Paketçi: milisarge +# Gerekler: + +isim=ntfs-3g +surum=2015.3.14 +devir=1 + +kaynak=(http://tuxera.com/opensource/${isim}_ntfsprogs-$surum.tgz) +derle() { +cd ${isim}_ntfsprogs-$surum +./configure --prefix=/usr \ +--disable-static +make +mkdir $PKG/lib +make DESTDIR=$PKG install +ln -s ../bin/ntfs-3g $PKG/sbin/mount.ntfs +ln -s ntfs-3g.8 $PKG/usr/share/man/man8/mount.ntfs.8 +chmod -v 4755 $PKG/bin/ntfs-3g +} diff --git a/talimatname/genel/n/ntp/talimat b/talimatname/genel/n/ntp/talimat new file mode 100644 index 000000000..65e6fc8bf --- /dev/null +++ b/talimatname/genel/n/ntp/talimat @@ -0,0 +1,68 @@ +# Tanım: NTP, bilgisayar saatlerini bir ağ üzerinden senkronize etmek için tasarlanmış bir protokoldür. +# URL: http://www.ntp.org/ +# Paketçi: milisarge +# Gerekler: + +isim=ntp +surum=4.2.8p5 +devir=1 + +kaynak=( http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/$isim-4.2/$isim-$surum.tar.gz) + +derle() { + +cd $isim-$surum +./configure --prefix=/usr \ +--bindir=/usr/sbin \ +--sysconfdir=/etc \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--enable-linuxcaps \ +--with-lineeditlibs=readline \ +--docdir=/usr/share/doc/$isim-$surum + +make +make DESTDIR=$PKG install +mkdir -p $PKG/var/lib/ntp +install -v -o ntp -g ntp -d $PKG/var/lib/ntp +mkdir -p $PKG/etc + +cat > $PKG/etc/ntp.conf << "EOF" + +# Europe +server 0.tr.pool.ntp.org +server 1.tr.pool.ntp.org +server 2.tr.pool.ntp.org +server 3.tr.pool.ntp.org +server 0.europe.pool.ntp.org + + +# Africa +server tock.nml.csir.co.za + +# Asia +server 0.asia.pool.ntp.org + +# Australia +server 0.oceania.pool.ntp.org + +# North America +server 0.north-america.pool.ntp.org + +# South America +server 2.south-america.pool.ntp.org + +driftfile /var/lib/ntp/ntp.drift +pidfile /var/run/ntpd.pid + +# Security session +restrict default limited kod nomodify notrap nopeer noquery +restrict -6 default limited kod nomodify notrap nopeer noquery + +restrict 127.0.0.1 +restrict ::1 +EOF +# service + +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/numix-gtk-theme/numix-gtk-theme.kur-kos b/talimatname/genel/n/numix-gtk-theme/numix-gtk-theme.kur-kos new file mode 100644 index 000000000..54f6b8678 --- /dev/null +++ b/talimatname/genel/n/numix-gtk-theme/numix-gtk-theme.kur-kos @@ -0,0 +1,5 @@ +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/Numix/ +gtk-update-icon-cache -q -t -f /usr/share/icons/Numix-Light/ +gtk-update-icon-cache -q -t -f /usr/share/icons/Numix-Circle/ +gtk-update-icon-cache -q -t -f /usr/share/icons/Numix-Circle-Light/ diff --git a/talimatname/genel/n/numix-gtk-theme/talimat b/talimatname/genel/n/numix-gtk-theme/talimat new file mode 100644 index 000000000..8c3d4fd9c --- /dev/null +++ b/talimatname/genel/n/numix-gtk-theme/talimat @@ -0,0 +1,42 @@ +# Tanım: Modern bir görünüme sahip düz ve hafif bir tema (GNOME, Openbox, Birlik, Xfce) +# URL: http://numixproject.org/ +# Paketçi: milisarge +# Gerekler: gdk-pixbuf glib libxml2 gtk-update-icon-cache + +isim=numix-gtk-theme +surum=2.2.3 +devir=1 +kaynak=(https://github.com/numixproject/numix-gtk-theme/archive/v$surum.tar.gz) + +derle() { + mv $DERLEME_KAYNAKDIZIN/v$surum.tar.gz $DERLEME_KAYNAKDIZIN/$isim-$surum.tar.gz + cd $isim-$surum + + if [ ! -d $DERLEME_KAYNAKDIZIN/numix-icon-theme-circle ];then + git clone https://github.com/numixproject/numix-icon-theme-circle $DERLEME_KAYNAKDIZIN/numix-icon-theme-circle + else + cd $DERLEME_KAYNAKDIZIN/numix-icon-theme-circle + git pull + cd - + fi + + if [ ! -d $DERLEME_KAYNAKDIZIN/numix-icon-theme ];then + git clone https://github.com/numixproject/numix-icon-theme $DERLEME_KAYNAKDIZIN/numix-icon-theme + else + cd $DERLEME_KAYNAKDIZIN/numix-icon-theme + git pull + cd - + fi + + #simgelerin eklenmesi + mkdir -p $PKG/usr/share/icons/ + cp -r $DERLEME_KAYNAKDIZIN/numix-icon-theme-circle/Numix-Circle-Light $PKG/usr/share/icons/ + cp -r $DERLEME_KAYNAKDIZIN/numix-icon-theme/Numix-Light $PKG/usr/share/icons/ + cp -r $DERLEME_KAYNAKDIZIN/numix-icon-theme-circle/Numix-Circle $PKG/usr/share/icons/ + cp -r $DERLEME_KAYNAKDIZIN/numix-icon-theme/Numix $PKG/usr/share/icons/ + #temanın paketlenmesi + cd .. + rm numix*/.gitignore + mkdir -p $PKG/usr/share/themes + mv numix* $PKG/usr/share/themes/Numix +} diff --git a/talimatname/genel/n/numlockx/talimat b/talimatname/genel/n/numlockx/talimat new file mode 100644 index 000000000..cf8bcb48a --- /dev/null +++ b/talimatname/genel/n/numlockx/talimat @@ -0,0 +1,21 @@ +# Tanım: X11'de numlock tuşunu açar +# URL: https://admin.fedoraproject.org/pkgdb/package/rpms/numlockx/ +# Paketçi: milisarge +# Gerekler: xorg-libxtst + +isim=numlockx +surum=1.2 +devir=1 +kaynak=(http://pkgs.fedoraproject.org/repo/pkgs/numlockx/numlockx-1.2.tar.gz/be9109370447eae23f6f3f8527bb1a67/numlockx-1.2.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr \ + x_includes=/usr/include/X11 \ + x_libraries=/usr/lib + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/n/nvidia/90-nvidia-uvm.rules b/talimatname/genel/n/nvidia/90-nvidia-uvm.rules new file mode 100644 index 000000000..3df8a3ab0 --- /dev/null +++ b/talimatname/genel/n/nvidia/90-nvidia-uvm.rules @@ -0,0 +1 @@ +KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/bin/mknod -m 660 /dev/nvidia-uvm c $(grep nvidia-uvm /proc/devices | cut -d \ -f 1) 0; /bin/chgrp video /dev/nvidia-uvm'" diff --git a/talimatname/genel/n/nvidia/nvidia.kur-kos b/talimatname/genel/n/nvidia/nvidia.kur-kos new file mode 100644 index 000000000..d3e350540 --- /dev/null +++ b/talimatname/genel/n/nvidia/nvidia.kur-kos @@ -0,0 +1 @@ +depmod diff --git a/talimatname/genel/n/nvidia/talimat b/talimatname/genel/n/nvidia/talimat new file mode 100644 index 000000000..79ed0a00c --- /dev/null +++ b/talimatname/genel/n/nvidia/talimat @@ -0,0 +1,105 @@ +# Tanım: nVIDIA Linux Display Driver +# URL: http://www.nvidia.com/ +# Paketçi: milisarge +# Gerekler: gtk2 gl-select kernel +# Grup: sürücü + +isim=nvidia +surum=390.42 +devir=1 +kaynak=(http://us.download.nvidia.com/XFree86/Linux-x86_64/$surum/NVIDIA-Linux-x86_64-$surum-no-compat32.run \ + 90-nvidia-uvm.rules) + +derle() { + sh NVIDIA-Linux-x86_64-$surum-no-compat32.run --extract-only + cd NVIDIA-Linux-x86_64-$surum-no-compat32 + + # libraries + install -d $PKG/usr/lib/{tls,vdpau} + install -m 0755 libGL.so.$surum $PKG/usr/lib + install -m 0755 libOpenCL.so.1.0.0 $PKG/usr/lib + install -m 0755 libcuda.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-cfg.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-compiler.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-encode.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-fbc.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-glcore.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-gtk2.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-gtk3.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-ifr.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-ml.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-opencl.so.$surum $PKG/usr/lib + install -m 0755 libnvidia-tls.so.$surum $PKG/usr/lib + install -m 0755 libnvcuvid.so.$surum $PKG/usr/lib + install -m 0755 tls/libnvidia-tls.so.$surum $PKG/usr/lib/tls + install -m 0755 libvdpau_nvidia.so.$surum $PKG/usr/lib/vdpau + install -m 0755 libnvidia-fatbinaryloader.so.$surum $PKG/usr/lib + + ln -s libvdpau_nvidia.so.$surum $PKG/usr/lib/vdpau/libvdpau_nvidia.so.1 + ln -s libvdpau_nvidia.so.$surum $PKG/usr/lib/vdpau/libvdpau_nvidia.so + + ln -s libnvcuvid.so.$surum $PKG/usr/lib/libnvcuvid.so.1 + ln -s libnvcuvid.so.$surum $PKG/usr/lib/libnvcuvid.so + + ln -s libnvidia-ml.so.$surum $PKG/usr/lib/libnvidia-ml.so.1 + ln -s libnvidia-ml.so.$surum $PKG/usr/lib/libnvidia-ml.so + + ln -s libOpenCL.so.1.0.0 $PKG/usr/lib/libOpenCL.so + + # xorg driver/extensions + install -d $PKG/usr/lib/xorg/modules/{drivers,extensions} + install -m 0755 nvidia_drv.so $PKG/usr/lib/xorg/modules/drivers + install -m 0755 libglx.so.$surum $PKG/usr/lib/xorg/modules/extensions + install -m 0755 libnvidia-wfb.so.$surum $PKG/usr/lib/xorg/modules + + # nvidia programs amd man-pages + install -d $PKG/usr/{bin,share/man/man1} + install -m 0755 nvidia-{debugdump,persistenced,settings,smi,xconfig} \ + $PKG/usr/bin + install -m 0644 nvidia-{persistenced,settings,smi,xconfig}.1.gz \ + $PKG/usr/share/man/man1 + + # desktop file and icon + install -d $PKG/usr/share/{applications,pixmaps} + sed -i 's:__UTILS_PATH__:/usr/bin: ; s:__PIXMAP_PATH__:/usr/share/pixmaps:' nvidia-settings.desktop + install -m 0644 nvidia-settings.desktop $PKG/usr/share/applications + install -m 0644 nvidia-settings.png $PKG/usr/share/pixmaps + + # additional symlinks required by gl-select + ln -s libGL.so.$surum $PKG/usr/lib/libGL_so_1_2_nvidia + ln -s libglx.so.$surum $PKG/usr/lib/xorg/modules/extensions/libglx_so_nvidia + + # opencl icd file + install -m 0644 -D nvidia.icd $PKG/etc/OpenCL/vendors/nvidia.icd + + # nvidia-uvm module udev rule + install -d $PKG/lib/udev/rules.d + install -m 0644 $SRC/90-nvidia-uvm.rules $PKG/lib/udev/rules.d/90-nvidia-uvm.rules + + # nvidia-settings registry key file + install -D -m 0644 nvidia-application-profiles-$surum-key-documentation \ + $PKG/usr/share/nvidia/nvidia-application-profiles-$surum-key-documentation + + # kernel modules + #cd /lib/modules/`uname -r`/build + #gunzip < /proc/config.gz > .config + #make oldconfig + #make prepare + #make scripts + #cp /lib/modules/`uname -r`/build/include/generated/autoconf.h /lib/modules/`uname -r`/build/include/linux/autoconf.h + #cd - + cd kernel + + #make SYSSRC=/lib/modules/"`uname -r`/build" module + rm -rf /lib/modules/`uname -r`/build/vmlinux + IGNORE_CC_MISMATCH=1 make module + install -D -m 0644 nvidia.ko $PKG/lib/modules/`uname -r`/extra/nvidia.ko + install -D -m 0644 nvidia-uvm.ko $PKG/lib/modules/`uname -r`/extra/nvidia-uvm.ko + install -D -m 0644 nvidia-modeset.ko $PKG/lib/modules/`uname -r`/extra/nvidia-modeset.ko + install -D -m 0644 nvidia-drm.ko $PKG/lib/modules/`uname -r`/extra/nvidia-drm.ko + + gzip "${PKG}/lib/modules/`uname -r`/extra/"*.ko + install -d -m755 "${PKG}/etc/modprobe.d" + echo "blacklist nouveau" >> "${PKG}/etc/modprobe.d/nouveau_blacklist.conf" + +} diff --git a/talimatname/genel/o/obconf-qt/talimat b/talimatname/genel/o/obconf-qt/talimat new file mode 100644 index 000000000..67203cebd --- /dev/null +++ b/talimatname/genel/o/obconf-qt/talimat @@ -0,0 +1,23 @@ +# Tanım: OpenBox için bir GUI Qt tabanlı yapılandırma aracıdır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gtk2 hicolor-icon-theme liblxqt openbox +# Grup: lxqt + +isim=obconf-qt +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/o/obconf/talimat b/talimatname/genel/o/obconf/talimat new file mode 100644 index 000000000..ec65140b1 --- /dev/null +++ b/talimatname/genel/o/obconf/talimat @@ -0,0 +1,17 @@ +# Tanım: Openbox yapılandırması için araçlar +# URL: http://openbox.org/wiki/ObConf:About +# Paketçi: milisarge +# Gerekler: openbox startup-notification gtk2 cairo xorg-pixman xorg-libxext gdk-pixbuf atk libglade avahi dbus-python dbus-glib libdaemon xorg-mesa + +isim=obconf +surum=2.0.4 +devir=2 + +kaynak=(http://icculus.org/openbox/obconf/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/obex-data-server/talimat b/talimatname/genel/o/obex-data-server/talimat new file mode 100644 index 000000000..7f684973a --- /dev/null +++ b/talimatname/genel/o/obex-data-server/talimat @@ -0,0 +1,18 @@ +# Tanım: OBEX Veri Sunucusu paketi, üst düzey OBEX istemci ve sunucu tarafında işlevsellik sağlayan D-Bus servisini içerir. +# URL: http://tadas.dailyda.com +# Paketçi: milisarge +# Gerekler: bluez dbus-glib imagemagick gdk-pixbuf libusb-compat openobex + +isim=obex-data-server +surum=0.4.6 +devir=1 +kaynak=(http://tadas.dailyda.com/software/$isim-$surum.tar.gz + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-build-fixes-1.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i $SRC/obex-data-server-0.4.6-build-fixes-1.patch + ./configure --prefix=/usr --sysconfdir=/etc + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/obexd/talimat b/talimatname/genel/o/obexd/talimat new file mode 100644 index 000000000..11e29e52d --- /dev/null +++ b/talimatname/genel/o/obexd/talimat @@ -0,0 +1,19 @@ +# Tanım: Obexd paketi OBEX istemci ve sunucu işlevselliğini sağlayan D-Bus hizmetlerini içerir. +# URL: http://www.bluez.org/ +# Paketçi: milisarge +# Gerekler: bluez libical + +isim=obexd +surum=0.48 +devir=2 + +kaynak=(http://www.kernel.org/pub/linux/bluetooth/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +sed -i 's/#include <string.h>/&\n#include <stdio.h>/' plugins/mas.c +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--libexecdir=/usr/lib/obexd +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/obmenu-generator/talimat b/talimatname/genel/o/obmenu-generator/talimat new file mode 100644 index 000000000..d32598a10 --- /dev/null +++ b/talimatname/genel/o/obmenu-generator/talimat @@ -0,0 +1,16 @@ +# Tanım: openbox menu yapıcı +# URL: https://github.com/trizen/obmenu-generator +# Paketçi: milisarge +# Gerekler: perl-module-build perl-data-dump perl-linux-desktopfiles +# Grup: sistem + +isim=obmenu-generator +surum=0.84 +devir=1 +kaynak=(https://github.com/trizen/${isim}/archive/${surum}.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd "$isim-$surum" + install -Dm755 "$isim" "$PKG/usr/bin/$isim" + install -Dm644 "schema.pl" "$PKG/etc/xdg/$isim/schema.pl" +} diff --git a/talimatname/genel/o/obmenu/talimat b/talimatname/genel/o/obmenu/talimat new file mode 100644 index 000000000..d1d455db9 --- /dev/null +++ b/talimatname/genel/o/obmenu/talimat @@ -0,0 +1,18 @@ +# Tanım: Openbox için yapılandırma aracı +# URL: http://obmenu.sourceforge.net +# Paketçi: milisarge +# Gerekler: python-gtk + + +isim=obmenu +surum=1.0 +devir=1 + +kaynak=(http://freefr.dl.sourceforge.net/sourceforge/obmenu/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +python2 setup.py install --root=$PKG + +} + diff --git a/talimatname/genel/o/obs-studio/obs.desktop b/talimatname/genel/o/obs-studio/obs.desktop new file mode 100644 index 000000000..ad0aa02a0 --- /dev/null +++ b/talimatname/genel/o/obs-studio/obs.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Version=1.0 +Name=OBS +GenericName=Streaming/Recording Software +GenericName[tr]=Akış ve Kayıt Yazılımı +Comment=Free and Open Source Streaming/Recording Software +Comment[ru]=Бесплатная программа с открытым кодом для записи/трансляции видео +Comment[tr]=Canlı akış ve kayıt için ücretsiz, açık kaynaklı yazılım +Exec=obs +Icon=obs +Terminal=false +Type=Application +Categories=AudioVideo;Recorder; +StartupNotify=true diff --git a/talimatname/genel/o/obs-studio/talimat b/talimatname/genel/o/obs-studio/talimat new file mode 100644 index 000000000..6dc5c3114 --- /dev/null +++ b/talimatname/genel/o/obs-studio/talimat @@ -0,0 +1,25 @@ +# Tanım: Canlı akış ve kayıt için ücretsiz, açık kaynaklı yazılım +# URL: https://obsproject.com +# Paketçi: Cihan_Alkan +# Gerekler: ffmpeg jansson xorg-libxinerama libxkbcommon qt5 curl jack gtk-update-icon-cache cmake fdk-aac xorg-libxcomposite x264 vlc +# Grup: medya + + +isim=obs-studio +surum=20.1.3 +devir=1 +kaynak=(https://github.com/jp9000/obs-studio/archive/$surum.tar.gz::$isim-$surum.tar.gz + obs.desktop) + +derle() { +cd $isim-$surum + mkdir -p build; cd build + + cmake -DCMAKE_INSTALL_PREFIX="/usr" \ + -DOBS_VERSION_OVERRIDE="$surum-$devir" .. + + make + make install DESTDIR="$PKG" + mkdir -p $PKG/usr/share/applications + mv $SRC/obs.desktop $PKG/usr/share/applications/ +} diff --git a/talimatname/genel/o/ocaml-batteries/talimat b/talimatname/genel/o/ocaml-batteries/talimat new file mode 100644 index 000000000..f1b66a526 --- /dev/null +++ b/talimatname/genel/o/ocaml-batteries/talimat @@ -0,0 +1,24 @@ +# Tanım: OCaml için kapsamlı bir standart kütüphane +# URL: https://forge.ocamlcore.org/projects/batteries/ +# Paketçi: Cihan_Alkan +# Gerekler: ocaml-findlib ocamlbuild ocaml +# Grup: kütüphane + +isim=ocaml-batteries +surum=2.8.0 +devir=1 +kaynak=(https://github.com/ocaml-batteries-team/batteries-included/archive/v${surum}.tar.gz) + +derle() { + + cd $SRC/${isim/ocaml-/}-included-$surum + make all || return 1 + rm -f *.cma *.cmi *.cmo + make doc || return 1 + + mkdir -p $PKG/$(ocamlfind printconf destdir)/batteries $PKG/$(ocamlfind printconf destdir)/stublibs || return 1 + make DESTDIR=$PKG/$(ocamlfind printconf destdir)/ OCAMLFIND_DESTDIR=$PKG/$(ocamlfind printconf destdir)/ install || return 1 + make DOCROOT=$PKG/usr/share/doc/ocaml-batteries/ install-doc || return 1 + install -Dm 644 ocamlinit $PKG/usr/share/doc/ocaml-batteries/ocamlinit || return 1 + +} diff --git a/talimatname/genel/o/ocaml-biniou/talimat b/talimatname/genel/o/ocaml-biniou/talimat new file mode 100644 index 000000000..ae4d44abe --- /dev/null +++ b/talimatname/genel/o/ocaml-biniou/talimat @@ -0,0 +1,27 @@ +# Tanım: JSON için optimize edilmiş bir ayrıştırma ve baskı kitaplığı +# URL: https://github.com/mjambon/biniou +# Paketçi: Cihan_Alkan +# Gerekler: ocaml-findlib dune opam ocaml-easy-format +# Grup: kütüphane + +_pkgname=biniou +isim=ocaml-biniou +surum=1.2.0 +devir=1 +kaynak=(https://github.com/mjambon/biniou/archive/v$surum.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + + cd biniou-${surum} + make all + + # Initialize OPAM + export OPAMROOT="${SRC}"/opam + opam init -n + + # Work around missing install command + OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" jbuilder install + + # Install LICENSE + install -Dm644 "${SRC}"/opam/system/doc/${_pkgname}/LICENSE -t "${PKG}"/usr/share/licenses/${isim}/ +} diff --git a/talimatname/genel/o/ocaml-easy-format/talimat b/talimatname/genel/o/ocaml-easy-format/talimat new file mode 100644 index 000000000..7c9118c21 --- /dev/null +++ b/talimatname/genel/o/ocaml-easy-format/talimat @@ -0,0 +1,26 @@ +# Tanım: JSON için optimize edilmiş bir ayrıştırma ve baskı kitaplığı +# URL: https://github.com/mjambon/easy-format +# Paketçi: Cihan_Alkan +# Gerekler: glibc dune ocaml-findlib opam +# Grup: kütüphane + +isim=ocaml-easy-format +surum=1.3.1 +devir=1 +kaynak=(https://github.com/mjambon/easy-format/archive/v$surum.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + + cd easy-format-${surum} + make all + + # Initialize OPAM + export OPAMROOT="${SRC}"/opam + opam init -n + + # Work around missing install command + OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" jbuilder install + + # Install LICENSE + install -Dm644 "${SRC}"/opam/system/doc/easy-format/LICENSE -t "${PKG}"/usr/share/licenses/${isim}/ +} diff --git a/talimatname/genel/o/ocaml-findlib/talimat b/talimatname/genel/o/ocaml-findlib/talimat new file mode 100644 index 000000000..22612361c --- /dev/null +++ b/talimatname/genel/o/ocaml-findlib/talimat @@ -0,0 +1,23 @@ +# Tanım: O'Caml kütüphane yöneticisi +# URL: http://projects.camlcity.org/projects/findlib.html +# Paketçi: milisarge +# Gerekler: ocaml + +isim=ocaml-findlib +_isim=findlib +surum=1.7.1 +devir=1 +kaynak=(http://download.camlcity.org/download/${_name}-$surum.tar.gz) + +derle() { + + cd ${_name}-$surum + + ./configure -bindir /usr/bin \ + -config /etc/findlib.conf + + make -j1 all opt + make prefix="$PKG" install + install -m755 src/findlib/ocamlfind_opt "$pkgdir/usr/bin/" + +} diff --git a/talimatname/genel/o/ocaml-lablgl/talimat b/talimatname/genel/o/ocaml-lablgl/talimat new file mode 100644 index 000000000..fa33b9b3f --- /dev/null +++ b/talimatname/genel/o/ocaml-lablgl/talimat @@ -0,0 +1,31 @@ +# Tanım: O'Caml kütüphane yöneticisi +# URL: http://projects.camlcity.org/projects/findlib.html +# Paketçi: milisarge +# Gerekler: ocaml camlp4 xorg-glu xorg-libxi xorg-libxmu + +isim=ocaml-lablgl +_isim=lablgl +surum=1.05 +devir=1 +kaynak=(https://forge.ocamlcore.org/frs/download.php/1254/lablgl-$surum.tar.gz) + +derle() { + cd ${_name}-$surum + + sed 17d Makefile.config.linux.mdk > Makefile.config + make lib + make libopt + + make install BINDIR="$PKG/usr/bin/" \ + LIBDIR="$PKG/usr/lib/ocaml/" \ + DDLDIR="$PKG/usr/lib/ocaml/stublibs/" \ + INSTALLDIR="$PKG/usr/lib/ocaml/lablGL/" + + install -Dm644 src/lablgl.cmxa "$PKG"/usr/lib/ocaml/lablgl.cmxa + + # stublibs kütüphanelerini doğru konumlamak için + mv "$PKG/usr/lib/ocaml/stublibs" /tmp/temp.so + mkdir -p "$PKG/usr/lib/ocaml/stublibs" + mv /tmp/temp.so "$PKG/usr/lib/ocaml/stublibs/dlllablgl.so" + +} diff --git a/talimatname/genel/o/ocaml-lablgtk/talimat b/talimatname/genel/o/ocaml-lablgtk/talimat new file mode 100644 index 000000000..5f6025935 --- /dev/null +++ b/talimatname/genel/o/ocaml-lablgtk/talimat @@ -0,0 +1,40 @@ +# Tanım: O'Caml kütüphane yöneticisi +# URL: http://projects.camlcity.org/projects/findlib.html +# Paketçi: milisarge +# Gerekler: ocaml ocaml-findlib ocaml-lablgl gtk2 librsvg libglade gtksourceview2 xorg-mesa + +isim=ocaml-lablgtk +_isim=lablgtk +surum=2.18.5 +devir=1 +kaynak=(https://forge.ocamlcore.org/frs/download.php/1627/$isim-$surum.tar.gz) + +derle() { + cd ${_name}-$surum + export LD_LIBRARY_PATH=/usr/lib/ocaml/stublibs/:/usr/lib/ocaml/:${LD_LIBRARY_PATH} + + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib \ + --build=$ARCH-milis-linux \ + --with-glade \ + --with-rsvg \ + --with-gtksourceview2 + + sed -i -e "s/\\(CFLAGS = .*\\)/\\1 ${SLKCFLAGS}/" src/Makefile + sed -i -e "s/\\(CFLAGS += -O\\)/CFLAGS +=/" src/Makefile + + make -j1 world + #make DESTDIR=$PKG install + make install BINDIR="$PKG/usr/bin/" + mkdir -p "$PKG/usr/lib/ocaml/stublibs" + mv /usr/lib/ocaml/site-lib/lablgtk2 "$PKG/usr/lib/ocaml/" + cp src/dlllablglade2.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dlllablgtk2.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dlllablgtksourceview2.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dlllablrsvg.so "$PKG/usr/lib/ocaml/stublibs/" + # remove file conflicting with ocaml's ones + rm -f $PKG/usr/lib/ocaml/ld.conf + + +} diff --git a/talimatname/genel/o/ocaml-menhir/talimat b/talimatname/genel/o/ocaml-menhir/talimat new file mode 100644 index 000000000..dae08a6c1 --- /dev/null +++ b/talimatname/genel/o/ocaml-menhir/talimat @@ -0,0 +1,18 @@ +# Tanım: Menhir, OCaml için bir LR (1) ayrıştırıcı üreticisidir. +# URL: http://cristal.inria.fr/~fpottier/menhir/ +# Paketçi: Cihan_Alkan +# Gerekler: ocaml ocaml-findlib ocamlbuild +# Grup: programlama + +isim=ocaml-menhir +surum=20171222 +devir=1 +kaynak=(http://cristal.inria.fr/~fpottier/menhir/menhir-$surum.tar.gz) + +derle() { + cd "$SRC/${isim/ocaml-/}-$surum" + make PREFIX="/usr" all + export OCAMLFIND_DESTDIR="$PKG$(ocamlfind printconf destdir)" + install -dm 755 "$OCAMLFIND_DESTDIR" + make PREFIX="$PKG/usr" install +} diff --git a/talimatname/genel/o/ocaml-ocamlsdl/talimat b/talimatname/genel/o/ocaml-ocamlsdl/talimat new file mode 100644 index 000000000..e60cb9ba8 --- /dev/null +++ b/talimatname/genel/o/ocaml-ocamlsdl/talimat @@ -0,0 +1,25 @@ +# Tanım: O'Caml sdl kütüphanesi +# URL: https://sourceforge.net/projects/ocamlsdl/ +# Paketçi: milisarge +# Gerekler: ocaml ocaml-findlib ocaml-lablgl sdl sdl-ttf sdl-image sdl-mixer + +isim=ocaml-ocamlsdl +surum=0.9.1 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/ocamlsdl/OCamlSDL/${name#ocaml-}-${surum}/${name#ocaml-}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${name#ocaml-}-${surum}" + ./configure + make + export OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" + mkdir -p "$PKG/usr/lib/ocaml/stublibs" + mkdir -p "$PKG/usr/lib/ocaml/site-lib/sdl" + make install + mv "$PKG/usr/lib/ocaml/site-lib/sdl" "$PKG/usr/lib/ocaml/" + + cp src/dllsdlloaderstub.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dllsdlmixerstub.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dllsdlstub.so "$PKG/usr/lib/ocaml/stublibs/" + cp src/dllsdlttfstub.so "$PKG/usr/lib/ocaml/stublibs/" +} diff --git a/talimatname/genel/o/ocaml-pprint/talimat b/talimatname/genel/o/ocaml-pprint/talimat new file mode 100644 index 000000000..4fa5ef7aa --- /dev/null +++ b/talimatname/genel/o/ocaml-pprint/talimat @@ -0,0 +1,19 @@ +# Tanım: Wadler'in ve Leijen'in daha güzel yazıcısının bir OCaml uyarlaması. +# URL: http://gallium.inria.fr/~fpottier/pprint/doc/PPrint.OCaml.html +# Paketçi: Cihan_Alkan +# Gerekler: ocaml-findlib ocamlbuild +# Grup: kütüphane + +isim=ocaml-pprint +surum=20171003 +devir=1 +_oname=pprint +kaynak=(http://gallium.inria.fr/~fpottier/${_oname}/${_oname}-${surum}.tar.gz) + +derle() { + cd "$SRC/$_oname-$surum" + make -C src + export OCAMLFIND_DESTDIR="$PKG$(ocamlfind printconf destdir)" + install -dm 755 "$OCAMLFIND_DESTDIR" + make -C src install +} diff --git a/talimatname/genel/o/ocaml-stdint/talimat b/talimatname/genel/o/ocaml-stdint/talimat new file mode 100644 index 000000000..1d0f07389 --- /dev/null +++ b/talimatname/genel/o/ocaml-stdint/talimat @@ -0,0 +1,21 @@ +# Tanım: ocaml tamsayı kütüphanesi +# URL: https://github.com/andrenth/ocaml-stdint +# Paketçi: milisarge +# Gerekler: ocamlbuild ocaml-findlib +# Grup: kütüphane + +isim=ocaml-stdint +surum=0.5.0 +devir=1 +kaynak=(https://github.com/andrenth/ocaml-stdint/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + export OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" + ocaml setup.ml -configure --destdir "${PKG}" + make all + mkdir -p "${OCAMLFIND_DESTDIR}" + export OCAMLFIND_LDCONF=FOOBAR + ocaml setup.ml -install --destdir "$PKG" + rm -r "$PKG/usr/local" +} diff --git a/talimatname/genel/o/ocaml-yojson/talimat b/talimatname/genel/o/ocaml-yojson/talimat new file mode 100644 index 000000000..29076ab43 --- /dev/null +++ b/talimatname/genel/o/ocaml-yojson/talimat @@ -0,0 +1,26 @@ +# Tanım: JSON için optimize edilmiş bir ayrıştırma ve baskı kitaplığı +# URL: https://github.com/mjambon/yojson +# Paketçi: Cihan_Alkan +# Gerekler: ocaml-findlib ocamlbuild dune ocaml-easy-format cppo ocaml-biniou +# Grup: kütüphane + +_isim=yojson +isim=ocaml-yojson +surum=1.4.1 +devir=1 +kaynak=(https://github.com/mjambon/yojson/archive/v${surum}.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd ${_isim}-${surum} + make all + + # Initialize OPAM, this should be removed once opam is “removed” from dune + export OPAMROOT="${SRC}"/opam + opam init -n + + # Work around the install command + make OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" install + + # Install LICENSE + install -Dm644 "${SRC}"/opam/system/doc/${_isim}/LICENSE -t "${PKG}"/usr/share/licenses/${isim}/ +} diff --git a/talimatname/genel/o/ocaml/talimat b/talimatname/genel/o/ocaml/talimat new file mode 100644 index 000000000..322c996e0 --- /dev/null +++ b/talimatname/genel/o/ocaml/talimat @@ -0,0 +1,18 @@ +# Tanım: Caml, program güvenliği ve güvenilirliği göz önünde bulundurularak tasarlanmış genel amaçlı bir programlama dilidir. +# URL: http://caml.inria.fr/ +# Paketçi: milisarge +# Gerekler: + +isim=ocaml +surum=4.05.0 +devir=1 +kaynak=(http://caml.inria.fr/pub/distrib/$isim-${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure -prefix /usr -x11include /usr/include -no-graph + make -j1 world.opt + make PREFIX=$PKG/usr install +} + + diff --git a/talimatname/genel/o/ocamlbuild/talimat b/talimatname/genel/o/ocamlbuild/talimat new file mode 100644 index 000000000..67d4ecad9 --- /dev/null +++ b/talimatname/genel/o/ocamlbuild/talimat @@ -0,0 +1,17 @@ +# Tanım: ocaml derleme kurallarına göre derleme uygulaması +# URL: https://github.com/ocaml/ocamlbuild/ +# Paketçi: milisarge +# Gerekler: ocaml +# Grup: programlama + +isim=ocamlbuild +surum=0.12.0 +devir=1 +kaynak=(https://github.com/ocaml/${isim}/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + make configure + make + make install DESTDIR=$PKG +} diff --git a/talimatname/genel/o/ocrfeeder/talimat b/talimatname/genel/o/ocrfeeder/talimat new file mode 100644 index 000000000..17767e41c --- /dev/null +++ b/talimatname/genel/o/ocrfeeder/talimat @@ -0,0 +1,26 @@ +# Tanım: GTK + belge yerleşimi analizi ve optik karakter tanıma uygulaması +# URL: https://wiki.gnome.org/Apps/OCRFeeder +# Paketçi: Cihan_Alkan +# Gerekler: pyenchant python-gobject python-lxml python-pillow pyreportlab gtk3 goocanvas gtkspell ghostscript unpaper sane iso-codes intltool gnome-doc-utils python-gobject2 +# Grup: ofis_düzenleyici + +isim=ocrfeeder +surum=0.8.1 +devir=1 +kaynak=(https://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + + cd $isim-$surum + + # Python2 fix + sed -i 's@^#!.*python$@#!/usr/bin/python@' bin/ocrfeeder*.in src/ocrfeeder/odf/*.py + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + PYTHON=python + make + + make DESTDIR="$PKG" install + mkdir -p "$PKG/usr/share/pixmaps" + ln -s ../ocrfeeder/icons/ocrfeeder.svg "$PKG/usr/share/pixmaps/ocrfeeder.svg" +} diff --git a/talimatname/genel/o/ode/talimat b/talimatname/genel/o/ode/talimat new file mode 100644 index 000000000..07e6c2b4e --- /dev/null +++ b/talimatname/genel/o/ode/talimat @@ -0,0 +1,18 @@ +# Tanım: ODE, katı cisim dinamikleri simüle etmek için açık kaynak kodlu, yüksek performanslı bir kütüphanedir. +# URL: http://www.ode.org/ +# Paketçi: milisarge +# Gerekler: xorg-mesa + +isim=ode +surum=0.11.1 +devir=1 +kaynak=(http://download.sourceforge.net/opende/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/ogre/talimat b/talimatname/genel/o/ogre/talimat new file mode 100644 index 000000000..e92bbe52e --- /dev/null +++ b/talimatname/genel/o/ogre/talimat @@ -0,0 +1,48 @@ +# Tanım: Sahne tabanlı, esnek 3D motor C ++ ile yazılmıştır +# URL: http://www.ogre3d.org +# Paketçi: Cihan_Alkan +# Gerekler: boost cmake doxygen graphviz dejavu-ttf xorg-mesa mercurial python swig tinyxml sdl2 +# Grup: geliştirme + + +isim=ogre +surum=1.10.11 +devir=1 +kaynak=(https://github.com/OGRECave/ogre/archive/v${surum}.tar.gz) + +derle() { + + cd ogre-${surum} + + [[ -d build ]] && rm -rf build + mkdir build && cd build + + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DOGRE_INSTALL_SAMPLES=TRUE \ + -DOGRE_INSTALL_DOCS=TRUE \ + -DOGRE_INSTALL_SAMPLES_SOURCE=TRUE \ + -DOGRE_BUILD_DEPENDENCIES=FALSE \ + -DOGRE_BUILD_COMPONENT_PYTHON=TRUE \ + -DCMAKE_BUILD_TYPE=Release + + make + make OgreDoc + + make DESTDIR=${PKG} install + + mv ${PKG}/usr/bin/SampleBrowser ${PKG}/usr/bin/OgreSampleBrowser + install -Dm644 ../LICENSE ${PKG}/usr/share/licenses/${isim}/LICENSE + + # move docs out of this package + mv ${PKG}/usr/share/OGRE/docs ${SRC}/docs + + # move docs into this package + install -dm755 ${PKG}/usr/share/doc + mv ${SRC}/docs ${PKG}/usr/share/doc/OGRE/ + + # symlink for docs + install -dm755 ${PKG}/usr/share/OGRE/ + cd ${PKG}/usr/share + ln -s /usr/share/doc/OGRE/ OGRE/docs +} diff --git a/talimatname/genel/o/ois/gcc47.patch b/talimatname/genel/o/ois/gcc47.patch new file mode 100644 index 000000000..2727d9173 --- /dev/null +++ b/talimatname/genel/o/ois/gcc47.patch @@ -0,0 +1,56 @@ +diff -rup ois-v1-3/configure.ac patched/configure.ac +--- ois-v1-3/configure.ac 2010-04-04 13:51:08.000000000 -0400 ++++ patched/configure.ac 2013-01-30 20:33:38.461394645 -0500 +@@ -5,7 +5,7 @@ AC_INIT( [OIS], 1.3.0 ) + + AC_CANONICAL_TARGET + AM_INIT_AUTOMAKE( [OIS], 1.3.0 ) +-AM_CONFIG_HEADER([includes/config.h]) ++AC_CONFIG_HEADERS([includes/config.h]) + + dnl Check for programs + AC_PROG_CC +diff -rup ois-v1-3/demos/FFConsoleDemo.cpp patched/demos/FFConsoleDemo.cpp +--- ois-v1-3/demos/FFConsoleDemo.cpp 2010-03-31 23:38:04.000000000 -0400 ++++ patched/demos/FFConsoleDemo.cpp 2013-01-30 20:33:18.281393097 -0500 +@@ -7,6 +7,7 @@ + #include <ios> + #include <sstream> + #include <vector> ++#include <unistd.h> + + using namespace std; + +diff -rup ois-v1-3/demos/OISConsole.cpp patched/demos/OISConsole.cpp +--- ois-v1-3/demos/OISConsole.cpp 2010-08-15 18:51:34.000000000 -0400 ++++ patched/demos/OISConsole.cpp 2013-01-30 20:33:18.281393097 -0500 +@@ -12,6 +12,7 @@ + #include <iostream> + #include <vector> + #include <sstream> ++#include <unistd.h> + + ////////////////////////////////////Needed Windows Headers//////////// + #if defined OIS_WIN32_PLATFORM +diff -rup ois-v1-3/src/linux/LinuxForceFeedback.cpp patched/src/linux/LinuxForceFeedback.cpp +--- ois-v1-3/src/linux/LinuxForceFeedback.cpp 2010-03-31 23:06:55.000000000 -0400 ++++ patched/src/linux/LinuxForceFeedback.cpp 2013-01-30 20:33:18.284726761 -0500 +@@ -26,6 +26,7 @@ restrictions: + #include <cstdlib> + #include <errno.h> + #include <memory.h> ++#include <unistd.h> + + using namespace OIS; + +diff -rup ois-v1-3/src/linux/LinuxJoyStickEvents.cpp patched/src/linux/LinuxJoyStickEvents.cpp +--- ois-v1-3/src/linux/LinuxJoyStickEvents.cpp 2010-07-25 21:28:41.000000000 -0400 ++++ patched/src/linux/LinuxJoyStickEvents.cpp 2013-01-30 20:33:18.284726761 -0500 +@@ -33,6 +33,7 @@ restrictions: + #include <fcntl.h> //Needed to Open a file descriptor + #include <cassert> + #include <linux/input.h> ++#include <unistd.h> + + + #include <sstream> diff --git a/talimatname/genel/o/ois/talimat b/talimatname/genel/o/ois/talimat new file mode 100644 index 000000000..6ef5511c2 --- /dev/null +++ b/talimatname/genel/o/ois/talimat @@ -0,0 +1,25 @@ +# Tanım: Nesneye Yönelik Giriş Sistemi +# URL: http://sourceforge.net/projects/wgois +# Paketçi: Cihan_Alkan +# Gerekler: xorg-libxaw +# Grup: + +isim=ois +surum=1.3 +devir=1 +_oisver=${surum/./-} +kaynak=(https://downloads.sourceforge.net/project/wgois/Source%20Release/${surum}/ois_v${_oisver}.tar.gz + gcc47.patch) + +derle() { + + cd ${SRC}/${isim}-v${_oisver} + + patch -Np1 < ${SRC}/gcc47.patch + + chmod +x bootstrap + ./bootstrap + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/o/okular/talimat b/talimatname/genel/o/okular/talimat new file mode 100644 index 000000000..2f558bba8 --- /dev/null +++ b/talimatname/genel/o/okular/talimat @@ -0,0 +1,24 @@ +# Tanım: PDF Belge görüntüleyici +# URL: http://www.kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: git kf5-extra-cmake-modules kf5-khtml kf5-threadweaver kf5-kactivities kf5-kdelibs4support kf5-kpty plasma-libkscreen freetype poppler-qt5 libspectre djvulibre qca-qt5 libkexiv2 chmlib zlib ebook-tools kf5-kdoctools phonon-qt5 +# Grup: kde + +isim=okular +surum=17.12.0 +devir=1 + +kaynak=(https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DSYSCONF_INSTALL_DIR=/etc \ + -DPLUGIN_INSTALL_DIR=/usr/lib/qt5/plugins \ + -DLIB_INSTALL_DIR=lib \ + -Wno-dev + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/olsrd/talimat b/talimatname/genel/o/olsrd/talimat new file mode 100644 index 000000000..6cc6ac2ed --- /dev/null +++ b/talimatname/genel/o/olsrd/talimat @@ -0,0 +1,15 @@ +# Tanım: Optimized Link State Routing Protocol gerçeklemesi +# URL: http://www.olsr.org/mediawiki/index.php/Olsrd +# Paketçi: milisarge +# Gerekler: + +isim=olsrd +surum=0.9.6 +devir=1 +kaynak=(http://www.olsr.org/releases/0.9/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make prefix=/usr + make libdir=/usr/lib/olsrd sbindir=/usr/bin DESTDIR=${PKG} install +} diff --git a/talimatname/genel/o/omnikey_ifdokccid/talimat b/talimatname/genel/o/omnikey_ifdokccid/talimat new file mode 100644 index 000000000..3da14a415 --- /dev/null +++ b/talimatname/genel/o/omnikey_ifdokccid/talimat @@ -0,0 +1,22 @@ +# Tanım: HID Global OMNIKEY CardMan Akıllı Kart okuyucu serisi için CCID sürücüsü +# URL: http://www.hidglobal.com/ +# Paketçi: Cihan Alkan +# Gerekler: pcsc-lite libusb + +isim=omnikey_ifdokccid +surum=4.2.8 +devir=1 + +kaynak=(http://www.hidglobal.com/sites/hidglobal.com/files/drivers/ifdokccid_linux_x86_64-v$surum.tar.gz) + +derle() { +cd $SRC/ifdokccid_linux_x86_64-v$surum + mkdir -p $PKG/usr/lib/pcsc/drivers + cp -r ifdokccid_linux_x86_64-v$surum.bundle $PKG/usr/lib/pcsc/drivers + mkdir -p $PKG/etc + install -m0600 omnikey.ini $PKG/etc/omnikey.ini + mkdir -p $PKG/etc/udev/rules.d + install -m0644 z98_omnikey.rules $PKG/etc/udev/rules.d/z98_omnikey.rules + mkdir -p $PKG/usr/lib/udev + install -m0744 ok_pcscd_hotplug.sh $PKG/usr/lib/udev/ok_pcscd_hotplug.sh +} diff --git a/talimatname/genel/o/opal/talimat b/talimatname/genel/o/opal/talimat new file mode 100644 index 000000000..1c3a1d288 --- /dev/null +++ b/talimatname/genel/o/opal/talimat @@ -0,0 +1,19 @@ +# Tanım: Çok sayıda telefon protokolünü normalleştirmek için C ++ sınıf kütüphanesi +# URL: http://ftp.gnu.org/opal +# Paketçi: milisarge +# Gerekler: ptlib + +isim=opal +surum=3.10.10 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz + http://www.linuxfromscratch.org/patches/blfs/svn/$isim-$surum-ffmpeg2-1.patch) + +derle() { +cd $isim-$surum +patch -Np1 -i ../$isim-$surum-ffmpeg2-1.patch +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/opam/talimat b/talimatname/genel/o/opam/talimat new file mode 100644 index 000000000..e917d1a3f --- /dev/null +++ b/talimatname/genel/o/opam/talimat @@ -0,0 +1,18 @@ +# Tanım: Ocaml paket yöneticisi. +# URL: http://opam.ocaml.org +# Paketçi: milisarge +# Gerekler: aspcud ocaml unzip + +isim=opam +surum=1.2.2 +devir=1 +kaynak=(https://github.com/ocaml/opam/releases/download/$surum/opam-full-$surum.tar.gz::$isim-$surum.tar.xz) + +derle() { + cd "opam-full-$surum" + ./configure --prefix=/usr + make -j1 lib-ext all + make -C "$SRC/opam-full-$surum" DESTDIR="$PKG" install +} + + diff --git a/talimatname/genel/o/open-vm-tools-kernel/0001-Fix-vmxnet-module-on-kernels-3.16.patch b/talimatname/genel/o/open-vm-tools-kernel/0001-Fix-vmxnet-module-on-kernels-3.16.patch new file mode 100644 index 000000000..b7145d11b --- /dev/null +++ b/talimatname/genel/o/open-vm-tools-kernel/0001-Fix-vmxnet-module-on-kernels-3.16.patch @@ -0,0 +1,74 @@ +From 08836a47c56b47b658025e41a20027c5d915f836 Mon Sep 17 00:00:00 2001 +From: "Scott M. Kroll" <skroll@gmail.com> +Date: Fri, 15 Aug 2014 10:40:38 -0400 +Subject: [PATCH 1/3] Fix vmxnet module on kernels >= 3.16 + +* Add compat check for ethtool_ops in net_device struct. +* SET_ETHTOOL_OPS is no longer defined, but can be manually. +--- + open-vm-tools/modules/linux/shared/compat_netdevice.h | 4 ++++ + open-vm-tools/modules/linux/vmxnet/vmxnet.c | 13 ++++++++----- + 2 files changed, 12 insertions(+), 5 deletions(-) + +diff --git a/open-vm-tools/modules/linux/shared/compat_netdevice.h b/open-vm-tools/modules/linux/shared/compat_netdevice.h +index 3aec25b..a65d59b 100644 +--- a/open-vm-tools/modules/linux/shared/compat_netdevice.h ++++ b/open-vm-tools/modules/linux/shared/compat_netdevice.h +@@ -337,4 +337,8 @@ typedef netdev_features_t compat_netdev_features_t; + typedef u32 compat_netdev_features_t; + #endif + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) || defined(SET_ETHTOOL_OPS) ++#define VMW_HAVE_ETHTOOL_OPS 1 ++#endif ++ + #endif /* __COMPAT_NETDEVICE_H__ */ +diff --git a/open-vm-tools/modules/linux/vmxnet/vmxnet.c b/open-vm-tools/modules/linux/vmxnet/vmxnet.c +index 33afb9b..40abde5 100644 +--- a/open-vm-tools/modules/linux/vmxnet/vmxnet.c ++++ b/open-vm-tools/modules/linux/vmxnet/vmxnet.c +@@ -279,8 +279,7 @@ vmxnet_change_mtu(struct net_device *dev, int new_mtu) + + #endif + +- +-#ifdef SET_ETHTOOL_OPS ++#ifdef VMW_HAVE_ETHTOOL_OPS + /* + *---------------------------------------------------------------------------- + * +@@ -526,7 +525,7 @@ vmxnet_ethtool_ops = { + }; + + +-#else /* !defined(SET_ETHTOOL_OPS) */ ++#else /* !defined(VMW_HAVE_ETHTOOL_OPS) */ + + + /* +@@ -739,7 +738,7 @@ vmxnet_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + } + return -EOPNOTSUPP; + } +-#endif /* SET_ETHTOOL_OPS */ ++#endif /* !defined(VMW_HAVE_ETHTOOL_OPS) */ + + + /* +@@ -1142,8 +1141,12 @@ vmxnet_probe_device(struct pci_dev *pdev, // IN: vmxnet PCI device + dev->watchdog_timeo = VMXNET_WATCHDOG_TIMEOUT; + #endif + +-#ifdef SET_ETHTOOL_OPS ++#ifdef VMW_HAVE_ETHTOOL_OPS ++# ifdef SET_ETHTOOL_OPS + SET_ETHTOOL_OPS(dev, &vmxnet_ethtool_ops); ++# else ++ dev->ethtool_ops = &vmxnet_ethtool_ops; ++# endif + #else + dev->do_ioctl = vmxnet_ioctl; + #endif +-- +2.3.4 + diff --git a/talimatname/genel/o/open-vm-tools-kernel/0004-Support-backing-dev-info-kernel-4.0.patch b/talimatname/genel/o/open-vm-tools-kernel/0004-Support-backing-dev-info-kernel-4.0.patch new file mode 100644 index 000000000..bc74d1a9c --- /dev/null +++ b/talimatname/genel/o/open-vm-tools-kernel/0004-Support-backing-dev-info-kernel-4.0.patch @@ -0,0 +1,86 @@ +From 122f184d946a007a7ba3ae68386a20f33ed62e1e Mon Sep 17 00:00:00 2001 +From: lotan <lotan@gmx.de> +Date: Mon, 8 Jun 2015 14:20:06 +0200 +Subject: [PATCH] Support backing dev info kernel 4.0. + +--- + open-vm-tools/modules/linux/vmhgfs/filesystem.c | 16 ++++++++++++++++ + open-vm-tools/modules/linux/vmhgfs/module.h | 4 ++++ + open-vm-tools/modules/linux/vmhgfs/super.c | 3 +++ + 3 files changed, 23 insertions(+) + +diff --git a/open-vm-tools/modules/linux/vmhgfs/filesystem.c b/open-vm-tools/modules/linux/vmhgfs/filesystem.c +index 10dd8ab..3148091 100644 +--- a/open-vm-tools/modules/linux/vmhgfs/filesystem.c ++++ b/open-vm-tools/modules/linux/vmhgfs/filesystem.c +@@ -398,8 +398,21 @@ HgfsReadSuper(struct super_block *sb, // OUT: Superblock object + return PTR_ERR(si); + } + HGFS_SET_SB_TO_COMMON(sb, si); ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ memset(&si->bdi, 0, sizeof(si->bdi)); ++ result = bdi_setup_and_register(&si->bdi, "vmhgfs"); ++ if (result) { ++ kfree(si->shareName); ++ kfree(si); ++ } ++#endif ++ + sb->s_magic = HGFS_SUPER_MAGIC; + sb->s_op = &HgfsSuperOperations; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ sb->s_bdi = &si->bdi; ++#endif + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38) + sb->s_d_op = &HgfsDentryOperations; +@@ -439,6 +452,9 @@ HgfsReadSuper(struct super_block *sb, // OUT: Superblock object + exit: + if (result) { + dput(rootDentry); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ bdi_destroy(&si->bdi); ++#endif + kfree(si->shareName); + kfree(si); + } +diff --git a/open-vm-tools/modules/linux/vmhgfs/module.h b/open-vm-tools/modules/linux/vmhgfs/module.h +index b673dc1..f3eeffc 100644 +--- a/open-vm-tools/modules/linux/vmhgfs/module.h ++++ b/open-vm-tools/modules/linux/vmhgfs/module.h +@@ -29,6 +29,7 @@ + #include "driver-config.h" + + #include <asm/atomic.h> ++#include <linux/backing-dev.h> + #include "compat_fs.h" + #include "compat_semaphore.h" + #include "compat_slab.h" +@@ -144,6 +145,9 @@ typedef struct HgfsSuperInfo { + char *shareName; /* Mounted share name. */ + size_t shareNameLen; /* To avoid repeated strlen() calls. */ + uint32 mntFlags; /* HGFS mount flags */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ struct backing_dev_info bdi; ++#endif + } HgfsSuperInfo; + + /* +diff --git a/open-vm-tools/modules/linux/vmhgfs/super.c b/open-vm-tools/modules/linux/vmhgfs/super.c +index 04a2192..41f8713 100644 +--- a/open-vm-tools/modules/linux/vmhgfs/super.c ++++ b/open-vm-tools/modules/linux/vmhgfs/super.c +@@ -152,6 +152,9 @@ HgfsPutSuper(struct super_block *sb) // IN: The superblock + + si = HGFS_SB_TO_COMMON(sb); + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ bdi_destroy(&si->bdi); ++#endif + kfree(si->shareName); + kfree(si); + } +-- +2.3.6 + diff --git a/talimatname/genel/o/open-vm-tools-kernel/0005-Remove-new_sync-for-Linux-4.1.patch b/talimatname/genel/o/open-vm-tools-kernel/0005-Remove-new_sync-for-Linux-4.1.patch new file mode 100644 index 000000000..f51278be5 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools-kernel/0005-Remove-new_sync-for-Linux-4.1.patch @@ -0,0 +1,27 @@ +From fbb6fe5ec57a2a0a9464ec5c433fc18793ebb05f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?D=C4=81vis?= <davispuh@gmail.com> +Date: Thu, 17 Sep 2015 18:05:29 +0300 +Subject: [PATCH] Remove new_sync for Linux >= 4.1 + +--- + open-vm-tools/modules/linux/vmhgfs/file.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/open-vm-tools/modules/linux/vmhgfs/file.c b/open-vm-tools/modules/linux/vmhgfs/file.c +index 0bc5ee3..ada3eee 100644 +--- a/open-vm-tools/modules/linux/vmhgfs/file.c ++++ b/open-vm-tools/modules/linux/vmhgfs/file.c +@@ -169,8 +169,10 @@ struct file_operations HgfsFileFileOperations = { + .flush = HgfsFlush, + #if defined VMW_USE_AIO + #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0) + .read = new_sync_read, + .write = new_sync_write, ++#endif // LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0) + .read_iter = HgfsFileRead, + .write_iter = HgfsFileWrite, + #else // LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) +--- +2.5.2 + diff --git a/talimatname/genel/o/open-vm-tools-kernel/0006-vmhgfs-support-linux-4.2.x-kernel.patch b/talimatname/genel/o/open-vm-tools-kernel/0006-vmhgfs-support-linux-4.2.x-kernel.patch new file mode 100644 index 000000000..4fa315cb5 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools-kernel/0006-vmhgfs-support-linux-4.2.x-kernel.patch @@ -0,0 +1,93 @@ +From b3a634a491da35d47a5e6e6120a21cba514fc3ec Mon Sep 17 00:00:00 2001 +From: JackM +Date: Wed, 30 Sep 2015 23:16:40 +0300 +Subject: [PATCH] vmhgfs support linux 4.2.x kernel + +--- + modules/linux/vmhgfs/link.c | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +diff --git a/open-vm-tools/modules/linux/vmhgfs/link.c b/open-vm-tools/modules/linux/vmhgfs/link.c +index 06f693b..72e97ff 100644 +--- a/open-vm-tools/modules/linux/vmhgfs/link.c ++++ b/open-vm-tools/modules/linux/vmhgfs/link.c +@@ -35,7 +35,9 @@ + #include "vm_assert.h" + + /* HGFS symlink operations. */ +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++static void *HgfsFollowlink(struct dentry *dentry, void **cookie, struct nameidata *nd); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) + static void *HgfsFollowlink(struct dentry *dentry, + struct nameidata *nd); + #else +@@ -45,7 +47,10 @@ static int HgfsFollowlink(struct dentry *dentry, + static int HgfsReadlink(struct dentry *dentry, + char __user *buffer, + int buflen); +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++static void HgfsPutlink(struct dentry *dentry, ++ void *cookie); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) + static void HgfsPutlink(struct dentry *dentry, + struct nameidata *nd, + void *cookie); +@@ -85,7 +90,9 @@ struct inode_operations HgfsLinkInodeOperations = { + *---------------------------------------------------------------------- + */ + +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++static void *HgfsFollowlink(struct dentry *dentry, void **cookie, struct nameidata *nd) ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) + static void * + HgfsFollowlink(struct dentry *dentry, // IN: Dentry containing link + struct nameidata *nd) // OUT: Contains target dentry +@@ -124,7 +131,11 @@ HgfsFollowlink(struct dentry *dentry, // IN: Dentry containing link + } else { + LOG(6, (KERN_DEBUG "VMware hgfs: %s: calling nd_set_link %s\n", + __func__, fileName)); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++ *cookie = fileName; ++#else + nd_set_link(nd, fileName); ++#endif + } + } + out: +@@ -219,7 +230,10 @@ HgfsReadlink(struct dentry *dentry, // IN: Dentry containing link + *---------------------------------------------------------------------- + */ + +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++static void HgfsPutlink(struct dentry *dentry, ++ void *cookie) ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13) + static void + HgfsPutlink(struct dentry *dentry, // dentry + struct nameidata *nd, // lookup name information +@@ -235,11 +249,17 @@ HgfsPutlink(struct dentry *dentry, // dentry + LOG(6, (KERN_DEBUG "VMware hgfs: %s: put for %s\n", + __func__, dentry->d_name.name)); + +- fileName = nd_get_link(nd); ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) ++ fileName = cookie; ++#else ++ fileName = nd_get_link(nd); ++#endif + if (!IS_ERR(fileName)) { + LOG(6, (KERN_DEBUG "VMware hgfs: %s: putting %s\n", + __func__, fileName)); + kfree(fileName); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) + nd_set_link(nd, NULL); ++#endif + } + } +-- +2.5.0.windows.1 + diff --git a/talimatname/genel/o/open-vm-tools-kernel/talimat b/talimatname/genel/o/open-vm-tools-kernel/talimat new file mode 100644 index 000000000..92fe65bc6 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools-kernel/talimat @@ -0,0 +1,33 @@ +# Tanım: Open Virtual Machine Tools kernel modules +# URL: http://open-vm-tools.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: kernel +# Grup: + +isim=open-vm-tools-kernel +_isim=open-vm-tools +surum=10.0.0 +_altsurum=3000743 +_surum="${surum}-${_altsurum}" +_tamisim="${_isim}-${_surum}" +_dkms_surum='2015.01.29' +devir=1 +kaynak=(http://downloads.sourceforge.net/open-vm-tools/open-vm-tools-10.0.0-3000743.tar.gz + 0001-Fix-vmxnet-module-on-kernels-3.16.patch + 0004-Support-backing-dev-info-kernel-4.0.patch + 0005-Remove-new_sync-for-Linux-4.1.patch + 0006-vmhgfs-support-linux-4.2.x-kernel.patch) + +derle() { + patch -d "$SRC/${_tamisim}" -Np2 -i "$SRC/0001-Fix-vmxnet-module-on-kernels-3.16.patch" + patch -d "$SRC/${_tamisim}" -Np2 -i "$SRC/0004-Support-backing-dev-info-kernel-4.0.patch" + patch -d "$SRC/${_tamisim}" -Np2 -i "$SRC/0005-Remove-new_sync-for-Linux-4.1.patch" + patch -d "$SRC/${_tamisim}" -Np2 -i "$SRC/0006-vmhgfs-support-linux-4.2.x-kernel.patch" + cd "$SRC/${_tamisim}" + [ -f /usr/src/linux-$(uname -r)/vmlinux ] && rm /usr/src/linux-$(uname -r)/vmlinux + sed -i "s/${_dkms_surum}/${surum}/g" ./modules/linux/dkms.sh + sh ./modules/linux/dkms.sh ./ "${PKG}/usr/src" + for _module in {"vmblock","vmci","vmsync","vsock"}; do + rm -rf "${PKG}/usr/src/${_isim}-${surum}/${_module}" + done +} diff --git a/talimatname/genel/o/open-vm-tools/0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch b/talimatname/genel/o/open-vm-tools/0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch new file mode 100644 index 000000000..61811419d --- /dev/null +++ b/talimatname/genel/o/open-vm-tools/0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch @@ -0,0 +1,83 @@ +From c5bc784da611ee929e0da7c20a410e03e6540613 Mon Sep 17 00:00:00 2001 +From: Oliver Kurth <okurth@vmware.com> +Date: Fri, 26 Jan 2018 15:04:36 -0800 +Subject: [PATCH] Set X11 as the backend for gtk3 of open-vm-tools + +Open-vm-tools defaults to gtk3. For distros like Fedora 27, Wayland is +the default display server. With no restriction on the backend, plugins +will try to use Wayland as the backend of Gtk+3. As a result, +gdk_display_get_default() returns a Wayland display; +gdk_display_get_default_group() also returns a Wayland window. Applying +GDK_WINDOW_XID() on the Wayland window will result in the crash reported +on recent Linux releases that default to a Wayland display server. + +As X11-specific code is widely used in tools plugins, a migratation to +Wayland in the short term is not possible. So, as a compromised solution, +plugins can be forced to run on XWayland, which is the compatible mode +of Wayland for legacy X11 clients. + +gdk_set_allowed_backends() only applies when flag GTK3 is defined, and Gtk +version cwgreater than 3.10. +--- + open-vm-tools/services/plugins/desktopEvents/x11Lock.c | 12 +++++++++++- + open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp | 14 +++++++++++++- + 2 files changed, 24 insertions(+), 2 deletions(-) + +diff --git a/open-vm-tools/services/plugins/desktopEvents/x11Lock.c b/open-vm-tools/services/plugins/desktopEvents/x11Lock.c +index 572234ac..613b6946 100644 +--- a/open-vm-tools/services/plugins/desktopEvents/x11Lock.c ++++ b/open-vm-tools/services/plugins/desktopEvents/x11Lock.c +@@ -1,5 +1,5 @@ + /********************************************************* +- * Copyright (C) 2010-2016 VMware, Inc. All rights reserved. ++ * Copyright (C) 2010-2018 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published +@@ -364,6 +364,16 @@ X11Lock_Init(ToolsAppCtx *ctx, + g_set_prgname(VMUSER_TITLE); + argv[0] = VMUSER_TITLE; + ++#if GTK_MAJOR_VERSION > 3 || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 10) ++ /* ++ * On recent distros, Wayland is the default display server. If the obtained ++ * display or window is a wayland one, applying X11 specific functions on them ++ * will result in crashes. Before migrating the X11 specific code to Wayland, ++ * force using X11 as the backend of Gtk+3. gdk_set_allowed_backends() is ++ * introduced since Gtk+3.10 and Wayland is supported from Gtk+3.10. ++ */ ++ gdk_set_allowed_backends("x11"); ++#endif + /* XXX: is calling gtk_init() multiple times safe? */ + gtk_init(&argc, (char ***) &argv); + +diff --git a/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp b/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp +index fffdc402..4c2f3d8d 100644 +--- a/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp ++++ b/open-vm-tools/services/plugins/dndcp/copyPasteDnDX11.cpp +@@ -1,5 +1,5 @@ + /********************************************************* +- * Copyright (C) 2010-2016 VMware, Inc. All rights reserved. ++ * Copyright (C) 2010-2018 VMware, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published +@@ -211,6 +211,18 @@ gboolean + CopyPasteDnDX11::Init(ToolsAppCtx *ctx) + { + TRACE_CALL(); ++ ++#if GTK_MAJOR_VERSION > 3 || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 10) ++ /* ++ * On recent distros, Wayland is the default display server. If the obtained ++ * display or window is a wayland one, applying X11 specific functions on them ++ * will result in crashes. Before migrating the X11 specific code to Wayland, ++ * force using X11 as the backend of Gtk+3. gdk_set_allowed_backends() is ++ * introduced since Gtk+3.10 and Wayland is supported from Gtk+3.10. ++ */ ++ gdk_set_allowed_backends("x11"); ++#endif ++ + CopyPasteDnDWrapper *wrapper = CopyPasteDnDWrapper::GetInstance(); + + ASSERT(ctx); diff --git a/talimatname/genel/o/open-vm-tools/README b/talimatname/genel/o/open-vm-tools/README new file mode 100644 index 000000000..3de139860 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools/README @@ -0,0 +1,45 @@ +README for open-vm-tools + +INTRODUCTION + +This port contains VMware Tools. You should install it if you are running CRUX +as a virtual machine under the VMware hypervisor. +This has only been tested on single core 32-bit virtual machines. +The VMware filesystem (vmhgfs) has not been tested. +Feedback is appreciated. + +POST-INSTALL + +1. Run the post-install script. +2. Add vmtools to the list of services to start at boot time. + +FAQ + +Q: What is the difference between this and the official commercial VMware Tools + distribution? + +A: This code comes from the GPL release of VMware's tools, so in theory + it should work just as the commercial version. + That said, since this port is intended to be used on a server environment, + all the desktop utilities have been removed (eg: no GUI applications). + +Q: Where is the driver for the VMware network adapter and disk controller? + +A: Some device drivers are already included in the Linux kernel and disabled + in this port. + Please enable these kernel options: + * CONFIG_VMWARE_BALLOON + * CONFIG_VMWARE_PVSCSI + * CONFIG_VMXNET3 + If your boot filesystem is connected to a paravirtual SCSI interface make + sure CONFIG_VMWARE_PVSCSI is set as builtin instead of module. + + +Q: Why do I have to shutdown/reboot twice my VM from VMware before it reacts? + +A: Did you run the post-install script? + + +-- +If you have any feedback/problems please email me: +Alan Mizrahi, alan at mizrahi dot com dot ve diff --git a/talimatname/genel/o/open-vm-tools/talimat b/talimatname/genel/o/open-vm-tools/talimat new file mode 100644 index 000000000..07433c0d2 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools/talimat @@ -0,0 +1,32 @@ +# Tanım: VMWare Araçları +# URL: http://open-vm-tools.sf.net/ +# Paketçi: milisarge +# Gerekler: chrpath libdnet glib libmspack cunit xorg-libx11 xorg-libxext xorg-libxinerama xorg-libxi xorg-libxrender xorg-libxrandr xorg-libxtst gdk-pixbuf gtk3 gtkmm3 + +isim=open-vm-tools +surum=10.2.0 +devir=1 +kaynak=(https://github.com/vmware/open-vm-tools/archive/stable-${surum/_/-}.tar.gz::open-vm-tools-$surum.tar.gz + 0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch) + +derle(){ + cd "$SRC/$isim-"*"/open-vm-tools" + patch -Np2 < "${SRC}"/0001-Set-X11-as-the-backend-for-gtk3-of-open-vm-tools.patch + cd "$SRC/$isim-"*"/open-vm-tools" + autoreconf -vi + sh ./configure --prefix=/usr \ + --sbindir=/usr/bin \ + --sysconfdir=/etc \ + --with-udev-rules-dir=/usr/lib/udev/rules.d \ + --without-xmlsecurity \ + --without-kernel-modules + make + cd "$SRC/$isim-"*"/open-vm-tools" + make install DESTDIR="$PKG" + chmod 7755 "$PKG"/usr/bin/vmware-user-suid-wrapper + # install vmware-xdg-detect-de + install -D -m 0755 scripts/common/vmware-xdg-detect-de "$PKG"/usr/bin/vmware-xdg-detect-de + # We don't want a symlink in /sbin + rm "$PKG"/sbin/mount.vmhgfs + rmdir "$PKG"/sbin +} diff --git a/talimatname/genel/o/open-vm-tools/tools.conf b/talimatname/genel/o/open-vm-tools/tools.conf new file mode 100644 index 000000000..7fe284131 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools/tools.conf @@ -0,0 +1,11 @@ +[logging] +log=syslog +level=warning +vmsvc.level=warning +vmsvc.data=/var/log/vmware-vmsvc.log +vmusr.handler=syslog +vmusr.level=warning +vmusr.data=/var/log/vmware-vmsvc.log.user + +[vmsvc] +disable-tools-surum=true diff --git a/talimatname/genel/o/open-vm-tools/vmtools.rc b/talimatname/genel/o/open-vm-tools/vmtools.rc new file mode 100755 index 000000000..71db6e4f4 --- /dev/null +++ b/talimatname/genel/o/open-vm-tools/vmtools.rc @@ -0,0 +1,77 @@ +#!/bin/bash + +NAME=vmtools +USER=root +CONFIG="/etc/vmware-tools/tools.conf" +RUNDIR="/var/run" +PIDFILE="$RUNDIR/vmtoolsd.pid" +STARTCMD="/usr/bin/vmtoolsd --config=$CONFIG --background=$PIDFILE" +STOPCMD="" +STOPTIMEOUT=300 + +function getpid() { + if [ -z "$PIDFILE" ]; then + pid="$(pgrep -xfn "$STARTCMD")" + else + if [ -f "$PIDFILE" ]; then + pid=$(< $PIDFILE) + if [ ! -d /proc/"$pid" ]; then + echo "$NAME: removing stale pidfile $PIDFILE" >&2 + rm -f "$PIDFILE" + unset pid + fi + fi + fi + echo "$pid" +} + +case $1 in +start) + pid=$(getpid) + install -d -m 755 -o $USER $RUNDIR || exit 1 + if [ -n "$pid" ]; then + echo "$NAME already running with pid $pid" >&2 + exit 1 + fi + eval "$STARTCMD" + ;; +stop) + pid=$(getpid) + if [ -n "$pid" ]; then + if [ -n "$STOPCMD" ]; then + eval "$STOPCMD" + else + kill "$pid" + fi + t=$(printf '%(%s)T' -1) + tend=$((t+STOPTIMEOUT)) + while [ -d /proc/$pid -a $t -lt $tend ]; do + sleep 0.5 + t=$(printf '%(%s)T' -1) + done + if [ -d /proc/"$pid" ]; then + echo "$NAME still running with pid $pid" >&2 + else + [ -n "$PIDFILE" ] && rm -f "$PIDFILE" + fi + else + echo "$NAME is not running" >&2 + fi + ;; +restart) + $0 stop + $0 start + ;; +status) + pid=$(getpid) + if [ -n "$pid" ]; then + echo "$NAME is running with pid $pid" + else + echo "$NAME is not running" + fi + ;; +*) + echo "usage: $0 [start|stop|restart|status]" + ;; +esac + diff --git a/talimatname/genel/o/openal/talimat b/talimatname/genel/o/openal/talimat new file mode 100644 index 000000000..1d07dd336 --- /dev/null +++ b/talimatname/genel/o/openal/talimat @@ -0,0 +1,24 @@ +# Tanım: OpenAL Soft, OpenAL 3D ses API'sinin LGPL lisanslı, çapraz platformlu bir yazılım uygulamasıdır. +# URL: http://kcat.strangesoft.net/openal.html +# Paketçi: milisarge +# Gerekler: alsa-lib cmake + +isim=openal +surum=1.16.0 +devir=1 +kaynak=(http://kcat.strangesoft.net/openal-releases/openal-soft-$surum.tar.bz2 ) + +derle() { +cd openal-soft-$surum/build + +cmake ../ \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DOSS=OFF \ + -DEXAMPLES=OFF \ + -DCMAKE_BUILD_TYPE=Release #-DCMAKE_VERBOSE_MAKEFILE=true + +make +make DESTDIR=$PKG install +} + + diff --git a/talimatname/genel/o/openboard/openboard.desktop b/talimatname/genel/o/openboard/openboard.desktop new file mode 100644 index 000000000..c119668bf --- /dev/null +++ b/talimatname/genel/o/openboard/openboard.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=OpenBoard +Comment=Okullar ve üniversiteler için interaktif beyaz tahta yazılımı +Exec=openboard %f +Icon=/opt/openboard/OpenBoard.png +StartupNotify=true +Terminal=false +MimeType=application/ubz +Categories=Education; diff --git a/talimatname/genel/o/openboard/qchar.patch b/talimatname/genel/o/openboard/qchar.patch new file mode 100644 index 000000000..c9f6bff1b --- /dev/null +++ b/talimatname/genel/o/openboard/qchar.patch @@ -0,0 +1,12 @@ +diff -u -ubr a/src/core/UBTextTools.cpp b/src/core/UBTextTools.cpp +--- a/src/core/UBTextTools.cpp 2017-05-09 15:59:42.177965830 +0200 ++++ b/src/core/UBTextTools.cpp 2017-05-09 16:00:08.547747097 +0200 +@@ -34,7 +34,7 @@ + + + for(int i = 0; i < _html.length(); i+=1){ +- if(_html.at(i) != '\0') ++ if(_html.at(i) != QChar('\0')) + clean.append(_html.at(i)); + } + return clean; diff --git a/talimatname/genel/o/openboard/qtmultimediadefs.patch b/talimatname/genel/o/openboard/qtmultimediadefs.patch new file mode 100644 index 000000000..76469af18 --- /dev/null +++ b/talimatname/genel/o/openboard/qtmultimediadefs.patch @@ -0,0 +1,13 @@ +diff -u -ubr a/src/domain/UBGraphicsMediaItemDelegate.h b/src/domain/UBGraphicsMediaItemDelegate.h +--- a/src/domain/UBGraphicsMediaItemDelegate.h 2017-05-09 16:15:51.919921697 +0200 ++++ b/src/domain/UBGraphicsMediaItemDelegate.h 2017-05-09 16:08:00.763830080 +0200 +@@ -32,7 +32,8 @@ + + #include <QtGui> + #include <QTimer> +-#include <QtMultimedia> ++//#include <QtMultimedia> ++#include <QMediaPlayer> + + #include "core/UB.h" + #include "UBGraphicsItemDelegate.h" diff --git a/talimatname/genel/o/openboard/ssl10.patch b/talimatname/genel/o/openboard/ssl10.patch new file mode 100644 index 000000000..e5acf0286 --- /dev/null +++ b/talimatname/genel/o/openboard/ssl10.patch @@ -0,0 +1,19 @@ +--- a/OpenBoard.pro 2017-02-26 00:44:23.000000000 +0100 ++++ b/OpenBoard.pro 2017-05-09 15:58:37.448502744 +0200 +@@ -44,6 +44,7 @@ + QT += core + + INCLUDEPATH += src ++INCLUDEPATH = "/usr/include/openssl-1.0" + $${INCLUDEPATH} + + include($$THIRD_PARTY_PATH/libs.pri) + include(src/adaptors/adaptors.pri) +@@ -400,7 +401,7 @@ + + linux-g++* { + CONFIG += link_prl +- LIBS += -lcrypto ++ LIBS += -l:libcrypto.so.1.0.0 + #LIBS += -lprofiler + LIBS += -lX11 + QMAKE_CFLAGS += -fopenmp diff --git a/talimatname/genel/o/openboard/talimat b/talimatname/genel/o/openboard/talimat new file mode 100644 index 000000000..97e0f93bc --- /dev/null +++ b/talimatname/genel/o/openboard/talimat @@ -0,0 +1,67 @@ +# Tanım: Okullar ve üniversiteler için interaktif beyaz tahta yazılımı +# URL: http://openboard.ch/index.en.html +# Paketçi: Cihan_Alkan +# Gerekler: qt5 libpaper qt5-webkit +# Grup: eğitim + +isim=openboard +surum=1.3.6 +devir=1 + +kaynak=(https://github.com/OpenBoard-org/OpenBoard/archive/v$surum.tar.gz::$isim-$surum.tar.gz + https://github.com/OpenBoard-org/OpenBoard-ThirdParty/archive/master.tar.gz::OpenBoard-ThirdParty-master.tar.gz + ssl10.patch + qchar.patch + qtmultimediadefs.patch + openboard.desktop) + + +derle() { + + rm -rf $SRC/OpenBoard-ThirdParty + mv $SRC/OpenBoard-ThirdParty-master $SRC/OpenBoard-ThirdParty + + cd $SRC/OpenBoard-$surum + patch -p1 < $SRC/ssl10.patch + patch -p1 < $SRC/qchar.patch + patch -p1 < $SRC/qtmultimediadefs.patch + cd $SRC/OpenBoard-ThirdParty + + cd freetype + qmake-qt5 freetype.pro -spec linux-g++ + make + cd .. + + cd quazip + qmake-qt5 quazip.pro -spec linux-g++ + make + cd .. + + cd xpdf/xpdf-3.04 + ./configure --with-freetype2-library="../../freetype/lib/linux" --with-freetype2-includes="../../freetype/freetype-2.6.1/include" + cd .. + qmake-qt5 xpdf.pro -spec linux-g++ + make + cd .. + + cd "$SRC/OpenBoard-$surum" + qmake-qt5 OpenBoard.pro -spec linux-g++ + make + + mkdir -p $PKG/opt/openboard + + for i in customizations etc i18n library; do + cp -rp $SRC/OpenBoard-$surum/resources/$i $PKG/opt/openboard; + done + + cp -rp $SRC/OpenBoard-$surum/resources/images/OpenBoard.png $PKG/opt/openboard/ + cp -rp build/linux/release/product/OpenBoard $PKG/opt/openboard/ + + mkdir -p $PKG/usr/share/applications + cp -rp $SRC/openboard.desktop $PKG/usr/share/applications + + mkdir -p $PKG/usr/bin + ln -s /opt/openboard/OpenBoard $PKG/usr/bin/openboard + /usr/lib/qt5/bin/lrelease $PKG/opt/openboard/i18n/OpenBoard_tr.ts -qm $PKG/opt/openboard/i18n/OpenBoard_tr.qm +} + diff --git a/talimatname/genel/o/openbox/openbox.kur-kos b/talimatname/genel/o/openbox/openbox.kur-kos new file mode 100755 index 000000000..f6a382286 --- /dev/null +++ b/talimatname/genel/o/openbox/openbox.kur-kos @@ -0,0 +1 @@ +echo "export TERM='xterm' " >> /root/.bashrc diff --git a/talimatname/genel/o/openbox/openbox.xinitrc b/talimatname/genel/o/openbox/openbox.xinitrc new file mode 100644 index 000000000..485218d82 --- /dev/null +++ b/talimatname/genel/o/openbox/openbox.xinitrc @@ -0,0 +1,2 @@ +dbus-launch --exit-with-session & +openbox-session \ No newline at end of file diff --git a/talimatname/genel/o/openbox/talimat b/talimatname/genel/o/openbox/talimat new file mode 100644 index 000000000..156726ba9 --- /dev/null +++ b/talimatname/genel/o/openbox/talimat @@ -0,0 +1,24 @@ +# Tanım: Openbox oldukça yapılandırılabilir bir pencere yöneticisi. +# URL: http://openbox.org/wiki/Main_Page +# Paketçi: milisarge +# Gerekler: xorg pcre pango freetype libpng xorg-fontconfig harfbuzz dbus imlib2 librsvg startup-notification xcb-util libxcb libxml2 dbus + +isim=openbox +surum=3.6.1 +devir=1 + +kaynak=(http://openbox.org/dist/openbox/$isim-$surum.tar.gz \ + openbox.xinitrc) + +derle() +{ + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --docdir=/usr/share/doc/$isim-$surum + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/doc + install -D -m644 ../openbox.xinitrc $PKG/etc/X11/dm/openbox.xinitrc + +} diff --git a/talimatname/genel/o/opencolorio/talimat b/talimatname/genel/o/opencolorio/talimat new file mode 100644 index 000000000..0af01d68c --- /dev/null +++ b/talimatname/genel/o/opencolorio/talimat @@ -0,0 +1,21 @@ +# Tanım: Görsel efektler ve animasyon için bir renk yönetimi çerçevesi +# URL: http://opencolorio.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: python cmake + + +isim=opencolorio +surum=1.0.9 +devir=1 + +kaynak=(https://github.com/imageworks/OpenColorIO/archive/v$surum.tar.gz) + +derle() { +cd OpenColorIO-$surum +mkdir build +cd build + +cmake -DCMAKE_INSTALL_PREFIX=/usr .. +make +make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/o/openconnect/talimat b/talimatname/genel/o/openconnect/talimat new file mode 100644 index 000000000..638f85b67 --- /dev/null +++ b/talimatname/genel/o/openconnect/talimat @@ -0,0 +1,21 @@ +# Tanım: SSL VPN istemcisi. +# URL: http://infradead.org/openconnect +# Paketçi: milisarge +# Gerekler: libxml2 openssl pkg-config vpnc zlib + +isim=openconnect +surum=7.06 +devir=1 +kaynak=(ftp://ftp.infradead.org/pub/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --bindir=/usr/bin \ + --mandir=/usr/share/man \ + --disable-static + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/opencore-amr/talimat b/talimatname/genel/o/opencore-amr/talimat new file mode 100644 index 000000000..53f4b276c --- /dev/null +++ b/talimatname/genel/o/opencore-amr/talimat @@ -0,0 +1,17 @@ +# Tanım: Adaptive Multi Rate (AMR) konuşma codec'inin açık kaynak uygulaması +# URL: http://opencore-amr.sourceforge.net/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=opencore-amr +surum=0.1.3 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/openct/talimat b/talimatname/genel/o/openct/talimat new file mode 100644 index 000000000..66e9c1e6f --- /dev/null +++ b/talimatname/genel/o/openct/talimat @@ -0,0 +1,29 @@ +# Tanım: Implements drivers for several smart card readers +# URL: https://github.com/OpenSC/openct/ +# Paketçi: milisarge +# Gerekler: doxygen pcsc-lite libusb-compat + +isim=openct +surum=0.6.20 +devir=1 +kaynak=(https://github.com/OpenSC/openct/archive/openct-$surum.tar.gz + udev-sleep.patch) + +derle() { + cd $isim-$isim-$surum + patch -p1 -i "${SRC}/udev-sleep.patch" + ./bootstrap + ./configure --prefix=/usr \ + --sbindir=/usr/bin \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --with-udev=/usr/lib/udev \ + --enable-usb \ + --enable-pcsc \ + --disable-static + + make + install -d "$PKG"/etc + make DESTDIR="$PKG" install + install -D etc/openct.udev "$PKG"/usr/lib/udev/rules.d/95-openct.rules +} diff --git a/talimatname/genel/o/openct/udev-sleep.patch b/talimatname/genel/o/openct/udev-sleep.patch new file mode 100644 index 000000000..0e604be1f --- /dev/null +++ b/talimatname/genel/o/openct/udev-sleep.patch @@ -0,0 +1,11 @@ +--- openct-0.6.20/etc/openct.udev.in.orig 2012-06-01 10:50:32.419033188 +0300 ++++ openct-0.6.20/etc/openct.udev.in 2012-06-01 10:50:51.225616679 +0300 +@@ -22,7 +22,7 @@ + # 2010-01-06 removed, as latest udev doesn't know WAIT_FOR_ATTR any more. + + # sleep for 100ms - the wait_for_sysfs might not be enough +-PROGRAM="/bin/sleep 0.1" ++PROGRAM="/usr/bin/sleep 0.1" + + # ccid + ATTR{bInterfaceClass}=="0b", ATTR{bInterfaceSubClass}=="00", ATTR{bInterfaceProtocol}=="00", ATTRS{idVendor}=="?*" RUN+="@udevdir@/openct_usb /dev/$parent" diff --git a/talimatname/genel/o/opencv/talimat b/talimatname/genel/o/opencv/talimat new file mode 100644 index 000000000..04b81fcdb --- /dev/null +++ b/talimatname/genel/o/opencv/talimat @@ -0,0 +1,59 @@ +# Tanım: OpenCV (Açık Kaynaklı Bilgisayar Vizyon Kütüphanesi) açık kaynaklı bir bilgisayar görme ve makine öğrenme yazılımı kütüphanesi. +# URL: http://opencv.org/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo libtiff jasper libpng ffmpeg28 gstreamer xine-lib v4l-utils xorg-mesa python3-numpy python-numpy gtkglext libgphoto2 + +_pybin=python2 +_pydir=python2.7 + +isim=opencv +surum=3.3.0 +devir=2 + +kaynak=(http://downloads.sourceforge.net/opencvlibrary/$isim-$surum.zip + https://raw.githubusercontent.com/opencv/opencv_3rdparty/a62e20676a60ee0ad6581e217fe7e4bada3b95db/ippicv/ippicv_2017u2_lnx_intel64_20170418.tgz + https://github.com/opencv/opencv_contrib/archive/$surum.tar.gz::opencv_contrib-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ipp_surum=ippicv_2017u2_lnx_intel64_20170418.tgz + ipp_file=$DERLEME_KAYNAKDIZIN/$ipp_surum && + ipp_hash=$(md5sum $ipp_file | cut -d" " -f1) && + ipp_dir=.cache/ippicv && + + mkdir -p $ipp_dir && + cp $ipp_file $ipp_dir/$ipp_hash-$ipp_surum + + + mkdir build + cd build + cmake -D WITH_OPENCL=ON \ + -DWITH_OPENGL=ON \ + -DWITH_TBB=ON \ + -DWITH_XINE=ON \ + -DWITH_GSTREAMER=OFF \ + -DBUILD_WITH_DEBUG_INFO=OFF \ + -DBUILD_TESTS=OFF \ + -DBUILD_PERF_TESTS=OFF \ + -DBUILD_EXAMPLES=ON \ + -DINSTALL_C_EXAMPLES=ON \ + -DINSTALL_PYTHON_EXAMPLES=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_SKIP_RPATH=ON \ + -DOPENCV_EXTRA_MODULES_PATH="$SRC/opencv_contrib-$surum/modules" \ + .. + make + make DESTDIR=$PKG install + cd "$PKG/usr/share" + if [[ -d OpenCV/samples ]]; then + mv OpenCV/samples "$SRC/$isim-samples" + mv OpenCV $isim #dizini ismi tutarlı olması için + elif [[ ! -d OpenCV ]]; then + echo "Dizin adlandırma hatası!" + fi + +} + + diff --git a/talimatname/genel/o/opendht/talimat b/talimatname/genel/o/opendht/talimat new file mode 100644 index 000000000..207abf803 --- /dev/null +++ b/talimatname/genel/o/opendht/talimat @@ -0,0 +1,22 @@ +# Tanım: Kademlia DHT'nin (Distributed Hash Table) bir C ++ 11 uygulaması, +# URL: https://github.com/savoirfairelinux/opendht +# Paketçi: milisarge +# Gerekler: cmake gnutls nettle msgpack-c python3-setuptools cython argon2 + +isim=opendht +surum=1.6.1 +devir=1 +kaynak=(https://github.com/savoirfairelinux/opendht/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + mkdir -p build + cd build + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DOPENDHT_PYTHON=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/openexr/talimat b/talimatname/genel/o/openexr/talimat new file mode 100644 index 000000000..acb7b7875 --- /dev/null +++ b/talimatname/genel/o/openexr/talimat @@ -0,0 +1,20 @@ +# Tanım: Yüksek dinamik aralıklı bir resim dosya formatı kütüphanesi +# URL: http://www.openexr.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: ilmbase + +isim=openexr +surum=2.2.0 +devir=1 + +kaynak=( http://savannah.nongnu.org/download/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--localstatedir=/var \ +--sysconfdir=/etc + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/openh264/talimat b/talimatname/genel/o/openh264/talimat new file mode 100644 index 000000000..e4afab9d5 --- /dev/null +++ b/talimatname/genel/o/openh264/talimat @@ -0,0 +1,16 @@ +# Tanım: açık kaynak h264 kodek uyg. +# URL: http://www.openh264.org/ +# Paketçi: milisarge +# Gerekler: nasm + +isim=openh264 +surum=1.1-2103-g69a8b3c +devir=1 +kaynak=(https://github.com/cisco/$isim/archive/v$surum.zip) + +derle() { + cd ${isim}-${version##*-g}* + + make + make PREFIX=$PKG/usr install +} diff --git a/talimatname/genel/o/openimageio/talimat b/talimatname/genel/o/openimageio/talimat new file mode 100644 index 000000000..cb122c88b --- /dev/null +++ b/talimatname/genel/o/openimageio/talimat @@ -0,0 +1,26 @@ +# Tanım: Sınıflar, yardımcı programlar ve uygulamalar da dahil olmak üzere resim okumak ve yazmak için +# URL: http://www.openimageio.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: cmake qt4 python boost xorg-mesa openexr jasper glew libtiff opencolorio + + +isim=openimageio +surum=1.7.14 +devir=1 + +kaynak=(https://github.com/OpenImageIO/oiio/archive/release.zip) + +derle() { + +cd oiio-release +mkdir build +cd build +cmake .. \ +-DUSE_OPENSSL=ON \ +-DCMAKE_INSTALL_PREFIX=/usr \ +-DPYLIB_INSTALL_DIR=lib/python2.7/site-packages \ +-DOIIO_BUILD_TESTS=ON \ +-DOIIO_BUILD_TOOLS=ON + +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/openjade/iostream.patch b/talimatname/genel/o/openjade/iostream.patch new file mode 100644 index 000000000..884d4c738 --- /dev/null +++ b/talimatname/genel/o/openjade/iostream.patch @@ -0,0 +1,11 @@ +diff -ru openjade-1.3.3-pre1.orig/style/MultiLineInlineNote.cxx openjade-1.3.3-pre1/style/MultiLineInlineNote.cxx +--- openjade-1.3.3-pre1.orig/style/MultiLineInlineNote.cxx 2009-03-15 18:10:52.000000000 +0200 ++++ openjade-1.3.3-pre1/style/MultiLineInlineNote.cxx 2009-03-15 18:11:06.000000000 +0200 +@@ -1,6 +1,6 @@ + + #include "MultiLineInlineNote.h" +-#include <iostream.h> ++#include <iostream> + + #ifdef DSSSL_NAMESPACE + namespace DSSSL_NAMESPACE { diff --git a/talimatname/genel/o/openjade/msggen.pl.patch b/talimatname/genel/o/openjade/msggen.pl.patch new file mode 100644 index 000000000..2f8745642 --- /dev/null +++ b/talimatname/genel/o/openjade/msggen.pl.patch @@ -0,0 +1,32 @@ +Use Getopt::Std in place of getopts.pl. +https://bugs.gentoo.org/show_bug.cgi?id=420083 + +--- a/msggen.pl ++++ b/msggen.pl +@@ -4,6 +4,7 @@ + # See the file COPYING for copying permission. + + use POSIX; ++use Getopt::Std; + + # Package and version. + $package = 'openjade'; +@@ -18,8 +19,7 @@ + undef $opt_l; + undef $opt_p; + undef $opt_t; +-do 'getopts.pl'; +-&Getopts('l:p:t:'); ++getopts('l:p:t:'); + $module = $opt_l; + $pot_file = $opt_p; + +@@ -72,7 +72,7 @@ + else { + $field[0] =~ /^[IWQXE][0-9]$/ || &error("invalid first field");; + $type[$num] = substr($field[0], 0, 1); +- $argc = int(substr($field[0], 1, 1)); ++ $argc = substr($field[0], 1, 1); + } + $nargs[$num] = $argc; + $field[1] =~ /^[a-zA-Z_][a-zA-Z0-9_]+$/ || &error("invalid tag"); \ No newline at end of file diff --git a/talimatname/genel/o/openjade/openjade.kur-kos b/talimatname/genel/o/openjade/openjade.kur-kos new file mode 100644 index 000000000..acc4c1d35 --- /dev/null +++ b/talimatname/genel/o/openjade/openjade.kur-kos @@ -0,0 +1,2 @@ +install-catalog --add /etc/sgml/openjade-1.3.3.cat /usr/share/sgml/openjade-1.3.3/catalog +install-catalog --add /etc/sgml/sgml-docbook.cat /etc/sgml/openjade-1.3.3.cat diff --git a/talimatname/genel/o/openjade/talimat b/talimatname/genel/o/openjade/talimat new file mode 100644 index 000000000..e9a17c1ee --- /dev/null +++ b/talimatname/genel/o/openjade/talimat @@ -0,0 +1,26 @@ +# Tanım: James Clark'ın Belge Stili Semantiği ve Şartname Dilinin uygulanması +# URL: http://openjade.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: opensp + + +isim=openjade +surum=1.3.3-pre1 +devir=2 +kaynak=(http://downloads.sourceforge.net/project/$isim/$isim/1.3.3/$isim-$surum.tar.gz + iostream.patch msggen.pl.patch) + +derle() { + cd $isim-$surum + + patch -p 1 -i $SRC/iostream.patch + patch -p 1 -i $SRC/msggen.pl.patch + + ./configure \ + --prefix=/usr + + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/o/openjdk/openjdk.kur-kos b/talimatname/genel/o/openjdk/openjdk.kur-kos new file mode 100644 index 000000000..025157387 --- /dev/null +++ b/talimatname/genel/o/openjdk/openjdk.kur-kos @@ -0,0 +1,14 @@ +. /lib/lsb/init-functions +if (grep jdk /etc/man_db.conf > /dev/null); then + cat >> /etc/man_db.conf << "EOF" +# Begin Java addition +MANDATORY_MANPATH /opt/jdk/man +MANPATH_MAP /opt/jdk/bin /opt/jdk/man +MANDB_MAP /opt/jdk/man /var/cache/man/jdk +# End Java addition +EOF +log_warning_msg "${WARNING}Check the /etc/man_db.conf file ${NORMAL}" +fi +mkdir -p /var/cache/man +mandb -c /opt/jdk/man +export JAVA_HOME=/opt/jdk diff --git a/talimatname/genel/o/openjdk/talimat b/talimatname/genel/o/openjdk/talimat new file mode 100644 index 000000000..6092afc8a --- /dev/null +++ b/talimatname/genel/o/openjdk/talimat @@ -0,0 +1,52 @@ +# Tanım: Java Development Kit (JDK) adı verilen bir dizi program. +# URL: http://openjdk.java.net/ +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=openjdk +surum=8u60 +devir=1 +_surum=1.8.0.60 +kaynak=(http://anduin.linuxfromscratch.org/files/BLFS/OpenJDK-${_version}/OpenJDK-${_version}-`uname -m`-bin.tar.xz ) + +derle() { +cd OpenJDK* +install -vdm755 $PKG/opt/OpenJDK-$surum-bin +mv -v * $PKG/opt/OpenJDK-$surum-bin +chown -R root:root $PKG/opt/OpenJDK-$surum-bin +mkdir -p $PKG/etc/profile.d +cat > $PKG/etc/profile.d/openjdk.sh << "EOF" +# Begin /etc/profile.d/openjdk.sh + +# Set JAVA_HOME directory +JAVA_HOME=/opt/jdk + +# Adjust PATH +pathappend $JAVA_HOME/bin + +# Add to MANPATH +pathappend $JAVA_HOME/man MANPATH + +# Auto Java CLASSPATH +# Copy jar files to, or create symlinks in this directory + +AUTO_CLASSPATH_DIR=/usr/share/java + +pathprepend . CLASSPATH + +for dir in `find ${AUTO_CLASSPATH_DIR} -type d 2>/dev/null`; do + pathappend $dir CLASSPATH +done + +for jar in `find ${AUTO_CLASSPATH_DIR} -name "*.jar" 2>/dev/null`; do + pathappend $jar CLASSPATH +done + +export JAVA_HOME +unset AUTO_CLASSPATH_DIR dir jar + +# End /etc/profile.d/openjdk.sh +EOF + +ln -sv OpenJDK-$surum-bin $PKG/opt/jdk +} diff --git a/talimatname/genel/o/openjdk8/talimat b/talimatname/genel/o/openjdk8/talimat new file mode 100644 index 000000000..48a1ab134 --- /dev/null +++ b/talimatname/genel/o/openjdk8/talimat @@ -0,0 +1,150 @@ +# Tanım: Java Development Kit (JDK) adı verilen bir dizi program. +# URL: http://openjdk.java.net/ +# Paketçi: milisarge@gmail.com +# Gerekler: openjdk alsa-lib cups xorg-fontconfig freetype giflib gtk2 krb5 lcms2 libjpeg-turbo libpng libxslt nss unzip xorg-libxt xorg-libxtst xorg-libxinerama zip + +isim=openjdk8 +openjdk_devir=8 +openjdk_update=u144 +openjdk_build=b01 +openjdk_surum=$openjdk_release$openjdk_update$openjdk_build +surum=8u144-b01 +icedtea_surum=3.5.1 +certdata_rev=e5e2984f44c5 +devir=1 +kaynak=(http://icedtea.wildebeest.org/download/source/icedtea-$icedtea_version.tar.xz + http://stygian.me/crux/distfiles/$isim/corba-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/hotspot-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/jaxp-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/jaxws-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/jdk-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/langtools-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/nashorn-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim/openjdk-$openjdk_version.tar.xz + http://stygian.me/crux/distfiles/$isim-boot.pkg.tar.xz + http://ftp.netbsd.org/pub/pkgsrc/pkgsrc-2017Q2/pkgsrc/security/mozilla-rootcerts/files/mozilla-rootcerts.sh + http://hg.mozilla.org/releases/mozilla-release/raw-file/$certdata_rev/security/nss/lib/ckfw/builtins/certdata.txt) + +unpack_source() { + for file in ${source[@]}; do + case ${file##*/} in + icedtea-$icedtea_version.tar.xz|\ + $isim-boot.pkg.tar.xz) + bsdtar -p -o -C $SRC -xf $(get_filename $file) ;; + *) + cp $(get_filename $file) $SRC ;; + esac + done +} + +derle() { + JAVA_DIR=/opt/OpenJDK-8u60-bin + + mkdir $SRC/build + cd $SRC/build + + LC_ALL=C \ + CFLAGS="$CFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + CXXFLAGS="$CXXFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + JAVA_HOME=$JAVA_DIR \ + PATH=$JAVA_DIR/bin:$PATH \ + CONFIG_SHELL=/bin/bash \ + ../icedtea-$icedtea_version/configure \ + --prefix=/usr/lib/java/$isim \ + --disable-docs \ + --disable-downloading \ + --disable-precompiled-headers \ + --disable-tests \ + --disable-system-pcsc \ + --disable-system-sctp \ + --enable-system-cups \ + --enable-system-fontconfig \ + --enable-system-gconf \ + --enable-system-gio \ + --enable-system-gtk \ + --enable-system-jpeg \ + --enable-system-kerberos \ + --enable-system-lcms \ + --enable-system-png \ + --enable-system-zlib \ + --enable-nss \ + --enable-sunec \ + --enable-non-nss-curves \ + --enable-improved-font-rendering \ + --with-openjdk-src-zip=$SRC/openjdk-$openjdk_version.tar.xz \ + --with-hotspot-src-zip=$SRC/hotspot-$openjdk_version.tar.xz \ + --with-corba-src-zip=$SRC/corba-$openjdk_version.tar.xz \ + --with-jaxp-src-zip=$SRC/jaxp-$openjdk_version.tar.xz \ + --with-jaxws-src-zip=$SRC/jaxws-$openjdk_version.tar.xz \ + --with-jdk-src-zip=$SRC/jdk-$openjdk_version.tar.xz \ + --with-langtools-src-zip=$SRC/langtools-$openjdk_version.tar.xz \ + --with-nashorn-src-zip=$SRC/nashorn-$openjdk_version.tar.xz \ + --with-pkgsurum=MILIS \ + --with-jdk-home=$JAVA_DIR + + LC_ALL=C \ + CFLAGS="$CFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + CXXFLAGS="$CXXFLAGS -fno-delete-null-pointer-checks -fno-omit-frame-pointer -fno-lifetime-dse" \ + JAVA_HOME=$JAVA_DIR \ + PATH=$JAVA_DIR/bin:$PATH \ + make + + mkdir -p $PKG/usr/lib/java/$isim + cp -r openjdk.build/images/j2sdk-image/* $PKG/usr/lib/java/$isim + + # remove unneeded files + rm -f $PKG/usr/lib/java/$isim/src.zip + rm -rf $PKG/usr/lib/java/$isim/{demo,sample} + rm -f $PKG/usr/lib/java/$isim/man/ja + rm -rf $PKG/usr/lib/java/$isim/man/ja_JP.UTF-8 + find $PKG/usr/lib/java/$isim -name '*.ja' -delete + + # deduplicate + rm $PKG/usr/lib/java/$isim/jre/lib/amd64/libjawt.so + ln -s ../../../../lib/amd64/libjawt.so \ + $PKG/usr/lib/java/$isim/jre/lib/amd64/libjawt.so + rm $PKG/usr/lib/java/$isim/jre/lib/amd64/jli/libjli.so + ln -s ../../../../lib/amd64/jli/libjli.so \ + $PKG/usr/lib/java/$isim/jre/lib/amd64/jli/libjli.so + for f in $PKG/usr/lib/java/$isim/jre/bin/* ; do + if [ -f $PKG/usr/lib/java/$isim/bin/${f##*/} ]; then + rm $f + ln -s ../../bin/${f##*/} $f + fi + done + + sed -e "/# cd \/etc\/openssl\/certs/s//# cd \/usr\/share\/$isim\/certs/" \ + -e '/@AWK@/s//\/usr\/bin\/awk/' \ + -e '/@ECHO@/s//\/bin\/echo/' \ + -e '/@EXPR@/s//\/usr\/bin\/expr/' \ + -e '/@LN@/s//\/bin\/ln/' \ + -e '/@LS@/s//\/bin\/ls/' \ + -e '/@MKDIR@/s//\/bin\/mkdir/' \ + -e '/@OPENSSL@/s//\/bin\/openssl/' \ + -e "/@SSLDIR@/s//\/usr\/share\/$isim/" \ + -e '/@PREFIX@/s//\/usr/' \ + -e '/@RM@/s//\/bin\/rm/' \ + -e '/@LOCALBASE@/s//\/usr/' \ + -e "/@DATADIR@/s//\/usr\/share\/$isim/" \ + -e 's/self extract/self -f $certfile extract/' \ + -e 's/self rehash/self -f $certfile rehash/' \ + $SRC/mozilla-rootcerts.sh > $SRC/mozilla-rootcerts + + # generate java's cacerts + # big thanks to pkgsrc's mozilla-rootcerts and openjdk pkg's for this part + rm -f $PKG/usr/lib/java/$isim/jre/lib/security/cacerts + mkdir $SRC/cacerts + cd $SRC/cacerts + sh $SRC/mozilla-rootcerts -f $SRC/certdata.txt extract + for cert in *.pem; do + JAVA_HOME=$PKG/usr/lib/java/$isim \ + PATH=$JAVA_HOME/bin:$PATH \ + keytool \ + -noprompt \ + -importcert \ + -keystore $PKG/usr/lib/java/$isim/jre/lib/security/cacerts \ + -alias $(echo $cert | sed 's,.*/\([^/]*\)\.pem,\1,') \ + -file $cert \ + -storepass changeit + done +} diff --git a/talimatname/genel/o/openjpeg/talimat b/talimatname/genel/o/openjpeg/talimat new file mode 100644 index 000000000..957541955 --- /dev/null +++ b/talimatname/genel/o/openjpeg/talimat @@ -0,0 +1,20 @@ +# Tanım: OpenJPEG, JPEG-2000 standardının açık kaynaklı bir uygulamasıdır. +# URL: http://www.ijg.org/ +# Paketçi: milisarge +# Gerekler: lcms2 libpng libtiff +# Grup: + +isim=openjpeg +surum=1.5.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/openjpeg.mirror/$isim-$surum.tar.gz ) + +derle() { + cd openjpeg-$surum + autoreconf -f -i + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install + ln -s openjpeg-1.5/openjpeg.h $PKG/usr/include +} diff --git a/talimatname/genel/o/openjpeg2/talimat b/talimatname/genel/o/openjpeg2/talimat new file mode 100644 index 000000000..bf76f60b5 --- /dev/null +++ b/talimatname/genel/o/openjpeg2/talimat @@ -0,0 +1,32 @@ +# Tanım: Açık kaynaklı bir JPEG 2000 codec bileşeni +# URL: https://github.com/uclouvain/openjpeg +# Paketçi: Cihan_Alkan +# Gerekler: zlib libpng libtiff lcms2 cmake doxygen +# Grup: + +isim=openjpeg2 +surum=2.3.0 +devir=1 + +kaynak=(https://github.com/uclouvain/openjpeg/archive/v2.3.0.tar.gz::openjpeg-${surum}.tar.gz) + +derle() { + + mkdir build + # remove thirdparty libs + sed -i '/add_subdirectory(thirdparty)/d' openjpeg-${surum}/CMakeLists.txt + # Install doxygen docs to the right directory + sed -i -e "s:DESTINATION\ share/doc:DESTINATION\ share/doc/${isim}:" openjpeg-${surum}/doc/CMakeLists.txt + cd build + + cmake "../openjpeg-${surum}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_DOC=on + + make + make DESTDIR="${PKG}" install + install -m755 -d "${PKG}/usr/share/licenses/openjpeg2" + mv ${PKG}/usr/share/doc/openjpeg-*/LICENSE ${PKG}/usr/share/licenses/openjpeg2 + rm -rf ${PKG}/usr/share/doc +} diff --git a/talimatname/genel/o/openldap/bdb.yama b/talimatname/genel/o/openldap/bdb.yama new file mode 100644 index 000000000..8d83aea5d --- /dev/null +++ b/talimatname/genel/o/openldap/bdb.yama @@ -0,0 +1,29 @@ +--- configure.o 2016-02-06 01:57:45.000000000 +0200 ++++ configure 2017-03-06 00:55:55.306825000 +0200 +@@ -20385,10 +20385,10 @@ + #define DB_VERSION_FULL ((DB_VERSION_MAJOR<<16)|(DB_VERSION_MINOR<<8)|DB_VERSION_PATCH) + + /* require 4.4 or later, but less than 6.0.20 */ +-#if DB_VERSION_FULL >= 0x040400 && DB_VERSION_FULL < 0x060014 ++#if DB_VERSION_FULL >= 0x010400 && DB_VERSION_FULL < 0x010014 + __db_version_compat + #endif +-#if DB_VERSION_FULL >= 0x060014 ++#if DB_VERSION_FULL >= 0x010014 + #error "BerkeleyDB 6.0.20+ license is incompatible with LDAP" + #endif + +@@ -20402,13 +20402,6 @@ + rm -f conftest* + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ol_cv_bdb_compat" >&5 +-$as_echo "$ol_cv_bdb_compat" >&6; } +- +- +- if test $ol_cv_bdb_compat != yes ; then +- as_fn_error "BerkeleyDB version incompatible with BDB/HDB backends" "$LINENO" 5 +- fi + + ol_cv_lib_db=no + diff --git a/talimatname/genel/o/openldap/openldap-config.patch b/talimatname/genel/o/openldap/openldap-config.patch new file mode 100644 index 000000000..ba18435f6 --- /dev/null +++ b/talimatname/genel/o/openldap/openldap-config.patch @@ -0,0 +1,25 @@ +Index: servers/slapd/slapd.conf +--- servers/slapd/slapd.conf.orig 2003-05-25 01:19:14.000000000 +0200 ++++ servers/slapd/slapd.conf 2003-12-05 10:43:58.000000000 +0100 +@@ -64,4 +64,21 @@ + # Mode 700 recommended. + directory %LOCALSTATEDIR%/openldap-data + # Indices to maintain ++ + index objectClass eq ++ ++####################################################################### ++# replication via slurpd(8) ++####################################################################### ++ ++# master server configuration ++#replogfile %LOCALSTATEDIR%/openldap-slurp ++#replica-pidfile %LOCALSTATEDIR%/slurpd.pid ++#replica host=slave.example.com:389 ++# binddn="cn=admin,dc=example,dc=org" ++# bindmethod=simple credentials=secret ++ ++# slave server(s) configuration ++#updatedn "cn=admin,dc=example,dc=org" ++#updateref ldap://master.example.org ++ diff --git a/talimatname/genel/o/openldap/slapd b/talimatname/genel/o/openldap/slapd new file mode 100644 index 000000000..910bf4b33 --- /dev/null +++ b/talimatname/genel/o/openldap/slapd @@ -0,0 +1,29 @@ +#!/bin/sh +# +# /etc/rc.d/slapd: start/stop Stand-alone LDAP Daemon +# + +SLAPD_PID=/var/openldap/run/slapd.pid + +case $1 in +start) + /usr/sbin/slapd + ;; +stop) + if [ -f $SLAPD_PID ]; then + kill -INT `head -1 $SLAPD_PID` + else + killall -q /usr/sbin/slapd + fi + ;; +restart) + $0 stop + sleep 2 + $0 start + ;; +*) + echo "usage: $0 [start|stop|restart]" + ;; +esac + +# End of file diff --git a/talimatname/genel/o/openldap/talimat b/talimatname/genel/o/openldap/talimat new file mode 100644 index 000000000..51d80ebf7 --- /dev/null +++ b/talimatname/genel/o/openldap/talimat @@ -0,0 +1,51 @@ +# Tanım: Basit Dizin Erişim Protokolü (LDAP) Araç Seti +# URL: https://www.openldap.org/ +# Paketçi: milisarge +# Gerekler: cyrus-sasl + +isim=openldap +surum=2.4.44 +devir=1 +kaynak=(https://www.openldap.org/software/download/OpenLDAP/openldap-release/$isim-$surum.tgz + $isim-config.patch slapd bdb.yama) + +derle() { + cd $isim-$surum + patch -p0 -i $SRC/$isim-config.patch + patch -p0 -i $SRC/bdb.yama + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/sbin \ + --localstatedir=/var/openldap \ + --enable-syslog \ + --with-threads \ + --with-tls \ + --with-cyrus-sasl \ + --enable-spasswd \ + --enable-dynamic \ + --enable-ipv6 \ + --enable-modules \ + --enable-crypt \ + --enable-rewrite \ + --enable-bdb \ + --enable-hdb \ + --enable-ldap \ + --enable-meta \ + --enable-monitor \ + --enable-dnssrv \ + --enable-null \ + --enable-perl \ + --enable-aci \ + --enable-shared + + make depend + make + make DESTDIR=$PKG install + + ln -sf liblber.so $PKG/usr/lib/liblber.so.2 + ln -sf libldap.so $PKG/usr/lib/libldap.so.2 + ln -sf libldap_r.so $PKG/usr/lib/libldap_r.so.2 + + install -D -m 0755 $SRC/slapd $PKG/etc/rc.d/init.d/slapd +} diff --git a/talimatname/genel/o/openmpi/talimat b/talimatname/genel/o/openmpi/talimat new file mode 100644 index 000000000..14ce23b63 --- /dev/null +++ b/talimatname/genel/o/openmpi/talimat @@ -0,0 +1,16 @@ +# Tanım: Yüksek performans mesaj iletim arayüzü +# URL: https://www.open-mpi.org +# Paketçi: milisarge +# Gerekler: + +isim=openmpi +surum=2.1.1 +devir=1 +kaynak=(https://www.open-mpi.org/software/ompi/v2.1/downloads/$isim-$surum.tar.bz2) + +derle() { + cd "$isim-$surum" + ./configure --prefix="$PKG/usr" + make "$MAKEFLAGS" + make install +} diff --git a/talimatname/genel/o/openmw/talimat b/talimatname/genel/o/openmw/talimat new file mode 100644 index 000000000..176ca12c6 --- /dev/null +++ b/talimatname/genel/o/openmw/talimat @@ -0,0 +1,19 @@ +# Tanım: Morrowind rol yapma oyunu için açık kaynak motoru +# URL: http://www.openmw.org +# Paketçi: Cihan_Alkan +# Gerekler: openal openscenegraph mygui bullet qt5 ffmpeg sdl2 unshield libxkbcommon cmake boost +# Grup: oyun + +isim=openmw +surum=0.43.0 +devir=1 +kaynak=(https://github.com/OpenMW/openmw/archive/openmw-$surum.tar.gz::openmw-$surum.tar.gz) + +derle() { + cd ${SRC}/openmw-openmw-0.43.0 + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DDESIRED_QT_VERSION=5 + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/o/openobex/talimat b/talimatname/genel/o/openobex/talimat new file mode 100644 index 000000000..958def136 --- /dev/null +++ b/talimatname/genel/o/openobex/talimat @@ -0,0 +1,21 @@ +# Tanım: Aygıtlar arasında ikili dosya aktarımları için kullanılan Nesne Değişimi Protokolünü uygular. +# URL: http://dev.zuckschwerdt.org/openobex/ +# Paketçi: milisarge +# Gerekler: bluez libusb + +isim=openobex +surum=1.7.2 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim-$surum-Source.tar.gz) +derle() { + cd $isim-$surum-Source + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release \ + .. + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/openra/talimat b/talimatname/genel/o/openra/talimat new file mode 100644 index 000000000..071ae746c --- /dev/null +++ b/talimatname/genel/o/openra/talimat @@ -0,0 +1,23 @@ +# Tanım: RedAlert oyunun mono tabanlı açık kaynak uygulaması +# Url: http://www.openra.net +# Paketçi: milisarge +# Gerekler: mono dejavu-ttf openal freetype sdl2 lua51 hicolor-icon-theme gtk-update-icon-cache desktop-file-utils xdg-utils zenity unzip + +isim=openra +isim=OpenRA +surum=20170421 +devir=1 + +kaynak=(https://github.com/$isim/$isim/archive/release-$surum.tar.gz) + +derle() { + cd $isim-release-$surum + make dependencies + make core + make tools + make prefix=/usr DESTDIR="$PKG" install-all + make prefix=/usr DESTDIR="$PKG" install-linux-shortcuts + make prefix=/usr DESTDIR="$PKG" install-linux-mime + make prefix=/usr DESTDIR="$PKG" install-linux-appdata + make prefix=/usr DESTDIR="$PKG" install-man-page +} diff --git a/talimatname/genel/o/opensc-openct/talimat b/talimatname/genel/o/opensc-openct/talimat new file mode 100644 index 000000000..f6dd0a7bc --- /dev/null +++ b/talimatname/genel/o/opensc-openct/talimat @@ -0,0 +1,26 @@ +# Tanım: OpenSC compiled with OpenCT instead of PCSC, working with e.g. SafeNet/Aladdin eToken Pro 64k +# URL: https://github.com/OpenSC/OpenSC/wiki +# Paketçi: milisarge +# Gerekler: openct + +isim=opensc-openct +_isim=OpenSC +surum=0.16.0 +devir=1 +kaynak=(https://github.com/OpenSC/OpenSC/archive/$surum.tar.gz) + +derle() { + _prefix=/opt/$isim + + cd $_name-$surum + ./bootstrap + ./configure \ + --prefix=$_prefix \ + --disable-pcsc \ + --enable-openct + + make + mkdir -p ./$_prefix + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/o/opensc/talimat b/talimatname/genel/o/opensc/talimat new file mode 100644 index 000000000..db4324898 --- /dev/null +++ b/talimatname/genel/o/opensc/talimat @@ -0,0 +1,31 @@ +# Tanım: smart kartlar için araç seti ve kütüphane +# URL: https://github.com/OpenSC/OpenSC/wiki +# Paketçi: milisarge +# Gerekler: pcsc-lite libxslt docbook-xsl + +isim=opensc +surum=0.16.0 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + export LIBS=-lltdl + _sheetdir=(/usr/share/xml/docbook/xsl-stylesheets-*) + ./bootstrap + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --enable-man \ + --disable-doc \ + --enable-readline \ + --enable-openssl \ + --enable-pcsc \ + --enable-zlib \ + --enable-sm \ + --with-xsl-stylesheetsdir="$_sheetdir" + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="$PKG" install + install -D -m644 etc/opensc.conf "$PKG/etc/opensc.conf" +} diff --git a/talimatname/genel/o/openscenegraph/talimat b/talimatname/genel/o/openscenegraph/talimat new file mode 100644 index 000000000..00f6c6b77 --- /dev/null +++ b/talimatname/genel/o/openscenegraph/talimat @@ -0,0 +1,24 @@ +# Tanım: Açık Kaynaklı, yüksek performanslı gerçek zamanlı grafik araç seti +# URL: http://www.openscenegraph.org +# Paketçi: Cihan_Alkan +# Gerekler: giflib jasper librsvg xine-lib pth cmake libvncserver qt5 ffmpeg xorg-mesa +# Grup: kütüphane + + +isim=openscenegraph +surum=3.4.1 +devir=1 +kaynak=(https://github.com/openscenegraph/OpenSceneGraph/archive/OpenSceneGraph-$surum.tar.gz) + +derle() { + + cd OpenSceneGraph-OpenSceneGraph-$surum + + [ $NOEXTRACT -eq 1 ] || cmake . \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR="$PKG" install + install -D -m644 LICENSE.txt "$PKG/usr/share/licenses/$isim/LICENSE" + [ -d "$PKG/usr/lib64" ] && mv "$PKG/usr/lib64" "$PKG/usr/lib" || true +} diff --git a/talimatname/genel/o/opensp/opensp.kur-kos b/talimatname/genel/o/opensp/opensp.kur-kos new file mode 100644 index 000000000..fd0448d88 --- /dev/null +++ b/talimatname/genel/o/opensp/opensp.kur-kos @@ -0,0 +1 @@ +ln -s /usr/lib/libosp.la /usr/lib64/libosp.la diff --git a/talimatname/genel/o/opensp/talimat b/talimatname/genel/o/opensp/talimat new file mode 100644 index 000000000..fb756abcf --- /dev/null +++ b/talimatname/genel/o/opensp/talimat @@ -0,0 +1,37 @@ +# Tanım: SGML / XML dosyalarını kullanmak için C ++ kütüphanesi. +# URL: http://openjade.sourceforge.net/doc/ +# Paketçi: milisarge +# Gerekler: sgml-common + +isim=opensp +surum=1.5.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/openjade/OpenSP-$surum.tar.gz) + +derle(){ + cd OpenSP-$surum + sed -i 's/32,/253,/' lib/Syntax.cxx && + sed -i 's/LITLEN 240 /LITLEN 8092/' \ + unicode/{gensyntax.pl,unicode.syn} && + + ./configure --prefix=/usr \ + --disable-static \ + --disable-doc-build \ + --enable-default-catalog=/etc/sgml/catalog \ + --enable-http \ + --enable-default-search-path=/usr/share/sgml + make DESTDIR=$PKG install + + # create the SP equivalents of OpenSP executables and libraries + cd $PKG/usr/bin + ln -v -sf onsgmls nsgmls + ln -v -sf osgmlnorm sgmlnorm + ln -v -sf ospam spam + ln -v -sf ospcat spcat + ln -v -sf ospent spent + ln -v -sf osx sx + ln -v -sf osx sgml2xml + cd $PKG/usr/lib + ln -v -sf libosp.so libsp.so +} diff --git a/talimatname/genel/o/opensubdiv/talimat b/talimatname/genel/o/opensubdiv/talimat new file mode 100644 index 000000000..f9bbd6e5f --- /dev/null +++ b/talimatname/genel/o/opensubdiv/talimat @@ -0,0 +1,23 @@ +# Tanım: Açık Kaynaklı bir alt bölüm yüzey kütüphanesi +# URL: http://graphics.pixar.com/opensubdiv +# Paketçi: yasarciv67@gmail.com +# Gerekler: python python-docutils pygments cmake glew xorg-libxcursor xorg-app xorg-libxinerama +# Grup: kütüphane + +isim=opensubdiv +surum=3.0.2 +devir=1 + +kaynak=(https://github.com/PixarAnimationStudios/OpenSubdiv/archive/v${version//./_}.tar.gz) + +derle() { + cd OpenSubdiv-${version//./_} + rm -rf build + mkdir build + cd build + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + make DESTDIR=$PKG/ install + rm -rf $PKG/usr/bin +} diff --git a/talimatname/genel/o/openttd-opengfx/talimat b/talimatname/genel/o/openttd-opengfx/talimat new file mode 100644 index 000000000..319f6a3b4 --- /dev/null +++ b/talimatname/genel/o/openttd-opengfx/talimat @@ -0,0 +1,19 @@ +# Tanım: Openttd için ücretsiz grafik seti +# URL: http://dev.openttdcoop.org/projects/opengfx +# Paketçi: milisarge +# Gerekler: + + +isim=openttd-opengfx +surum=0.5.3 +devir=1 +kaynak=(http://bundles.openttdcoop.org/opengfx/releases/${surum}/opengfx-${surum}.zip) + +derle() { + cd ${SRC} + tar xvf opengfx-${surum}.tar + cd opengfx-${surum} + install -d ${PKG}/usr/share/openttd/data + install -m644 *.grf ${PKG}/usr/share/openttd/data + install -m644 *.obg ${PKG}/usr/share/openttd/data +} diff --git a/talimatname/genel/o/openttd-opensfx/talimat b/talimatname/genel/o/openttd-opensfx/talimat new file mode 100644 index 000000000..a7cd5f1d0 --- /dev/null +++ b/talimatname/genel/o/openttd-opensfx/talimat @@ -0,0 +1,21 @@ +# Tanım: Openttd için ücretsiz ses seti +# URL: http://www.openttd.org +# Paketçi: milisarge +# Gerekler: + + +isim=openttd-opensfx +surum=0.2.3 +devir=1 +kaynak=(http://bundles.openttdcoop.org/opensfx/releases/opensfx-${surum}.zip) + +derle() { + cd ${SRC}/opensfx-${surum} + + chmod 0644 * + + mkdir -pm0755 ${PKG}/usr/share/openttd/data + cp opensfx.* ${PKG}/usr/share/openttd/data/ + install -Dm644 license.txt ${PKG}/usr/share/licenses/${isim}/license + install -Dm644 readme.txt ${PKG}/usr/share/licenses/${isim}/readme +} diff --git a/talimatname/genel/o/openttd/openttd.kur-kos b/talimatname/genel/o/openttd/openttd.kur-kos new file mode 100644 index 000000000..f9c0fc156 --- /dev/null +++ b/talimatname/genel/o/openttd/openttd.kur-kos @@ -0,0 +1,2 @@ + gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor > /dev/null 2>&1 + update-desktop-database > /dev/null 2>&1 diff --git a/talimatname/genel/o/openttd/talimat b/talimatname/genel/o/openttd/talimat new file mode 100644 index 000000000..f35fb9251 --- /dev/null +++ b/talimatname/genel/o/openttd/talimat @@ -0,0 +1,27 @@ +# Tanım:Transport Tycoon Deluxe çalıştırmak için bir motor. +# URL: http://www.openttd.org +# Paketçi: milisarge +# Gerekler: libpng sdl icu xorg-fontconfig lzo hicolor-icon-theme desktop-file-utils xz openttd-opengfx openttd-opensfx + + +isim=openttd +surum=1.5.2 +devir=1 +kaynak=(http://binaries.openttd.org/releases/${surum}/${isim}-${surum}-source.tar.xz) + +derle() { + cd ${isim}-${surum} + + ./configure \ + --prefix-dir=/usr \ + --binary-isim=${isim} \ + --binary-dir=bin \ + --data-dir=share/${isim} \ + --install-dir=${PKG} \ + --doc-dir=share/doc/${isim} \ + --menu-isim="OpenTTD" \ + --personal-dir=.${isim} + + make + make install +} diff --git a/talimatname/genel/o/openvpn/openvpnd b/talimatname/genel/o/openvpn/openvpnd new file mode 100644 index 000000000..62ce72f0f --- /dev/null +++ b/talimatname/genel/o/openvpn/openvpnd @@ -0,0 +1,65 @@ +#!/bin/sh +# +# /etc/rc.d/openvpn: start/stop openvpn daemon +# + +CONFDIR=/etc/openvpn +RUNDIR=/var/run + +# optional arguments to openvpn +OPTARGS="--fast-io" + +usage() { + echo "Usage: $0 [start|stop|restart] <config-name>" + exit 0 +} + +# require a config name to be specified +if [ -z "$2" ] +then + usage +fi + +CONF=${CONFDIR}/${2}.conf +PID=${RUNDIR}/openvpn.${2}.pid + +# check for the existence of the specified config +if [ ! -f ${CONF} ] +then + echo "Can't find config file ${CONF}! Exiting." + exit 1 +fi + +case $1 in + start) + # check for an existing PID; this tunnel may already be running + if [ -f ${PID} ] + then + echo "VPN '${2}' appears to be running already. If not, remove the stale PID file '${PID}'. Exiting." + exit 2 + fi + # start the specified VPN config + echo "Starting VPN '${2}'..." + /usr/sbin/openvpn --config ${CONF} --writepid ${PID} --daemon ovpn-${2} ${OPTARGS} + ;; + stop) + # check for an existing PID; this tunnel should already be running + if [ ! -f ${PID} ] + then + echo "VPN '${2}' doesn't appear to be running. Exiting." + exit 3 + fi + # stop the specified VPN config + echo "Stopping VPN '${2}'..." + kill `cat ${PID}` + rm -f ${PID} + ;; + restart) + ${0} stop ${2}; sleep 3; ${0} start ${2} + ;; + *) + usage + ;; +esac + +# End of file diff --git a/talimatname/genel/o/openvpn/talimat b/talimatname/genel/o/openvpn/talimat new file mode 100644 index 000000000..1d8435581 --- /dev/null +++ b/talimatname/genel/o/openvpn/talimat @@ -0,0 +1,26 @@ +# Tanım: VPN istemcisi +# URL: http://www.openvpn.net +# Paketçi: milisarge +# Gerekler: + +isim=openvpn +surum=2.4.0 +devir=1 +kaynak=(http://swupdate.openvpn.net/community/releases/$isim-$surum.tar.gz \ + openvpnd) + +derle() { + install -D -m 755 openvpnd $PKG/etc/rc.d/init.d/openvpn + cd $isim-$surum + + ./configure --prefix=/usr \ + --mandir=/usr/man \ + --enable-iproute2 \ + --disable-plugin-auth-pam + make + make DESTDIR=$PKG install + if [ -d $PKG/usr/share/doc ];then + rm -r $PKG/usr/share/doc + fi + +} diff --git a/talimatname/genel/o/openvswitch/openvswitch.tmpfiles b/talimatname/genel/o/openvswitch/openvswitch.tmpfiles new file mode 100644 index 000000000..f99f19f89 --- /dev/null +++ b/talimatname/genel/o/openvswitch/openvswitch.tmpfiles @@ -0,0 +1 @@ +d /run/openvswitch 0770 root root - diff --git a/talimatname/genel/o/openvswitch/talimat b/talimatname/genel/o/openvswitch/talimat new file mode 100644 index 000000000..e8de2f954 --- /dev/null +++ b/talimatname/genel/o/openvswitch/talimat @@ -0,0 +1,32 @@ +# Tanım: Üretim Kalitesi, Çok Katmanlı Açık Sanal Anahtar +# URL: http://openvswitch.org +# Paketçi: Cihan_Alkan +# Gerekler: libcap-ng python-six +# Grup: ağ + +isim=openvswitch +surum=2.8.1 +devir=1 +kaynak=(http://openvswitch.org/releases/openvswitch-$surum.tar.gz + openvswitch.tmpfiles) + +derle() { + cd "$SRC/$isim-$surum" + sed -i \ + -e 's|$(sysconfdir)/bash_completion.d|/usr/share/bash-completion/completions|g' \ + Makefile.am + ./boot.sh + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --with-rundir=/run/openvswitch \ + --sbindir=/usr/bin \ + PYTHON=/usr/bin/python + make + + make DESTDIR="$PKG" install + install -Dm0644 "$SRC"/openvswitch.tmpfiles "$PKG/usr/lib/tmpfiles.d/openvswitch.conf" + install -dm0755 "$PKG/etc/openvswitch" + rm -rf "$PKG"/run +} diff --git a/talimatname/genel/o/opera/default b/talimatname/genel/o/opera/default new file mode 100644 index 000000000..380d9ccee --- /dev/null +++ b/talimatname/genel/o/opera/default @@ -0,0 +1,4 @@ +# Default settings for chromium. This file is sourced by /usr/bin/chromium + +# Options to pass to chromium +OPERA_FLAGS="" diff --git a/talimatname/genel/o/opera/opera b/talimatname/genel/o/opera/opera new file mode 100644 index 000000000..f1eb7f6d2 --- /dev/null +++ b/talimatname/genel/o/opera/opera @@ -0,0 +1,13 @@ +#!/bin/bash + +# Allow users to override command-line options +# Based on Gentoo's chromium package (and by extension, Debian's) +if [[ -f /etc/%name%/default ]]; then + . /etc/%name%/default +fi + +# Prefer user defined CHROMIUM_USER_FLAGS (from env) over system +# default CHROMIUM_FLAGS (from /etc/chromium/default) +OPERA_FLAGS=${OPERA_USER_FLAGS:-$OPERA_FLAGS} + +exec /usr/lib/%operabin% $OPERA_FLAGS "$@" diff --git a/talimatname/genel/o/opera/opera.kur-kos b/talimatname/genel/o/opera/opera.kur-kos new file mode 100644 index 000000000..1ec548500 --- /dev/null +++ b/talimatname/genel/o/opera/opera.kur-kos @@ -0,0 +1,5 @@ +#!/bin/sh +update-desktop-database -q /usr/share/applications +update-mime-database /usr/share/mime >/dev/null +gtk-update-icon-cache -tq /usr/share/icons/hicolor + diff --git a/talimatname/genel/o/opera/talimat b/talimatname/genel/o/opera/talimat new file mode 100644 index 000000000..dd57dba17 --- /dev/null +++ b/talimatname/genel/o/opera/talimat @@ -0,0 +1,47 @@ +# Tanım: Hızlı ve güvenli bir web tarayıcısı +# URL: http://www.opera.com/ +# Paketçi: yasarciv67 Cihan_Alkan +# Gerekler: gtk2 desktop-file-utils shared-mime-info xorg-libxtst gconf xorg-libxscrnsaver alsa-lib nss freefont-ttf libnotify hicolor-icon-theme + +isim=opera +surum=53.0.2907.68 +devir=1 +kaynak=(http://get.geo.opera.com/pub/${isim}/desktop/$surum/linux/${isim}-stable_${surum}_amd64.deb + opera + default) + +derle() { + sed -e "s/%{isim}%/${isim}/g" -i "$SRC/opera" + sed -e "s/%operabin%/${isim}\/${isim}/g" \ + -i "$SRC/opera" + bsdtar -xf ${isim}-stable_${surum}_amd64.deb + bsdtar -xf data.tar.xz --exclude=usr/share/{lintian,menu} -C "$PKG/" + # get rid of the extra subfolder {i386,x86_64}-linux-gnu + ( + cd "$PKG/usr/lib/"*-linux-gnu/ + mv "${isim}" ../ + ) + rm -rf "$PKG/usr/lib/"*-linux-gnu + + # suid opera_sandbox + chmod 4755 "$PKG/usr/lib/${isim}/opera_sandbox" + + # Varsayılan seçenekleri yükle + install -Dm644 "$SRC/default" "$PKG/etc/${isim}/default" + + # Opera sarmalayıcı yükle + rm "$PKG/usr/bin/${isim}" + install -Dm755 "$SRC/opera" "$PKG/usr/bin/${isim}" + + # lisans + + install -Dm644 \ + "$PKG/usr/share/doc/${isim}-stable/copyright" \ + "$PKG/usr/share/licenses/${isim}/copyright" + + # Başlatıcı + sed -i 's/^Exec=/Name[tr]=Opera \ + GenericName[tr]=Web Tarayıcı \ + Comment[tr]=Hızlı ve güvenli bir web tarayıcısı \ + &/' $PKG/usr/share/applications/${isim}.desktop +} diff --git a/talimatname/genel/o/opmsg/talimat b/talimatname/genel/o/opmsg/talimat new file mode 100644 index 000000000..2697030cd --- /dev/null +++ b/talimatname/genel/o/opmsg/talimat @@ -0,0 +1,23 @@ +# Tanım: opmsg mesaj şifreleme +# URL: https://github.com/stealth/opmsg +# Paketçi: milisarge +# Gerekler: +# Grup: ağ + +isim=opmsg +surum=git +devir=2 +kaynak=(https://github.com/stealth/opmsg/archive/master.tar.gz::$isim-$surum-$devir.tar.gz) + +derle() { + cd "$isim-master/src" + make + make contrib + cd "${SRC}/$isim-master" + mkdir -p "$PKG/usr/share/opmsg" + install -D -m644 sample.config "$PKG/usr/share/opmsg" + cd "${SRC}/$isim-master/src" + install -D -m755 opmsg "$PKG/usr/bin/opmsg" + install -D -m755 opmux "$PKG/usr/bin/opmux" + install -D -m755 opcoin "$PKG/usr/bin/opcoin" +} diff --git a/talimatname/genel/o/optipng/talimat b/talimatname/genel/o/optipng/talimat new file mode 100644 index 000000000..29170013e --- /dev/null +++ b/talimatname/genel/o/optipng/talimat @@ -0,0 +1,23 @@ +# Tanım: PNG dosyalarını herhangi bir bilgi kaybı olmadan daha küçük bir boyuta sıkıştırır. +# URL: http://optipng.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: libpng + +isim=optipng +surum=0.7.6 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr --mandir=/usr/share/man --with-system-libs + make + + make prefix="$PKG/usr" mandir="$PKG/usr/share/man" install + + # install license + install -Dm0644 LICENSE.txt "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/o/opus/talimat b/talimatname/genel/o/opus/talimat new file mode 100644 index 000000000..235e6c4f4 --- /dev/null +++ b/talimatname/genel/o/opus/talimat @@ -0,0 +1,18 @@ +# Tanım: Internet üzerinden etkileşimli konuşma ve ses iletimi için tasarlanmış Codec +# URL: http://www.opus-codec.org/ +# Paketçi: milisarge +# Gerekler: + +isim=opus +surum=1.1.2 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --enable-custom-modes --disable-static \ +--docdir=/usr/share/doc/$isim-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/opusfile/talimat b/talimatname/genel/o/opusfile/talimat new file mode 100644 index 000000000..44380c8ec --- /dev/null +++ b/talimatname/genel/o/opusfile/talimat @@ -0,0 +1,17 @@ +# Tanım: .opus dosyalarını açma, arama ve çözme için kitaplık +# URL: http://www.opus-codec.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libogg opus + +isim=opusfile +surum=0.7 +devir=1 + +kaynak=(http://downloads.xiph.org/releases/opus/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/orage/orage.kur-kos b/talimatname/genel/o/orage/orage.kur-kos new file mode 100644 index 000000000..1dd81428d --- /dev/null +++ b/talimatname/genel/o/orage/orage.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/o/orage/talimat b/talimatname/genel/o/orage/talimat new file mode 100644 index 000000000..824827fab --- /dev/null +++ b/talimatname/genel/o/orage/talimat @@ -0,0 +1,24 @@ +# Tanım: Xfce için, hatırlatıcılar ile basit bir takvim uygulaması. +# URL: https://www.xfce.org/projects +# Paketçi: milisarge +# Gerekler: exo intltool xfce4-panel libnotify + +isim=orage +surum=4.12.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/${isim}/${surum%.*}-$surum.tar.bz2) + +derle() { +cd ${isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --enable-libical \ + --disable-debug + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/o/os-installer/talimat b/talimatname/genel/o/os-installer/talimat new file mode 100644 index 000000000..ffd1ce953 --- /dev/null +++ b/talimatname/genel/o/os-installer/talimat @@ -0,0 +1,24 @@ +# Tanım: İşletim sistemini diske yükleme uygulaması +# URL: https://www.solus-project.com +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python-setuptools gsettings-desktop-schemas gnome-desktop libtimezonemap gparted python-cairo python-geoip python-gobject python-parted xorg-app + +isim=os-installer +surum=12.5 +devir=1 +_surum=v12.5 + +kaynak=( https://github.com/solus-project/$isim/archive/${_version}.tar.gz + 10-livecd.rules) + +derle() { +cd $isim-$surum +python setup.py build +python setup.py install --optimize=1 --root=$PKG + +install -D -m 00644 dist/org.freedesktop.policykit.pkexec.policy $PKG/usr/share/polkit-1/actions/org.freedesktop.policykit.pkexec.policy +install -D -m 00755 dist/os-installer-wrapper $PKG/usr/bin/os-installer-wrapper +install -D -m 00644 $SRC/10-livecd.rules $PKG/usr/share/polkit-1/rules.d/10-livecd.rules +install -D -m 00644 dist/install-symbolic.svg $PKG/usr/share/icons/gnome/scalable/actions/install-symbolic.svg +install -D -m 00644 dist/com.solus_project.Installer.desktop $PKG/usr/share/applications/os-installer-gtk.desktop +} diff --git a/talimatname/genel/o/os-prober/talimat b/talimatname/genel/o/os-prober/talimat new file mode 100644 index 000000000..8bcf63e16 --- /dev/null +++ b/talimatname/genel/o/os-prober/talimat @@ -0,0 +1,52 @@ +# Tanım: Bir sürücü grubundaki diğer işletim sistemlerini bulmak için yardımcı program. +# URL: https://packages.debian.org/source/sid/os-prober +# Paketçi: milisarge +# Gerekler: + +isim=os-prober +surum=1.71 +devir=1 +kaynak=(http://ftp.de.debian.org/debian/pool/main/o/os-prober/os-prober_1.71.tar.xz) + +derle() { + cd $isim-$surum + + # Compile newns + make + +# Create a hierharchy for os-prober package, and copy files into it. +mkdir -p $PKG/var/lib/$isim + +mkdir -p $PKG/usr/bin +cp linux-boot-prober $PKG/usr/bin +cp os-prober $PKG/usr/bin + +mkdir -p $PKG/usr/lib/$isim +cp newns $PKG/usr/lib/$isim + +mkdir -p $PKG/usr/lib/os-probes +cp os-probes/common/* $PKG/usr/lib/os-probes +mkdir -p $PKG/usr/lib/os-probes/mounted +mkdir -p $PKG/usr/lib/os-probes/mounted/efi +cp os-probes/mounted/common/* $PKG/usr/lib/os-probes/mounted +cp os-probes/mounted/x86/efi/* $PKG/usr/lib/os-probes/mounted/efi +rm -r os-probes/mounted/x86/efi +cp os-probes/mounted/x86/* $PKG/usr/lib/os-probes/mounted + +mkdir -p $PKG/usr/lib/os-probes/init +cp os-probes/init/common/* $PKG/usr/lib/os-probes/init + +mkdir -p $PKG/usr/lib/linux-boot-probes +cp linux-boot-probes/common/* $PKG/usr/lib/linux-boot-probes/ +mkdir $PKG/usr/lib/linux-boot-probes/mounted +cp linux-boot-probes/mounted/common/* $PKG/usr/lib/linux-boot-probes/mounted +cp linux-boot-probes/mounted/x86/* $PKG/usr/lib/linux-boot-probes/mounted + +mkdir -p $PKG/usr/share/$isim +cp common.sh $PKG/usr/share/$isim +chmod +x $PKG/usr/share/$isim/common.sh +# End of making os-prober directory hierarchy. + +tar -cvjf os-prober#1.70.pkg.tar.bz2 $PKG/* + +} diff --git a/talimatname/genel/o/ostree/talimat b/talimatname/genel/o/ostree/talimat new file mode 100644 index 000000000..b04456fb3 --- /dev/null +++ b/talimatname/genel/o/ostree/talimat @@ -0,0 +1,45 @@ +# Tanım: İşletim sistemi ve konteyner ikili dağıtımı ve yükseltmeleri +# URL: https://github.com/ostreedev/ostree +# Paketçi: Cihan_Alkan +# Gerekler: glib libsoup gpgme fuse gobject-introspection libxslt python syslinux gjs elfutils +# Grup: sistem + +isim=ostree +surum=2018.1 +devir=1 +kaynak=() + +derle() { + adres="https://github.com/ostreedev/ostree" + git_indir ${adres} ${isim} + adres1="https://github.com/mendsley/bsdiff" + git_indir ${adres1} $SRC/bsdiff + adres2="https://git.gnome.org/browse/libglnx" + git_indir ${adres2} $SRC/libglnx + + cd ${isim} + git submodule init + git config --local submodule.bsdiff.url "$SRC/bsdiff" + git config --local submodule.libglnx.url "$SRC/libglnx" + git submodule update + + find . -name '*.py' -exec sed -i '1s/python$/&2/' {} + + + NOCONFIGURE=1 ./autogen.sh + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --sbindir=/usr/bin \ + --libexecdir=/usr/lib \ + --without-mkinitcpio \ + --with-openssl \ + --with-builtin-grub2-mkconfig \ + --enable-experimental-api \ + --disable-static \ + --disable-gtk-doc + + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/o/owncloud-cli/talimat b/talimatname/genel/o/owncloud-cli/talimat new file mode 100644 index 000000000..f129cd071 --- /dev/null +++ b/talimatname/genel/o/owncloud-cli/talimat @@ -0,0 +1,27 @@ +# Tanım: OwnCloud Masaüstü İstemcisi, ownCloud Sunucusu'ndan bilgisayarınızla dosyaları senkronize etmek için kullanılan bir araçtır. +# URL: http://owncloud.org/ +# Paketçi: milisarge +# Gerekler: cmake qt5 qtkeychain-qt5 + +isim=owncloud-cli +devir=2 +surum=2.0.2 +_isim=owncloudclient + +kaynak=(https://download.owncloud.com/desktop/stable/${_name}-$surum.tar.xz) + +derle() { + +mkdir build +cd build + +cmake ../$_name-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_SYSCONFDIR=/etc/$isim \ + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/o/oxygen-fonts/talimat b/talimatname/genel/o/oxygen-fonts/talimat new file mode 100644 index 000000000..ab208bf83 --- /dev/null +++ b/talimatname/genel/o/oxygen-fonts/talimat @@ -0,0 +1,19 @@ +# Tanım: Oksijen fontları paketi, KDE tarafından kullanılan bir yazı tipidir. +# URL: http://www.kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake fontforge + +isim=oxygen-fonts +surum=5.4.3 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz ) + +derle() { + cd $isim-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr + + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/o/oxygen-gtk2/talimat b/talimatname/genel/o/oxygen-gtk2/talimat new file mode 100644 index 000000000..48c55d903 --- /dev/null +++ b/talimatname/genel/o/oxygen-gtk2/talimat @@ -0,0 +1,21 @@ +# Tanım: Oxygen-gtk2, gtk2 uygulamaları için Oksijen teması. +# URL: https://projects.kde.org/projects/playground/artwork/oxygen-gtk/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake gtk2 dbus-glib cairo + + +isim=oxygen-gtk2 +surum=1.4.6 +devir=1 + +kaynak=(http://download.kde.org/stable/oxygen-gtk2/$surum/src/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + .. + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.kur-kos b/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.kur-kos new file mode 100644 index 000000000..684d0599e --- /dev/null +++ b/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.kur-kos @@ -0,0 +1,14 @@ +if grep "\[Settings\]" /etc/gtk-3.0/settings.ini>/dev/null; then + if grep "gtk-theme-name" /etc/gtk-3.0/settings.ini>/dev/null; then + exit 0 + else + echo "gtk-theme-name = oxygen-gtk" >> /etc/gtk-3.0/settings.ini + fi +else + + cat > /etc/gtk-3.0/settings.ini << "EOF" +[Settings] +gtk-theme-name = oxygen-gtk +EOF + +fi diff --git a/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.okubeni b/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.okubeni new file mode 100644 index 000000000..4bd83db6d --- /dev/null +++ b/talimatname/genel/o/oxygen-gtk3/oxygen-gtk3.okubeni @@ -0,0 +1,3 @@ +A la fin de l'install ET en user : + +ln -s /usr/share/themes/oxygen-gtk/gtk-3.0 ~/.config/gtk-3.0 diff --git a/talimatname/genel/o/oxygen-gtk3/talimat b/talimatname/genel/o/oxygen-gtk3/talimat new file mode 100644 index 000000000..7325db351 --- /dev/null +++ b/talimatname/genel/o/oxygen-gtk3/talimat @@ -0,0 +1,22 @@ +# Tanım: Oxygen-gtk3, gtk3 uygulamaları için Oksijen teması. +# URL: https://projects.kde.org/projects/playground/artwork/oxygen-gtk/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake gtk3 dbus-glib cairo + + +isim=oxygen-gtk3 +surum=1.4.1 +devir=1 + +kaynak=(http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + .. + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/p0f/talimat b/talimatname/genel/p/p0f/talimat new file mode 100644 index 000000000..e3bbf4dbf --- /dev/null +++ b/talimatname/genel/p/p0f/talimat @@ -0,0 +1,24 @@ +# Tanım: p0f, tcp-ip trafik akışını takip ve dinleme uygulaması +# URL: http://lcamtuf.coredump.cx/p0f3/ +# Paketçi: milisarge +# Gerekler: libpcap + +isim=p0f +surum=3.09b +devir=1 + +kaynak=(http://lcamtuf.coredump.cx/p0f3/releases/p0f-3.09b.tgz) + +derle() { + cd $isim-$surum + install -d $PKG/usr/bin + install -d $PKG/usr/share/$isim + install -d $PKG/etc + make + cd tools + make + cd .. + cp p0f tools/p0f-client tools/p0f-sendsyn tools/p0f-sendsyn6 $PKG/usr/bin/ + cp docs/* $PKG/usr/share/$isim/ + cp p0f.fp $PKG/etc/p0f +} diff --git a/talimatname/genel/p/p11-kit/libnssckbi-compat.patch b/talimatname/genel/p/p11-kit/libnssckbi-compat.patch new file mode 100644 index 000000000..d1b70a3bb --- /dev/null +++ b/talimatname/genel/p/p11-kit/libnssckbi-compat.patch @@ -0,0 +1,57 @@ +diff -upr p11-kit-0.23.1.orig/trust/Makefile.am p11-kit-0.23.1/trust/Makefile.am +--- p11-kit-0.23.1.orig/trust/Makefile.am 2014-11-12 12:58:50.000000000 +0200 ++++ p11-kit-0.23.1/trust/Makefile.am 2015-03-30 16:43:35.275993032 +0300 +@@ -61,6 +61,20 @@ p11_kit_trust_la_LDFLAGS = \ + + p11_kit_trust_la_SOURCES = $(TRUST_SRCS) + ++libnssckbi_compatdir = $(libdir) ++libnssckbi_compat_LTLIBRARIES = \ ++ libnssckbi-p11-kit.la ++ ++libnssckbi_p11_kit_la_CFLAGS = \ ++ -DLIBNSSCKBI_COMPAT \ ++ $(p11_kit_trust_la_CFLAGS) ++ ++libnssckbi_p11_kit_la_LIBADD = $(p11_kit_trust_la_LIBADD) ++ ++libnssckbi_p11_kit_la_LDFLAGS = $(p11_kit_trust_la_LDFLAGS) ++ ++libnssckbi_p11_kit_la_SOURCES = $(p11_kit_trust_la_SOURCES) ++ + libtrust_testable_la_LDFLAGS = \ + -no-undefined + +diff -upr p11-kit-0.23.1.orig/trust/module.c p11-kit-0.23.1/trust/module.c +--- p11-kit-0.23.1.orig/trust/module.c 2014-12-16 12:24:01.000000000 +0200 ++++ p11-kit-0.23.1/trust/module.c 2015-03-30 16:48:41.370360130 +0300 +@@ -196,7 +196,11 @@ create_tokens_inlock (p11_array *tokens, + const char *label; + } labels[] = { + { "~/", "User Trust" }, ++#ifdef LIBNSSCKBI_COMPAT ++ { DATA_DIR, "Builtin Object Token" }, ++#else + { DATA_DIR, "Default Trust" }, ++#endif + { SYSCONFDIR, "System Trust" }, + { NULL }, + }; +@@ -521,9 +525,15 @@ sys_C_GetSlotInfo (CK_SLOT_ID id, + info->flags = CKF_TOKEN_PRESENT; + strncpy ((char*)info->manufacturerID, MANUFACTURER_ID, 32); + +- /* If too long, copy the first 64 characters into buffer */ +- path = p11_token_get_path (token); ++#ifdef LIBNSSCKBI_COMPAT ++ /* Change description to match libnssckbi so HPKP works in Chromium */ ++ if (strcmp (p11_token_get_label (token), "Builtin Object Token" ) == 0) ++ path = "NSS Builtin Objects"; ++ else ++#endif ++ path = p11_token_get_path (token); + length = strlen (path); ++ /* If too long, copy the first 64 characters into buffer */ + if (length > sizeof (info->slotDescription)) + length = sizeof (info->slotDescription); + memset (info->slotDescription, ' ', sizeof (info->slotDescription)); diff --git a/talimatname/genel/p/p11-kit/talimat b/talimatname/genel/p/p11-kit/talimat new file mode 100644 index 000000000..8dd4a2168 --- /dev/null +++ b/talimatname/genel/p/p11-kit/talimat @@ -0,0 +1,26 @@ +# Tanım: PKCS 11 modüllerini yüklemek ve numaralandırmak için bir yol sağlar. +# URL: http://p11-glue.freedesktop.org/p11-kit.html +# Paketçi: milisarge +# Gerekler: libffi libtasn1 + +isim=p11-kit +surum=0.23.7 +devir=1 + +kaynak=(https://github.com/p11-glue/p11-kit/archive/$surum.tar.gz + libnssckbi-compat.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../libnssckbi-compat.patch + NOCONFIGURE=1 ./autogen.sh + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --libexecdir=/usr/lib \ + --with-module-path=/usr/lib/pkcs11 \ + --with-trust-paths=/etc/ca-certificates/trust-source:/usr/share/ca-certificates/trust-source:/etc/ssl + make + make DESTDIR="$PKG" install + ln -srf "$PKG/usr/bin/update-ca-trust" "$PKG/usr/lib/p11-kit/trust-extract-compat" +} diff --git a/talimatname/genel/p/p7zip/CVE-2016-9296.patch b/talimatname/genel/p/p7zip/CVE-2016-9296.patch new file mode 100644 index 000000000..fa98afb4f --- /dev/null +++ b/talimatname/genel/p/p7zip/CVE-2016-9296.patch @@ -0,0 +1,11 @@ +--- ./CPP/7zip/Archive/7z/7zIn.cpp.orig 2016-11-21 01:42:29.460901230 +0000 ++++ ./CPP/7zip/Archive/7z/7zIn.cpp 2016-11-21 01:42:57.481197725 +0000 +@@ -1097,7 +1097,8 @@ HRESULT CInArchive::ReadAndDecodePackedS + if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) + ThrowIncorrect(); + } +- HeadersSize += folders.PackPositions[folders.NumPackStreams]; ++ if (folders.PackPositions) ++ HeadersSize += folders.PackPositions[folders.NumPackStreams]; + return S_OK; + } diff --git a/talimatname/genel/p/p7zip/talimat b/talimatname/genel/p/p7zip/talimat new file mode 100644 index 000000000..f17ebb6ff --- /dev/null +++ b/talimatname/genel/p/p7zip/talimat @@ -0,0 +1,31 @@ +# Tanım: 7zip sıkıştırılmış dosya arşivinin konsol uygulaması +# URL: http://p7zip.sourceforge.net +# Paketçi: milisarge +# Gerekler: yasm +# Grup: ağ + +isim=p7zip +surum=16.02 +devir=1 + +kaynak=(https://downloads.sourceforge.net/project/$isim/$isim/$surum/${isim}_${surum}_src_all.tar.bz2 + CVE-2016-9296.patch) + +derle() { + cd ${isim}_$surum + # https://sourceforge.net/p/p7zip/bugs/185/ + patch -Np1 -i $SRC/CVE-2016-9296.patch + + cp makefile.linux_amd64_asm makefile.machine + + make all3 + + make install \ + DEST_DIR="$PKG" \ + DEST_HOME=/usr + + # Remove documentation for the GUI file manager + rm -r "$PKG/usr/share/doc/" + + install -d "${PKG}"/usr/share/licenses/p7zip +} diff --git a/talimatname/genel/p/pa-applet/pa-applet.desktop b/talimatname/genel/p/pa-applet/pa-applet.desktop new file mode 100644 index 000000000..83d773766 --- /dev/null +++ b/talimatname/genel/p/pa-applet/pa-applet.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Encoding=UTF-8 +Version=0.9.4 +Type=Application +Name=pa-applet +Comment=Ses simgesini sistem çekmecesine ekler +Exec=pa-applet +OnlyShowIn=XFCE; +StartupNotify=false +Terminal=false +Hidden=false + diff --git a/talimatname/genel/p/pa-applet/talimat b/talimatname/genel/p/pa-applet/talimat new file mode 100644 index 000000000..5d6ae2706 --- /dev/null +++ b/talimatname/genel/p/pa-applet/talimat @@ -0,0 +1,26 @@ +# Tanım: PulseAudio kontrol uygulaması +# URL: https://github.com/fernandotcl/pa-applet +# Paketçi: yasarciv67@gmail.com +# Gerekler: glib gtk3 libnotify pulseaudio + +isim=pa-applet +surum=2017.09 +devir=1 +kaynak=(pa-applet.desktop) + +derle() { +git clone https://github.com/fernandotcl/pa-applet.git + cd "$isim" + + echo $(git rev-list --count HEAD).$(git rev-parse --short HEAD) + + CFLAGS+=" -Wno-error" + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR="$PKG/" install + + install -D -m644 LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" + cd .. + install -D pa-applet.desktop "$PKG/etc/xdg/autostart/pa-applet.desktop" +} diff --git a/talimatname/genel/p/packit/talimat b/talimatname/genel/p/packit/talimat new file mode 100644 index 000000000..27a4c43c8 --- /dev/null +++ b/talimatname/genel/p/packit/talimat @@ -0,0 +1,18 @@ +# Tanım: Ağ sızma ve paket takip uygulaması +# url: https://github.com/eribertomota/packit/ +# Paketçi:milisarge +# Gerekler: libnet libpcap + +isim=packit +surum=1.5 +devir=1 +kaynak=(https://github.com/eribertomota/packit/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/pamsshagentauth/talimat b/talimatname/genel/p/pamsshagentauth/talimat new file mode 100644 index 000000000..c8960fa86 --- /dev/null +++ b/talimatname/genel/p/pamsshagentauth/talimat @@ -0,0 +1,16 @@ +# Tanım: ssh-agent ile pam modülünün yetkilendirilmesi +# URL: http://pamsshagentauth.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=pamsshagentauth +surum=0.10.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v$surum/pam_ssh_agent_auth-$surum.tar.bz2) + +derle() { + cd "$SRC/pam_ssh_agent_auth-$surum" + ./configure --prefix=/usr --with-mantype=man --libexecdir=/usr/lib/security + make + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/p/pango-perl/talimat b/talimatname/genel/p/pango-perl/talimat new file mode 100644 index 000000000..2fd251f9b --- /dev/null +++ b/talimatname/genel/p/pango-perl/talimat @@ -0,0 +1,18 @@ +# Tanım: Pango için Perl bağları +# URL: http://gtk2-perl.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: perl-extutils-pkgconfig perl-extutils-depends pango cairo-perl perl-glib +# Grup: kütüphane + +isim=pango-perl +surum=1.227 +devir=1 +kaynak=(https://downloads.sourceforge.net/sourceforge/gtk2-perl/Pango-$surum.tar.gz) + +derle() { + cd Pango-$surum + export PERL_USE_UNSAFE_INC=1 + PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor + make + make install DESTDIR="${PKG}" +} diff --git a/talimatname/genel/p/pango/talimat b/talimatname/genel/p/pango/talimat new file mode 100644 index 000000000..a79388fb0 --- /dev/null +++ b/talimatname/genel/p/pango/talimat @@ -0,0 +1,21 @@ +# Tanım: Metin düzeni ve sunumu için bir kütüphane +# URL: http://gnome.org +# Paketçi: milisarge +# Gerekler: python cairo freetype libthai xorg-libxft gobject-introspection harfbuzz xorg-libxxf86vm + +isim=pango +surum=1.38.1 +devir=2 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +install -m755 -d $PKG/etc/pango +} diff --git a/talimatname/genel/p/pangomm/talimat b/talimatname/genel/p/pangomm/talimat new file mode 100644 index 000000000..bf29517a8 --- /dev/null +++ b/talimatname/genel/p/pangomm/talimat @@ -0,0 +1,16 @@ +# Tanım: Pango için C ++ bağları +# URL: http://cairographics.org/cairomm/ +# Paketçi: milisarge +# Gerekler: pango glibmm cairomm + +isim=pangomm +surum=2.38.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pangox-compat/talimat b/talimatname/genel/p/pangox-compat/talimat new file mode 100644 index 000000000..039d9b81b --- /dev/null +++ b/talimatname/genel/p/pangox-compat/talimat @@ -0,0 +1,21 @@ +# Tanım: Pango için X Pencere Sistemi yazı tipi desteği +# URL: http://gnome.org +# Paketçi: milisarge +# Gerekler: pango + +isim=pangox-compat +surum=0.0.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/p/parole/talimat b/talimatname/genel/p/parole/talimat new file mode 100644 index 000000000..84a2ab617 --- /dev/null +++ b/talimatname/genel/p/parole/talimat @@ -0,0 +1,16 @@ +# Tanım: GStreamer çerçevesine dayanan modern bir medya oynatıcı +# URL: http://docs.xfce.org/apps/parole/start +# Paketçi: milisarge +# Gerekler: libnotify dbus-glib xfce4-libui gstreamer1-plugins-base gstreamer1-plugins-good libdvdcss libdvdnav libdvdread startup-notification + +isim=parole +surum=1.0.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/parole/${surum%.*}/parole-$surum.tar.bz2) +derle() { + cd parole-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/partclone/talimat b/talimatname/genel/p/partclone/talimat new file mode 100644 index 000000000..005942800 --- /dev/null +++ b/talimatname/genel/p/partclone/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir bölümde kullanılan blokları kaydetmek ve geri yüklemek için kullanılan yardımcı programlar +# URL: http://partclone.org +# Paketçi: Cihan_Alkan +# Gerekler: reiserfsprogs ntfs-3g +# Grup: + +isim=partclone +surum=0.2.89 +devir=1 +kaynak=(http://partclone.nchc.org.tw/download/stable/$surum/${isim}_$surum.orig.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --enable-extfs --enable-fat \ + --enable-hfsp --enable-btrfs --enable-ncursesw --enable-ntfs \ + --enable-exfat --enable-f2fs --enable-minix --enable-xfs \ + --sbindir=/usr/bin + make + make PREFIX=/usr DESTDIR="$PKG" install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/p/parted/talimat b/talimatname/genel/p/parted/talimat new file mode 100644 index 000000000..145ae2c68 --- /dev/null +++ b/talimatname/genel/p/parted/talimat @@ -0,0 +1,30 @@ +# Tanım: Bölüm oluşturma, yok etme, yeniden boyutlandırma, kontrol etme ve kopyalama için bir program +# URL: http://www.gnu.org/software/parted/index.shtml +# Paketçi: milisarge +# Gerekler: lvm2 + +isim=parted +surum=3.2 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz + http://www.linuxfromscratch.org/patches/blfs/svn/$isim-$surum-devmapper-1.patch) + +derle() { +cd $isim-$surum +patch -Np1 -i ../parted-3.2-devmapper-1.patch +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +make -C doc html +makeinfo --html -o doc/html doc/parted.texi +makeinfo --plaintext -o doc/parted.txt doc/parted.texi + +install -v -m755 -d $PKG/usr/share/doc/parted-$surum/html +install -v -m644 doc/html/* \ +$PKG/usr/share/doc/parted-$surum/html +install -v -m644 doc/{FAT,API,parted.{txt,html}} \ +$PKG/usr/share/doc/parted-$surum +} diff --git a/talimatname/genel/p/partitionmanager/talimat b/talimatname/genel/p/partitionmanager/talimat new file mode 100644 index 000000000..06a05fcfc --- /dev/null +++ b/talimatname/genel/p/partitionmanager/talimat @@ -0,0 +1,23 @@ +# Tanım: Diskleri, bölümleri ve dosya sistemlerini yönetmenizi sağlayan bir KDE yardımcı programı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 kpmcore kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kdoctools kf5-ki18n kf5-kiconthemes kf5-kjobwidgets kf5-kio kf5-kservice kf5-kxmlgui kf5-kwidgetsaddons + +isim=partitionmanager +surum=2.2.1 +devir=1 + +kaynak=( http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/patchutils/talimat b/talimatname/genel/p/patchutils/talimat new file mode 100644 index 000000000..19b491e3f --- /dev/null +++ b/talimatname/genel/p/patchutils/talimat @@ -0,0 +1,20 @@ +# Tanım: Düzeltme eki dosyaları üzerinde çalışan bir program koleksiyonu. +# URL: http://cyberelk.net/tim/software/patchutils/ +# Paketçi: milisarge +# Gerekler: + +isim=patchutils +surum=0.3.2 +devir=1 +kaynak=(http://cyberelk.net/tim/data/patchutils/stable/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man + + make CFLAGS="$CFLAGS" + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pavucontrol-qt/talimat b/talimatname/genel/p/pavucontrol-qt/talimat new file mode 100644 index 000000000..7c33bce71 --- /dev/null +++ b/talimatname/genel/p/pavucontrol-qt/talimat @@ -0,0 +1,21 @@ +# Tanım: Pulseaudio ayarları için bir Qt tabanlı GUI yapılandırma aracıdır. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt pulseaudio glib + +isim=pavucontrol-qt +surum=0.2.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pavucontrol/pavucontrol-gtk2.patch b/talimatname/genel/p/pavucontrol/pavucontrol-gtk2.patch new file mode 100644 index 000000000..ae29c674e --- /dev/null +++ b/talimatname/genel/p/pavucontrol/pavucontrol-gtk2.patch @@ -0,0 +1,32 @@ +diff -u -r pavucontrol-2.0.orig/src/devicewidget.cc pavucontrol-2.0/src/devicewidget.cc +--- pavucontrol-2.0.orig/src/devicewidget.cc 2014-11-10 10:30:36.273878918 +0900 ++++ pavucontrol-2.0/src/devicewidget.cc 2014-11-10 10:39:18.554891364 +0900 +@@ -63,8 +63,13 @@ + for (unsigned i = 0; i < PA_CHANNELS_MAX; i++) + channelWidgets[i] = NULL; + ++#ifdef HAVE_GTK3 + offsetAdjustment = Gtk::Adjustment::create(0.0, -2000.0, 2000.0, 10.0, 50.0, 0.0); + offsetButton->configure(offsetAdjustment, 0, 2); ++#else ++ offsetAdjustment = new Gtk::Adjustment(0.0, -2000.0, 2000.0, 10.0, 50.0, 0.0); ++ offsetButton->configure(*offsetAdjustment, 0, 2); ++#endif + } + + void DeviceWidget::init(MainWindow* mainWindow, Glib::ustring deviceType) { +diff -u -r pavucontrol-2.0.orig/src/devicewidget.h pavucontrol-2.0/src/devicewidget.h +--- pavucontrol-2.0.orig/src/devicewidget.h 2014-11-10 10:30:36.273878918 +0900 ++++ pavucontrol-2.0/src/devicewidget.h 2014-11-10 10:39:12.869891228 +0900 +@@ -98,7 +98,11 @@ + Gtk::HBox *portSelect, *offsetSelect; + Gtk::ComboBox *portList; + Glib::RefPtr<Gtk::ListStore> treeModel; ++#ifdef HAVE_GTK3 + Glib::RefPtr<Gtk::Adjustment> offsetAdjustment; ++#else ++ Gtk::Adjustment *offsetAdjustment; ++#endif + + private: + Glib::ustring mDeviceType; diff --git a/talimatname/genel/p/pavucontrol/talimat b/talimatname/genel/p/pavucontrol/talimat new file mode 100644 index 000000000..e5a70fdcc --- /dev/null +++ b/talimatname/genel/p/pavucontrol/talimat @@ -0,0 +1,27 @@ +# Tanım: PulseAudio Ses Kontrolü (pavucontrol), PulseAudio ses sunucusu için basit bir GTK tabanlı ses kontrol aracıdır ("karıştırıcı"). +# URL: http://www.freedesktop.org/software/pulseaudio/pavucontrol/ +# Paketçi: milisarge +# Gerekler: pulseaudio gtk2 libcanberra gtkmm libsigc++ + +isim=pavucontrol +surum=2.0 +devir=1 +kaynak=(http://freedesktop.org/software/pulseaudio/pavucontrol/$isim-$surum.tar.xz pavucontrol-gtk2.patch) + +derle() { + cd $isim-$surum + + # Fix gtk2 compilation + patch -p1 -i $SRC/pavucontrol-gtk2.patch + + export CXXFLAGS="$CXXFLAGS -std=c++11" + ./configure \ + --prefix=/usr \ + --disable-gtk3 \ + --disable-lynx \ + --disable-dependency-tracking + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/p/pax-utils/libcap.pc b/talimatname/genel/p/pax-utils/libcap.pc new file mode 100644 index 000000000..5f8d6b7ba --- /dev/null +++ b/talimatname/genel/p/pax-utils/libcap.pc @@ -0,0 +1,10 @@ +prefix=/usr +exec_prefix=/usr +libdir=/usr/lib +includedir=/usr/include/pcap + +Name: libcap +Description: Library to deal with kernel modules +Version: 22 +Libs: -L${libdir} -lcap +Cflags: -I${includedir} diff --git a/talimatname/genel/p/pax-utils/talimat b/talimatname/genel/p/pax-utils/talimat new file mode 100644 index 000000000..5c2a20fdb --- /dev/null +++ b/talimatname/genel/p/pax-utils/talimat @@ -0,0 +1,19 @@ +# Tanım: ELF 32/64 ikililer için araçlar +# URL: https://wiki.gentoo.org/wiki/Hardened/PaX_Utilities +# Paketçi: milisarge +# Gerekler: +# Grup: araçlar + +isim=pax-utils +surum=1.2.2 +devir=1 +kaynak=(http://distfiles.gentoo.org/distfiles/$isim-$surum.tar.xz + libcap.pc) + +derle(){ + cd "$isim-$surum" + [ ! -f /usr/lib/pkgconfig/libcap.pc ] && cp $SRC/libcap.pc /usr/lib/pkgconfig/ + make USE_CAP=yes + make DESTDIR="$PKG/" install; + rm -f "$PKG"/usr/bin/lddtree +} diff --git a/talimatname/genel/p/pax/talimat b/talimatname/genel/p/pax/talimat new file mode 100644 index 000000000..34224d552 --- /dev/null +++ b/talimatname/genel/p/pax/talimat @@ -0,0 +1,32 @@ +# Tanım: Dosyaları çeşitli biçimlerde arşivlere ve arşivlerden kopyalar. +# URL: http://downloads.sourceforge.net/heirloom +# Paketçi: milisarge +# Gerekler: + +isim=pax +surum=070715 +devir=1 +kaynak=(http://downloads.sourceforge.net/heirloom/heirloom-070715.tar.bz2) + +derle() { + +cd heirloom-$surum + +sed -i build/mk.config \ + -e '/LIBZ/s@ -Wl[^ ]*@@g' \ + -e '/LIBBZ2/{s@^#@@;s@ -Wl[^ ]*@@g}' \ + -e '/BZLIB/s@0@1@' + +make makefiles +make -C libcommon +make -C libuxre +make -C cpio + +install -v -dm 755 $PKG/usr/bin +install -v -dm 755 $PKG/usr/share/man/man1 + +install -v -m755 cpio/pax_su3 $PKG/usr/bin/pax +install -v -m644 cpio/pax.1 $PKG/usr/share/man/man1 + + +} diff --git a/talimatname/genel/p/paxtest/talimat b/talimatname/genel/p/paxtest/talimat new file mode 100644 index 000000000..8c599f81c --- /dev/null +++ b/talimatname/genel/p/paxtest/talimat @@ -0,0 +1,17 @@ +# Tanım: Linux kernel pax güvenlik testi +# Url: http://codemonkey.org.uk/projects/trinity/ +# Paketçi: milisarge +# Gerekler: +# Grup: güvenlik + +isim=paxtest +surum=0.9.15 +devir=1 +kaynak=(https://grsecurity.net/~spender/${isim}-${surum}.tar.gz) + +derle() { + cd $isim-$surum + _make="make -f Makefile.psm BINDIR=/usr/bin RUNDIR=/usr/lib/$isim" + $_make + $_make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/p/pcmanfm-qt/talimat b/talimatname/genel/p/pcmanfm-qt/talimat new file mode 100644 index 000000000..100f621ea --- /dev/null +++ b/talimatname/genel/p/pcmanfm-qt/talimat @@ -0,0 +1,21 @@ +# Tanım: LXQt dosya yöneticisi, PCManFM'in Qt portu +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: libfm-qt lxde-menu-data + +isim=pcmanfm-qt +surum=0.13.0 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pcmanfm/talimat b/talimatname/genel/p/pcmanfm/talimat new file mode 100755 index 000000000..7c7780d39 --- /dev/null +++ b/talimatname/genel/p/pcmanfm/talimat @@ -0,0 +1,18 @@ +# Tanım: Son derece hızlı, hafif, sekmeli tarama özellikli zengin dosya yöneticisi +# URL: http://pcmanfm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libfm lxde-menu-data libexif +# Grup: + +isim=pcmanfm +surum=1.3.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/${isim}/${isim}-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc +make +make DESTDIR=$PKG install +sed -i 's/System;//' $PKG/usr/share/applications/pcmanfm.desktop +} diff --git a/talimatname/genel/p/pcre/talimat b/talimatname/genel/p/pcre/talimat new file mode 100644 index 000000000..b4be64e2a --- /dev/null +++ b/talimatname/genel/p/pcre/talimat @@ -0,0 +1,30 @@ +# Tanım: Perl ile Uyumlu Normal İfade kütüphaneleri. +# URL: http://www.pcre.org/ +# Paketçi: milisarge +# Gerekler: + +isim=pcre +surum=8.38 +devir=1 + +kaynak=( ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/$isim-$surum.tar.bz2 ) +derle() { +cd $isim-$surum + +[ "${CARCH}" = "x86_64" ] && export CFLAGS="${CFLAGS} -fPIC" + +./configure --prefix=/usr \ +--docdir=/usr/share/doc/pcre-$surum \ +--enable-unicode-properties \ +--enable-pcre16 \ +--enable-pcre32 \ +--enable-pcregrep-libz \ +--enable-pcregrep-libbz2 \ +--enable-pcretest-libreadline \ +--disable-static +make +make DESTDIR=$PKG install +mkdir $PKG/lib +mv -v $PKG/usr/lib/libpcre.so.* $PKG/lib +ln -sfv ../../lib/$(readlink $PKG/usr/lib/libpcre.so) $PKG/usr/lib/libpcre.so +} diff --git a/talimatname/genel/p/pcre2/talimat b/talimatname/genel/p/pcre2/talimat new file mode 100644 index 000000000..fdabfda4f --- /dev/null +++ b/talimatname/genel/p/pcre2/talimat @@ -0,0 +1,28 @@ +# Tanım: Perl ile Uyumlu Normal İfade kütüphaneleri (2nci vers.) +# URL: http://www.pcre.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: + +isim=pcre2 +surum=10.22 +devir=1 + +kaynak=( ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/$isim-$surum.tar.bz2 ) +PKGMK_GROUPS=(devel man doc) +derle() { +cd $isim-$surum + +[ "${CARCH}" = "x86_64" ] && export CFLAGS="${CFLAGS} -fPIC" + +./configure --prefix=/usr \ +--docdir=/usr/share/doc/pcre-$surum \ +--enable-unicode-properties \ +--enable-pcre2-16 \ +--enable-pcre2-32 \ +--enable-pcre2grep-libz \ +--enable-pcre2grep-libbz2 \ +--enable-pcre2test-libreadline \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pcsc-lite/talimat b/talimatname/genel/p/pcsc-lite/talimat new file mode 100644 index 000000000..9d44cded4 --- /dev/null +++ b/talimatname/genel/p/pcsc-lite/talimat @@ -0,0 +1,24 @@ +# Tanım: SCard API (PC/SC) kullanan smartkartlara erişim kütüphanesi +# URL: https://pcsclite.alioth.debian.org/pcsclite.html +# Paketçi: milisarge +# Gerekler: python + +isim=pcsc-lite +surum=1.8.23 +devir=1 +kaynak=(https://pcsclite.apdu.fr/files/pcsc-lite-${surum}.tar.bz2) + +derle() { + cd $isim-$surum + sed -i -e "s:python:python2:g" src/spy/pcsc-spy + ./configure --prefix=/usr \ + --sbindir=/usr/bin \ + --enable-libudev \ + --sysconfdir=/etc \ + --disable-libsystemd \ + --enable-ipcdir=/run/pcscd \ + --enable-usbdropdir=/usr/lib/pcsc/drivers + make + make DESTDIR=$PKG install + install -d ${PKG}/usr/lib/pcsc/drivers +} diff --git a/talimatname/genel/p/pcsc-perl/talimat b/talimatname/genel/p/pcsc-perl/talimat new file mode 100644 index 000000000..a9de73f0a --- /dev/null +++ b/talimatname/genel/p/pcsc-perl/talimat @@ -0,0 +1,24 @@ +# Tanım: Perl pcsc modülü +# URL: https://github.com/gitpan/pcsc-perl +# Paketçi: milisarge +# Gerekler: pcsc-lite + +isim=pcsc-perl +surum=1.4.14 +devir=1 +kaynak=(http://ludovic.rousseau.free.fr/softwares/$isim/$isim-$surum.tar.bz2) + +derle() { + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$PKG'" \ + MODULEBUILDRC=/dev/null + + cd "$isim-$surum" + /usr/bin/perl Makefile.PL + make + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" + make DESTDIR=${PKG} install + find "$PKG" -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/pcsc-tools/talimat b/talimatname/genel/p/pcsc-tools/talimat new file mode 100644 index 000000000..a9509144c --- /dev/null +++ b/talimatname/genel/p/pcsc-tools/talimat @@ -0,0 +1,19 @@ +# Tanım: PC / SC Mimarisi akıllı kart araçları +# URL: http://ludovic.rousseau.free.fr/softwares/pcsc-tools/ +# Paketçi: Cihan Alkan +# Gerekler: pcsc-lite + +isim=pcsc-tools +surum=1.5.2 +devir=1 + +kaynak=(http://ludovic.rousseau.free.fr/softwares/pcsc-tools/$isim-$surum.tar.bz2) + +derle() { + cd $SRC/$isim-$surum + ./configure + sed -i -e 's:-Wall -O2:${CFLAGS}:g' Makefile + make + make DESTDIR=$PKG install + mv $PKG/usr/local/* $PKG/usr/ +} diff --git a/talimatname/genel/p/pdfshuffler/pdfshuffler-tr.po b/talimatname/genel/p/pdfshuffler/pdfshuffler-tr.po new file mode 100644 index 000000000..12a9bd3a4 --- /dev/null +++ b/talimatname/genel/p/pdfshuffler/pdfshuffler-tr.po @@ -0,0 +1,202 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PDF-Shuffler 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-28 23:13+0200\n" +"PO-Revision-Date: 2018-01-05 07:49+0100\n" +"Last-Translator: Cihan Alkan <cihanalk@gmail.com>\n" +"Language-Team: Turkish <LL@li.org>\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: pdfshuffler/pdfshuffler.py:110 +msgid "Can't load icon. Application is not installed correctly." +msgstr "Simge yüklenemiyor. Uygulama doğru yüklenmedi." + +#: pdfshuffler/pdfshuffler.py:233 +msgid "_Rotate Right" +msgstr "" + +#: pdfshuffler/pdfshuffler.py:234 +msgid "Rotate _Left" +msgstr "Sağa Döndür" + +#: pdfshuffler/pdfshuffler.py:235 +msgid "C_rop..." +msgstr "Kırp..." + +#: pdfshuffler/pdfshuffler.py:237 +msgid "_Export selection..." +msgstr "Dışa aktarma seçimi" + +#: pdfshuffler/pdfshuffler.py:299 +msgid "No document" +msgstr "Belge yok" + +#: pdfshuffler/pdfshuffler.py:301 +msgid "Several documents" +msgstr "Çeşitli belgeler" + +#: pdfshuffler/pdfshuffler.py:317 +#, python-format +msgid "Rendering thumbnails... [%(i1)s/%(i2)s]" +msgstr "Küçük resimleri oluşturuluyor ..[%(i1)s/%(i2)s]" + +#: pdfshuffler/pdfshuffler.py:435 +msgid "page" +msgstr "sayfa" + +#: pdfshuffler/pdfshuffler.py:461 +msgid "Export ..." +msgstr "Dışa aktar ..." + +#: pdfshuffler/pdfshuffler.py:470 pdfshuffler/pdfshuffler.py:586 +msgid "PDF files" +msgstr "PDF Dosyaları" + +#: pdfshuffler/pdfshuffler.py:475 pdfshuffler/pdfshuffler.py:581 +msgid "All files" +msgstr "Tüm Dosyalar" + +#: pdfshuffler/pdfshuffler.py:518 +#, python-format +msgid "" +"File %s is encrypted.\n" +"Support for encrypted files has not been implemented yet.\n" +"File export failed." +msgstr "" + +#: pdfshuffler/pdfshuffler.py:571 +msgid "Import..." +msgstr "İçe aktar" + +#: pdfshuffler/pdfshuffler.py:604 +msgid "OpenDocument not supported yet!" +msgstr "OpenDocument henüz desteklenmiyor!" + +#: pdfshuffler/pdfshuffler.py:606 +msgid "Image file not supported yet!" +msgstr "Resim dosyası henüz desteklenmiyor!" + +#: pdfshuffler/pdfshuffler.py:608 +msgid "File type not supported!" +msgstr "Dosya türü desteklenmiyor!" + +#: pdfshuffler/pdfshuffler.py:610 +#, python-format +msgid "File %s does not exist" +msgstr "Dosya %s mevcut değil" + +#: pdfshuffler/pdfshuffler.py:612 +msgid "Closed, no files selected" +msgstr "Kapatıldı, dosya seçilmedi" + +#: pdfshuffler/pdfshuffler.py:921 +msgid "Left" +msgstr "Sol" + +#: pdfshuffler/pdfshuffler.py:921 +msgid "Right" +msgstr "Sağ" + +#: pdfshuffler/pdfshuffler.py:922 +msgid "Top" +msgstr "Üst" + +#: pdfshuffler/pdfshuffler.py:922 +msgid "Bottom" +msgstr "Alt" + +#: pdfshuffler/pdfshuffler.py:940 +msgid "Crop Selected Pages" +msgstr "Seçilen Sayfaları Kırp" + +#: pdfshuffler/pdfshuffler.py:948 +msgid "Crop Margins" +msgstr "Kenar boşluklarını kırp" + +#: pdfshuffler/pdfshuffler.py:955 +#, python-format +msgid "% of width" +msgstr "% genişlik" + +#: pdfshuffler/pdfshuffler.py:955 +#, python-format +msgid "% of height" +msgstr "% yükseklik" + +#: pdfshuffler/pdfshuffler.py:993 +msgid "Dialog closed" +msgstr "Diyalog kapalı" + +#: pdfshuffler/pdfshuffler.py:1007 +#, python-format +msgid "" +"%s is a tool for rearranging and modifying PDF files. Developed using GTK+ " +"and Python" +msgstr "%s, PDF dosyalarını yeniden düzenlemek ve değiştirmek için kullanılan bir araçtır." +"GTK ve Python kullanılarak geliştirildi" + +#: data/pdfshuffler.ui.h:1 +msgid "Crop" +msgstr "Kırp" + +#: data/pdfshuffler.ui.h:2 +msgid "Delete" +msgstr "Sil" + +#: data/pdfshuffler.ui.h:3 +msgid "Import" +msgstr "İçe Aktar" + +#: data/pdfshuffler.ui.h:4 +msgid "Open a file and append it to the current document" +msgstr "Bir dosyayı açın ve geçerli belgeye ekleyin" + +#: data/pdfshuffler.ui.h:5 +msgid "Rotate left" +msgstr "Sola Döndür" + +#: data/pdfshuffler.ui.h:6 +msgid "Rotate right" +msgstr "Sağa Döndür" + +#: data/pdfshuffler.ui.h:7 +msgid "Save" +msgstr "Kaydet" + +#: data/pdfshuffler.ui.h:8 +msgid "Save as" +msgstr "Farklı Kaydet" + +#: data/pdfshuffler.ui.h:9 +msgid "Zoom in" +msgstr "Yakınlaştır" + +#: data/pdfshuffler.ui.h:10 +msgid "Zoom out" +msgstr "Uzaklaştır" + +#: data/pdfshuffler.ui.h:11 +msgid "_Edit" +msgstr "Düzenle" + +#: data/pdfshuffler.ui.h:12 +msgid "_File" +msgstr "Dosya" + +#: data/pdfshuffler.ui.h:13 +msgid "_Help" +msgstr "Yardım" + +#: data/pdfshuffler.ui.h:14 +msgid "_View" +msgstr "Görünüm" diff --git a/talimatname/genel/p/pdfshuffler/talimat b/talimatname/genel/p/pdfshuffler/talimat new file mode 100644 index 000000000..fba530b32 --- /dev/null +++ b/talimatname/genel/p/pdfshuffler/talimat @@ -0,0 +1,24 @@ +# Tanım: Pdf belgelerini birleştirme veya bölme ve döndürme, kırpma ve sayfalarını yeniden düzenleme +# URL: http://sourceforge.net/projects/pdfshuffler/ +# Paketçi: Cihan_Alkan +# Gerekler: python-poppler pypdf +# Grup: ofis_duzenleyici + +isim=pdfshuffler +surum=0.6.0 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz + pdfshuffler-tr.po) + +derle() { + + +# python2 fix + find $isim-$surum -name "*.py" -exec \ + sed -i "s/python/&2/" {} \; + + cd $isim-$surum + mv ../pdfshuffler-tr.po $SRC/$isim-$surum/po/tr.po + python setup.py build + python setup.py install --root="$PKG" +} diff --git a/talimatname/genel/p/peek/talimat b/talimatname/genel/p/peek/talimat new file mode 100644 index 000000000..103e9b123 --- /dev/null +++ b/talimatname/genel/p/peek/talimat @@ -0,0 +1,25 @@ +# Tanım: Kullanımı kolay bir arayüze sahip basit ekran kaydedici +# URL: https://github.com/phw/peek +# Paketçi: Cihan_Alkan +# Gerekler: cmake vala gettext gtk3 libkeybinder3 ffmpeg +# Grup: medya + + +isim=peek +surum=1.2.1 +devir=1 +kaynak=(https://github.com/phw/${isim}/archive/${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + + mkdir -p build + cd "build" + cmake "${SRC}/$isim-$surum" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTS=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DGSETTINGS_COMPILE=OFF \ + -DENABLE_FILECHOOSERNATIVE=ON + make + make DESTDIR=${PKG} install +} diff --git a/talimatname/genel/p/pencilsheep/pencilsheep.sh b/talimatname/genel/p/pencilsheep/pencilsheep.sh new file mode 100644 index 000000000..c3d35f071 --- /dev/null +++ b/talimatname/genel/p/pencilsheep/pencilsheep.sh @@ -0,0 +1 @@ +/usr/share/pencilsheep/bin/pencilsheep "$@" diff --git a/talimatname/genel/p/pencilsheep/talimat b/talimatname/genel/p/pencilsheep/talimat new file mode 100644 index 000000000..d68e6d36a --- /dev/null +++ b/talimatname/genel/p/pencilsheep/talimat @@ -0,0 +1,18 @@ +# Tanım: Resim düzenleme uygulaması +# URL: http://pencilsheep.com +# Paketçi: Cihan_Alkan +# Gerekler: sdl2-ttf +# Grup: grafik + +isim=pencilsheep +surum=0.100.04 +devir=1 +kaynak=(http://pencilsheep.com/dl/pencilsheep.deb + pencilsheep.sh) + +derle() { + ar x pencilsheep.deb + tar -xf data.tar.?z -C "$PKG" ./usr + mkdir $PKG/usr/bin + cp -r $SRC/pencilsheep.sh $PKG/usr/bin/pencilsheep +} diff --git a/talimatname/genel/p/peony/peony.kur-kos b/talimatname/genel/p/peony/peony.kur-kos new file mode 100644 index 000000000..faa1e7656 --- /dev/null +++ b/talimatname/genel/p/peony/peony.kur-kos @@ -0,0 +1,7 @@ +update-mime-database /usr/share/mime +gtk-update-icon-cache +gio-querymodules /usr/lib/gio/modules +glib-compile-schemas /usr/share/glib-2.0/schemas/ +xdg-icon-resource forceupdate --theme hicolor +gdk-pixbuf-query-loaders --update-cache +update-desktop-database -q diff --git a/talimatname/genel/p/peony/talimat b/talimatname/genel/p/peony/talimat new file mode 100644 index 000000000..1ea54158d --- /dev/null +++ b/talimatname/genel/p/peony/talimat @@ -0,0 +1,21 @@ +# Tanım: Peony dosya yöneticisi +# URL: https://github.com/ukui/peony +# Paketçi: Cihan_Alkan +# Gerekler: mate-desktop pango mate-common libnotify shared-mime-info +# Grup: ukui + +isim=peony +surum=1.0.4 +devir=1 + +kaynak=(https://github.com/ukui/peony/archive/v1.0.4.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./autogen.sh + ./configure \ + --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --libexecdir=/usr/lib/$isim + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/perl-anyevent/talimat b/talimatname/genel/p/perl-anyevent/talimat new file mode 100644 index 000000000..3a20154ce --- /dev/null +++ b/talimatname/genel/p/perl-anyevent/talimat @@ -0,0 +1,18 @@ +# Tanım: Olay döngü programlamanın DBI +# URL: https://metacpan.org/release/AnyEvent +# Paketçi: Cihan_Alkan +# Gerekler: perl-glib perl-json +# Grup: kütüphane + +isim=perl-anyevent +surum=7.14 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/AnyEvent-$surum.tar.gz) + +derle() { + cd AnyEvent-$surum + perl Makefile.PL INSTALLDIRS=vendor + make + PERL_ANYEVENT_LOOP_TESTS=true make test + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/p/perl-archive-zip/talimat b/talimatname/genel/p/perl-archive-zip/talimat new file mode 100644 index 000000000..9019a6690 --- /dev/null +++ b/talimatname/genel/p/perl-archive-zip/talimat @@ -0,0 +1,18 @@ +# Tanım: Zip modülü, bir Perl programının Zip arşiv dosyalarını oluşturmasına, işlenmesine, okumasına ve yazmasına olanak tanır. +# URL: http://search.cpan.org/~adamk/Archive-Zip-1.23/lib/Archive/Zip.pm +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=perl-archive-zip +surum=1.57 +devir=1 + +kaynak=(http://cpan.metacpan.org/authors/id/P/PH/PHRED/Archive-Zip-$surum.tar.gz) + +derle() { + cd Archive-* + perl Makefile.PL + make OPTIMIZE="${CFLAGS}" + make DESTDIR=${PKG} install + find ${PKG} -name perllocal.pod -exec rm {} \; +} diff --git a/talimatname/genel/p/perl-carp-always/talimat b/talimatname/genel/p/perl-carp-always/talimat new file mode 100644 index 000000000..9df1428d1 --- /dev/null +++ b/talimatname/genel/p/perl-carp-always/talimat @@ -0,0 +1,26 @@ +# Tanım: Perl Carp modülü +# URL: http://search.cpan.org/dist/Carp-Always +# Paketçi: milisarge +# Gerekler: + +isim=perl-carp-always +surum=0.13 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/F/FE/FERREIRA/Carp-Always-0.13.tar.gz) + +derle() { + _distdir="Carp-Always-0.13" + + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$PKG'" \ + MODULEBUILDRC=/dev/null + + cd "$SRC/$_distdir" + /usr/bin/perl Makefile.PL + make + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" + make DESTDIR=${PKG} install + find "$PKG" -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/perl-carp/talimat b/talimatname/genel/p/perl-carp/talimat new file mode 100644 index 000000000..dd4e24a8e --- /dev/null +++ b/talimatname/genel/p/perl-carp/talimat @@ -0,0 +1,26 @@ +# Tanım: Perl Carp modülü +# URL: http://search.cpan.org/dist/Carp +# Paketçi: milisarge +# Gerekler: + +isim=perl-carp +surum=1.38 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Carp-1.38.tar.gz) + +derle() { + _distdir="Carp-1.38" + + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$PKG'" \ + MODULEBUILDRC=/dev/null + + cd "$SRC/$_distdir" + /usr/bin/perl Makefile.PL + make + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" + make DESTDIR=${PKG} install + find "$PKG" -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/perl-cgi-carp/talimat b/talimatname/genel/p/perl-cgi-carp/talimat new file mode 100644 index 000000000..280f89953 --- /dev/null +++ b/talimatname/genel/p/perl-cgi-carp/talimat @@ -0,0 +1,26 @@ +# Tanım: Perl CGI Carp modülü +# URL: http://search.cpan.org/~leejo/CGI-4.35/lib/CGI/Carp.pm +# Paketçi: milisarge +# Gerekler: + +isim=perl-cgi-carp +surum=4.35 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/L/LE/LEEJO/CGI-4.35.tar.gz) + +derle() { + _distdir="CGI-4.35" + + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$PKG'" \ + MODULEBUILDRC=/dev/null + + cd "$SRC/$_distdir" + /usr/bin/perl Makefile.PL + make + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" + make DESTDIR=${PKG} install + find "$PKG" -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/perl-class-accessor/talimat b/talimatname/genel/p/perl-class-accessor/talimat new file mode 100644 index 000000000..fd36c277f --- /dev/null +++ b/talimatname/genel/p/perl-class-accessor/talimat @@ -0,0 +1,19 @@ +# Tanım: Otomatik erişimci üretimi +# URL: http://search.cpan.org/dist/Class-Accessor/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: kütüphane + +isim=perl-class-accessor +surum=0.51 +devir=1 +kaynak=(https://www.cpan.org/authors/id/K/KA/KASEI/Class-Accessor-$surum.tar.gz) + +derle() { + cd Class-Accessor-$surum + eval `perl -V:archname` + perl Makefile.PL INSTALLDIRS=vendor + make + make DESTDIR="$PKG" install + find "$PKG" \( -name '.packlist' -o -name '*.pod' \) -delete +} diff --git a/talimatname/genel/p/perl-class-inspector/talimat b/talimatname/genel/p/perl-class-inspector/talimat new file mode 100644 index 000000000..1a9b4450b --- /dev/null +++ b/talimatname/genel/p/perl-class-inspector/talimat @@ -0,0 +1,17 @@ +# Tanım: Bir sınıf ve yapısı hakkında bilgi edinin +# URL: http://search.cpan.org/dist/Class-Inspector +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: + +isim=perl-class-inspector +surum=1.32 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/P/PL/PLICEASE/Class-Inspector-$surum.tar.gz) + +derle() { + cd Class-Inspector-${surum} + perl Makefile.PL INSTALLDIRS=vendor + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/p/perl-convert-asn1/talimat b/talimatname/genel/p/perl-convert-asn1/talimat new file mode 100644 index 000000000..73bde0765 --- /dev/null +++ b/talimatname/genel/p/perl-convert-asn1/talimat @@ -0,0 +1,20 @@ +# Tanım: Perl/CPAN Module Convert::ASN1 : Standard endecode of ASN1 structures +# URL: http://search.cpan.org/dist/Convert-ASN1 +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=perl-convert-asn1 +surum=0.27 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Convert-ASN1-$surum.tar.gz) + +derle() { + cd "$SRC"/Convert-ASN1-$surum + PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor + make + cd "$SRC"/Convert-ASN1-$surum + make pure_install doc_install DESTDIR="$PKG" + find "$PKG" -name '.packlist' -delete + find "$PKG" -name '*.pod' -delete +} diff --git a/talimatname/genel/p/perl-crypt-le/talimat b/talimatname/genel/p/perl-crypt-le/talimat new file mode 100644 index 000000000..f37144902 --- /dev/null +++ b/talimatname/genel/p/perl-crypt-le/talimat @@ -0,0 +1,17 @@ +# Tanım: Let's Encrypt API interfacing module +# URL: http://search.cpan.org/dist/Crypt-LE/ +# Paketçi: milisarge +# Gerekler: perl-convert-asn1 perl-crypt-openssl-rsa perl-io-socket-ssl perl-json-maybexs perl-log-log4perl perl-mozilla-ca +# Grup: kütüphane + +isim=perl-crypt-le +surum=0.29 +devir=1 +kaynak=(https://github.com/do-know/Crypt-LE/archive/$surum.tar.gz::Crypt-LE-$surum.tar.gz) + +derle() { + cd Crypt-LE-$surum + perl Makefile.PL INSTALLDIRS=vendor + make + make install DESTDIR="$PKG" +} diff --git a/talimatname/genel/p/perl-crypt-openssl-bignum/talimat b/talimatname/genel/p/perl-crypt-openssl-bignum/talimat new file mode 100644 index 000000000..5438e606b --- /dev/null +++ b/talimatname/genel/p/perl-crypt-openssl-bignum/talimat @@ -0,0 +1,23 @@ +# Tanım: OpenSSL's multiprecision integer arithmetic +# URL: https://metacpan.org/release/Crypt-OpenSSL-Bignum +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=perl-crypt-openssl-bignum +surum=0.08 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/K/KM/KMX/Crypt-OpenSSL-Bignum-$surum.tar.gz) + +derle() { + _ddir="Crypt-OpenSSL-Bignum-$surum" + cd "$SRC/$_ddir" + export PERL_MM_USE_DEFAULT=1 PERL_AUTOINSTALL=--skipdeps + unset PERL5LIB PERL_MM_OPT + /usr/bin/perl Makefile.PL + make + export PERL_MM_USE_DEFAULT=1 + unset PERL5LIB + make test + make install INSTALLDIRS=vendor DESTDIR="$PKG" +} diff --git a/talimatname/genel/p/perl-crypt-openssl-random/talimat b/talimatname/genel/p/perl-crypt-openssl-random/talimat new file mode 100644 index 000000000..52dca121c --- /dev/null +++ b/talimatname/genel/p/perl-crypt-openssl-random/talimat @@ -0,0 +1,25 @@ +# Tanım: Routines for accessing the OpenSSL pseudo-random number generator +# URL: https://metacpan.org/release/Crypt-OpenSSL-Random +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=perl-crypt-openssl-random +surum=0.11 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/R/RU/RURBAN/Crypt-OpenSSL-Random-$surum.tar.gz) + +derle() { + _ddir="Crypt-OpenSSL-Random-$surum" + cd "$SRC/$_ddir" + export PERL_MM_USE_DEFAULT=1 PERL_AUTOINSTALL=--skipdeps + unset PERL5LIB PERL_MM_OPT + /usr/bin/perl Makefile.PL + make + cd "$SRC/$_ddir" + export PERL_MM_USE_DEFAULT=1 + unset PERL5LIB + make test + cd "$SRC/$_ddir" + make install INSTALLDIRS=vendor DESTDIR="$PKG" +} diff --git a/talimatname/genel/p/perl-crypt-openssl-rsa/0001-Adapt-to-OpenSSL-1.1.0.patch b/talimatname/genel/p/perl-crypt-openssl-rsa/0001-Adapt-to-OpenSSL-1.1.0.patch new file mode 100644 index 000000000..748271d4b --- /dev/null +++ b/talimatname/genel/p/perl-crypt-openssl-rsa/0001-Adapt-to-OpenSSL-1.1.0.patch @@ -0,0 +1,185 @@ +From b3747e625780be90dcff11c2d9e91048016bb4d0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com> +Date: Thu, 13 Oct 2016 18:14:17 +0200 +Subject: [PATCH] Adapt to OpenSSL 1.1.0 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +OpenSSL 1.1.0 hid structure internals and provided methods for getting +and settting the internal values. This patch modifes the code so that +it can be built with OpenSSL 1.1.0 as well as with the older one. + +CPAN RT#117481 + +Signed-off-by: Petr Písař <ppisar@redhat.com> +--- + RSA.xs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 73 insertions(+), 16 deletions(-) + +diff --git a/RSA.xs b/RSA.xs +index de512e7..9bf6f01 100644 +--- a/RSA.xs ++++ b/RSA.xs +@@ -49,7 +49,13 @@ void croakSsl(char* p_file, int p_line) + + char _is_private(rsaData* p_rsa) + { +- return(p_rsa->rsa->d != NULL); ++ const BIGNUM *d; ++#if OPENSSL_VERSION_NUMBER < 0x10100000L ++ d = p_rsa->rsa->d; ++#else ++ RSA_get0_key(p_rsa->rsa, NULL, NULL, &d); ++#endif ++ return(d != NULL); + } + + SV* make_rsa_obj(SV* p_proto, RSA* p_rsa) +@@ -136,7 +142,7 @@ unsigned char* get_message_digest(SV* text_SV, int hash_method) + } + } + +-SV* bn2sv(BIGNUM* p_bn) ++SV* bn2sv(const BIGNUM* p_bn) + { + return p_bn != NULL + ? sv_2mortal(newSViv((IV) BN_dup(p_bn))) +@@ -317,6 +323,9 @@ _new_key_from_parameters(proto, n, e, d, p, q) + BN_CTX* ctx; + BIGNUM* p_minus_1 = NULL; + BIGNUM* q_minus_1 = NULL; ++ BIGNUM* dmp1 = NULL; ++ BIGNUM* dmq1 = NULL; ++ BIGNUM* iqmp = NULL; + int error; + CODE: + { +@@ -325,8 +334,10 @@ _new_key_from_parameters(proto, n, e, d, p, q) + croak("At least a modulous and public key must be provided"); + } + CHECK_OPEN_SSL(rsa = RSA_new()); ++#if OPENSSL_VERSION_NUMBER < 0x10100000L + rsa->n = n; + rsa->e = e; ++#endif + if (p || q) + { + error = 0; +@@ -341,8 +352,12 @@ _new_key_from_parameters(proto, n, e, d, p, q) + q = BN_new(); + THROW(BN_div(q, NULL, n, p, ctx)); + } ++#if OPENSSL_VERSION_NUMBER < 0x10100000L + rsa->p = p; + rsa->q = q; ++#else ++ THROW(RSA_set0_factors(rsa, p, q)); ++#endif + THROW(p_minus_1 = BN_new()); + THROW(BN_sub(p_minus_1, p, BN_value_one())); + THROW(q_minus_1 = BN_new()); +@@ -353,17 +368,32 @@ _new_key_from_parameters(proto, n, e, d, p, q) + THROW(BN_mul(d, p_minus_1, q_minus_1, ctx)); + THROW(BN_mod_inverse(d, e, d, ctx)); + } ++#if OPENSSL_VERSION_NUMBER < 0x10100000L + rsa->d = d; +- THROW(rsa->dmp1 = BN_new()); +- THROW(BN_mod(rsa->dmp1, d, p_minus_1, ctx)); +- THROW(rsa->dmq1 = BN_new()); +- THROW(BN_mod(rsa->dmq1, d, q_minus_1, ctx)); +- THROW(rsa->iqmp = BN_new()); +- THROW(BN_mod_inverse(rsa->iqmp, q, p, ctx)); ++#else ++ THROW(RSA_set0_key(rsa, n, e, d)); ++#endif ++ THROW(dmp1 = BN_new()); ++ THROW(BN_mod(dmp1, d, p_minus_1, ctx)); ++ THROW(dmq1 = BN_new()); ++ THROW(BN_mod(dmq1, d, q_minus_1, ctx)); ++ THROW(iqmp = BN_new()); ++ THROW(BN_mod_inverse(iqmp, q, p, ctx)); ++#if OPENSSL_VERSION_NUMBER < 0x10100000L ++ rsa->dmp1 = dmp1; ++ rsa->dmq1 = dmq1; ++ rsa->iqmp = iqmp; ++#else ++ THROW(RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)); ++#endif ++ dmp1 = dmq1 = iqmp = NULL; + THROW(RSA_check_key(rsa) == 1); + err: + if (p_minus_1) BN_clear_free(p_minus_1); + if (q_minus_1) BN_clear_free(q_minus_1); ++ if (dmp1) BN_clear_free(dmp1); ++ if (dmq1) BN_clear_free(dmq1); ++ if (iqmp) BN_clear_free(iqmp); + if (ctx) BN_CTX_free(ctx); + if (error) + { +@@ -373,7 +403,11 @@ _new_key_from_parameters(proto, n, e, d, p, q) + } + else + { ++#if OPENSSL_VERSION_NUMBER < 0x10100000L + rsa->d = d; ++#else ++ CHECK_OPEN_SSL(RSA_set0_key(rsa, n, e, d)); ++#endif + } + RETVAL = make_rsa_obj(proto, rsa); + } +@@ -383,18 +417,41 @@ _new_key_from_parameters(proto, n, e, d, p, q) + void + _get_key_parameters(p_rsa) + rsaData* p_rsa; ++PREINIT: ++ const BIGNUM* n; ++ const BIGNUM* e; ++ const BIGNUM* d; ++ const BIGNUM* p; ++ const BIGNUM* q; ++ const BIGNUM* dmp1; ++ const BIGNUM* dmq1; ++ const BIGNUM* iqmp; + PPCODE: + { + RSA* rsa; + rsa = p_rsa->rsa; +- XPUSHs(bn2sv(rsa->n)); +- XPUSHs(bn2sv(rsa->e)); +- XPUSHs(bn2sv(rsa->d)); +- XPUSHs(bn2sv(rsa->p)); +- XPUSHs(bn2sv(rsa->q)); +- XPUSHs(bn2sv(rsa->dmp1)); +- XPUSHs(bn2sv(rsa->dmq1)); +- XPUSHs(bn2sv(rsa->iqmp)); ++#if OPENSSL_VERSION_NUMBER < 0x10100000L ++ n = rsa->n; ++ e = rsa->e; ++ d = rsa->d; ++ p = rsa->p; ++ q = rsa->q; ++ dmp1 = rsa->dmp1; ++ dmq1 = rsa->dmq1; ++ iqmp = rsa->iqmp; ++#else ++ RSA_get0_key(rsa, &n, &e, &d); ++ RSA_get0_factors(rsa, &p, &q); ++ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); ++#endif ++ XPUSHs(bn2sv(n)); ++ XPUSHs(bn2sv(e)); ++ XPUSHs(bn2sv(d)); ++ XPUSHs(bn2sv(p)); ++ XPUSHs(bn2sv(q)); ++ XPUSHs(bn2sv(dmp1)); ++ XPUSHs(bn2sv(dmq1)); ++ XPUSHs(bn2sv(iqmp)); + } + + SV* +-- +2.7.4 + diff --git a/talimatname/genel/p/perl-crypt-openssl-rsa/talimat b/talimatname/genel/p/perl-crypt-openssl-rsa/talimat new file mode 100644 index 000000000..4a23643a7 --- /dev/null +++ b/talimatname/genel/p/perl-crypt-openssl-rsa/talimat @@ -0,0 +1,23 @@ +# Tanım: Interface to OpenSSL RSA methods +# URL: http://search.cpan.org/dist/Crypt-OpenSSL-RSA +# Paketçi: milisarge +# Gerekler: perl-crypt-openssl-random perl-crypt-openssl-bignum +# Grup: kütüphane + +isim=perl-crypt-openssl-rsa +surum=0.28 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/P/PE/PERLER/Crypt-OpenSSL-RSA-$surum.tar.gz + 0001-Adapt-to-OpenSSL-1.1.0.patch) + +derle() { + cd "$SRC/Crypt-OpenSSL-RSA-$surum" + patch -p1 -i "$SRC/0001-Adapt-to-OpenSSL-1.1.0.patch" + cd "$SRC/Crypt-OpenSSL-RSA-$surum" + PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor + make + cd "$SRC/Crypt-OpenSSL-RSA-$surum" + make test + cd "$SRC/Crypt-OpenSSL-RSA-$surum" + make pure_install doc_install DESTDIR="$PKG" +} diff --git a/talimatname/genel/p/perl-crypt-ssleay/talimat b/talimatname/genel/p/perl-crypt-ssleay/talimat new file mode 100644 index 000000000..35ea24545 --- /dev/null +++ b/talimatname/genel/p/perl-crypt-ssleay/talimat @@ -0,0 +1,20 @@ +# Tanım: Bu Perl modülü, LWP::UserAgent nesnesinin şifreli soket bağlantıları üzerinden GET, HEAD ve POST isteklerini gerçekleştirmesine izin vermek için LWP altında HTTPS protokolünü desteklemektedir. +# URL: http://search.cpan.org/dist/Crypt-SSLeay/SSLeay.pm +# Paketçi: milisarge +# Gerekler: perl-lwp-protocol-https perl-try-tiny perl-path-class + +isim=perl-crypt-ssleay +surum=0.72 +devir=1 + +kaynak=(http://www.cpan.org/CPAN/authors/id/N/NA/NANIS/Crypt-SSLeay-$surum.tar.gz) + +derle() { +cd Crypt-SSLeay-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install + +find $PKG -name '.packlist' -delete +find $PKG -name '*.pod' -delete +} diff --git a/talimatname/genel/p/perl-curses-ui/talimat b/talimatname/genel/p/perl-curses-ui/talimat new file mode 100644 index 000000000..6a36ef453 --- /dev/null +++ b/talimatname/genel/p/perl-curses-ui/talimat @@ -0,0 +1,26 @@ +# Tanım: Curses :: UI, Perl için nesne yönelimli bir kullanıcı arabirimi çerçevesidir. +# URL: https://metacpan.org/pod/Curses::UI +# Paketçi: milisarge +# Gerekler: + +isim=perl-curses-ui +surum=0.9609 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/M/MD/MDXI/Curses-UI-$surum.tar.gz) + +derle() { + cd Curses-UI-$surum + + perl Makefile.PL + make CC="${CC:-gcc}" LD="${CC:-gcc}" OPTIMIZE="$CFLAGS" + make DESTDIR=$PKG install + + find $PKG -type f \( \ + -name ".packlist" -o \ + -name "*.bs" -o \ + -name "autosplit.ix" -o \ + -name "perllocal.pod" \) -delete + + find $PKG -depth -empty -delete + +} diff --git a/talimatname/genel/p/perl-curses/talimat b/talimatname/genel/p/perl-curses/talimat new file mode 100644 index 000000000..81d5444d3 --- /dev/null +++ b/talimatname/genel/p/perl-curses/talimat @@ -0,0 +1,26 @@ +# Tanım: Curses, Perl ile sisteminizin curses (3) kütüphanesi arasındaki arabirimdir. +# URL: http://search.cpan.org/~giraffed/Curses-1.34/Curses.pm +# Paketçi: milisarge +# Gerekler: + +isim=perl-curses +surum=1.34 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GI/GIRAFFED/Curses-$surum.tar.gz) + +derle() { + cd Curses-$surum + + perl Makefile.PL + make CC="${CC:-gcc}" LD="${CC:-gcc}" OPTIMIZE="$CFLAGS" + make DESTDIR=$PKG install + + find $PKG -type f \( \ + -name ".packlist" -o \ + -name "*.bs" -o \ + -name "autosplit.ix" -o \ + -name "perllocal.pod" \) -delete + + find $PKG -depth -empty -delete + +} diff --git a/talimatname/genel/p/perl-data-dump/talimat b/talimatname/genel/p/perl-data-dump/talimat new file mode 100644 index 000000000..f3c8039cc --- /dev/null +++ b/talimatname/genel/p/perl-data-dump/talimat @@ -0,0 +1,19 @@ +# Tanım: Bu modül, argümanlarından geçip sonuç olarak bir dizge üreten birkaç işlev sunar. +# URL: http://search.cpan.org/~gaas/Data-Dump-1.23/lib/Data/Dump.pm +# Paketçi: milisarge +# Gerekler: + +_isim=Data-Dump +isim=perl-data-dump +surum=1.23 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/$_name-$surum.tar.gz) + +derle() { +cd $_name-$surum +perl Makefile.PL +make OPTIMIZE="$CFLAGS" +make DESTDIR=$PKG install +find $PKG -name .packlist -o -name perllocal.pod -exec rm '{}' \; +} diff --git a/talimatname/genel/p/perl-dbi/talimat b/talimatname/genel/p/perl-dbi/talimat new file mode 100644 index 000000000..a2d4f983d --- /dev/null +++ b/talimatname/genel/p/perl-dbi/talimat @@ -0,0 +1,21 @@ +# Tanım: Perl için veritabanı bağımsız arabirimi +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-dbi +surum=1.631 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/T/TI/TIMB/DBI-$surum.tar.gz) + +derle() { +cd DBI-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-devel-leak/talimat b/talimatname/genel/p/perl-devel-leak/talimat new file mode 100644 index 000000000..2c9999057 --- /dev/null +++ b/talimatname/genel/p/perl-devel-leak/talimat @@ -0,0 +1,27 @@ +# Tanım: Geri kazanılmayan perl nesneleri aramak için yardımcı program. +# URL: https://metacpan.org/pod/Devel::Leak +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=perl-devel-leak +surum=0.03 +devir=1 + +kaynak=( https://cpan.metacpan.org/authors/id/N/NI/NI-S/Devel-Leak-$surum.tar.gz) + +derle() { + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$pkgdir'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$pkgdir'" \ + MODULEBUILDRC=/dev/null + cd Devel-Leak-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-devel-symdump/talimat b/talimatname/genel/p/perl-devel-symdump/talimat new file mode 100644 index 000000000..2c6c4e766 --- /dev/null +++ b/talimatname/genel/p/perl-devel-symdump/talimat @@ -0,0 +1,22 @@ +# Tanım: Perl sembol tablosuna erişim ve boşaltma +# URL: http://search.cpan.org/dist/Devel-Symdump +# Paketçi: milisarge +# Gerekler: + +isim=perl-devel-symdump +surum=2.11 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/A/AN/ANDK/Devel-Symdump-$surum.tar.gz) + +derle() { + cd Devel-Symdump-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-digest-hmac/talimat b/talimatname/genel/p/perl-digest-hmac/talimat new file mode 100644 index 000000000..bd1224022 --- /dev/null +++ b/talimatname/genel/p/perl-digest-hmac/talimat @@ -0,0 +1,21 @@ +# Tanım: İleti Kimlik Doğrulaması için Anahtarlı-Hashing +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-digest-sha1 + +isim=perl-digest-hmac +surum=1.03 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/Digest-HMAC-$surum.tar.gz) + +derle() { +cd Digest-HMAC-$surum +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-digest-nilsimsa/talimat b/talimatname/genel/p/perl-digest-nilsimsa/talimat new file mode 100644 index 000000000..618a6e642 --- /dev/null +++ b/talimatname/genel/p/perl-digest-nilsimsa/talimat @@ -0,0 +1,21 @@ +# Tanım: Nilsimsa kodunun Perl sürümü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-digest-nilsimsa +surum=0.06 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/V/VI/VIPUL/Digest-Nilsimsa-$surum.tar.gz) + +derle() { +cd Digest-Nilsimsa-$surum +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-digest-sha1/talimat b/talimatname/genel/p/perl-digest-sha1/talimat new file mode 100644 index 000000000..6dc3f6cb4 --- /dev/null +++ b/talimatname/genel/p/perl-digest-sha1/talimat @@ -0,0 +1,20 @@ +# Tanım: SHA-1 Algoritmasına Perl Arayüzü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-digest-sha1 +surum=2.13 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/Digest-SHA1-$surum.tar.gz) + +derle() { +cd Digest-SHA1-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG -iname '*.pod' -or \ +-name '.packlist' -or \ +-name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-encode-locale/talimat b/talimatname/genel/p/perl-encode-locale/talimat new file mode 100644 index 000000000..53a05fc49 --- /dev/null +++ b/talimatname/genel/p/perl-encode-locale/talimat @@ -0,0 +1,21 @@ +# Tanım: Yerel kodlamayı belirleyin +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-encode-locale +surum=1.03 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/Encode-Locale-$surum.tar.gz) + +derle() { +cd Encode-Locale-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-error/talimat b/talimatname/genel/p/perl-error/talimat new file mode 100644 index 000000000..987e69fa3 --- /dev/null +++ b/talimatname/genel/p/perl-error/talimat @@ -0,0 +1,21 @@ +# Tanım: Perl / CPAN Hata modülü - OO-ish yolunda hata / istisna işleme +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-error +surum=0.17022 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/Error-$surum.tar.gz) + +derle() { +cd Error-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-extutils-depends/talimat b/talimatname/genel/p/perl-extutils-depends/talimat new file mode 100644 index 000000000..4533a6f9b --- /dev/null +++ b/talimatname/genel/p/perl-extutils-depends/talimat @@ -0,0 +1,22 @@ +# Tanım: XS uzantılarına bağlı XS uzantılarını kolayca oluşturun +# URL: http://search.cpan.org/~flora/ExtUtils-Depends-0.304/lib/ExtUtils/Depends.pm +# Paketçi: milisarge +# Gerekler: + +isim=perl-extutils-depends +surum=0.304 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/F/FL/FLORA/ExtUtils-Depends-$surum.tar.gz) + +derle() { + cd ExtUtils-Depends-$surum + perl Makefile.PL + make + make DESTDIR=$PKG install + find $PKG \ + -name perllocal.pod \ + -o -name .packlist | xargs rm + find $PKG -empty | xargs rmdir -p ||: + +} diff --git a/talimatname/genel/p/perl-extutils-makemaker/talimat b/talimatname/genel/p/perl-extutils-makemaker/talimat new file mode 100644 index 000000000..68b590173 --- /dev/null +++ b/talimatname/genel/p/perl-extutils-makemaker/talimat @@ -0,0 +1,31 @@ +# Tanım: Bu yardımcı program, bir Makefile'den bir uzantı modülü için bir Makefile yazmak üzere tasarlanmıştır. +# URL: http://search.cpan.org/~bingos/ExtUtils-MakeMaker-6.98/lib/ExtUtils/MakeMaker.pm +# Paketçi: milisarge +# Gerekler: + +isim=perl-extutils-makemaker +surum=6.98 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-$surum.tar.gz) + +derle() { + cd ExtUtils-MakeMaker-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make test + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove duplicated man pages + rm -r $PKG/usr/share/man + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done + rm $PKG/usr/bin/instmodsh +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/p/perl-extutils-pkgconfig/talimat b/talimatname/genel/p/perl-extutils-pkgconfig/talimat new file mode 100644 index 000000000..0dc787cc7 --- /dev/null +++ b/talimatname/genel/p/perl-extutils-pkgconfig/talimat @@ -0,0 +1,22 @@ +# Tanım: Pkgconfig için Perl bağlayıcısı +# URL: http://search.cpan.org/~xaoc/ExtUtils-PkgConfig-1.15/lib/ExtUtils/PkgConfig.pm +# Paketçi: milisarge +# Gerekler: perl-extutils-depends + +isim=perl-extutils-pkgconfig +surum=1.15 +devir=1 + +kaynak=(http://www.cpan.org/modules/by-module/ExtUtils/ExtUtils-PkgConfig-$surum.tar.gz) + +derle() { + cd ExtUtils-PkgConfig-$surum + perl Makefile.PL + make + make DESTDIR=$PKG install + find $PKG \ + -name perllocal.pod \ + -o -name .packlist | xargs rm + find $PKG -empty | xargs rmdir -p ||: +} + diff --git a/talimatname/genel/p/perl-file-listing/talimat b/talimatname/genel/p/perl-file-listing/talimat new file mode 100644 index 000000000..8a9669928 --- /dev/null +++ b/talimatname/genel/p/perl-file-listing/talimat @@ -0,0 +1,21 @@ +# Tanım: Ayrıştırma dizini listesi +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-http-date + +isim=perl-file-listing +surum=6.04 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/File-Listing-$surum.tar.gz) + +derle() { +cd File-Listing-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-file-sharedir/talimat b/talimatname/genel/p/perl-file-sharedir/talimat new file mode 100644 index 000000000..6a20ca6ee --- /dev/null +++ b/talimatname/genel/p/perl-file-sharedir/talimat @@ -0,0 +1,20 @@ +# Tanım: Dist başına ve modül başına paylaşılan dosyaları bulun +# URL: http://search.cpan.org/dist/File-ShareDir +# Paketçi: Cihan_Alkan +# Gerekler: perl-class-inspector +# Grup: + +isim=perl-file-sharedir +_isim=File-ShareDir +_yazar=REHSACK +surum=1.102 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/${_yazar::1}/${_yazar::2}/${_yazar}/$_isim-$surum.tar.gz) + +derle() { + + cd "$SRC/$_isim-$surum" + PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/p/perl-glib/talimat b/talimatname/genel/p/perl-glib/talimat new file mode 100644 index 000000000..00b5028e0 --- /dev/null +++ b/talimatname/genel/p/perl-glib/talimat @@ -0,0 +1,21 @@ +# Tanım: Glib için perl bağlayıcısı +# URL: http://www.gtkperl.org +# Paketçi: milisarge +# Gerekler: perl-extutils-depends gobject-introspection perl-extutils-pkgconfig + +isim=perl-glib +surum=1.304 +devir=1 + +kaynak=(https://github.com/gitpan/Glib/archive/cpan_path/XAOC/Glib-$surum.tar.gz.tar.gz) + +derle() { + cd Glib-cpan_path-XAOC-Glib-$surum.tar.gz + perl Makefile.PL + make + make DESTDIR=$PKG install + find $PKG \ + -name perllocal.pod \ + -o -name .packlist | xargs rm + rm $PKG -empty | xargs rmdir -p ||: +} diff --git a/talimatname/genel/p/perl-html-parser/talimat b/talimatname/genel/p/perl-html-parser/talimat new file mode 100644 index 000000000..702e26fb5 --- /dev/null +++ b/talimatname/genel/p/perl-html-parser/talimat @@ -0,0 +1,22 @@ +# Tanım: Perl HTML ayrıştırıcı modülü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-html-tagset + +isim=perl-html-parser +surum=3.71 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTML-Parser-$surum.tar.gz) + +derle() { +cd HTML-Parser-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install + +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-html-tagset/talimat b/talimatname/genel/p/perl-html-tagset/talimat new file mode 100644 index 000000000..907651b3d --- /dev/null +++ b/talimatname/genel/p/perl-html-tagset/talimat @@ -0,0 +1,21 @@ +# Tanım: HTML ayrıştırması için faydalı veri tabloları +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-html-tagset +surum=3.20 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/P/PE/PETDANCE/HTML-Tagset-$surum.tar.gz) + +derle() { +cd HTML-Tagset-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-http-cookies/talimat b/talimatname/genel/p/perl-http-cookies/talimat new file mode 100644 index 000000000..ff6982448 --- /dev/null +++ b/talimatname/genel/p/perl-http-cookies/talimat @@ -0,0 +1,21 @@ +# Tanım: HTTP çerez kavanozları +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-http-date perl-http-message + +isim=perl-http-cookies +surum=6.01 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Cookies-$surum.tar.gz) + +derle() { +cd HTTP-Cookies-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-http-daemon/talimat b/talimatname/genel/p/perl-http-daemon/talimat new file mode 100644 index 000000000..d0d026510 --- /dev/null +++ b/talimatname/genel/p/perl-http-daemon/talimat @@ -0,0 +1,21 @@ +# Tanım: Basit bir http sunucusu sınıfı +# URL: https://metacpan.org/pod/HTTP::Daemon +# Paketçi: milisarge +# Gerekler: perl-http-date perl-http-message perl-lwp-mediatypes + +isim=perl-http-daemon +surum=6.01 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Daemon-$surum.tar.gz) + +derle() { +cd HTTP-Daemon-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-http-date/talimat b/talimatname/genel/p/perl-http-date/talimat new file mode 100644 index 000000000..f90db39d1 --- /dev/null +++ b/talimatname/genel/p/perl-http-date/talimat @@ -0,0 +1,21 @@ +# Tanım: Tarih dönüştürme rutinleri +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-http-date +surum=6.02 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Date-$surum.tar.gz) + +derle() { +cd HTTP-Date-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-http-message/talimat b/talimatname/genel/p/perl-http-message/talimat new file mode 100644 index 000000000..2b9919a14 --- /dev/null +++ b/talimatname/genel/p/perl-http-message/talimat @@ -0,0 +1,27 @@ +# Tanım: HTTP stili mesajlar. +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-encode-locale perl-html-parser perl-http-date perl-lwp-mediatypes perl-uri + +isim=perl-http-message +surum=6.06 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Message-$surum.tar.gz) + +derle() { +( export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor" \ + PERL_MB_OPT="--installdirs vendor" \ + MODULEBUILDRC=/dev/null) + +cd HTTP-Message-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-http-negotiate/talimat b/talimatname/genel/p/perl-http-negotiate/talimat new file mode 100644 index 000000000..5f3fb0f26 --- /dev/null +++ b/talimatname/genel/p/perl-http-negotiate/talimat @@ -0,0 +1,22 @@ +# Tanım: Sunulacak bir varyant seçin +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-http-message + +isim=perl-http-negotiate +surum=6.01 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Negotiate-$surum.tar.gz) + +derle() { +cd HTTP-Negotiate-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install + +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-image-exiftool/talimat b/talimatname/genel/p/perl-image-exiftool/talimat new file mode 100644 index 000000000..0cd8b0402 --- /dev/null +++ b/talimatname/genel/p/perl-image-exiftool/talimat @@ -0,0 +1,21 @@ +# Tanım: Ham dosyalardaki exif bilgilerini oluşturur ve yeniden yazar +# URL: http://search.cpan.org/~exiftool/Image-ExifTool/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-image-exiftool +surum=9.90 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/E/EX/EXIFTOOL/Image-ExifTool-$surum.tar.gz) + +derle() { +cd Image-ExifTool-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install +find $PKG \ +-name '*.pod' \ +-o -name '.packlist' | xargs rm +find $PKG -empty | xargs rmdir -p ||: +} diff --git a/talimatname/genel/p/perl-io-socket-inet6/talimat b/talimatname/genel/p/perl-io-socket-inet6/talimat new file mode 100644 index 000000000..2b9ae5528 --- /dev/null +++ b/talimatname/genel/p/perl-io-socket-inet6/talimat @@ -0,0 +1,25 @@ +# Tanım: IO::Socket::INET6, AF_INET veya AF_INET6 etki alanlarında yuvalar oluşturmak ve kullanmak için bir nesne arabirimi sağlar. +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-socket6 + +isim=perl-io-socket-inet6 +surum=2.72 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/IO-Socket-INET6-$surum.tar.gz) + +derle() { + ( export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor" \ + PERL_MB_OPT="--installdirs vendor" \ + MODULEBUILDRC=/dev/null) + +cd IO-Socket-INET6-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install + +find $PKG -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/perl-io-socket-ssl/talimat b/talimatname/genel/p/perl-io-socket-ssl/talimat new file mode 100644 index 000000000..311a607f8 --- /dev/null +++ b/talimatname/genel/p/perl-io-socket-ssl/talimat @@ -0,0 +1,18 @@ +# Tanım: Nearly transparent SSL encapsulation for IO::Socket::INET +# URL: http://search.cpan.org/dist/IO-Socket-SSL/ +# Paketçi: milisarge +# Gerekler: perl-net-ssleay perl-uri +# Grup: + +isim=perl-io-socket-ssl +surum=2.055 +devir=1 +kaynak=(http://www.cpan.org/authors/id/S/SU/SULLR/IO-Socket-SSL-$surum.tar.gz) + +derle() { + cd IO-Socket-SSL-${surum} + yes | perl Makefile.PL INSTALLDIRS=vendor + make + make test + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/p/perl-io-tty/talimat b/talimatname/genel/p/perl-io-tty/talimat new file mode 100644 index 000000000..675e250c3 --- /dev/null +++ b/talimatname/genel/p/perl-io-tty/talimat @@ -0,0 +1,26 @@ +# Tanım: TTY'lere ve PTY'lere bir arayüz sağlama +# URL: http://search.cpan.org/dist/IO-Tty/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-io-tty +surum=1.11 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/T/TO/TODDR/IO-Tty-$surum.tar.gz) + +derle() { + cd IO-Tty-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/p/perl-ipc-run/talimat b/talimatname/genel/p/perl-ipc-run/talimat new file mode 100644 index 000000000..848126065 --- /dev/null +++ b/talimatname/genel/p/perl-ipc-run/talimat @@ -0,0 +1,26 @@ +# Tanım: IPC::Run, dosyaları, boruları ve sözde tty'leri kullanarak alt süreçleri çalıştırmanıza ve etkileşime girmenizi sağlar. +# URL: http://search.cpan.org/dist/IPC-Run +# Paketçi: milisarge +# Gerekler: perl-io-tty + +isim=perl-ipc-run +surum=0.92 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/T/TO/TODDR/IPC-Run-$surum.tar.gz) + +derle() { + cd IPC-Run-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/p/perl-json-maybexs/talimat b/talimatname/genel/p/perl-json-maybexs/talimat new file mode 100644 index 000000000..3d337e3a0 --- /dev/null +++ b/talimatname/genel/p/perl-json-maybexs/talimat @@ -0,0 +1,29 @@ +# Tanım: Use Cpanel::JSON::XS with a fallback to JSON::XS and JSON::PP +# URL: https://metacpan.org/release/JSON-MaybeXS +# Paketçi: milisarge +# Gerekler: +# Grup: + +isim=perl-json-maybexs +surum=1.003008 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/E/ET/ETHER/JSON-MaybeXS-$surum.tar.gz) + +derle() { + _distdir="JSON-MaybeXS-$surum" + ( export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir $PKG" \ + MODULEBUILDRC=/dev/null + cd "$SRC/$_distdir" + /usr/bin/perl Makefile.PL + make + ) + cd "$SRC/$_distdir" + export PERL_MM_USE_DEFAULT=1 PERL5LIB="" + make test + cd "$SRC/$_distdir" + make install + find "$PKG" -name .packlist -o -name perllocal.pod -delete +} diff --git a/talimatname/genel/p/perl-json/talimat b/talimatname/genel/p/perl-json/talimat new file mode 100644 index 000000000..de4b14073 --- /dev/null +++ b/talimatname/genel/p/perl-json/talimat @@ -0,0 +1,20 @@ +# Tanım: JSON (JavaScript Object Notation) kodlayıcı/kod çözücü +# URL: http://search.cpan.org/dist/JSON +# Paketçi: Cihan_Alkan +# Gerekler: perl +# Grup: kütüphane + +isim=perl-json +surum=2.97000 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/I/IS/ISHIGAKI/JSON-$surum.tar.gz) + +derle() { + + cd JSON-$surum + PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor + make + make install DESTDIR="$PKG" + find "$PKG" -name '.packlist' -delete + find "$PKG" -name '*.pod' -delete +} diff --git a/talimatname/genel/p/perl-libwww/talimat b/talimatname/genel/p/perl-libwww/talimat new file mode 100644 index 000000000..7e3803f5c --- /dev/null +++ b/talimatname/genel/p/perl-libwww/talimat @@ -0,0 +1,21 @@ +# Tanım: Perl için World Wide Web kütüphanesi +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-encode-locale perl-file-listing perl-html-parser perl-http-cookies perl-http-daemon perl-http-date perl-http-negotiate perl-lwp-mediatypes perl-net-http perl-uri perl-www-robotrules perl-http-message + +isim=perl-libwww +surum=6.06 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/libwww-perl-$surum.tar.gz) + +derle() { +cd libwww-perl-$surum +perl Makefile.PL --aliases IINSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-linux-desktopfiles/talimat b/talimatname/genel/p/perl-linux-desktopfiles/talimat new file mode 100644 index 000000000..ee919d12e --- /dev/null +++ b/talimatname/genel/p/perl-linux-desktopfiles/talimat @@ -0,0 +1,28 @@ +# Tanım: linux masa dosyalarını parçalamak için perl modulu +# URL:http://search.cpan.org/~trizen/Linux-DesktopFiles-0.07/lib/Linux/DesktopFiles.pm +# Paketçi: milisarge +# Gerekler: + +_isim=Linux-DesktopFiles +isim=perl-linux-desktopfiles +surum=0.25 +devir=1 + +kaynak=(https://cpan.metacpan.org/authors/id/T/TR/TRIZEN/Linux-DesktopFiles-$surum.tar.gz) + +derle() { + ( export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor DESTDIR='$PKG'" \ + PERL_MB_OPT="--installdirs vendor --destdir '$PKG'" \ + MODULEBUILDRC=/dev/null + + cd "$SRC/$_isim-$surum" + /usr/bin/perl Makefile.PL + make + make install + + find "$PKG" -name .packlist -o -name perllocal.pod -delete + ) + +} diff --git a/talimatname/genel/p/perl-locale-gettext/talimat b/talimatname/genel/p/perl-locale-gettext/talimat new file mode 100644 index 000000000..d0bdd7cea --- /dev/null +++ b/talimatname/genel/p/perl-locale-gettext/talimat @@ -0,0 +1,22 @@ +# Tanım: Perl'den gettext () fonksiyon ailesine erişime izin verir. +# URL: http://search.cpan.org/dist/gettext/ +# Paketçi: alihan-ozturk28@hotmail.com milisarge +# Gerekler: + +isim=perl-locale-gettext +surum=1.07 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/P/PV/PVANDRY/gettext-$surum.tar.gz) + +derle() { + cd Locale-gettext-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-log-log4perl/talimat b/talimatname/genel/p/perl-log-log4perl/talimat new file mode 100644 index 000000000..213aa3b11 --- /dev/null +++ b/talimatname/genel/p/perl-log-log4perl/talimat @@ -0,0 +1,18 @@ +# Tanım: Log4j implementation for Perl +# URL: https://metacpan.org/release/Log-Log4perl +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=perl-log-log4perl +surum=1.49 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/Log-Log4perl-$surum.tar.gz) + +derle() { + cd Log-Log4perl-$surum + perl Makefile.PL INSTALLDIRS=vendor + make + make test + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/p/perl-lwp-mediatypes/talimat b/talimatname/genel/p/perl-lwp-mediatypes/talimat new file mode 100644 index 000000000..b92679890 --- /dev/null +++ b/talimatname/genel/p/perl-lwp-mediatypes/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir dosyanın medya türünü veya bir URL'yi tahmin edin +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-lwp-mediatypes +surum=6.02 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/LWP-MediaTypes-$surum.tar.gz) + +derle() { +cd LWP-MediaTypes-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-lwp-protocol-https/talimat b/talimatname/genel/p/perl-lwp-protocol-https/talimat new file mode 100644 index 000000000..0efec9d6a --- /dev/null +++ b/talimatname/genel/p/perl-lwp-protocol-https/talimat @@ -0,0 +1,22 @@ +# Tanım: LWP :: UserAgent için https desteği sağlar +# URL: http://search.cpan.org/~gaas/LWP-Protocol-https-6.04/lib/LWP/Protocol/https.pm +# Paketçi: milisarge +# Gerekler: perl-io-socket-ssl perl-mozilla-ca perl-net-http perl-libwww + +isim=perl-lwp-protocol-https +surum=6.04 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/LWP-Protocol-https-$surum.tar.gz) + +derle() { +cd LWP-Protocol-https-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install + +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-mail-dkim/talimat b/talimatname/genel/p/perl-mail-dkim/talimat new file mode 100644 index 000000000..e5a9245f3 --- /dev/null +++ b/talimatname/genel/p/perl-mail-dkim/talimat @@ -0,0 +1,21 @@ +# Tanım: İnternet postasını DKIM/DomainKey imzaları ile imzalar/doğrular +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-crypt-openssl-rsa perl-digest-sha1 perl-mailtools perl-net-dns + +isim=perl-mail-dkim +surum=0.40 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/J/JA/JASLONG/Mail-DKIM-$surum.tar.gz) + +derle() { +cd Mail-DKIM-$surum +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-mail-spf/talimat b/talimatname/genel/p/perl-mail-spf/talimat new file mode 100644 index 000000000..36284e62c --- /dev/null +++ b/talimatname/genel/p/perl-mail-spf/talimat @@ -0,0 +1,17 @@ +# Tanım: SPF desteği sağlayan Perl modülü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-error perl-netaddr-ip perl-uri perl-net-dns perl-net-dns-resolver-programmable + +isim=perl-mail-spf +surum=2.9.0 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/J/JM/JMEHNLE/mail-spf/Mail-SPF-v$surum.tar.gz) + +derle() { +cd Mail-SPF-v$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/perl-mailtools/talimat b/talimatname/genel/p/perl-mailtools/talimat new file mode 100644 index 000000000..1956cf412 --- /dev/null +++ b/talimatname/genel/p/perl-mailtools/talimat @@ -0,0 +1,21 @@ +# Tanım: Çeşitli e-posta ile ilgili modüller +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-timedate + +isim=perl-mailtools +surum=2.13 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/M/MA/MARKOV/MailTools-$surum.tar.gz) + +derle() { +cd MailTools-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-module-build/talimat b/talimatname/genel/p/perl-module-build/talimat new file mode 100644 index 000000000..11cb55c2b --- /dev/null +++ b/talimatname/genel/p/perl-module-build/talimat @@ -0,0 +1,19 @@ +# Tanım: Perl modülü binası +# URL:http://search.cpan.org/~leont/Module-Build-0.4216 +# Paketçi: milisarge +# Gerekler: + +_isim=Module-Build +isim=perl-module-build +surum=0.4216 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/L/LE/LEONT/$_name-$surum.tar.gz) + +derle() { +cd $_name-$surum +perl Makefile.PL +make OPTIMIZE="$CFLAGS" +make DESTDIR=$PKG install +find $PKG -name .packlist -o -name perllocal.pod -exec rm '{}' \; +} diff --git a/talimatname/genel/p/perl-mozilla-ca/talimat b/talimatname/genel/p/perl-mozilla-ca/talimat new file mode 100644 index 000000000..7cd28a890 --- /dev/null +++ b/talimatname/genel/p/perl-mozilla-ca/talimat @@ -0,0 +1,17 @@ +# Tanım: Mozilla's CA cert bundle in PEM format +# URL: https://metacpan.org/release/Mozilla-CA +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=perl-mozilla-ca +surum=20160104 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/A/AB/ABH/Mozilla-CA-$surum.tar.gz) + +derle() { + cd Mozilla-CA-$surum + perl Makefile.PL INSTALLDIRS=vendor + make + make install DESTDIR="$PKG" +} diff --git a/talimatname/genel/p/perl-net-dns-resolver-programmable/talimat b/talimatname/genel/p/perl-net-dns-resolver-programmable/talimat new file mode 100644 index 000000000..23a633b4c --- /dev/null +++ b/talimatname/genel/p/perl-net-dns-resolver-programmable/talimat @@ -0,0 +1,21 @@ +# Tanım: DNS'nin çevrimdışı öykünmesi için bir Net::DNS::Resolver alt sınıfı +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-net-dns + +isim=perl-net-dns-resolver-programmable +surum=0.003 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/J/JM/JMEHNLE/net-dns-resolver-programmable/Net-DNS-Resolver-Programmable-v$surum.tar.gz) + +derle() { +cd Net-DNS-Resolver-Programmable-v$surum +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-net-dns/talimat b/talimatname/genel/p/perl-net-dns/talimat new file mode 100644 index 000000000..871d2864c --- /dev/null +++ b/talimatname/genel/p/perl-net-dns/talimat @@ -0,0 +1,20 @@ +# Tanım: Perl Modülü: DNS çözümleyicisine arayüz +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-digest-hmac perl-net-ip perl-io-socket-inet6 perl-socket6 + +isim=perl-net-dns +surum=0.81 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/N/NL/NLNETLABS/Net-DNS-$surum.tar.gz) + +derle() { +cd Net-DNS-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG -iname '*.pod' -or \ +-name '.packlist' -or \ +-name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-net-http/talimat b/talimatname/genel/p/perl-net-http/talimat new file mode 100644 index 000000000..18b6459e8 --- /dev/null +++ b/talimatname/genel/p/perl-net-http/talimat @@ -0,0 +1,21 @@ +# Tanım: Düşük düzey HTTP bağlantısı (istemci) +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-net-http +surum=6.06 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/Net-HTTP-$surum.tar.gz) + +derle() { +cd Net-HTTP-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-net-ip/talimat b/talimatname/genel/p/perl-net-ip/talimat new file mode 100644 index 000000000..d514d451f --- /dev/null +++ b/talimatname/genel/p/perl-net-ip/talimat @@ -0,0 +1,20 @@ +# Tanım: Perl Modülü: IPv4 ve IPv6 adreslerinin kolay manipüle edilmesi +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-net-ip +surum=1.26 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/M/MA/MANU/Net-IP-$surum.tar.gz) + +derle() { +cd Net-IP-$surum +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG -iname '*.pod' -or \ +-name '.packlist' -or \ +-name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-net-ssleay/talimat b/talimatname/genel/p/perl-net-ssleay/talimat new file mode 100644 index 000000000..08bd4335a --- /dev/null +++ b/talimatname/genel/p/perl-net-ssleay/talimat @@ -0,0 +1,31 @@ +# Tanım: OpenSSL'yi kullanmak için Perl uzantısı +# URL: http://search.cpan.org/dist/Net-SSLeay +# Paketçi: milisarge +# Gerekler: + +_cpanisim=Net-SSLeay +isim=perl-net-ssleay +surum=1.63 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/M/MI/MIKEM/${_cpanname}-$surum.tar.gz) + +derle() { +cd ${_cpanname}-$surum +sed -i \ + -e "/\$opts->{optimize} = '-O2 -g';/d" \ + inc/Module/Install/PRIVATE/Net/SSLeay.pm + +export OPTIMIZE="$CFLAGS" +export OPENSSL_PREFIX=/usr + +PERL_MM_USE_DEFAULT=1 perl Makefile.PL -- INSTALLDIRS=vendor +make +make install DESTDIR=$PKG + +install -D -m644 README $PKG/usr/share/licenses/$isim/LICENSE +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-netaddr-ip/talimat b/talimatname/genel/p/perl-netaddr-ip/talimat new file mode 100644 index 000000000..8ad8040c5 --- /dev/null +++ b/talimatname/genel/p/perl-netaddr-ip/talimat @@ -0,0 +1,21 @@ +# Tanım: IP adreslerini ve alt ağları yönetmek için Perl modülü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-netaddr-ip +surum=4.075 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/M/MI/MIKER/NetAddr-IP-$surum.tar.gz) + +derle() { +cd NetAddr-IP-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-path-class/talimat b/talimatname/genel/p/perl-path-class/talimat new file mode 100644 index 000000000..627c39815 --- /dev/null +++ b/talimatname/genel/p/perl-path-class/talimat @@ -0,0 +1,27 @@ +# Tanım: Çapraz platform yol belirtimi manipülasyonu +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-path-class +surum=0.33 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/K/KW/KWILLIAMS/Path-Class-$surum.tar.gz) + +derle() { +export PERL_MM_USE_DEFAULT=1 PERL5LIB="" \ + PERL_AUTOINSTALL=--skipdeps \ + PERL_MM_OPT="INSTALLDIRS=vendor" \ + PERL_MB_OPT="--installdirs vendor" \ + MODULEBUILDRC=/dev/null + +cd Path-Class-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perl-pod-coverage/talimat b/talimatname/genel/p/perl-pod-coverage/talimat new file mode 100644 index 000000000..e2a2c2371 --- /dev/null +++ b/talimatname/genel/p/perl-pod-coverage/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir modülün belgelerinin kapsamlı olup olmadığını kontrol eder +# URL: http://search.cpan.org/dist/Pod-Coverage +# Paketçi: milisarge +# Gerekler: + +isim=perl-pod-coverage +surum=0.23 +devir=1 + +kaynak=( +http://www.cpan.org/authors/id/R/RC/RCLAMP/Pod-Coverage-$surum.tar.gz) + +derle() { + cd Pod-Coverage-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-socket6/talimat b/talimatname/genel/p/perl-socket6/talimat new file mode 100644 index 000000000..1cf4c1c8d --- /dev/null +++ b/talimatname/genel/p/perl-socket6/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir getaddrinfo/getnameinfo destek modülü +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-socket6 +surum=0.25 +devir=2 + +kaynak=(http://search.cpan.org/CPAN/authors/id/U/UM/UMEMOTO/Socket6-$surum.tar.gz) + +derle() { +cd Socket6-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-term-readkey/talimat b/talimatname/genel/p/perl-term-readkey/talimat new file mode 100644 index 000000000..128494d3a --- /dev/null +++ b/talimatname/genel/p/perl-term-readkey/talimat @@ -0,0 +1,19 @@ +# Tanım: Basit uç kontrolü için bir perl modülü +# URL: http://search.cpan.org/~jstowe/TermReadKey-2.33/ +# Paketçi: milisarge +# Gerekler: + +_isim=TermReadKey +isim=perl-term-readkey +surum=2.33 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/J/JS/JSTOWE/$_name-$surum.tar.gz) + +derle() { +cd $_name-$surum +perl Makefile.PL +make OPTIMIZE="$CFLAGS" +make DESTDIR=$PKG install +find $PKG -name .packlist -o -name perllocal.pod -exec rm '{}' \; +} diff --git a/talimatname/genel/p/perl-test-pod-coverage/talimat b/talimatname/genel/p/perl-test-pod-coverage/talimat new file mode 100644 index 000000000..24ea6aeb6 --- /dev/null +++ b/talimatname/genel/p/perl-test-pod-coverage/talimat @@ -0,0 +1,26 @@ +# Tanım: CPAN Test::Pod::Kapsama modülü +# URL: URL: http://search.cpan.org/dist/Test-Pod-Coverage/ +# Paketçi: milisarge +# Gerekler: perl-pod-coverage + +isim=perl-test-pod-coverage +surum=1.08 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/Test-Pod-Coverage-$surum.tar.gz) + +derle() { + cd Test-Pod-Coverage-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/p/perl-test-pod/talimat b/talimatname/genel/p/perl-test-pod/talimat new file mode 100644 index 000000000..3023e1e31 --- /dev/null +++ b/talimatname/genel/p/perl-test-pod/talimat @@ -0,0 +1,22 @@ +# Tanım: Dosyalardaki POD hatalarını kontrol etme +# URL: http://search.cpan.org/dist/Test-Pod/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=perl-test-pod +surum=1.51 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/E/ET/ETHER/Test-Pod-$surum.tar.gz) + +derle() { + cd Test-Pod-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-time-duration/talimat b/talimatname/genel/p/perl-time-duration/talimat new file mode 100644 index 000000000..79baeb3d7 --- /dev/null +++ b/talimatname/genel/p/perl-time-duration/talimat @@ -0,0 +1,23 @@ +# Tanım: Yuvarlak veya kesin İngilizce sürelerin ifadesi +# URL: http://search.cpan.org/dist/Time-Duration +# Paketçi: milisarge +# Gerekler: perl-test-pod perl-test-pod-coverage + +isim=perl-time-duration +surum=1.1 +devir=1 + +kaynak=( +http://www.cpan.org/authors/id/A/AV/AVIF/Time-Duration-$surum.tar.gz) + +derle() { + cd Time-Duration-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-timedate/talimat b/talimatname/genel/p/perl-timedate/talimat new file mode 100644 index 000000000..5fbf3a99e --- /dev/null +++ b/talimatname/genel/p/perl-timedate/talimat @@ -0,0 +1,23 @@ +# Tanım: Tarih biçimlendirme altprogramları +# URL: http://search.cpan.org/dist/TimeDate/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-timedate +surum=2.30 +devir=1 + +kaynak=( +http://www.cpan.org/authors/id/G/GB/GBARR/TimeDate-$surum.tar.gz) + +derle() { + cd TimeDate-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-tk/talimat b/talimatname/genel/p/perl-tk/talimat new file mode 100644 index 000000000..0d536f77e --- /dev/null +++ b/talimatname/genel/p/perl-tk/talimat @@ -0,0 +1,17 @@ +# Tanım: Perl için bir grafik kullanıcı arabirimi araç takımı. +# URL: http://search.cpan.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: perl-devel-leak perl-test-pod xorg-server libpng libjpeg-turbo tk + +isim=perl-tk +surum=804.033 +devir=1 + +kaynak=( http://search.cpan.org/CPAN/authors/id/S/SR/SREZIC/Tk-$surum.tar.gz) + +derle() { +cd Tk-$surum +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/perl-try-tiny/talimat b/talimatname/genel/p/perl-try-tiny/talimat new file mode 100644 index 000000000..496acaa77 --- /dev/null +++ b/talimatname/genel/p/perl-try-tiny/talimat @@ -0,0 +1,19 @@ +# Tanım: \$@ Öğesinin uygun yerelleştirilmesiyle minimum deneme/yakalama +# URL: http://search.cpan.org/dist/Try-Tiny +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: + +isim=perl-try-tiny +surum=0.30 +devir=1 +kaynak=(http://search.cpan.org/CPAN/authors/id/E/ET/ETHER/Try-Tiny-$surum.tar.gz) + +derle() { + cd Try-Tiny-${surum} + perl Makefile.PL INSTALLDIRS=vendor + make + make DESTDIR="$PKG" install + # upstream typo :/ + install -D -m644 LICENCE "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/p/perl-uri/talimat b/talimatname/genel/p/perl-uri/talimat new file mode 100644 index 000000000..c0e6b4456 --- /dev/null +++ b/talimatname/genel/p/perl-uri/talimat @@ -0,0 +1,21 @@ +# Tanım: Tekdüzen Kaynak Tanımlayıcıları (mutlak ve göreceli) +# URL: http://search.cpan.org/~gaas/URI-1.60/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-uri +surum=1.67 +devir=1 + +kaynak=(http://www.cpan.org/authors/id/E/ET/ETHER/URI-$surum.tar.gz) + +derle() { +cd URI-$surum + perl Makefile.PL + make + make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/p/perl-www-robotrules/talimat b/talimatname/genel/p/perl-www-robotrules/talimat new file mode 100644 index 000000000..2c76396e2 --- /dev/null +++ b/talimatname/genel/p/perl-www-robotrules/talimat @@ -0,0 +1,20 @@ +# Tanım: Robots.txt türevli izinlerin veritabanı +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl-uri + +isim=perl-www-robotrules +surum=6.02 +devir=2 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/WWW-RobotRules-$surum.tar.gz) + +derle() { +cd WWW-RobotRules-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install +find $PKG \ +-name perllocal.pod \ +-o -name .packlist | xargs rm +} diff --git a/talimatname/genel/p/perl-xml-namespacesupport/talimat b/talimatname/genel/p/perl-xml-namespacesupport/talimat new file mode 100644 index 000000000..b22274f28 --- /dev/null +++ b/talimatname/genel/p/perl-xml-namespacesupport/talimat @@ -0,0 +1,22 @@ +# Tanım: Genel ad alanı yardımcıları (SAX2'den aktarılan) +# URL: http://search.cpan.org/dist/XML-NamespaceSupport +# Paketçi: milisarge +# Gerekler: + +isim=perl-xml-namespacesupport +surum=1.11 +devir=1 + +kaynak=( http://www.cpan.org/authors/id/P/PE/PERIGRIN/XML-NamespaceSupport-$surum.tar.gz) + +derle() { + cd XML-NamespaceSupport-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-xml-parser/talimat b/talimatname/genel/p/perl-xml-parser/talimat new file mode 100644 index 000000000..e80d0f657 --- /dev/null +++ b/talimatname/genel/p/perl-xml-parser/talimat @@ -0,0 +1,19 @@ +# Tanım: Xml belgesini işlemek için Perl modülü +# URL: http://search.cpan.org/dist/XML-Parser/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-xml-parser +surum=2.43 +devir=2 + +kaynak=(http://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-$surum.tar.gz) +run=(perl) + +derle() { +cd XML-Parser-$surum +perl Makefile.PL +make OPTIMIZE="$CFLAGS" +make DESTDIR=$PKG install +find $PKG -name .packlist -o -name perllocal.pod -exec rm '{}' \; +} diff --git a/talimatname/genel/p/perl-xml-sax-base/talimat b/talimatname/genel/p/perl-xml-sax-base/talimat new file mode 100644 index 000000000..c6c98c28b --- /dev/null +++ b/talimatname/genel/p/perl-xml-sax-base/talimat @@ -0,0 +1,24 @@ +# Tanım: Temel sınıf SAX Sürücüleri ve Filtreleri +# URL: http://search.cpan.org/dist/XML-SAX-Base +# Paketçi: milisarge +# Gerekler: + +isim=perl-xml-sax-base +surum=1.08 +devir=1 + +kaynak=( +http://www.cpan.org/authors/id/G/GR/GRANTM/XML-SAX-Base-$surum.tar.gz) + +derle() { + cd XML-SAX-Base-$surum + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make test + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-xml-sax/perl-xml-sax.patch b/talimatname/genel/p/perl-xml-sax/perl-xml-sax.patch new file mode 100644 index 000000000..880468b8d --- /dev/null +++ b/talimatname/genel/p/perl-xml-sax/perl-xml-sax.patch @@ -0,0 +1,46 @@ +--- a/Makefile.PL 2011-09-04 23:37:48.000000000 +0200 ++++ b/Makefile.PL 2011-10-07 18:12:50.000000000 +0200 +@@ -12,43 +12,3 @@ + 'XML::NamespaceSupport' => 0.03, + }, + ); +- +-sub MY::install { +- package MY; +- my $script = shift->SUPER::install(@_); +- +- # Only modify existing ParserDetails.ini if user agrees +- +- my $write_ini_ok = 0; +- +- eval { require XML::SAX }; +- if ($@) { +- $write_ini_ok = 1; +- } +- else { +- my $dir = File::Basename::dirname($INC{'XML/SAX.pm'}); +- if (-e File::Spec->catfile($dir, 'SAX', 'ParserDetails.ini')) { +- $write_ini_ok = +- ExtUtils::MakeMaker::prompt( +- "Do you want XML::SAX to alter ParserDetails.ini?", "Y" +- ) =~ /^y/i; +- } +- else { +- $write_ini_ok = 1; +- } +- } +- +- if ($write_ini_ok) { +- $script =~ s/install :: (.*)$/install :: $1 install_sax_pureperl/m; +- $script .= <<"INSTALL"; +- +-install_sax_pureperl : +-\t\@\$(PERL) -MXML::SAX -e "XML::SAX->add_parser(q(XML::SAX::PurePerl))->save_parsers()" +- +-INSTALL +- +- } +- +- return $script; +-} +- diff --git a/talimatname/genel/p/perl-xml-sax/talimat b/talimatname/genel/p/perl-xml-sax/talimat new file mode 100644 index 000000000..d6a35427b --- /dev/null +++ b/talimatname/genel/p/perl-xml-sax/talimat @@ -0,0 +1,26 @@ +# Tanım: XML için basit API +# URL: http://search.cpan.org/dist/XML-SAX +# Paketçi: milisarge +# Gerekler: perl-xml-namespacesupport perl-xml-sax-base + +isim=perl-xml-sax +surum=0.99 +devir=1 + +kaynak=( +http://www.cpan.org/authors/id/G/GR/GRANTM/XML-SAX-$surum.tar.gz +perl-xml-sax.patch) + +derle() { + cd XML-SAX-$surum + patch -Np1 -i ../perl-xml-sax.patch || exit 1 + perl Makefile.PL + make OPTIMIZE="$CFLAGS" || exit 1 + make test + make install INSTALLDIRS=vendor DESTDIR=$PKG || exit 1 + + # Remove perllocal.pod and .packlist if present in the package + for i in perllocal.pod .packlist; do + find $PKG -name "$i" -exec rm -rf {} \; + done +} diff --git a/talimatname/genel/p/perl-xml-simple/talimat b/talimatname/genel/p/perl-xml-simple/talimat new file mode 100644 index 000000000..3d40b6934 --- /dev/null +++ b/talimatname/genel/p/perl-xml-simple/talimat @@ -0,0 +1,21 @@ +# Tanım: XML'i korumak için kolay API +# URL: http://search.cpan.org/~grantm/ +# Paketçi: milisarge +# Gerekler: + +isim=perl-xml-simple +surum=2.20 +devir=1 + +kaynak=(http://search.cpan.org/CPAN/authors/id/G/GR/GRANTM/XML-Simple-$surum.tar.gz) + +derle() { +cd XML-Simple-$surum +perl Makefile.PL +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/p/perldoc/perldoc.desktop b/talimatname/genel/p/perldoc/perldoc.desktop new file mode 100644 index 000000000..382f9c70a --- /dev/null +++ b/talimatname/genel/p/perldoc/perldoc.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Categories=Development;Documentation +Exec=xdg-open file:///usr/share/doc/perldoc-5.20.0/index.html +Icon=perldoc +StartupNotify=false +Terminal=false +Type=Application +Name=Perl Documentation +Name[fr]=Documentation Perl diff --git a/talimatname/genel/p/perldoc/perldoc.png b/talimatname/genel/p/perldoc/perldoc.png new file mode 100644 index 0000000000000000000000000000000000000000..adae31957d537cc5f53c0175a7c22267284c0540 GIT binary patch literal 4190 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/p/perldoc/talimat b/talimatname/genel/p/perldoc/talimat new file mode 100644 index 000000000..04bc6d036 --- /dev/null +++ b/talimatname/genel/p/perldoc/talimat @@ -0,0 +1,24 @@ +# Tanım: Perldoc (Resmi Perl belgeleri) +# URL: http://perldoc.perl.org +# Paketçi: milisarge +# Gerekler: + +isim=perldoc +surum=5.20.1 +devir=1 + +kaynak=( +http://perldoc.perl.org/perldoc-html.tar.gz +perldoc.desktop +perldoc.png +) + +derle(){ +mkdir -p $PKG/usr/share/doc/$isim-$surum +cp -rf $SRC/perldoc-html/* \ +$PKG/usr/share/doc/$isim-$surum/ +install -Dm 644 $SRC/$isim.desktop \ +$PKG/usr/share/applications/$isim.desktop +install -Dm 644 $SRC/$isim.png \ +$PKG/usr/share/icons/hicolor/48x48/apps/$isim.png +} diff --git a/talimatname/genel/p/pgadmin3/pgadmin3-fix-segfault.patch b/talimatname/genel/p/pgadmin3/pgadmin3-fix-segfault.patch new file mode 100644 index 000000000..1396f8de8 --- /dev/null +++ b/talimatname/genel/p/pgadmin3/pgadmin3-fix-segfault.patch @@ -0,0 +1,11 @@ +--- a/pgadmin/frm/plugins.cpp ++++ b/pgadmin/frm/plugins.cpp +@@ -380,7 +380,7 @@ bool pluginUtilityFactory::CheckEnable(p + { + // If we need a specific server type, we can't enable unless + // we have a connection. +- if (!obj || !(obj->GetConnection()->GetStatus() == PGCONN_OK)) ++ if (!obj || !obj->GetConnection() || !(obj->GetConnection()->GetStatus() == PGCONN_OK)) + return false; + + // Get the server type. diff --git a/talimatname/genel/p/pgadmin3/talimat b/talimatname/genel/p/pgadmin3/talimat new file mode 100644 index 000000000..e40ae0b62 --- /dev/null +++ b/talimatname/genel/p/pgadmin3/talimat @@ -0,0 +1,26 @@ +# Tanım: PostgreSQL administration gui frontend +# URL: http://www.pgadmin.org/ +# Paketçi: milisarge +# Gerekler: wxgtk postgresql libgcrypt libxslt libxml2 libnotify + +isim=pgadmin3 +surum=1.22.2 +devir=1 +kaynak=(https://github.com/postgres/pgadmin3/archive/REL-1_22_2.tar.gz + pgadmin3-fix-segfault.patch) + +derle() { + cd $isim-REL-1_22_2 + bash bootstrap + patch -p1 -i $SRC/pgadmin3-fix-segfault.patch + ./configure --prefix=/usr --with-wx-surum=3.0 --with-libgcrypt + make all + make DESTDIR=$PKG install + find $PKG/usr/share/pgadmin3/docs/* ! -wholename "*tr_TR*" | xargs rm -rf + rm -r "$PKG/usr/share/pgadmin3/i18n/" + install -d "$PKG/usr/share/pgadmin3/i18n/" + install -Dm644 i18n/$isim.lng "$PKG/usr/share/pgadmin3/i18n" + cp -r i18n/tr_TR "$PKG/usr/share/pgadmin3/i18n/" + install -Dm644 "pgadmin/include/images/pgAdmin3.png" "$PKG/usr/share/pgadmin3/pgadmin3.png" + install -Dm644 "pkg/pgadmin3.desktop" "$PKG/usr/share/applications/pgadmin3.desktop" +} diff --git a/talimatname/genel/p/phonon-backend-gstreamer-qt5/talimat b/talimatname/genel/p/phonon-backend-gstreamer-qt5/talimat new file mode 100644 index 000000000..228157287 --- /dev/null +++ b/talimatname/genel/p/phonon-backend-gstreamer-qt5/talimat @@ -0,0 +1,24 @@ +# Tanım: Bu pakette, GStreamer medya çerçevesini kullanan bir Phonon arka planı bulunur. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: phonon-qt5 gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good gstreamer1-plugins-bad gstreamer1-plugins-ugly libxml2 pulseaudio + +isim=phonon-backend-gstreamer-qt5 +devir=1 +surum=4.9.0 +_isim=phonon-backend-gstreamer + +kaynak=( http://download.kde.org/stable/phonon/${_name}/$surum/${_name}-$surum.tar.xz) + +derle() { +cd phonon-gstreamer-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPHONON_BUILD_PHONON4QT5=ON \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/phonon-backend-vlc-qt5/talimat b/talimatname/genel/p/phonon-backend-vlc-qt5/talimat new file mode 100644 index 000000000..d0a248be6 --- /dev/null +++ b/talimatname/genel/p/phonon-backend-vlc-qt5/talimat @@ -0,0 +1,24 @@ +# Tanım: Bu pakette VLC medya çerçevesini kullanan bir Phonon arka planı bulunur. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules phonon-qt5 libvlc pulseaudio + +isim=phonon-backend-vlc-qt5 +devir=1 +surum=0.9.0 +_isim=phonon-backend-vlc + +kaynak=( http://download.kde.org/stable/phonon/${_name}/$surum/${_name}-$surum.tar.xz) + +derle() { +cd phonon-vlc-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPHONON_BUILD_PHONON4QT5=ON \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/phonon-qt4/talimat b/talimatname/genel/p/phonon-qt4/talimat new file mode 100644 index 000000000..509aab07c --- /dev/null +++ b/talimatname/genel/p/phonon-qt4/talimat @@ -0,0 +1,30 @@ +# Tanım: KDE'nin API multimedya programı. KDE tarafından daha fazla desteklenen eski aRts'in yerini alıyor. +# URL: https://www.kde.org/ +# Paketçi: milisarge +# Gerekler: cmake kf5-extra-cmake-modules glib qt4 pulseaudio + +isim=phonon-qt4 +devir=1 +surum=4.9.0 +_isim=phonon +kaynak=(http://download.kde.org/stable/${_name}/$surum/${_name}-$surum.tar.xz) + +derle() { + cd phonon-$surum + cmake ../phonon-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPHONON_INSTALL_QT_EXTENSIONS_INTO_SYSTEM_QT=ON \ + -DQT_QMAKE_EXECUTABLE=/usr/bin/qmake-qt4 \ + -D__KDE_HAVE_GCC_VISIBILITY=NO \ + -DCMAKE_INSTALL_LIBDIR=lib + + make + make DESTDIR=$PKG install + + # Install headers into the Qt4 dir + install -d "${PKG}"/usr/include/qt4 + mv "${PKG}"/usr/include/{phonon,KDE} "${PKG}"/usr/include/qt4/ + sed -i 's#includedir=/usr/include#includedir=/usr/include/qt4#' "${PKG}/usr/lib/pkgconfig/phonon.pc" +} diff --git a/talimatname/genel/p/phonon-qt5/talimat b/talimatname/genel/p/phonon-qt5/talimat new file mode 100644 index 000000000..cb47b1f7e --- /dev/null +++ b/talimatname/genel/p/phonon-qt5/talimat @@ -0,0 +1,25 @@ +# Tanım: KDE'nin API multimedya programı. KDE tarafından daha fazla desteklenen eski aRts'in yerini alıyor. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake kf5-extra-cmake-modules glib qt5 pulseaudio + +isim=phonon-qt5 +devir=1 +surum=4.9.0 +_isim=phonon +kaynak=(http://download.kde.org/stable/${_name}/$surum/${_name}-$surum.tar.xz) + +derle() { +cd phonon-$surum +cmake ../phonon-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPHONON_INSTALL_QT_EXTENSIONS_INTO_SYSTEM_QT=ON \ + -DPHONON_BUILD_PHONON4QT5=ON \ + -D__KDE_HAVE_GCC_VISIBILITY=NO \ + -DCMAKE_INSTALL_LIBDIR=lib + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/php-gd/talimat b/talimatname/genel/p/php-gd/talimat new file mode 100644 index 000000000..3b07844c4 --- /dev/null +++ b/talimatname/genel/p/php-gd/talimat @@ -0,0 +1,22 @@ +# Tanım: php-gd kütüphanesi +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: libgd + +isim=php-gd +surum=5.6.31 +devir=1 +kaynak=(http://www.php.net/distributions/php-$surum.tar.xz) + +derle() { + cd php-$surum + + ./configure --disable-all \ + --enable-gd-native-ttf \ + --with-gd=shared,/usr + make build-modules + + install -d $PKG/{etc/php/conf.d,usr/lib/php/extensions} + install -m 755 modules/gd.so $PKG/usr/lib/php/extensions + echo "extension=gd.so" > $PKG/etc/php/conf.d/gd.ini +} diff --git a/talimatname/genel/p/php-gettext/talimat b/talimatname/genel/p/php-gettext/talimat new file mode 100644 index 000000000..e0fca5a99 --- /dev/null +++ b/talimatname/genel/p/php-gettext/talimat @@ -0,0 +1,25 @@ +# Tanım: Php için Gettext modülü +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: + +isim=php-gettext +surum=5.6.31 +devir=1 +kaynak=(http://www.php.net/distributions/php-$surum.tar.xz) + +derle() { + cd php-$surum + + ./configure \ + --disable-all \ + --with-${name#*-}=shared,/usr + make build-modules + + install -d $PKG/etc/php/conf.d + for i in modules/*.so; do + install -D -m755 $i $PKG/usr/lib/php/extensions/${i##*/} + echo extension=/usr/lib/php/extensions/${i##*/} >> $PKG/etc/php/conf.d/${name#php-}.ini + done + +} diff --git a/talimatname/genel/p/php-mysql/talimat b/talimatname/genel/p/php-mysql/talimat new file mode 100644 index 000000000..76c832e07 --- /dev/null +++ b/talimatname/genel/p/php-mysql/talimat @@ -0,0 +1,28 @@ +# Tanım: PHP için MySQL modulü +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: mariadb php + +isim=php-mysql +surum=5.6.31 +devir=1 +kaynak=(http://php.net/distributions/php-$surum.tar.xz) + +derle() { + cd php-$surum + + ./configure --disable-all \ + --enable-pdo=shared \ + --enable-mysqlnd=shared \ + --with-mysql=shared,mysqlnd \ + --with-mysqli=shared,mysqlnd \ + --with-pdo-mysql=shared,mysqlnd + + make build-modules + + install -d $PKG/{etc/php/conf.d,usr/lib/php/extensions} + install -m 755 modules/*mysql*.so $PKG/usr/lib/php/extensions + + printf 'extension=%s\n' {mysqlnd,mysql,mysqli,pdo_mysql}.so \ + > $PKG/etc/php/conf.d/mysql.ini +} diff --git a/talimatname/genel/p/php-xsl/talimat b/talimatname/genel/p/php-xsl/talimat new file mode 100644 index 000000000..7cbe602b0 --- /dev/null +++ b/talimatname/genel/p/php-xsl/talimat @@ -0,0 +1,23 @@ +# Tanım: libxslt kütüphanesi kullanılarak xslt php uyarlaması +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: libxslt + +isim=php-xsl +surum=5.6.31 +devir=1 +kaynak=(http://www.php.net/distributions/php-$surum.tar.xz) + +derle() { + cd php-$surum + + ./configure --disable-all \ + --enable-libxml \ + --enable-dom \ + --with-xsl=shared,/usr + make build-modules + + install -d $PKG/{etc/php/conf.d,usr/lib/php/extensions} + install -m 755 modules/xsl.so $PKG/usr/lib/php/extensions + echo "extension=xsl.so" > $PKG/etc/php/conf.d/xsl.ini +} diff --git a/talimatname/genel/p/php/php.kos-kur b/talimatname/genel/p/php/php.kos-kur new file mode 100644 index 000000000..4f00f265d --- /dev/null +++ b/talimatname/genel/p/php/php.kos-kur @@ -0,0 +1,12 @@ +cakisan=php7 +if [ -d /var/lib/pkg/DB/$cakisan ]; then + echo "php7 sürümü siliniyor." + nokta=`date +%m-%d-%y.%H%M%S` + mkdir -p /var/lib/pkg/koruma + [ -f /etc/php.ini ] && cp /etc/php.ini /var/lib/pkg/koruma/php7.ini.$nokta + [ -f /etc/php-fpm.conf ] && cp /etc/php-fpm.conf /var/lib/pkg/koruma/php7-fpm.conf.$nokta + [ -f /etc/pear.conf ] && cp /etc/pear.conf /var/lib/pkg/koruma/pear7.conf.$nokta + mps -sz $cakisan +else + echo "çakışan $cakisan paketi mevcut degil." +fi diff --git a/talimatname/genel/p/php/talimat b/talimatname/genel/p/php/talimat new file mode 100644 index 000000000..ee3d245dc --- /dev/null +++ b/talimatname/genel/p/php/talimat @@ -0,0 +1,44 @@ +# Tanım: Dinamik web sitelerinde kullanılan programlama kodunun HTML biçimlendirmesine doğrudan gömülmesini sağlar. +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: apache libxml2 aspell aspell-tr libxslt enchant pcre pth freetype libexif libjpeg-turbo libpng libtiff xorg curl db mariadb openldap postgresql sqlite unixodbc openssl cyrus-sasl kerberos + +isim=php +surum=5.6.31 +devir=1 + +kaynak=(http://php.net/distributions/$isim-$surum.tar.xz) +derle() { + + cd $isim-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --datadir=/usr/share/php \ + --mandir=/usr/share/man \ + --enable-fpm \ + --with-fpm-user=apache \ + --with-fpm-group=apache \ + --with-config-file-path=/etc \ + --with-zlib \ + --enable-bcmath \ + --with-bz2 \ + --enable-calendar \ + --enable-dba=shared \ + --enable-mysqlnd \ + --with-gdbm \ + --with-gmp \ + --enable-ftp \ + --with-gettext \ + --enable-mbstring \ + --with-readline + make + make -j1 INSTALL_ROOT=$PKG install + + install -v -m644 php.ini-production $PKG/etc/php.ini + mv -v $PKG/etc/php-fpm.conf{.default,} + + sed -i 's@php/includes"@&\ninclude_path = ".:/usr/lib/php"@' $PKG/etc/php.ini + +} diff --git a/talimatname/genel/p/php7-apache/apache.conf b/talimatname/genel/p/php7-apache/apache.conf new file mode 100644 index 000000000..4a0f571f8 --- /dev/null +++ b/talimatname/genel/p/php7-apache/apache.conf @@ -0,0 +1,11 @@ +<IfModule dir_module> + <IfModule php7_module> + DirectoryIndex index.php index.html + <FilesMatch "\.php$"> + SetHandler application/x-httpd-php + </FilesMatch> + <FilesMatch "\.phps$"> + SetHandler application/x-httpd-php-source + </FilesMatch> + </IfModule> +</IfModule> \ No newline at end of file diff --git a/talimatname/genel/p/php7-apache/talimat b/talimatname/genel/p/php7-apache/talimat new file mode 100644 index 000000000..4ed675655 --- /dev/null +++ b/talimatname/genel/p/php7-apache/talimat @@ -0,0 +1,23 @@ +# Tanım: php-apache kütüphanesi +# URL: http://www.php.net +# Paketçi: halityilmaz1982 +# Gerekler: php7 apache + +isim=php7-apache +surum=7.1.11 +devir=1 +kaynak=(http://www.php.net/distributions/php-$surum.tar.xz + apache.conf) + +derle() { + cd php-$surum + + ./configure --disable-all \ + --with-apxs2 + make DESTDIR=$PKG install + + install -D -m755 ${SRC}/php-${surum}/libs/libphp7.so ${PKG}/usr/lib/httpd/modules/libphp7.so + install -D -m644 ${SRC}/apache.conf ${PKG}/etc/httpd/conf/extra/php7_module.conf + mkdir -p $PKG/etc/php/conf.d/ + echo "extension=apache.so" > $PKG/etc/php/conf.d/apache.ini +} diff --git a/talimatname/genel/p/php7/php7.kos-kur b/talimatname/genel/p/php7/php7.kos-kur new file mode 100644 index 000000000..251685395 --- /dev/null +++ b/talimatname/genel/p/php7/php7.kos-kur @@ -0,0 +1,12 @@ +cakisan=php +if [ -d /var/lib/pkg/DB/$cakisan ]; then + echo "php7 sürümü siliniyor." + nokta=`date +%m-%d-%y.%H%M%S` + mkdir -p /var/lib/pkg/koruma + [ -f /etc/php.ini ] && cp /etc/php.ini /var/lib/pkg/koruma/php.ini.$nokta + [ -f /etc/php-fpm.conf ] && cp /etc/php-fpm.conf /var/lib/pkg/koruma/php-fpm.conf.$nokta + [ -f /etc/pear.conf ] && cp /etc/pear.conf /var/lib/pkg/koruma/pear.conf.$nokta + mps -sz $cakisan +else + echo "çakışan $cakisan paketi mevcut degil." +fi diff --git a/talimatname/genel/p/php7/php7.kur-kos b/talimatname/genel/p/php7/php7.kur-kos new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/talimatname/genel/p/php7/php7.kur-kos @@ -0,0 +1 @@ + diff --git a/talimatname/genel/p/php7/talimat b/talimatname/genel/p/php7/talimat new file mode 100644 index 000000000..ecb040618 --- /dev/null +++ b/talimatname/genel/p/php7/talimat @@ -0,0 +1,50 @@ +# Tanım: Dinamik web sitelerinde kullanılan programlama kodunun doğrudan HTML içine gömülmesini sağlar. +# URL: http://www.php.net +# Paketçi: milisarge +# Gerekler: apache libxml2 aspell aspell-tr libxslt enchant pcre pth freetype libexif libjpeg-turbo libpng libtiff db mariadb openldap postgresql sqlite unixodbc cyrus-sasl kerberos + +isim=php7 +_isim=php +surum=7.1.11 +devir=1 + +kaynak=(http://php.net/distributions/${_isim}-$surum.tar.xz) + +derle() { + + cd ${_isim}-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --datadir=/usr/share/php \ + --mandir=/usr/share/man \ + --enable-fpm \ + --with-fpm-user=www-data \ + --with-fpm-group=www-data \ + --with-config-file-path=/etc \ + --with-zlib \ + --enable-bcmath \ + --with-bz2 \ + --enable-calendar \ + --enable-dba=shared \ + --with-gdbm \ + --with-gmp \ + --enable-ftp \ + --with-gettext \ + --enable-mbstring \ + --with-mysqli=shared \ + --with-mysql-sock=/run/mysqld/mysqld.sock \ + --with-pdo-mysql=shared \ + --with-readline + make + make -j1 INSTALL_ROOT=$PKG install + + install -v -m644 php.ini-production $PKG/etc/php.ini + if [ -f /etc/php-fpm.conf.default ]; then + mv -v /etc/php-fpm.conf{.default,} && + mv -v /etc/php-fpm.d/www.conf{.default,} + fi + sed -i 's@php/includes"@&\ninclude_path = ".:/usr/lib/php"@' $PKG/etc/php.ini + +} diff --git a/talimatname/genel/p/physfs/talimat b/talimatname/genel/p/physfs/talimat new file mode 100644 index 000000000..d918d150b --- /dev/null +++ b/talimatname/genel/p/physfs/talimat @@ -0,0 +1,22 @@ +# Tanım: Çeşitli arşivlere soyut erişim sağlayan kütüphane +# URL: http://icculus.org/physfs/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=physfs +surum=2.0.3 +devir=1 +kaynak=(http://icculus.org/$isim/downloads/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + sed -i -e 's|-Werror||' CMakeLists.txt + + cmake \ + -DPHYSFS_BUILD_STATIC=FALSE \ + -DCMAKE_INSTALL_PREFIX=/usr . + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/picolisp/talimat b/talimatname/genel/p/picolisp/talimat new file mode 100644 index 000000000..db55d287a --- /dev/null +++ b/talimatname/genel/p/picolisp/talimat @@ -0,0 +1,43 @@ +# Tanım: Hızlı ve hafif bir 64-bit Lisp yorumlayıcısı +# URL: http://www.picolisp.com +# Paketçi: milisarge +# Gerekler: +# Grup: geliştirme + +isim=picolisp +surum=18.1.18 +devir=1 +kaynak=(https://github.com/taij33n/picolisp/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/${isim}-$surum/src" + make all + make clean + # 64bit sürüm derlemesi + cd "${SRC}/${isim}-$surum/src64" + # real 64-bit env + make + make clean + + install -d -m755 "${PKG}/usr/lib/picolisp" + cp -a ${SRC}/${isim}/* ${PKG}/usr/lib/picolisp/ + + # kısayolar + install -d -m755 "$PKG/usr/bin/" + ln -s "/usr/lib/picolisp/bin/picolisp" "$PKG/usr/bin/" + ln -s "/usr/lib/picolisp/bin/pil" "$PKG/usr/bin/" + + ln -s "/usr/lib/picolisp/bin/ssl" "$PKG/usr/bin/" + ln -s "/usr/lib/picolisp/bin/httpGate" "$PKG/usr/bin/" + ln -s "/usr/lib/picolisp/bin/psh" "$PKG/usr/bin/" + + # belge + install -d -m755 "$PKG/usr/share/man/man1/" + ln -s "/usr/lib/picolisp/man/man1/picolisp.1" "$PKG/usr/share/man/man1/" + ln -s "/usr/lib/picolisp/man/man1/pil.1" "$PKG/usr/share/man/man1/" + + ln -s "/usr/lib/picolisp" "$PKG/usr/share/" + + # lisans + install -Dm755 $PKG/usr/lib/picolisp/COPYING $PKG/usr/share/licenses/picolisp/LICENSE +} diff --git a/talimatname/genel/p/pidgin/pidgin.kur-kos b/talimatname/genel/p/pidgin/pidgin.kur-kos new file mode 100644 index 000000000..aec6ce5d7 --- /dev/null +++ b/talimatname/genel/p/pidgin/pidgin.kur-kos @@ -0,0 +1,2 @@ +gtk-update-icon-cache +update-desktop-database diff --git a/talimatname/genel/p/pidgin/talimat b/talimatname/genel/p/pidgin/talimat new file mode 100644 index 000000000..263d0ce9c --- /dev/null +++ b/talimatname/genel/p/pidgin/talimat @@ -0,0 +1,33 @@ +# Tanım: Pidgin, AIM, ICQ, GroupWise, MSN, Jabber, IRC, Napster, Gadu-Gadu, SILC, Zephyr ve Yahoo gibi geniş bir ağ yelpazesiyle bağlanabilen bir Gtk+ 2 anında mesajlaşma istemcisidir. +# URL: http://www.pidgin.im +# Paketçi: milisarge +# Gerekler: desktop-file-utils gtk2 gstreamer1 libxml2 perl-xml-parser gnutls nss nspr xorg-libxscrnsaver xorg-libxrandr xorg-libxinerama xorg-libsm xscreensaver startup-notification hicolor-icon-theme libidn dbus networkmanager + +isim=pidgin +surum=2.10.12 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--with-gstreamer=1.0 \ +--disable-gevolution \ +--disable-meanwhile \ +--disable-avahi \ +--disable-mono \ +--disable-tk \ +--disable-cap \ +--disable-gtkspell \ +--disable-vv \ +--disable-nm \ +--disable-tcl \ +--disable-schemas-install \ +--enable-gnutls=yes + +make +make DESTDIR=$PKG install +rm -rf $PKG/{etc,usr/lib/perl5} +} diff --git a/talimatname/genel/p/pimcommon/talimat b/talimatname/genel/p/pimcommon/talimat new file mode 100644 index 000000000..3660e6e83 --- /dev/null +++ b/talimatname/genel/p/pimcommon/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE PIM için ortak kütüphaneler +# URL : https://community.kde.org/KDE_PIM +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 akonadi kcontacts kf5-extra-cmake-modules kf5-kdoctools boost libkdepim kpimtextedit kf5-knewstuff kimap +# Grup: kde + +isim=pimcommon +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pinentry/talimat b/talimatname/genel/p/pinentry/talimat new file mode 100644 index 000000000..26604b913 --- /dev/null +++ b/talimatname/genel/p/pinentry/talimat @@ -0,0 +1,22 @@ +# Tanım: Assuan protokolünü kullanan basit bir PIN veya parolalı giriş diyaloglarının bir koleksiyonu +# URL: http://www.gnupg.org/ +# Paketçi: milisarge +# Gerekler: libcap libsecret libassuan + +isim=pinentry +surum=0.9.7 +devir=1 + +kaynak=(ftp://ftp.gnupg.org/gcrypt/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --libexecdir=/usr/lib \ + --disable-pinentry-qt \ + --disable-pinentry-qt5 \ + --disable-pinentry-gtk +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +} diff --git a/talimatname/genel/p/pingus/missing-header.patch b/talimatname/genel/p/pingus/missing-header.patch new file mode 100644 index 000000000..cc1dcdbb8 --- /dev/null +++ b/talimatname/genel/p/pingus/missing-header.patch @@ -0,0 +1,22 @@ +From df6e2f445d3e2925a94d22faeb17be9444513e92 Mon Sep 17 00:00:00 2001 +From: Jonathan Wakely <jwakely@redhat.com> +Date: Mon, 30 Jan 2017 15:41:53 +0000 +Subject: [PATCH] Add missing header for std::function and std::bind + +--- + src/pingus/screens/demo_session.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/pingus/screens/demo_session.cpp b/src/pingus/screens/demo_session.cpp +index e3ec49a2c..f887e50f0 100644 +--- a/src/pingus/screens/demo_session.cpp ++++ b/src/pingus/screens/demo_session.cpp +@@ -18,6 +18,7 @@ + + #include <algorithm> + #include <iostream> ++#include <functional> + + #include "engine/gui/gui_manager.hpp" + #include "engine/gui/surface_button.hpp" + diff --git a/talimatname/genel/p/pingus/pingus-0.7.6-gcc470-udl.patch b/talimatname/genel/p/pingus/pingus-0.7.6-gcc470-udl.patch new file mode 100644 index 000000000..843439321 --- /dev/null +++ b/talimatname/genel/p/pingus/pingus-0.7.6-gcc470-udl.patch @@ -0,0 +1,22 @@ +--- src/pingus/pingus_main.cpp~ 2011-12-24 15:46:47.000000000 -0600 ++++ src/pingus/pingus_main.cpp 2012-01-03 13:13:03.034195720 -0600 +@@ -465,7 +465,7 @@ + void + PingusMain::print_greeting_message() + { +- std::string greeting = "Welcome to Pingus "VERSION; ++ std::string greeting = "Welcome to Pingus " VERSION; + greeting += "!"; + std::cout << greeting << std::endl; + for (unsigned int i = 0; i < greeting.length(); ++i) +--- src/pingus/screens/pingus_menu.cpp~ 2011-12-24 15:46:47.000000000 -0600 ++++ src/pingus/screens/pingus_menu.cpp 2012-01-03 13:30:28.967700554 -0600 +@@ -153,7 +153,7 @@ + gc.get_height()/2 - 280)); + + gc.print_left(Fonts::pingus_small, Vector2i(gc.get_width()/2 - 400 + 25, gc.get_height()-140), +- "Pingus "VERSION" - Copyright (C) 1998-2011 Ingo Ruhnke <grumbel@gmail.com>\n" ++ "Pingus " VERSION " - Copyright (C) 1998-2011 Ingo Ruhnke <grumbel@gmail.com>\n" + "See the file AUTHORS for a complete list of contributors.\n" + "Pingus comes with ABSOLUTELY NO WARRANTY. This is free software, and you are\n" + "welcome to redistribute it under certain conditions; see the file COPYING for details.\n"); diff --git a/talimatname/genel/p/pingus/pingus.desktop b/talimatname/genel/p/pingus/pingus.desktop new file mode 100644 index 000000000..7492f41ad --- /dev/null +++ b/talimatname/genel/p/pingus/pingus.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Pingus +Comment=Lemmings'den esinlenen bir eylem-bulmaca oyunu +Exec=pingus +Terminal=false +Type=Application +Categories=Application;Game;LogicGame +Icon=/usr/share/pingus/images/core/editor/actions.png diff --git a/talimatname/genel/p/pingus/talimat b/talimatname/genel/p/pingus/talimat new file mode 100644 index 000000000..473c02f41 --- /dev/null +++ b/talimatname/genel/p/pingus/talimat @@ -0,0 +1,24 @@ +# Tanım: Lemmings'den esinlenen bir eylem-bulmaca oyunu +# URL: http://pingus.seul.org +# Paketçi: Cihan_Alkan +# Gerekler: sdl-image sdl-mixer xorg-mesa boost scons xorg-glu +# Grup: oyun + +isim=pingus +surum=0.7.6 +devir=1 +kaynak=(https://github.com/Pingus/pingus/archive/v$surum.tar.gz::$isim-$surum.tar.gz + ${isim}.desktop + pingus-0.7.6-gcc470-udl.patch + missing-header.patch) + +derle() { + cd $isim-$surum + patch -Np0 -i ${SRC}/pingus-0.7.6-gcc470-udl.patch + sed -i "s#/man1/#/man6/#g" Makefile + # missing header + patch -Np1 -i ../missing-header.patch + scons prefix=/usr + make install DESTDIR="${PKG}" PREFIX="/usr" + install -D -m644 "${SRC}/pingus.desktop" "${PKG}/usr/share/applications/pingus.desktop" +} diff --git a/talimatname/genel/p/pinta/talimat b/talimatname/genel/p/pinta/talimat new file mode 100644 index 000000000..1b1a7df18 --- /dev/null +++ b/talimatname/genel/p/pinta/talimat @@ -0,0 +1,25 @@ +# Tanım: Paint benzeri resim düzenleme programı +# URL: http://pinta-project.com/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk-sharp2 mono-addins +# Grup: + +isim=pinta +surum=1.6 +devir=1 +kaynak=(https://github.com/PintaProject/Pinta/releases/download/$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + # update the project and solution files for mono4 (taken from Fedora) + find . -name "*.sln" -print -exec sed -i 's/Format Version 10.00/Format Version 11.00/g' {} \; + find . \( -name "*.csproj" -o -name "*.proj" \) -print -exec sed -i 's#ToolsVersion="3.5"#ToolsVersion="4.0"#g; s#<TargetFrameworkVersion>.*</TargetFrameworkVersion>##g; s#<PropertyGroup>#<PropertyGroup><TargetFrameworkVersion>v4.5</TargetFrameworkVersion>#g; s#Mono.Posix, Version.*"#Mono.Posix"#g' {} \; + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + + make DESTDIR=$PKG install + install -dm755 "$PKG"/usr/share/licenses/$isim + install -m644 license-*.txt readme.md "$PKG"/usr/share/licenses/$isim/ + +} diff --git a/talimatname/genel/p/pix/talimat b/talimatname/genel/p/pix/talimat new file mode 100644 index 000000000..3ffe46291 --- /dev/null +++ b/talimatname/genel/p/pix/talimat @@ -0,0 +1,30 @@ +# Tanım: Gthumb temelli resim görüntüleyici ve tarayıcı. +# URL: https://github.com/linuxmint/pix +# Paketçi: Cihan_Alkan +# Gerekler: gnome-common yelp-tools desktop-file-utils gconf librsvg clutter-gtk gsettings-desktop-schemas libwebp webkitgtk2 +# Grup: medya + +isim=pix +surum=1.6.2 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + gnome-autogen.sh --prefix="/usr" \ + --localstatedir="/var" \ + --libexecdir="/usr/lib/$isim" \ + -disable-static + + if [ -d 'tests/$(top_srcdir)/' ] + then + cp 'tests/$(top_srcdir)/pix/.deps/dom_test-dom.Po' "pix/.deps/" + cp 'tests/$(top_srcdir)/pix/.deps/glib_utils_test-glib-utils.Po' "pix/.deps/" + cp 'tests/$(top_srcdir)/pix/.deps/gsignature_test-gsignature.Po' "pix/.deps/" + cp 'tests/$(top_srcdir)/pix/.deps/oauth_test-gsignature.Po' "pix/.deps/" + fi + + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/help +} diff --git a/talimatname/genel/p/pjproject-ring/add_dtls_transport.patch b/talimatname/genel/p/pjproject-ring/add_dtls_transport.patch new file mode 100644 index 000000000..b7f9f296e --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/add_dtls_transport.patch @@ -0,0 +1,63 @@ +--- a/pjsip/src/pjsip/sip_transport.c ++++ b/pjsip/src/pjsip/sip_transport.c +@@ -183,6 +183,13 @@ + PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE + }, + { ++ PJSIP_TRANSPORT_DTLS, ++ 5061, ++ {"DTLS", 4}, ++ "DTLS transport", ++ PJSIP_TRANSPORT_SECURE ++ }, ++ { + PJSIP_TRANSPORT_SCTP, + 5060, + {"SCTP", 4}, +@@ -224,6 +231,13 @@ + "TLS IPv6 transport", + PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE + }, ++ { ++ PJSIP_TRANSPORT_DTLS6, ++ 5061, ++ {"DTLS", 4}, ++ "DTLS IPv6 transport", ++ PJSIP_TRANSPORT_SECURE ++ }, + }; + + static void tp_state_callback(pjsip_transport *tp, +@@ -249,7 +263,7 @@ + */ + PJ_DEF(pj_status_t) pjsip_transport_register_type( unsigned tp_flag, + const char *tp_name, +- int def_port, ++ int def_port, + int *p_tp_type) + { + unsigned i; +--- a/pjsip/include/pjsip/sip_types.h ++++ b/pjsip/include/pjsip/sip_types.h +@@ -73,6 +73,9 @@ + /** TLS. */ + PJSIP_TRANSPORT_TLS, + ++ /** DTLS. */ ++ PJSIP_TRANSPORT_DTLS, ++ + /** SCTP. */ + PJSIP_TRANSPORT_SCTP, + +@@ -95,7 +98,10 @@ + PJSIP_TRANSPORT_TCP6 = PJSIP_TRANSPORT_TCP + PJSIP_TRANSPORT_IPV6, + + /** TLS over IPv6 */ +- PJSIP_TRANSPORT_TLS6 = PJSIP_TRANSPORT_TLS + PJSIP_TRANSPORT_IPV6 ++ PJSIP_TRANSPORT_TLS6 = PJSIP_TRANSPORT_TLS + PJSIP_TRANSPORT_IPV6, ++ ++ /** DTLS over IPv6 */ ++ PJSIP_TRANSPORT_DTLS6 = PJSIP_TRANSPORT_DTLS + PJSIP_TRANSPORT_IPV6 + + } pjsip_transport_type_e; + diff --git a/talimatname/genel/p/pjproject-ring/endianness.patch b/talimatname/genel/p/pjproject-ring/endianness.patch new file mode 100644 index 000000000..84b949944 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/endianness.patch @@ -0,0 +1,19 @@ +diff --git a/pjlib/include/pj/config.h b/pjlib/include/pj/config.h +index 10f86fd..4ace1bc 100644 +--- a/pjlib/include/pj/config.h ++++ b/pjlib/include/pj/config.h +@@ -245,7 +245,13 @@ + # define PJ_M_NAME "armv4" + # define PJ_HAS_PENTIUM 0 + # if !PJ_IS_LITTLE_ENDIAN && !PJ_IS_BIG_ENDIAN +-# error Endianness must be declared for this processor ++# if defined(__GNUC__) ++# include <endian.h> ++# define PJ_IS_LITTLE_ENDIAN __BYTE_ORDER__ == __LITTLE_ENDIAN__ ++# define PJ_IS_BIG_ENDIAN __BYTE_ORDER__ == __BIG_ENDIAN__ ++# else ++# error Endianness must be declared for this processor ++# endif + # endif + + #elif defined (PJ_M_POWERPC) || defined(__powerpc) || defined(__powerpc__) || \ diff --git a/talimatname/genel/p/pjproject-ring/fix_base64.patch b/talimatname/genel/p/pjproject-ring/fix_base64.patch new file mode 100644 index 000000000..70bdd5054 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/fix_base64.patch @@ -0,0 +1,20 @@ +--- a/pjlib-util/src/pjlib-util/base64.c 2017-05-03 10:29:07.200417026 -0400 ++++ b/pjlib-util/src/pjlib-util/base64.c 2017-05-03 10:28:30.344335390 -0400 +@@ -131,7 +131,7 @@ + + PJ_ASSERT_RETURN(input && out && out_len, PJ_EINVAL); + +- while (buf[len-1] == '=' && len) ++ while (len && buf[len-1] == '=') + --len; + + PJ_ASSERT_RETURN(*out_len >= PJ_BASE64_TO_BASE256_LEN(len), +@@ -161,7 +161,7 @@ + out[j++] = (pj_uint8_t)(((c[2] & 0x03)<<6) | (c[3] & 0x3F)); + } + +- pj_assert(j < *out_len); ++ pj_assert(j <= *out_len); + *out_len = j; + + return PJ_SUCCESS; diff --git a/talimatname/genel/p/pjproject-ring/fix_ioqueue_ipv6_sendto.patch b/talimatname/genel/p/pjproject-ring/fix_ioqueue_ipv6_sendto.patch new file mode 100644 index 000000000..bc53fd2cb --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/fix_ioqueue_ipv6_sendto.patch @@ -0,0 +1,19 @@ +--- a/pjlib/src/pj/ioqueue_common_abs.c 2015-11-05 23:18:46.000000000 -0500 ++++ b/pjlib/src/pj/ioqueue_common_abs.c 2016-10-21 13:49:09.183662433 -0400 +@@ -1048,5 +1048,6 @@ + * Check that address storage can hold the address parameter. + */ +- PJ_ASSERT_RETURN(addrlen <= (int)sizeof(pj_sockaddr_in), PJ_EBUG); ++ PJ_ASSERT_RETURN((((pj_sockaddr*)addr)->addr.sa_family == pj_AF_INET() && addrlen <= (int)sizeof(pj_sockaddr_in)) || ++ (((pj_sockaddr*)addr)->addr.sa_family == pj_AF_INET6() && addrlen <= (int)sizeof(pj_sockaddr_in6)), PJ_EBUG); + + /* +--- a/pjlib/src/pj/ioqueue_common_abs.h 2013-02-21 06:18:36.000000000 -0500 ++++ b/pjlib/src/pj/ioqueue_common_abs.h 2016-10-21 14:04:04.148928591 -0400 +@@ -64,5 +64,5 @@ + pj_ssize_t written; + unsigned flags; +- pj_sockaddr_in rmt_addr; ++ pj_sockaddr rmt_addr; + int rmt_addrlen; + }; diff --git a/talimatname/genel/p/pjproject-ring/fix_turn_fallback.patch b/talimatname/genel/p/pjproject-ring/fix_turn_fallback.patch new file mode 100644 index 000000000..50229dd01 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/fix_turn_fallback.patch @@ -0,0 +1,53 @@ +--- a/pjnath/src/pjnath/turn_session.c 2016-09-19 18:21:09.073614574 -0400 ++++ b/pjnath/src/pjnath/turn_session.c 2016-09-19 18:21:30.648631620 -0400 +@@ -653,3 +653,3 @@ + +- cnt = PJ_TURN_MAX_DNS_SRV_CNT; ++ cnt = 1; + ai = (pj_addrinfo*) +--- a/pjnath/src/pjnath/ice_strans.c 2016-09-19 18:36:04.180104330 -0400 ++++ b/pjnath/src/pjnath/ice_strans.c 2016-09-19 18:37:10.614136809 -0400 +@@ -1304,2 +1304,5 @@ + ++ if (!comp->turn[n].sock) ++ continue; ++ + /* Gather remote addresses for this component */ +@@ -1995,4 +1998,37 @@ + sess_init_update(comp->ice_st); + ++ } else if ((old_state == PJ_TURN_STATE_RESOLVING || old_state == PJ_TURN_STATE_ALLOCATING) && ++ new_state >= PJ_TURN_STATE_DEALLOCATING) ++ { ++ pj_ice_sess_cand *cand = NULL; ++ unsigned i; ++ ++ /* DNS resolution has failed! */ ++ ++comp->turn[tp_idx].err_cnt; ++ ++ /* Unregister ourself from the TURN relay */ ++ pj_turn_sock_set_user_data(turn_sock, NULL); ++ comp->turn[tp_idx].sock = NULL; ++ ++ /* Wait until initialization completes */ ++ pj_grp_lock_acquire(comp->ice_st->grp_lock); ++ ++ /* Find relayed candidate in the component */ ++ for (i=0; i<comp->cand_cnt; ++i) { ++ if (comp->cand_list[i].type == PJ_ICE_CAND_TYPE_RELAYED && ++ comp->cand_list[i].transport_id == data->transport_id) ++ { ++ cand = &comp->cand_list[i]; ++ break; ++ } ++ } ++ pj_assert(cand != NULL); ++ ++ pj_grp_lock_release(comp->ice_st->grp_lock); ++ ++ cand->status = old_state == PJ_TURN_STATE_RESOLVING ? PJ_ERESOLVE : PJ_EINVALIDOP; ++ ++ sess_init_update(comp->ice_st); ++ + } else if (new_state >= PJ_TURN_STATE_DEALLOCATING) { + pj_turn_session_info info; diff --git a/talimatname/genel/p/pjproject-ring/gnutls.patch b/talimatname/genel/p/pjproject-ring/gnutls.patch new file mode 100644 index 000000000..e8b26657e --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/gnutls.patch @@ -0,0 +1,3295 @@ +Copyright (c) 2014-2017 Savoir-faire Linux Inc. + +ssl_sock: add gnutls backend + +This backend is mutually exclusive with the OpenSSL one, but completely +compatible, and conformant to the PJSIP API. Also avoids any license issues +when linking statically. + +The configure script is updated to select either OpenSSL or GnuTLS +with --enable-ssl[='...'] and a new symbol (PJ_HAS_TLS_SOCK) is introduced +to identify which backend is in use. + +Written by +Vittorio Giovara <vittorio.giovara@savoirfairelinux.com> +Philippe Proulx <philippe.proulx@savoirfairelinux.com> and +Adrien Béraud <adrien.beraud@savoirfairelinux.com> +on behalf of Savoir-faire Linux. + +--- +diff -ru a/aconfigure b/aconfigure +--- a/aconfigure 2017-01-25 06:23:08.000000000 -0500 ++++ b/aconfigure 2017-06-08 13:51:11.146810527 -0400 +@@ -644,6 +644,8 @@ + libcrypto_present + libssl_present + openssl_h_present ++libgnutls_present ++gnutls_h_present + ac_ssl_has_aes_gcm + ac_no_ssl + ac_openh264_ldflags +@@ -1482,8 +1484,8 @@ + package and samples location using IPPROOT and + IPPSAMPLES env var or with --with-ipp and + --with-ipp-samples options +- --disable-ssl Exclude SSL support the build (default: autodetect) +- ++ --enable-ssl=backend Select 'gnutls' or 'openssl' (default) to provide ++ SSL support (autodetect) + --disable-opencore-amr Exclude OpenCORE AMR support from the build + (default: autodetect) + +@@ -7787,17 +7789,149 @@ + + # Check whether --enable-ssl was given. + if test "${enable_ssl+set}" = set; then : +- enableval=$enable_ssl; +- if test "$enable_ssl" = "no"; then +- ac_no_ssl=1 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Checking if SSL support is disabled... yes" >&5 ++ enableval=$enable_ssl; if test "x$enableval" = "xgnutls"; then ++ ssl_backend="gnutls" ++ else ++ ssl_backend="openssl" ++ fi ++fi ++ ++ ++if test "x$enable_ssl" = "xno"; then ++ ac_no_ssl=1 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Checking if SSL support is disabled... yes" >&5 + $as_echo "Checking if SSL support is disabled... yes" >&6; } +- fi ++else ++ if test "x$with_ssl" != "xno" -a "x$with_ssl" != "x"; then ++ CFLAGS="$CFLAGS -I$with_ssl/include" ++ LDFLAGS="$LDFLAGS -L$with_ssl/lib" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSL prefix... $with_ssl" >&5 ++$as_echo "Using SSL prefix... $with_ssl" >&6; } ++ fi ++ if test "x$ssl_backend" = "xgnutls"; then ++ for ac_prog in $host-pkg-config pkg-config "python pkgconfig.py" ++do ++ # Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$PKG_CONFIG"; then ++ ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_PKG_CONFIG="$ac_prog" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++PKG_CONFIG=$ac_cv_prog_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++ test -n "$PKG_CONFIG" && break ++done ++test -n "$PKG_CONFIG" || PKG_CONFIG="none" ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for GnuTLS installations.." >&5 ++$as_echo "checking for GnuTLS installations.." >&6; } ++ ++ ++ ac_fn_c_check_header_mongrel "$LINENO" "gnutls/gnutls.h" "ac_cv_header_gnutls_gnutls_h" "$ac_includes_default" ++if test "x$ac_cv_header_gnutls_gnutls_h" = xyes; then : ++ gnutls_h_present=1 ++fi ++ + ++ ++ if test "$PKG_CONFIG" != "none"; then ++ if $PKG_CONFIG --exists gnutls; then ++ LIBS="$LIBS `$PKG_CONFIG --libs gnutls`" ++ libgnutls_present=1 ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnutls_certificate_set_x509_system_trust in -lgnutls" >&5 ++$as_echo_n "checking for gnutls_certificate_set_x509_system_trust in -lgnutls... " >&6; } ++if ${ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lgnutls $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char gnutls_certificate_set_x509_system_trust (); ++int ++main () ++{ ++return gnutls_certificate_set_x509_system_trust (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust=yes + else ++ ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust" >&5 ++$as_echo "$ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust" >&6; } ++if test "x$ac_cv_lib_gnutls_gnutls_certificate_set_x509_system_trust" = xyes; then : ++ libgnutls_present=1 && ++ LIBS="$LIBS -lgnutls" ++fi + ++ fi ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** Warning: neither pkg-config nor python is available, disabling gnutls. ***" >&5 ++$as_echo "*** Warning: neither pkg-config nor python is available, disabling gnutls. ***" >&6; } ++ fi ++ ++ if test "x$gnutls_h_present" = "x1" -a "x$libgnutls_present" = "x1"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: GnuTLS library found, SSL support enabled" >&5 ++$as_echo "GnuTLS library found, SSL support enabled" >&6; } ++ # PJSIP_HAS_TLS_TRANSPORT setting follows PJ_HAS_SSL_SOCK ++ #AC_DEFINE(PJSIP_HAS_TLS_TRANSPORT, 1) ++ $as_echo "#define PJ_HAS_SSL_SOCK 1" >>confdefs.h ++ ++ $as_echo "#define PJ_HAS_TLS_SOCK 1" >>confdefs.h ++ ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** No GnuTLS libraries found, disabling SSL support **" >&5 ++$as_echo "** No GnuTLS libraries found, disabling SSL support **" >&6; } ++ fi ++ else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: checking for OpenSSL installations.." >&5 + $as_echo "checking for OpenSSL installations.." >&6; } ++ + if test "x$with_ssl" != "xno" -a "x$with_ssl" != "x"; then + CFLAGS="$CFLAGS -I$with_ssl/include" + LDFLAGS="$LDFLAGS -L$with_ssl/lib" +@@ -7971,11 +8105,10 @@ + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ** OpenSSL libraries not found, disabling SSL support **" >&5 + $as_echo "** OpenSSL libraries not found, disabling SSL support **" >&6; } + fi +- ++ fi + fi + + +- + # Check whether --with-opencore-amrnb was given. + if test "${with_opencore_amrnb+set}" = set; then : + withval=$with_opencore_amrnb; as_fn_error $? "This option is obsolete and replaced by --with-opencore-amr=DIR" "$LINENO" 5 +diff -ru a/aconfigure.ac b/aconfigure.ac +--- a/aconfigure.ac 2017-01-25 06:23:08.000000000 -0500 ++++ b/aconfigure.ac 2017-06-08 13:28:17.138135490 -0400 +@@ -1533,18 +1533,59 @@ + dnl # Include SSL support + AC_SUBST(ac_no_ssl) + AC_SUBST(ac_ssl_has_aes_gcm,0) +-AC_ARG_ENABLE(ssl, +- AS_HELP_STRING([--disable-ssl], +- [Exclude SSL support the build (default: autodetect)]) +- , +- [ +- if test "$enable_ssl" = "no"; then +- [ac_no_ssl=1] +- AC_MSG_RESULT([Checking if SSL support is disabled... yes]) +- fi +- ], +- [ ++AC_ARG_ENABLE([ssl], ++ AS_HELP_STRING([--enable-ssl[=backend]], ++ [Select 'gnutls' or 'openssl' (default) to provide SSL support (autodetect)]), ++ [ if test "x$enableval" = "xgnutls"; then ++ [ssl_backend="gnutls"] ++ else ++ [ssl_backend="openssl"] ++ fi ]) ++ ++if test "x$enable_ssl" = "xno"; then ++ [ac_no_ssl=1] ++ AC_MSG_RESULT([Checking if SSL support is disabled... yes]) ++else ++ if test "x$with_ssl" != "xno" -a "x$with_ssl" != "x"; then ++ CFLAGS="$CFLAGS -I$with_ssl/include" ++ LDFLAGS="$LDFLAGS -L$with_ssl/lib" ++ AC_MSG_RESULT([Using SSL prefix... $with_ssl]) ++ fi ++ if test "x$ssl_backend" = "xgnutls"; then ++ AC_CHECK_PROGS(PKG_CONFIG, ++ $host-pkg-config pkg-config "python pkgconfig.py", ++ none) ++ AC_MSG_RESULT([checking for GnuTLS installations..]) ++ AC_SUBST(gnutls_h_present) ++ AC_SUBST(libgnutls_present) ++ AC_CHECK_HEADER(gnutls/gnutls.h, [gnutls_h_present=1]) ++ ++ if test "$PKG_CONFIG" != "none"; then ++ if $PKG_CONFIG --exists gnutls; then ++ LIBS="$LIBS `$PKG_CONFIG --libs gnutls`" ++ libgnutls_present=1 ++ else ++ AC_CHECK_LIB(gnutls, ++ gnutls_certificate_set_x509_system_trust, ++ [libgnutls_present=1 && ++ LIBS="$LIBS -lgnutls"]) ++ fi ++ else ++ AC_MSG_RESULT([*** Warning: neither pkg-config nor python is available, disabling gnutls. ***]) ++ fi ++ ++ if test "x$gnutls_h_present" = "x1" -a "x$libgnutls_present" = "x1"; then ++ AC_MSG_RESULT([GnuTLS library found, SSL support enabled]) ++ # PJSIP_HAS_TLS_TRANSPORT setting follows PJ_HAS_SSL_SOCK ++ #AC_DEFINE(PJSIP_HAS_TLS_TRANSPORT, 1) ++ AC_DEFINE(PJ_HAS_SSL_SOCK, 1) ++ AC_DEFINE(PJ_HAS_TLS_SOCK, 1) ++ else ++ AC_MSG_RESULT([** No GnuTLS libraries found, disabling SSL support **]) ++ fi ++ else + AC_MSG_RESULT([checking for OpenSSL installations..]) ++ + if test "x$with_ssl" != "xno" -a "x$with_ssl" != "x"; then + CFLAGS="$CFLAGS -I$with_ssl/include" + LDFLAGS="$LDFLAGS -L$with_ssl/lib" +@@ -1578,7 +1619,8 @@ + else + AC_MSG_RESULT([** OpenSSL libraries not found, disabling SSL support **]) + fi +- ]) ++ fi ++fi + + dnl # Obsolete option --with-opencore-amrnb + AC_ARG_WITH(opencore-amrnb, +diff -ru a/pjlib/build/Makefile b/pjlib/build/Makefile +--- a/pjlib/build/Makefile 2016-10-05 05:52:39.000000000 -0400 ++++ b/pjlib/build/Makefile 2017-06-08 13:30:20.702138591 -0400 +@@ -35,7 +35,7 @@ + guid.o hash.o ip_helper_generic.o list.o lock.o log.o os_time_common.o \ + os_info.o pool.o pool_buf.o pool_caching.o pool_dbg.o rand.o \ + rbtree.o sock_common.o sock_qos_common.o \ +- ssl_sock_common.o ssl_sock_ossl.o ssl_sock_dump.o \ ++ ssl_sock_common.o ssl_sock_ossl.o ssl_sock_gtls.o ssl_sock_dump.o \ + string.o timer.o types.o + export PJLIB_CFLAGS += $(_CFLAGS) + export PJLIB_CXXFLAGS += $(_CXXFLAGS) +diff -ru a/pjlib/include/pj/compat/os_auto.h.in b/pjlib/include/pj/compat/os_auto.h.in +--- a/pjlib/include/pj/compat/os_auto.h.in 2017-01-24 00:36:50.000000000 -0500 ++++ b/pjlib/include/pj/compat/os_auto.h.in 2017-06-08 13:31:04.976064779 -0400 +@@ -219,6 +219,9 @@ + #ifndef PJ_HAS_SSL_SOCK + #undef PJ_HAS_SSL_SOCK + #endif ++#ifndef PJ_HAS_TLS_SOCK ++#undef PJ_HAS_TLS_SOCK ++#endif + + + #endif /* __PJ_COMPAT_OS_AUTO_H__ */ +diff -ru a/pjlib/include/pj/config.h b/pjlib/include/pj/config.h +--- a/pjlib/include/pj/config.h 2017-01-25 21:29:59.000000000 -0500 ++++ b/pjlib/include/pj/config.h 2017-06-08 13:34:27.642149351 -0400 +@@ -888,7 +888,7 @@ + + /** + * Enable secure socket. For most platforms, this is implemented using +- * OpenSSL, so this will require OpenSSL to be installed. For Symbian ++ * OpenSSL or GnuTLS, so this will require OpenSSL or GnuTLS to be installed. For Symbian + * platform, this is implemented natively using CSecureSocket. + * + * Default: 0 (for now) +@@ -896,6 +896,10 @@ + #ifndef PJ_HAS_SSL_SOCK + # define PJ_HAS_SSL_SOCK 0 + #endif ++// When set to 1 secure sockets will use the GnuTLS backend than OpenSSL ++#ifndef PJ_HAS_TLS_SOCK ++# define PJ_HAS_TLS_SOCK 0 ++#endif + + + /** +diff -ru a/pjlib/include/pj/ssl_sock.h b/pjlib/include/pj/ssl_sock.h +--- a/pjlib/include/pj/ssl_sock.h 2016-10-27 03:58:01.000000000 -0400 ++++ b/pjlib/include/pj/ssl_sock.h 2017-06-08 13:36:16.448510381 -0400 +@@ -184,6 +184,10 @@ + pj_str_t raw; /**< Raw certificate in PEM format, only + available for remote certificate. */ + ++ struct { ++ unsigned cnt; /**< # of entry */ ++ pj_str_t* cert_raw; ++ } raw_chain; + } pj_ssl_cert_info; + + +diff -ru a/pjlib/src/pj/ssl_sock_common.c b/pjlib/src/pj/ssl_sock_common.c +--- a/pjlib/src/pj/ssl_sock_common.c 2016-10-27 03:58:01.000000000 -0400 ++++ b/pjlib/src/pj/ssl_sock_common.c 2017-06-08 13:37:17.171037628 -0400 +@@ -35,7 +35,12 @@ + param->async_cnt = 1; + param->concurrency = -1; + param->whole_data = PJ_TRUE; ++#if defined(PJ_HAS_TLS_SOCK) && PJ_HAS_TLS_SOCK == 1 ++ // GnuTLS is allowed to send bigger chunks ++ param->send_buffer_size = 65536; ++#else + param->send_buffer_size = 8192; ++#endif + #if !defined(PJ_SYMBIAN) || PJ_SYMBIAN==0 + param->read_buffer_size = 1500; + #endif +diff --git a/pjlib/src/pj/ssl_sock_gtls.c b/pjlib/src/pj/ssl_sock_gtls.c +new file mode 100644 +index 0000000..37bcaba +--- /dev/null ++++ b/pjlib/src/pj/ssl_sock_gtls.c +@@ -0,0 +1,2877 @@ ++/* $Id$ */ ++/* ++ * Copyright (C) 2014-2016 Savoir-faire Linux. (https://www.savoirfairelinux.com) ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <pj/ssl_sock.h> ++#include <pj/activesock.h> ++#include <pj/compat/socket.h> ++#include <pj/assert.h> ++#include <pj/errno.h> ++#include <pj/list.h> ++#include <pj/lock.h> ++#include <pj/log.h> ++#include <pj/math.h> ++#include <pj/os.h> ++#include <pj/pool.h> ++#include <pj/string.h> ++#include <pj/timer.h> ++#include <pj/file_io.h> ++ ++#if GNUTLS_VERSION_NUMBER < 0x030306 && !defined(_MSC_VER) ++#include <dirent.h> ++#endif ++ ++#include <errno.h> ++ ++/* Only build when PJ_HAS_SSL_SOCK and PJ_HAS_TLS_SOCK are enabled */ ++#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0 && \ ++ defined(PJ_HAS_TLS_SOCK) && PJ_HAS_TLS_SOCK != 0 ++ ++#define THIS_FILE "ssl_sock_gtls.c" ++ ++/* Workaround for ticket #985 */ ++#define DELAYED_CLOSE_TIMEOUT 200 ++ ++/* Maximum ciphers */ ++#define MAX_CIPHERS 100 ++ ++/* Standard trust locations */ ++#define TRUST_STORE_FILE1 "/etc/ssl/certs/ca-certificates.crt" ++#define TRUST_STORE_FILE2 "/etc/ssl/certs/ca-bundle.crt" ++ ++/* Debugging output level for GnuTLS only */ ++#define GNUTLS_LOG_LEVEL 0 ++ ++/* GnuTLS includes */ ++#include <gnutls/gnutls.h> ++#include <gnutls/x509.h> ++#include <gnutls/abstract.h> ++ ++#ifdef _MSC_VER ++# pragma comment( lib, "libgnutls") ++#endif ++ ++ ++/* TLS state enumeration. */ ++enum tls_connection_state { ++ TLS_STATE_NULL, ++ TLS_STATE_HANDSHAKING, ++ TLS_STATE_ESTABLISHED ++}; ++ ++/* Internal timer types. */ ++enum timer_id { ++ TIMER_NONE, ++ TIMER_HANDSHAKE_TIMEOUT, ++ TIMER_CLOSE ++}; ++ ++/* Structure of SSL socket read buffer. */ ++typedef struct read_data_t { ++ void *data; ++ pj_size_t len; ++} read_data_t; ++ ++/* ++ * Get the offset of pointer to read-buffer of SSL socket from read-buffer ++ * of active socket. Note that both SSL socket and active socket employ ++ * different but correlated read-buffers (as much as async_cnt for each), ++ * and to make it easier/faster to find corresponding SSL socket's read-buffer ++ * from known active socket's read-buffer, the pointer of corresponding ++ * SSL socket's read-buffer is stored right after the end of active socket's ++ * read-buffer. ++ */ ++#define OFFSET_OF_READ_DATA_PTR(ssock, asock_rbuf) \ ++ (read_data_t**) \ ++ ((pj_int8_t *)(asock_rbuf) + \ ++ ssock->param.read_buffer_size) ++ ++/* Structure of SSL socket write data. */ ++typedef struct write_data_t { ++ PJ_DECL_LIST_MEMBER(struct write_data_t); ++ pj_ioqueue_op_key_t key; ++ pj_size_t record_len; ++ pj_ioqueue_op_key_t *app_key; ++ pj_size_t plain_data_len; ++ pj_size_t data_len; ++ unsigned flags; ++ union { ++ char content[1]; ++ const char *ptr; ++ } data; ++} write_data_t; ++ ++ ++/* Structure of SSL socket write buffer (circular buffer). */ ++typedef struct send_buf_t { ++ char *buf; ++ pj_size_t max_len; ++ char *start; ++ pj_size_t len; ++} send_buf_t; ++ ++ ++/* Circular buffer object */ ++typedef struct circ_buf_t { ++ pj_size_t cap; /* maximum number of elements (must be power of 2) */ ++ pj_size_t readp; /* index of oldest element */ ++ pj_size_t writep; /* index at which to write new element */ ++ pj_size_t size; /* number of elements */ ++ pj_uint8_t *buf; /* data buffer */ ++ pj_pool_t *pool; /* where new allocations will take place */ ++} circ_buf_t; ++ ++ ++/* Secure socket structure definition. */ ++struct pj_ssl_sock_t { ++ pj_pool_t *pool; ++ pj_ssl_sock_t *parent; ++ pj_ssl_sock_param param; ++ pj_ssl_sock_param newsock_param; ++ pj_ssl_cert_t *cert; ++ ++ pj_ssl_cert_info local_cert_info; ++ pj_ssl_cert_info remote_cert_info; ++ ++ pj_bool_t is_server; ++ enum tls_connection_state connection_state; ++ pj_ioqueue_op_key_t handshake_op_key; ++ pj_timer_entry timer; ++ pj_status_t verify_status; ++ ++ int last_err; ++ ++ pj_sock_t sock; ++ pj_activesock_t *asock; ++ ++ pj_sockaddr local_addr; ++ pj_sockaddr rem_addr; ++ int addr_len; ++ ++ pj_bool_t read_started; ++ pj_size_t read_size; ++ pj_uint32_t read_flags; ++ void **asock_rbuf; ++ read_data_t *ssock_rbuf; ++ ++ write_data_t write_pending; /* list of pending writes */ ++ write_data_t write_pending_empty; /* cache for write_pending */ ++ pj_bool_t flushing_write_pend; /* flag of flushing is ongoing */ ++ send_buf_t send_buf; ++ write_data_t send_pending; /* list of pending write to network */ ++ ++ gnutls_session_t session; ++ gnutls_certificate_credentials_t xcred; ++ ++ circ_buf_t circ_buf_input; ++ pj_lock_t *circ_buf_input_mutex; ++ ++ circ_buf_t circ_buf_output; ++ pj_lock_t *circ_buf_output_mutex; ++ ++ int tls_init_count; /* library initialization counter */ ++}; ++ ++ ++/* Certificate/credential structure definition. */ ++struct pj_ssl_cert_t { ++ pj_str_t CA_file; ++ pj_str_t CA_path; ++ pj_str_t cert_file; ++ pj_str_t privkey_file; ++ pj_str_t privkey_pass; ++}; ++ ++/* GnuTLS available ciphers */ ++static unsigned tls_available_ciphers; ++ ++/* Array of id/names for available ciphers */ ++static struct tls_ciphers_t { ++ pj_ssl_cipher id; ++ const char *name; ++} tls_ciphers[MAX_CIPHERS]; ++ ++/* Last error reported somehow */ ++static int tls_last_error; ++ ++ ++/* ++ ******************************************************************* ++ * Circular buffer functions. ++ ******************************************************************* ++ */ ++ ++static pj_status_t circ_init(pj_pool_factory *factory, ++ circ_buf_t *cb, pj_size_t cap) ++{ ++ cb->cap = cap; ++ cb->readp = 0; ++ cb->writep = 0; ++ cb->size = 0; ++ ++ /* Initial pool holding the buffer elements */ ++ cb->pool = pj_pool_create(factory, "tls-circ%p", cap, cap, NULL); ++ if (!cb->pool) ++ return PJ_ENOMEM; ++ ++ /* Allocate circular buffer */ ++ cb->buf = pj_pool_alloc(cb->pool, cap); ++ if (!cb->buf) { ++ pj_pool_release(cb->pool); ++ return PJ_ENOMEM; ++ } ++ ++ return PJ_SUCCESS; ++} ++ ++static void circ_deinit(circ_buf_t *cb) ++{ ++ if (cb->pool) { ++ pj_pool_release(cb->pool); ++ cb->pool = NULL; ++ } ++} ++ ++static pj_bool_t circ_empty(const circ_buf_t *cb) ++{ ++ return cb->size == 0; ++} ++ ++static pj_size_t circ_size(const circ_buf_t *cb) ++{ ++ return cb->size; ++} ++ ++static pj_size_t circ_avail(const circ_buf_t *cb) ++{ ++ return cb->cap - cb->size; ++} ++ ++static void circ_read(circ_buf_t *cb, pj_uint8_t *dst, pj_size_t len) ++{ ++ pj_size_t size_after = cb->cap - cb->readp; ++ pj_size_t tbc = PJ_MIN(size_after, len); ++ pj_size_t rem = len - tbc; ++ ++ pj_memcpy(dst, cb->buf + cb->readp, tbc); ++ pj_memcpy(dst + tbc, cb->buf, rem); ++ ++ cb->readp += len; ++ cb->readp &= (cb->cap - 1); ++ ++ cb->size -= len; ++} ++ ++static pj_status_t circ_write(circ_buf_t *cb, ++ const pj_uint8_t *src, pj_size_t len) ++{ ++ /* Overflow condition: resize */ ++ if (len > circ_avail(cb)) { ++ /* Minimum required capacity */ ++ pj_size_t min_cap = len + cb->size; ++ ++ /* Next 32-bit power of two */ ++ min_cap--; ++ min_cap |= min_cap >> 1; ++ min_cap |= min_cap >> 2; ++ min_cap |= min_cap >> 4; ++ min_cap |= min_cap >> 8; ++ min_cap |= min_cap >> 16; ++ min_cap++; ++ ++ /* Create a new pool to hold a bigger buffer, using the same factory */ ++ pj_pool_t *pool = pj_pool_create(cb->pool->factory, "tls-circ%p", ++ min_cap, min_cap, NULL); ++ if (!pool) ++ return PJ_ENOMEM; ++ ++ /* Allocate our new buffer */ ++ pj_uint8_t *buf = pj_pool_alloc(pool, min_cap); ++ if (!buf) { ++ pj_pool_release(pool); ++ return PJ_ENOMEM; ++ } ++ ++ /* Save old size, which we shall restore after the next read */ ++ pj_size_t old_size = cb->size; ++ ++ /* Copy old data into beginning of new buffer */ ++ circ_read(cb, buf, cb->size); ++ ++ /* Restore old size now */ ++ cb->size = old_size; ++ ++ /* Release the previous pool */ ++ pj_pool_release(cb->pool); ++ ++ /* Update circular buffer members */ ++ cb->pool = pool; ++ cb->buf = buf; ++ cb->readp = 0; ++ cb->writep = cb->size; ++ cb->cap = min_cap; ++ } ++ ++ pj_size_t size_after = cb->cap - cb->writep; ++ pj_size_t tbc = PJ_MIN(size_after, len); ++ pj_size_t rem = len - tbc; ++ ++ pj_memcpy(cb->buf + cb->writep, src, tbc); ++ pj_memcpy(cb->buf, src + tbc, rem); ++ ++ cb->writep += len; ++ cb->writep &= (cb->cap - 1); ++ ++ cb->size += len; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* ++ ******************************************************************* ++ * Static/internal functions. ++ ******************************************************************* ++ */ ++ ++/* Convert from GnuTLS error to pj_status_t. */ ++static pj_status_t tls_status_from_err(pj_ssl_sock_t *ssock, int err) ++{ ++ pj_status_t status; ++ ++ switch (err) { ++ case GNUTLS_E_SUCCESS: ++ status = PJ_SUCCESS; ++ break; ++ case GNUTLS_E_MEMORY_ERROR: ++ status = PJ_ENOMEM; ++ break; ++ case GNUTLS_E_LARGE_PACKET: ++ status = PJ_ETOOBIG; ++ break; ++ case GNUTLS_E_NO_CERTIFICATE_FOUND: ++ status = PJ_ENOTFOUND; ++ break; ++ case GNUTLS_E_SESSION_EOF: ++ status = PJ_EEOF; ++ break; ++ case GNUTLS_E_HANDSHAKE_TOO_LARGE: ++ status = PJ_ETOOBIG; ++ break; ++ case GNUTLS_E_EXPIRED: ++ status = PJ_EGONE; ++ break; ++ case GNUTLS_E_TIMEDOUT: ++ status = PJ_ETIMEDOUT; ++ break; ++ case GNUTLS_E_PREMATURE_TERMINATION: ++ status = PJ_ECANCELLED; ++ break; ++ case GNUTLS_E_INTERNAL_ERROR: ++ case GNUTLS_E_UNIMPLEMENTED_FEATURE: ++ status = PJ_EBUG; ++ break; ++ case GNUTLS_E_AGAIN: ++ case GNUTLS_E_INTERRUPTED: ++ case GNUTLS_E_REHANDSHAKE: ++ status = PJ_EPENDING; ++ break; ++ case GNUTLS_E_TOO_MANY_EMPTY_PACKETS: ++ case GNUTLS_E_TOO_MANY_HANDSHAKE_PACKETS: ++ case GNUTLS_E_RECORD_LIMIT_REACHED: ++ status = PJ_ETOOMANY; ++ break; ++ case GNUTLS_E_UNSUPPORTED_VERSION_PACKET: ++ case GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM: ++ case GNUTLS_E_UNSUPPORTED_CERTIFICATE_TYPE: ++ case GNUTLS_E_X509_UNSUPPORTED_ATTRIBUTE: ++ case GNUTLS_E_X509_UNSUPPORTED_EXTENSION: ++ case GNUTLS_E_X509_UNSUPPORTED_CRITICAL_EXTENSION: ++ status = PJ_ENOTSUP; ++ break; ++ case GNUTLS_E_INVALID_SESSION: ++ case GNUTLS_E_INVALID_REQUEST: ++ case GNUTLS_E_INVALID_PASSWORD: ++ case GNUTLS_E_ILLEGAL_PARAMETER: ++ case GNUTLS_E_RECEIVED_ILLEGAL_EXTENSION: ++ case GNUTLS_E_UNEXPECTED_PACKET: ++ case GNUTLS_E_UNEXPECTED_PACKET_LENGTH: ++ case GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET: ++ case GNUTLS_E_UNWANTED_ALGORITHM: ++ case GNUTLS_E_USER_ERROR: ++ status = PJ_EINVAL; ++ break; ++ default: ++ status = PJ_EUNKNOWN; ++ break; ++ } ++ ++ /* Not thread safe */ ++ tls_last_error = err; ++ if (ssock) ++ ssock->last_err = err; ++ return status; ++} ++ ++ ++/* Get error string from GnuTLS using tls_last_error */ ++static pj_str_t tls_strerror(pj_status_t status, ++ char *buf, pj_size_t bufsize) ++{ ++ pj_str_t errstr; ++ const char *tmp = gnutls_strerror(tls_last_error); ++ ++#if defined(PJ_HAS_ERROR_STRING) && (PJ_HAS_ERROR_STRING != 0) ++ if (tmp) { ++ pj_ansi_strncpy(buf, tmp, bufsize); ++ errstr = pj_str(buf); ++ return errstr; ++ } ++#endif /* PJ_HAS_ERROR_STRING */ ++ ++ errstr.ptr = buf; ++ errstr.slen = pj_ansi_snprintf(buf, bufsize, "GnuTLS error %d: %s", ++ tls_last_error, tmp); ++ if (errstr.slen < 1 || errstr.slen >= (int) bufsize) ++ errstr.slen = bufsize - 1; ++ ++ return errstr; ++} ++ ++ ++/* Initialize GnuTLS. */ ++static pj_status_t tls_init(void) ++{ ++ /* Register error subsystem */ ++ pj_status_t status = pj_register_strerror(PJ_ERRNO_START_USER + ++ PJ_ERRNO_SPACE_SIZE * 6, ++ PJ_ERRNO_SPACE_SIZE, ++ &tls_strerror); ++ pj_assert(status == PJ_SUCCESS); ++ ++ /* Init GnuTLS library */ ++ int ret = gnutls_global_init(); ++ if (ret < 0) ++ return tls_status_from_err(NULL, ret); ++ ++ /* Init available ciphers */ ++ if (!tls_available_ciphers) { ++ unsigned int i; ++ ++ for (i = 0; ; i++) { ++ unsigned char id[2]; ++ const char *suite = gnutls_cipher_suite_info(i, (unsigned char *)id, ++ NULL, NULL, NULL, NULL); ++ tls_ciphers[i].id = 0; ++ /* usually the array size is bigger than the number of available ++ * ciphers anyway, so by checking here we can exit the loop as soon ++ * as either all ciphers have been added or the array is full */ ++ if (suite && i < PJ_ARRAY_SIZE(tls_ciphers)) { ++ tls_ciphers[i].id = (pj_ssl_cipher) ++ (pj_uint32_t) ((id[0] << 8) | id[1]); ++ tls_ciphers[i].name = suite; ++ } else ++ break; ++ } ++ ++ tls_available_ciphers = i; ++ } ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Shutdown GnuTLS */ ++static void tls_deinit(void) ++{ ++ gnutls_global_deinit(); ++} ++ ++ ++/* Callback invoked every time a certificate has to be validated. */ ++static int tls_cert_verify_cb(gnutls_session_t session) ++{ ++ pj_ssl_sock_t *ssock; ++ unsigned int status; ++ int ret; ++ ++ /* Get SSL socket instance */ ++ ssock = (pj_ssl_sock_t *)gnutls_session_get_ptr(session); ++ pj_assert(ssock); ++ ++ /* Support only x509 format */ ++ ret = gnutls_certificate_type_get(session) != GNUTLS_CRT_X509; ++ if (ret < 0) { ++ ssock->verify_status |= PJ_SSL_CERT_EINVALID_FORMAT; ++ return GNUTLS_E_CERTIFICATE_ERROR; ++ } ++ ++ /* Store verification status */ ++ ret = gnutls_certificate_verify_peers2(session, &status); ++ if (ret < 0) { ++ ssock->verify_status |= PJ_SSL_CERT_EUNKNOWN; ++ return GNUTLS_E_CERTIFICATE_ERROR; ++ } ++ if (ssock->param.verify_peer) { ++ if (status & GNUTLS_CERT_INVALID) { ++ if (status & GNUTLS_CERT_SIGNER_NOT_FOUND) ++ ssock->verify_status |= PJ_SSL_CERT_EISSUER_NOT_FOUND; ++ else if (status & GNUTLS_CERT_EXPIRED || ++ status & GNUTLS_CERT_NOT_ACTIVATED) ++ ssock->verify_status |= PJ_SSL_CERT_EVALIDITY_PERIOD; ++ else if (status & GNUTLS_CERT_SIGNER_NOT_CA || ++ status & GNUTLS_CERT_INSECURE_ALGORITHM) ++ ssock->verify_status |= PJ_SSL_CERT_EUNTRUSTED; ++ else if (status & GNUTLS_CERT_UNEXPECTED_OWNER || ++ status & GNUTLS_CERT_MISMATCH) ++ ssock->verify_status |= PJ_SSL_CERT_EISSUER_MISMATCH; ++ else if (status & GNUTLS_CERT_REVOKED) ++ ssock->verify_status |= PJ_SSL_CERT_EREVOKED; ++ else ++ ssock->verify_status |= PJ_SSL_CERT_EUNKNOWN; ++ ++ return GNUTLS_E_CERTIFICATE_ERROR; ++ } ++ ++ /* When verification is not requested just return ok here, however ++ * applications can still get the verification status. */ ++ gnutls_x509_crt_t cert; ++ unsigned int cert_list_size; ++ const gnutls_datum_t *cert_list; ++ int ret; ++ ++ ret = gnutls_x509_crt_init(&cert); ++ if (ret < 0) ++ goto out; ++ ++ cert_list = gnutls_certificate_get_peers(session, &cert_list_size); ++ if (cert_list == NULL) { ++ ret = GNUTLS_E_NO_CERTIFICATE_FOUND; ++ goto out; ++ } ++ ++ /* TODO: verify whole chain perhaps? */ ++ ret = gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER); ++ if (ret < 0) ++ ret = gnutls_x509_crt_import(cert, &cert_list[0], ++ GNUTLS_X509_FMT_PEM); ++ if (ret < 0) { ++ ssock->verify_status |= PJ_SSL_CERT_EINVALID_FORMAT; ++ goto out; ++ } ++ ret = gnutls_x509_crt_check_hostname(cert, ssock->param.server_name.ptr); ++ if (ret < 0) ++ goto out; ++ ++ gnutls_x509_crt_deinit(cert); ++ ++ /* notify GnuTLS to continue handshake normally */ ++ return GNUTLS_E_SUCCESS; ++ ++out: ++ tls_last_error = ret; ++ ssock->verify_status |= PJ_SSL_CERT_EUNKNOWN; ++ return GNUTLS_E_CERTIFICATE_ERROR; ++ } ++ ++ return GNUTLS_E_SUCCESS; ++} ++ ++ ++/* gnutls_handshake() and gnutls_record_send() will call this function to ++ * send/write (encrypted) data */ ++static ssize_t tls_data_push(gnutls_transport_ptr_t ptr, ++ const void *data, size_t len) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t *)ptr; ++ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ if (circ_write(&ssock->circ_buf_output, data, len) != PJ_SUCCESS) { ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ gnutls_transport_set_errno(ssock->session, ENOMEM); ++ return -1; ++ } ++ ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ return len; ++} ++ ++ ++/* gnutls_handshake() and gnutls_record_recv() will call this function to ++ * receive/read (encrypted) data */ ++static ssize_t tls_data_pull(gnutls_transport_ptr_t ptr, ++ void *data, pj_size_t len) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t *)ptr; ++ ++ pj_lock_acquire(ssock->circ_buf_input_mutex); ++ ++ if (circ_empty(&ssock->circ_buf_input)) { ++ pj_lock_release(ssock->circ_buf_input_mutex); ++ ++ /* Data buffers not yet filled */ ++ gnutls_transport_set_errno(ssock->session, EAGAIN); ++ return -1; ++ } ++ ++ pj_size_t circ_buf_size = circ_size(&ssock->circ_buf_input); ++ pj_size_t read_size = PJ_MIN(circ_buf_size, len); ++ ++ circ_read(&ssock->circ_buf_input, data, read_size); ++ ++ pj_lock_release(ssock->circ_buf_input_mutex); ++ ++ return read_size; ++} ++ ++ ++/* Append a string to the priority string, only once. */ ++static pj_status_t tls_str_append_once(pj_str_t *dst, pj_str_t *src) ++{ ++ if (pj_strstr(dst, src) == NULL) { ++ /* Check buffer size */ ++ if (dst->slen + src->slen + 3 > 1024) ++ return PJ_ETOOMANY; ++ ++ pj_strcat2(dst, ":+"); ++ pj_strcat(dst, src); ++ } ++ return PJ_SUCCESS; ++} ++ ++ ++/* Generate priority string with user preference order. */ ++static pj_status_t tls_priorities_set(pj_ssl_sock_t *ssock) ++{ ++ char buf[1024]; ++ char priority_buf[256]; ++ pj_str_t cipher_list; ++ pj_str_t compression = pj_str("COMP-NULL"); ++ pj_str_t server = pj_str(":%SERVER_PRECEDENCE"); ++ int i, j, ret; ++ pj_str_t priority; ++ const char *err; ++ ++ pj_strset(&cipher_list, buf, 0); ++ pj_strset(&priority, priority_buf, 0); ++ ++ /* For each level, enable only the requested protocol */ ++ pj_strcat2(&priority, "NORMAL:"); ++ if (ssock->param.proto & PJ_SSL_SOCK_PROTO_TLS1_2) { ++ pj_strcat2(&priority, "+VERS-TLS1.2:"); ++ } ++ if (ssock->param.proto & PJ_SSL_SOCK_PROTO_TLS1_1) { ++ pj_strcat2(&priority, "+VERS-TLS1.1:"); ++ } ++ if (ssock->param.proto & PJ_SSL_SOCK_PROTO_TLS1) { ++ pj_strcat2(&priority, "+VERS-TLS1.0:"); ++ } ++ pj_strcat2(&priority, "-VERS-SSL3.0:"); ++ pj_strcat2(&priority, "%LATEST_RECORD_VERSION"); ++ ++ pj_strcat(&cipher_list, &priority); ++ for (i = 0; i < ssock->param.ciphers_num; i++) { ++ for (j = 0; ; j++) { ++ pj_ssl_cipher c; ++ const char *suite; ++ unsigned char id[2]; ++ gnutls_protocol_t proto; ++ gnutls_kx_algorithm_t kx; ++ gnutls_mac_algorithm_t mac; ++ gnutls_cipher_algorithm_t algo; ++ ++ suite = gnutls_cipher_suite_info(j, (unsigned char *)id, ++ &kx, &algo, &mac, &proto); ++ if (!suite) ++ break; ++ ++ c = (pj_ssl_cipher) (pj_uint32_t) ((id[0] << 8) | id[1]); ++ if (ssock->param.ciphers[i] == c) { ++ char temp[256]; ++ pj_str_t cipher_entry; ++ ++ /* Protocol version */ ++ pj_strset(&cipher_entry, temp, 0); ++ pj_strcat2(&cipher_entry, "VERS-"); ++ pj_strcat2(&cipher_entry, gnutls_protocol_get_name(proto)); ++ ret = tls_str_append_once(&cipher_list, &cipher_entry); ++ if (ret != PJ_SUCCESS) ++ return ret; ++ ++ /* Cipher */ ++ pj_strset(&cipher_entry, temp, 0); ++ pj_strcat2(&cipher_entry, gnutls_cipher_get_name(algo)); ++ ret = tls_str_append_once(&cipher_list, &cipher_entry); ++ if (ret != PJ_SUCCESS) ++ return ret; ++ ++ /* Mac */ ++ pj_strset(&cipher_entry, temp, 0); ++ pj_strcat2(&cipher_entry, gnutls_mac_get_name(mac)); ++ ret = tls_str_append_once(&cipher_list, &cipher_entry); ++ if (ret != PJ_SUCCESS) ++ return ret; ++ ++ /* Key exchange */ ++ pj_strset(&cipher_entry, temp, 0); ++ pj_strcat2(&cipher_entry, gnutls_kx_get_name(kx)); ++ ret = tls_str_append_once(&cipher_list, &cipher_entry); ++ if (ret != PJ_SUCCESS) ++ return ret; ++ ++ /* Compression is always disabled */ ++ /* Signature is level-default */ ++ break; ++ } ++ } ++ } ++ ++ /* Disable compression, it's a TLS-only extension after all */ ++ tls_str_append_once(&cipher_list, &compression); ++ ++ /* Server will be the one deciding which crypto to use */ ++ if (ssock->is_server) { ++ if (cipher_list.slen + server.slen + 1 > sizeof(buf)) ++ return PJ_ETOOMANY; ++ else ++ pj_strcat(&cipher_list, &server); ++ } ++ ++ /* End the string and print it */ ++ cipher_list.ptr[cipher_list.slen] = '\0'; ++ PJ_LOG(5, (ssock->pool->obj_name, "Priority string: %s", cipher_list.ptr)); ++ ++ /* Set our priority string */ ++ ret = gnutls_priority_set_direct(ssock->session, ++ cipher_list.ptr, &err); ++ if (ret < 0) { ++ tls_last_error = GNUTLS_E_INVALID_REQUEST; ++ return PJ_EINVAL; ++ } ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Load root CA file or load the installed ones. */ ++static pj_status_t tls_trust_set(pj_ssl_sock_t *ssock) ++{ ++ int ntrusts = 0; ++ int err; ++ ++ err = gnutls_certificate_set_x509_system_trust(ssock->xcred); ++ if (err > 0) ++ ntrusts += err; ++ err = gnutls_certificate_set_x509_trust_file(ssock->xcred, ++ TRUST_STORE_FILE1, ++ GNUTLS_X509_FMT_PEM); ++ if (err > 0) ++ ntrusts += err; ++ ++ err = gnutls_certificate_set_x509_trust_file(ssock->xcred, ++ TRUST_STORE_FILE2, ++ GNUTLS_X509_FMT_PEM); ++ if (err > 0) ++ ntrusts += err; ++ ++ if (ntrusts > 0) ++ return PJ_SUCCESS; ++ else if (!ntrusts) ++ return PJ_ENOTFOUND; ++ else ++ return PJ_EINVAL; ++} ++ ++#if GNUTLS_VERSION_NUMBER < 0x030306 ++ ++#ifdef _POSIX_PATH_MAX ++# define GNUTLS_PATH_MAX _POSIX_PATH_MAX ++#else ++# define GNUTLS_PATH_MAX 256 ++#endif ++ ++static ++int gnutls_certificate_set_x509_trust_dir(gnutls_certificate_credentials_t cred, const char *dirname, unsigned type) ++{ ++ DIR *dirp; ++ struct dirent *d; ++ int ret; ++ int r = 0; ++ char path[GNUTLS_PATH_MAX]; ++#ifndef _WIN32 ++ struct dirent e; ++#endif ++ ++ dirp = opendir(dirname); ++ if (dirp != NULL) { ++ do { ++#ifdef _WIN32 ++ d = readdir(dirp); ++ if (d != NULL) { ++#else ++ ret = readdir_r(dirp, &e, &d); ++ if (ret == 0 && d != NULL ++#ifdef _DIRENT_HAVE_D_TYPE ++ && (d->d_type == DT_REG || d->d_type == DT_LNK || d->d_type == DT_UNKNOWN) ++#endif ++ ) { ++#endif ++ snprintf(path, sizeof(path), "%s/%s", ++ dirname, d->d_name); ++ ++ ret = gnutls_certificate_set_x509_trust_file(cred, path, type); ++ if (ret >= 0) ++ r += ret; ++ } ++ } ++ while (d != NULL); ++ closedir(dirp); ++ } ++ ++ return r; ++} ++ ++#endif ++ ++/* Create and initialize new GnuTLS context and instance */ ++static pj_status_t tls_open(pj_ssl_sock_t *ssock) ++{ ++ pj_ssl_cert_t *cert; ++ pj_status_t status; ++ int ret; ++ ++ pj_assert(ssock); ++ ++ cert = ssock->cert; ++ ++ /* Even if reopening is harmless, having one instance only simplifies ++ * deallocating it later on */ ++ if (!ssock->tls_init_count) { ++ ssock->tls_init_count++; ++ ret = tls_init(); ++ if (ret < 0) ++ return ret; ++ } else ++ return PJ_SUCCESS; ++ ++ /* Start this socket session */ ++ ret = gnutls_init(&ssock->session, ssock->is_server ? GNUTLS_SERVER ++ : GNUTLS_CLIENT); ++ if (ret < 0) ++ goto out; ++ ++ /* Set the ssock object to be retrieved by transport (send/recv) and by ++ * user data from this session */ ++ gnutls_transport_set_ptr(ssock->session, ++ (gnutls_transport_ptr_t) (uintptr_t) ssock); ++ gnutls_session_set_ptr(ssock->session, ++ (gnutls_transport_ptr_t) (uintptr_t) ssock); ++ ++ /* Initialize input circular buffer */ ++ status = circ_init(ssock->pool->factory, &ssock->circ_buf_input, 512); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Initialize output circular buffer */ ++ status = circ_init(ssock->pool->factory, &ssock->circ_buf_output, 512); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Set the callback that allows GnuTLS to PUSH and PULL data ++ * TO and FROM the transport layer */ ++ gnutls_transport_set_push_function(ssock->session, tls_data_push); ++ gnutls_transport_set_pull_function(ssock->session, tls_data_pull); ++ ++ /* Determine which cipher suite to support */ ++ status = tls_priorities_set(ssock); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Allocate credentials for handshaking and transmission */ ++ ret = gnutls_certificate_allocate_credentials(&ssock->xcred); ++ if (ret < 0) ++ goto out; ++ gnutls_certificate_set_verify_function(ssock->xcred, tls_cert_verify_cb); ++ ++ /* Load system trust file(s) */ ++ status = tls_trust_set(ssock); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Load user-provided CA, certificate and key if available */ ++ if (cert) { ++ /* Load CA if one is specified. */ ++ if (cert->CA_file.slen) { ++ ret = gnutls_certificate_set_x509_trust_file(ssock->xcred, ++ cert->CA_file.ptr, ++ GNUTLS_X509_FMT_PEM); ++ if (ret < 0) ++ ret = gnutls_certificate_set_x509_trust_file(ssock->xcred, ++ cert->CA_file.ptr, ++ GNUTLS_X509_FMT_DER); ++ if (ret < 0) ++ goto out; ++ } ++ if (cert->CA_path.slen) { ++ ret = gnutls_certificate_set_x509_trust_dir(ssock->xcred, ++ cert->CA_path.ptr, ++ GNUTLS_X509_FMT_PEM); ++ if (ret < 0) ++ ret = gnutls_certificate_set_x509_trust_dir(ssock->xcred, ++ cert->CA_path.ptr, ++ GNUTLS_X509_FMT_DER); ++ if (ret < 0) ++ goto out; ++ } ++ ++ /* Load certificate, key and pass if one is specified */ ++ if (cert->cert_file.slen && cert->privkey_file.slen) { ++ const char *prikey_file = cert->privkey_file.ptr; ++ const char *prikey_pass = cert->privkey_pass.slen ++ ? cert->privkey_pass.ptr ++ : NULL; ++ ret = gnutls_certificate_set_x509_key_file2(ssock->xcred, ++ cert->cert_file.ptr, ++ prikey_file, ++ GNUTLS_X509_FMT_PEM, ++ prikey_pass, ++ 0); ++ if (ret != GNUTLS_E_SUCCESS) ++ ret = gnutls_certificate_set_x509_key_file2(ssock->xcred, ++ cert->cert_file.ptr, ++ prikey_file, ++ GNUTLS_X509_FMT_DER, ++ prikey_pass, ++ 0); ++ if (ret < 0) ++ goto out; ++ } ++ } ++ ++ /* Require client certificate if asked */ ++ if (ssock->is_server && ssock->param.require_client_cert) ++ gnutls_certificate_server_set_request(ssock->session, ++ GNUTLS_CERT_REQUIRE); ++ ++ /* Finally set credentials for this session */ ++ ret = gnutls_credentials_set(ssock->session, ++ GNUTLS_CRD_CERTIFICATE, ssock->xcred); ++ if (ret < 0) ++ goto out; ++ ++ ret = GNUTLS_E_SUCCESS; ++out: ++ return tls_status_from_err(ssock, ret); ++} ++ ++ ++/* Destroy GnuTLS credentials and session. */ ++static void tls_close(pj_ssl_sock_t *ssock) ++{ ++ if (ssock->session) { ++ gnutls_bye(ssock->session, GNUTLS_SHUT_RDWR); ++ gnutls_deinit(ssock->session); ++ ssock->session = NULL; ++ } ++ ++ if (ssock->xcred) { ++ gnutls_certificate_free_credentials(ssock->xcred); ++ ssock->xcred = NULL; ++ } ++ ++ /* Free GnuTLS library */ ++ if (ssock->tls_init_count) { ++ ssock->tls_init_count--; ++ tls_deinit(); ++ } ++ ++ /* Destroy circular buffers */ ++ circ_deinit(&ssock->circ_buf_input); ++ circ_deinit(&ssock->circ_buf_output); ++} ++ ++ ++/* Reset socket state. */ ++static void tls_sock_reset(pj_ssl_sock_t *ssock) ++{ ++ ssock->connection_state = TLS_STATE_NULL; ++ ++ tls_close(ssock); ++ ++ if (ssock->asock) { ++ pj_activesock_close(ssock->asock); ++ ssock->asock = NULL; ++ ssock->sock = PJ_INVALID_SOCKET; ++ } ++ if (ssock->sock != PJ_INVALID_SOCKET) { ++ pj_sock_close(ssock->sock); ++ ssock->sock = PJ_INVALID_SOCKET; ++ } ++ ++ ssock->last_err = tls_last_error = GNUTLS_E_SUCCESS; ++} ++ ++ ++/* Get Common Name field string from a general name string */ ++static void tls_cert_get_cn(const pj_str_t *gen_name, pj_str_t *cn) ++{ ++ pj_str_t CN_sign = {"CN=", 3}; ++ char *p, *q; ++ ++ pj_bzero(cn, sizeof(cn)); ++ ++ p = pj_strstr(gen_name, &CN_sign); ++ if (!p) ++ return; ++ ++ p += 3; /* shift pointer to value part */ ++ pj_strset(cn, p, gen_name->slen - (p - gen_name->ptr)); ++ q = pj_strchr(cn, ','); ++ if (q) ++ cn->slen = q - p; ++} ++ ++ ++/* Get certificate info; in case the certificate info is already populated, ++ * this function will check if the contents need updating by inspecting the ++ * issuer and the serial number. */ ++static void tls_cert_get_info(pj_pool_t *pool, pj_ssl_cert_info *ci, gnutls_x509_crt_t cert) ++{ ++ pj_bool_t update_needed; ++ char buf[512] = { 0 }; ++ size_t bufsize = sizeof(buf); ++ pj_uint8_t serial_no[64] = { 0 }; /* should be >= sizeof(ci->serial_no) */ ++ size_t serialsize = sizeof(serial_no); ++ size_t len = sizeof(buf); ++ int i, ret, seq = 0; ++ pj_ssl_cert_name_type type; ++ ++ pj_assert(pool && ci && cert); ++ ++ /* Get issuer */ ++ gnutls_x509_crt_get_issuer_dn(cert, buf, &bufsize); ++ ++ /* Get serial no */ ++ gnutls_x509_crt_get_serial(cert, serial_no, &serialsize); ++ ++ /* Check if the contents need to be updated */ ++ update_needed = pj_strcmp2(&ci->issuer.info, buf) || ++ pj_memcmp(ci->serial_no, serial_no, serialsize); ++ if (!update_needed) ++ return; ++ ++ /* Update cert info */ ++ ++ pj_bzero(ci, sizeof(pj_ssl_cert_info)); ++ ++ /* Version */ ++ ci->version = gnutls_x509_crt_get_version(cert); ++ ++ /* Issuer */ ++ pj_strdup2(pool, &ci->issuer.info, buf); ++ tls_cert_get_cn(&ci->issuer.info, &ci->issuer.cn); ++ ++ /* Serial number */ ++ pj_memcpy(ci->serial_no, serial_no, sizeof(ci->serial_no)); ++ ++ /* Subject */ ++ bufsize = sizeof(buf); ++ gnutls_x509_crt_get_dn(cert, buf, &bufsize); ++ pj_strdup2(pool, &ci->subject.info, buf); ++ tls_cert_get_cn(&ci->subject.info, &ci->subject.cn); ++ ++ /* Validity */ ++ ci->validity.end.sec = gnutls_x509_crt_get_expiration_time(cert); ++ ci->validity.start.sec = gnutls_x509_crt_get_activation_time(cert); ++ ci->validity.gmt = 0; ++ ++ /* Subject Alternative Name extension */ ++ if (ci->version >= 3) { ++ char out[256] = { 0 }; ++ /* Get the number of all alternate names so that we can allocate ++ * the correct number of bytes in subj_alt_name */ ++ while (gnutls_x509_crt_get_subject_alt_name(cert, seq, out, &len, ++ NULL) != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) ++ seq++; ++ ++ ci->subj_alt_name.entry = pj_pool_calloc(pool, seq, ++ sizeof(*ci->subj_alt_name.entry)); ++ if (!ci->subj_alt_name.entry) { ++ tls_last_error = GNUTLS_E_MEMORY_ERROR; ++ return; ++ } ++ ++ /* Now populate the alternative names */ ++ for (i = 0; i < seq; i++) { ++ len = sizeof(out) - 1; ++ ret = gnutls_x509_crt_get_subject_alt_name(cert, i, out, &len, NULL); ++ switch (ret) { ++ case GNUTLS_SAN_IPADDRESS: ++ type = PJ_SSL_CERT_NAME_IP; ++ pj_inet_ntop2(len == sizeof(pj_in6_addr) ? pj_AF_INET6() ++ : pj_AF_INET(), ++ out, buf, sizeof(buf)); ++ break; ++ case GNUTLS_SAN_URI: ++ type = PJ_SSL_CERT_NAME_URI; ++ break; ++ case GNUTLS_SAN_RFC822NAME: ++ type = PJ_SSL_CERT_NAME_RFC822; ++ break; ++ case GNUTLS_SAN_DNSNAME: ++ type = PJ_SSL_CERT_NAME_DNS; ++ break; ++ default: ++ type = PJ_SSL_CERT_NAME_UNKNOWN; ++ break; ++ } ++ ++ if (len && type != PJ_SSL_CERT_NAME_UNKNOWN) { ++ ci->subj_alt_name.entry[ci->subj_alt_name.cnt].type = type; ++ pj_strdup2(pool, ++ &ci->subj_alt_name.entry[ci->subj_alt_name.cnt].name, ++ type == PJ_SSL_CERT_NAME_IP ? buf : out); ++ ci->subj_alt_name.cnt++; ++ } ++ } ++ /* TODO: if no DNS alt. names were found, we could check against ++ * the commonName as per RFC3280. */ ++ } ++} ++ ++static void tls_cert_get_chain_raw(pj_pool_t *pool, pj_ssl_cert_info *ci, const gnutls_datum_t *certs, size_t certs_num) ++{ ++ size_t i=0; ++ ci->raw_chain.cert_raw = pj_pool_calloc(pool, certs_num, sizeof(*ci->raw_chain.cert_raw)); ++ ci->raw_chain.cnt = certs_num; ++ for (i=0; i < certs_num; ++i) { ++ const pj_str_t crt_raw = {(const char*)certs[i].data, (pj_ssize_t)certs[i].size}; ++ pj_strdup(pool, ci->raw_chain.cert_raw+i, &crt_raw); ++ } ++} ++ ++/* Update local & remote certificates info. This function should be ++ * called after handshake or renegotiation successfully completed. */ ++static void tls_cert_update(pj_ssl_sock_t *ssock) ++{ ++ gnutls_x509_crt_t cert = NULL; ++ const gnutls_datum_t *us; ++ const gnutls_datum_t *certs; ++ unsigned int certslen = 0; ++ int ret = GNUTLS_CERT_INVALID; ++ ++ pj_assert(ssock->connection_state == TLS_STATE_ESTABLISHED); ++ ++ /* Get active local certificate */ ++ us = gnutls_certificate_get_ours(ssock->session); ++ if (!us) ++ goto us_out; ++ ++ ret = gnutls_x509_crt_init(&cert); ++ if (ret < 0) ++ goto us_out; ++ ret = gnutls_x509_crt_import(cert, us, GNUTLS_X509_FMT_DER); ++ if (ret < 0) ++ ret = gnutls_x509_crt_import(cert, us, GNUTLS_X509_FMT_PEM); ++ if (ret < 0) ++ goto us_out; ++ ++ tls_cert_get_info(ssock->pool, &ssock->local_cert_info, cert); ++ tls_cert_get_chain_raw(ssock->pool, &ssock->local_cert_info, us, 1); ++ ++us_out: ++ tls_last_error = ret; ++ if (cert) ++ gnutls_x509_crt_deinit(cert); ++ else ++ pj_bzero(&ssock->local_cert_info, sizeof(pj_ssl_cert_info)); ++ ++ cert = NULL; ++ ++ /* Get active remote certificate */ ++ certs = gnutls_certificate_get_peers(ssock->session, &certslen); ++ if (certs == NULL || certslen == 0) ++ goto peer_out; ++ ++ ret = gnutls_x509_crt_init(&cert); ++ if (ret < 0) ++ goto peer_out; ++ ++ ret = gnutls_x509_crt_import(cert, certs, GNUTLS_X509_FMT_PEM); ++ if (ret < 0) ++ ret = gnutls_x509_crt_import(cert, certs, GNUTLS_X509_FMT_DER); ++ if (ret < 0) ++ goto peer_out; ++ ++ tls_cert_get_info(ssock->pool, &ssock->remote_cert_info, cert); ++ tls_cert_get_chain_raw(ssock->pool, &ssock->remote_cert_info, certs, certslen); ++ ++peer_out: ++ tls_last_error = ret; ++ if (cert) ++ gnutls_x509_crt_deinit(cert); ++ else ++ pj_bzero(&ssock->remote_cert_info, sizeof(pj_ssl_cert_info)); ++} ++ ++ ++/* When handshake completed: ++ * - notify application ++ * - if handshake failed, reset SSL state ++ * - return PJ_FALSE when SSL socket instance is destroyed by application. */ ++static pj_bool_t on_handshake_complete(pj_ssl_sock_t *ssock, ++ pj_status_t status) ++{ ++ pj_bool_t ret = PJ_TRUE; ++ ++ /* Cancel handshake timer */ ++ if (ssock->timer.id == TIMER_HANDSHAKE_TIMEOUT) { ++ pj_timer_heap_cancel(ssock->param.timer_heap, &ssock->timer); ++ ssock->timer.id = TIMER_NONE; ++ } ++ ++ /* Update certificates info on successful handshake */ ++ if (status == PJ_SUCCESS) ++ tls_cert_update(ssock); ++ ++ /* Accepting */ ++ if (ssock->is_server) { ++ if (status != PJ_SUCCESS) { ++ /* Handshake failed in accepting, destroy our self silently. */ ++ ++ char errmsg[PJ_ERR_MSG_SIZE]; ++ char buf[PJ_INET6_ADDRSTRLEN + 10]; ++ ++ pj_strerror(status, errmsg, sizeof(errmsg)); ++ PJ_LOG(3, (ssock->pool->obj_name, ++ "Handshake failed in accepting %s: %s", ++ pj_sockaddr_print(&ssock->rem_addr, buf, sizeof(buf), 3), ++ errmsg)); ++ ++ /* Workaround for ticket #985 */ ++#if (defined(PJ_WIN32) && PJ_WIN32 != 0) || (defined(PJ_WIN64) && PJ_WIN64 != 0) ++ if (ssock->param.timer_heap) { ++ pj_time_val interval = {0, DELAYED_CLOSE_TIMEOUT}; ++ ++ tls_sock_reset(ssock); ++ ++ ssock->timer.id = TIMER_CLOSE; ++ pj_time_val_normalize(&interval); ++ if (pj_timer_heap_schedule(ssock->param.timer_heap, ++ &ssock->timer, &interval) != 0) ++ { ++ ssock->timer.id = TIMER_NONE; ++ pj_ssl_sock_close(ssock); ++ } ++ } else ++#endif /* PJ_WIN32 */ ++ { ++ pj_ssl_sock_close(ssock); ++ } ++ ++ return PJ_FALSE; ++ } ++ /* Notify application the newly accepted SSL socket */ ++ if (ssock->param.cb.on_accept_complete) ++ ret = (*ssock->param.cb.on_accept_complete) ++ (ssock->parent, ssock, (pj_sockaddr_t*)&ssock->rem_addr, ++ pj_sockaddr_get_len((pj_sockaddr_t*)&ssock->rem_addr)); ++ ++ } else { /* Connecting */ ++ /* On failure, reset SSL socket state first, as app may try to ++ * reconnect in the callback. */ ++ if (status != PJ_SUCCESS) { ++ /* Server disconnected us, possibly due to negotiation failure */ ++ tls_sock_reset(ssock); ++ } ++ if (ssock->param.cb.on_connect_complete) { ++ ++ ret = (*ssock->param.cb.on_connect_complete)(ssock, status); ++ } ++ } ++ ++ return ret; ++} ++ ++static write_data_t *alloc_send_data(pj_ssl_sock_t *ssock, pj_size_t len) ++{ ++ send_buf_t *send_buf = &ssock->send_buf; ++ pj_size_t avail_len, skipped_len = 0; ++ char *reg1, *reg2; ++ pj_size_t reg1_len, reg2_len; ++ write_data_t *p; ++ ++ /* Check buffer availability */ ++ avail_len = send_buf->max_len - send_buf->len; ++ if (avail_len < len) ++ return NULL; ++ ++ /* If buffer empty, reset start pointer and return it */ ++ if (send_buf->len == 0) { ++ send_buf->start = send_buf->buf; ++ send_buf->len = len; ++ p = (write_data_t*)send_buf->start; ++ goto init_send_data; ++ } ++ ++ /* Free space may be wrapped/splitted into two regions, so let's ++ * analyze them if any region can hold the write data. */ ++ reg1 = send_buf->start + send_buf->len; ++ if (reg1 >= send_buf->buf + send_buf->max_len) ++ reg1 -= send_buf->max_len; ++ reg1_len = send_buf->max_len - send_buf->len; ++ if (reg1 + reg1_len > send_buf->buf + send_buf->max_len) { ++ reg1_len = send_buf->buf + send_buf->max_len - reg1; ++ reg2 = send_buf->buf; ++ reg2_len = send_buf->start - send_buf->buf; ++ } else { ++ reg2 = NULL; ++ reg2_len = 0; ++ } ++ ++ /* More buffer availability check, note that the write data must be in ++ * a contigue buffer. */ ++ avail_len = PJ_MAX(reg1_len, reg2_len); ++ if (avail_len < len) ++ return NULL; ++ ++ /* Get the data slot */ ++ if (reg1_len >= len) { ++ p = (write_data_t*)reg1; ++ } else { ++ p = (write_data_t*)reg2; ++ skipped_len = reg1_len; ++ } ++ ++ /* Update buffer length */ ++ send_buf->len += len + skipped_len; ++ ++init_send_data: ++ /* Init the new send data */ ++ pj_bzero(p, sizeof(*p)); ++ pj_list_init(p); ++ pj_list_push_back(&ssock->send_pending, p); ++ ++ return p; ++} ++ ++static void free_send_data(pj_ssl_sock_t *ssock, write_data_t *wdata) ++{ ++ send_buf_t *buf = &ssock->send_buf; ++ write_data_t *spl = &ssock->send_pending; ++ ++ pj_assert(!pj_list_empty(&ssock->send_pending)); ++ ++ /* Free slot from the buffer */ ++ if (spl->next == wdata && spl->prev == wdata) { ++ /* This is the only data, reset the buffer */ ++ buf->start = buf->buf; ++ buf->len = 0; ++ } else if (spl->next == wdata) { ++ /* This is the first data, shift start pointer of the buffer and ++ * adjust the buffer length. ++ */ ++ buf->start = (char*)wdata->next; ++ if (wdata->next > wdata) { ++ buf->len -= ((char*)wdata->next - buf->start); ++ } else { ++ /* Overlapped */ ++ pj_size_t right_len, left_len; ++ right_len = buf->buf + buf->max_len - (char*)wdata; ++ left_len = (char*)wdata->next - buf->buf; ++ buf->len -= (right_len + left_len); ++ } ++ } else if (spl->prev == wdata) { ++ /* This is the last data, just adjust the buffer length */ ++ if (wdata->prev < wdata) { ++ pj_size_t jump_len; ++ jump_len = (char*)wdata - ++ ((char*)wdata->prev + wdata->prev->record_len); ++ buf->len -= (wdata->record_len + jump_len); ++ } else { ++ /* Overlapped */ ++ pj_size_t right_len, left_len; ++ right_len = buf->buf + buf->max_len - ++ ((char*)wdata->prev + wdata->prev->record_len); ++ left_len = (char*)wdata + wdata->record_len - buf->buf; ++ buf->len -= (right_len + left_len); ++ } ++ } ++ /* For data in the middle buffer, just do nothing on the buffer. The slot ++ * will be freed later when freeing the first/last data. */ ++ ++ /* Remove the data from send pending list */ ++ pj_list_erase(wdata); ++} ++ ++#if 0 ++/* Just for testing send buffer alloc/free */ ++#include <pj/rand.h> ++pj_status_t pj_ssl_sock_ossl_test_send_buf(pj_pool_t *pool) ++{ ++ enum { MAX_CHUNK_NUM = 20 }; ++ unsigned chunk_size, chunk_cnt, i; ++ write_data_t *wdata[MAX_CHUNK_NUM] = {0}; ++ pj_time_val now; ++ pj_ssl_sock_t *ssock = NULL; ++ pj_ssl_sock_param param; ++ pj_status_t status; ++ ++ pj_gettimeofday(&now); ++ pj_srand((unsigned)now.sec); ++ ++ pj_ssl_sock_param_default(¶m); ++ status = pj_ssl_sock_create(pool, ¶m, &ssock); ++ if (status != PJ_SUCCESS) { ++ return status; ++ } ++ ++ if (ssock->send_buf.max_len == 0) { ++ ssock->send_buf.buf = (char *) ++ pj_pool_alloc(ssock->pool, ++ ssock->param.send_buffer_size); ++ ssock->send_buf.max_len = ssock->param.send_buffer_size; ++ ssock->send_buf.start = ssock->send_buf.buf; ++ ssock->send_buf.len = 0; ++ } ++ ++ chunk_size = ssock->param.send_buffer_size / MAX_CHUNK_NUM / 2; ++ chunk_cnt = 0; ++ for (i = 0; i < MAX_CHUNK_NUM; i++) { ++ wdata[i] = alloc_send_data(ssock, pj_rand() % chunk_size + 321); ++ if (wdata[i]) ++ chunk_cnt++; ++ else ++ break; ++ } ++ ++ while (chunk_cnt) { ++ i = pj_rand() % MAX_CHUNK_NUM; ++ if (wdata[i]) { ++ free_send_data(ssock, wdata[i]); ++ wdata[i] = NULL; ++ chunk_cnt--; ++ } ++ } ++ ++ if (ssock->send_buf.len != 0) ++ status = PJ_EBUG; ++ ++ pj_ssl_sock_close(ssock); ++ return status; ++} ++#endif ++ ++/* Flush write circular buffer to network socket. */ ++static pj_status_t flush_circ_buf_output(pj_ssl_sock_t *ssock, ++ pj_ioqueue_op_key_t *send_key, ++ pj_size_t orig_len, unsigned flags) ++{ ++ pj_ssize_t len; ++ write_data_t *wdata; ++ pj_size_t needed_len; ++ pj_status_t status; ++ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ ++ /* Check if there is data in the circular buffer, flush it if any */ ++ if (circ_empty(&ssock->circ_buf_output)) { ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ return PJ_SUCCESS; ++ } ++ ++ len = circ_size(&ssock->circ_buf_output); ++ ++ /* Calculate buffer size needed, and align it to 8 */ ++ needed_len = len + sizeof(write_data_t); ++ needed_len = ((needed_len + 7) >> 3) << 3; ++ ++ /* Allocate buffer for send data */ ++ wdata = alloc_send_data(ssock, needed_len); ++ if (wdata == NULL) { ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ return PJ_ENOMEM; ++ } ++ ++ /* Copy the data and set its properties into the send data */ ++ pj_ioqueue_op_key_init(&wdata->key, sizeof(pj_ioqueue_op_key_t)); ++ wdata->key.user_data = wdata; ++ wdata->app_key = send_key; ++ wdata->record_len = needed_len; ++ wdata->data_len = len; ++ wdata->plain_data_len = orig_len; ++ wdata->flags = flags; ++ circ_read(&ssock->circ_buf_output, (pj_uint8_t *)&wdata->data, len); ++ ++ /* Ticket #1573: Don't hold mutex while calling PJLIB socket send(). */ ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ /* Send it */ ++ if (ssock->param.sock_type == pj_SOCK_STREAM()) { ++ status = pj_activesock_send(ssock->asock, &wdata->key, ++ wdata->data.content, &len, ++ flags); ++ } else { ++ status = pj_activesock_sendto(ssock->asock, &wdata->key, ++ wdata->data.content, &len, ++ flags, ++ (pj_sockaddr_t*)&ssock->rem_addr, ++ ssock->addr_len); ++ } ++ ++ if (status != PJ_EPENDING) { ++ /* When the sending is not pending, remove the wdata from send ++ * pending list. */ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ free_send_data(ssock, wdata); ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ } ++ ++ return status; ++} ++ ++static void on_timer(pj_timer_heap_t *th, struct pj_timer_entry *te) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t*)te->user_data; ++ int timer_id = te->id; ++ ++ te->id = TIMER_NONE; ++ ++ PJ_UNUSED_ARG(th); ++ ++ switch (timer_id) { ++ case TIMER_HANDSHAKE_TIMEOUT: ++ PJ_LOG(1, (ssock->pool->obj_name, "TLS timeout after %d.%ds", ++ ssock->param.timeout.sec, ssock->param.timeout.msec)); ++ ++ on_handshake_complete(ssock, PJ_ETIMEDOUT); ++ break; ++ case TIMER_CLOSE: ++ pj_ssl_sock_close(ssock); ++ break; ++ default: ++ pj_assert(!"Unknown timer"); ++ break; ++ } ++} ++ ++ ++/* Try to perform an asynchronous handshake */ ++static pj_status_t tls_try_handshake(pj_ssl_sock_t *ssock) ++{ ++ int ret; ++ pj_status_t status; ++ ++ /* Perform SSL handshake */ ++ ret = gnutls_handshake(ssock->session); ++ ++ status = flush_circ_buf_output(ssock, &ssock->handshake_op_key, 0, 0); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ if (ret == GNUTLS_E_SUCCESS) { ++ /* System are GO */ ++ ssock->connection_state = TLS_STATE_ESTABLISHED; ++ status = PJ_SUCCESS; ++ } else if (!gnutls_error_is_fatal(ret)) { ++ /* Non fatal error, retry later (busy or again) */ ++ status = PJ_EPENDING; ++ } else { ++ /* Fatal error invalidates session, no fallback */ ++ status = PJ_EINVAL; ++ } ++ ++ tls_last_error = ret; ++ ++ return status; ++} ++ ++ ++/* ++ ******************************************************************* ++ * Active socket callbacks. ++ ******************************************************************* ++ */ ++ ++/* PJ_TRUE asks the socket to read more data, PJ_FALSE takes it off the queue */ ++static pj_bool_t asock_on_data_read(pj_activesock_t *asock, void *data, ++ pj_size_t size, pj_status_t status, ++ pj_size_t *remainder) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t *) ++ pj_activesock_get_user_data(asock); ++ ++ pj_size_t app_remainder = 0; ++ ++ if (data && size > 0) { ++ /* Push data into input circular buffer (for GnuTLS) */ ++ pj_lock_acquire(ssock->circ_buf_input_mutex); ++ circ_write(&ssock->circ_buf_input, data, size); ++ pj_lock_release(ssock->circ_buf_input_mutex); ++ } ++ ++ /* Check if SSL handshake hasn't finished yet */ ++ if (ssock->connection_state == TLS_STATE_HANDSHAKING) { ++ pj_bool_t ret = PJ_TRUE; ++ ++ if (status == PJ_SUCCESS) ++ status = tls_try_handshake(ssock); ++ ++ /* Not pending is either success or failed */ ++ if (status != PJ_EPENDING) ++ ret = on_handshake_complete(ssock, status); ++ ++ return ret; ++ } ++ ++ /* See if there is any decrypted data for the application */ ++ if (ssock->read_started) { ++ do { ++ /* Get read data structure at the end of the data */ ++ read_data_t *app_read_data = *(OFFSET_OF_READ_DATA_PTR(ssock, data)); ++ int app_data_size = (int)(ssock->read_size - app_read_data->len); ++ ++ /* Decrypt received data using GnuTLS (will read our input ++ * circular buffer) */ ++ int decrypted_size = gnutls_record_recv(ssock->session, ++ ((read_data_t *)app_read_data->data) + ++ app_read_data->len, ++ app_data_size); ++ ++ if (decrypted_size > 0 || status != PJ_SUCCESS) { ++ if (ssock->param.cb.on_data_read) { ++ pj_bool_t ret; ++ app_remainder = 0; ++ ++ if (decrypted_size > 0) ++ app_read_data->len += decrypted_size; ++ ++ ret = (*ssock->param.cb.on_data_read)(ssock, ++ app_read_data->data, ++ app_read_data->len, ++ status, ++ &app_remainder); ++ ++ if (!ret) { ++ /* We've been destroyed */ ++ return PJ_FALSE; ++ } ++ ++ /* Application may have left some data to be consumed ++ * later as remainder */ ++ app_read_data->len = app_remainder; ++ } ++ ++ /* Active socket signalled connection closed/error, this has ++ * been signalled to the application along with any remaining ++ * buffer. So, let's just reset SSL socket now. */ ++ if (status != PJ_SUCCESS) { ++ tls_sock_reset(ssock); ++ return PJ_FALSE; ++ } ++ } else if (decrypted_size == 0) { ++ /* Nothing more to read */ ++ ++ return PJ_TRUE; ++ } else if (decrypted_size == GNUTLS_E_AGAIN || ++ decrypted_size == GNUTLS_E_INTERRUPTED) { ++ return PJ_TRUE; ++ } else if (decrypted_size == GNUTLS_E_REHANDSHAKE) { ++ /* Seems like we are renegotiating */ ++ pj_status_t try_handshake_status = tls_try_handshake(ssock); ++ ++ /* Not pending is either success or failed */ ++ if (try_handshake_status != PJ_EPENDING) { ++ if (!on_handshake_complete(ssock, try_handshake_status)) { ++ return PJ_FALSE; ++ } ++ } ++ ++ if (try_handshake_status != PJ_SUCCESS && ++ try_handshake_status != PJ_EPENDING) { ++ return PJ_FALSE; ++ } ++ } else if (!gnutls_error_is_fatal(decrypted_size)) { ++ /* non-fatal error, let's just continue */ ++ } else { ++ return PJ_FALSE; ++ } ++ } while (PJ_TRUE); ++ } ++ ++ return PJ_TRUE; ++} ++ ++ ++/* Callback every time new data is available from the active socket */ ++static pj_bool_t asock_on_data_sent(pj_activesock_t *asock, ++ pj_ioqueue_op_key_t *send_key, ++ pj_ssize_t sent) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t *)pj_activesock_get_user_data(asock); ++ ++ PJ_UNUSED_ARG(send_key); ++ PJ_UNUSED_ARG(sent); ++ ++ if (ssock->connection_state == TLS_STATE_HANDSHAKING) { ++ /* Initial handshaking */ ++ pj_status_t status = tls_try_handshake(ssock); ++ ++ /* Not pending is either success or failed */ ++ if (status != PJ_EPENDING) ++ return on_handshake_complete(ssock, status); ++ ++ } else if (send_key != &ssock->handshake_op_key) { ++ /* Some data has been sent, notify application */ ++ write_data_t *wdata = (write_data_t*)send_key->user_data; ++ if (ssock->param.cb.on_data_sent) { ++ pj_bool_t ret; ++ pj_ssize_t sent_len; ++ ++ sent_len = sent > 0 ? wdata->plain_data_len : sent; ++ ++ ret = (*ssock->param.cb.on_data_sent)(ssock, wdata->app_key, ++ sent_len); ++ if (!ret) { ++ /* We've been destroyed */ ++ return PJ_FALSE; ++ } ++ } ++ ++ /* Update write buffer state */ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ free_send_data(ssock, wdata); ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ } else { ++ /* SSL re-negotiation is on-progress, just do nothing */ ++ /* FIXME: check if this is valid for GnuTLS too */ ++ } ++ ++ return PJ_TRUE; ++} ++ ++ ++/* Callback every time a new connection has been accepted (server) */ ++static pj_bool_t asock_on_accept_complete(pj_activesock_t *asock, ++ pj_sock_t newsock, ++ const pj_sockaddr_t *src_addr, ++ int src_addr_len) ++{ ++ pj_ssl_sock_t *ssock_parent = (pj_ssl_sock_t *) ++ pj_activesock_get_user_data(asock); ++ ++ pj_ssl_sock_t *ssock; ++ pj_activesock_cb asock_cb; ++ pj_activesock_cfg asock_cfg; ++ unsigned int i; ++ pj_status_t status; ++ ++ PJ_UNUSED_ARG(src_addr_len); ++ ++ /* Create new SSL socket instance */ ++ status = pj_ssl_sock_create(ssock_parent->pool, &ssock_parent->newsock_param, ++ &ssock); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Update new SSL socket attributes */ ++ ssock->sock = newsock; ++ ssock->parent = ssock_parent; ++ ssock->is_server = PJ_TRUE; ++ if (ssock_parent->cert) { ++ status = pj_ssl_sock_set_certificate(ssock, ssock->pool, ++ ssock_parent->cert); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ } ++ ++ /* Apply QoS, if specified */ ++ status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, ++ &ssock->param.qos_params, 1, ++ ssock->pool->obj_name, NULL); ++ if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) ++ goto on_return; ++ ++ /* Update local address */ ++ ssock->addr_len = src_addr_len; ++ status = pj_sock_getsockname(ssock->sock, &ssock->local_addr, ++ &ssock->addr_len); ++ if (status != PJ_SUCCESS) { ++ /* This fails on few envs, e.g: win IOCP, just tolerate this and ++ * use parent local address instead. ++ */ ++ pj_sockaddr_cp(&ssock->local_addr, &ssock_parent->local_addr); ++ } ++ ++ /* Set remote address */ ++ pj_sockaddr_cp(&ssock->rem_addr, src_addr); ++ ++ /* Create SSL context */ ++ status = tls_open(ssock); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Prepare read buffer */ ++ ssock->asock_rbuf = (void **)pj_pool_calloc(ssock->pool, ++ ssock->param.async_cnt, ++ sizeof(void*)); ++ if (!ssock->asock_rbuf) ++ return PJ_ENOMEM; ++ ++ for (i = 0; i < ssock->param.async_cnt; ++i) { ++ ssock->asock_rbuf[i] = (void *)pj_pool_alloc( ++ ssock->pool, ++ ssock->param.read_buffer_size + ++ sizeof(read_data_t*)); ++ if (!ssock->asock_rbuf[i]) ++ return PJ_ENOMEM; ++ } ++ ++ /* Create active socket */ ++ pj_activesock_cfg_default(&asock_cfg); ++ asock_cfg.async_cnt = ssock->param.async_cnt; ++ asock_cfg.concurrency = ssock->param.concurrency; ++ asock_cfg.whole_data = PJ_TRUE; ++ ++ pj_bzero(&asock_cb, sizeof(asock_cb)); ++ asock_cb.on_data_read = asock_on_data_read; ++ asock_cb.on_data_sent = asock_on_data_sent; ++ ++ status = pj_activesock_create(ssock->pool, ++ ssock->sock, ++ ssock->param.sock_type, ++ &asock_cfg, ++ ssock->param.ioqueue, ++ &asock_cb, ++ ssock, ++ &ssock->asock); ++ ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Start reading */ ++ status = pj_activesock_start_read2(ssock->asock, ssock->pool, ++ (unsigned)ssock->param.read_buffer_size, ++ ssock->asock_rbuf, ++ PJ_IOQUEUE_ALWAYS_ASYNC); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Prepare write/send state */ ++ pj_assert(ssock->send_buf.max_len == 0); ++ ssock->send_buf.buf = (char *)pj_pool_alloc(ssock->pool, ++ ssock->param.send_buffer_size); ++ if (!ssock->send_buf.buf) ++ return PJ_ENOMEM; ++ ++ ssock->send_buf.max_len = ssock->param.send_buffer_size; ++ ssock->send_buf.start = ssock->send_buf.buf; ++ ssock->send_buf.len = 0; ++ ++ /* Start handshake timer */ ++ if (ssock->param.timer_heap && ++ (ssock->param.timeout.sec != 0 || ssock->param.timeout.msec != 0)) { ++ pj_assert(ssock->timer.id == TIMER_NONE); ++ ssock->timer.id = TIMER_HANDSHAKE_TIMEOUT; ++ status = pj_timer_heap_schedule(ssock->param.timer_heap, ++ &ssock->timer, ++ &ssock->param.timeout); ++ if (status != PJ_SUCCESS) ++ ssock->timer.id = TIMER_NONE; ++ } ++ ++ /* Start SSL handshake */ ++ ssock->connection_state = TLS_STATE_HANDSHAKING; ++ ++ status = tls_try_handshake(ssock); ++ ++on_return: ++ if (ssock && status != PJ_EPENDING) ++ on_handshake_complete(ssock, status); ++ ++ /* Must return PJ_TRUE whatever happened, as active socket must ++ * continue listening. ++ */ ++ return PJ_TRUE; ++} ++ ++ ++/* Callback every time a new connection has been completed (client) */ ++static pj_bool_t asock_on_connect_complete (pj_activesock_t *asock, ++ pj_status_t status) ++{ ++ pj_ssl_sock_t *ssock = (pj_ssl_sock_t*) ++ pj_activesock_get_user_data(asock); ++ ++ unsigned int i; ++ int ret; ++ ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Update local address */ ++ ssock->addr_len = sizeof(pj_sockaddr); ++ status = pj_sock_getsockname(ssock->sock, &ssock->local_addr, ++ &ssock->addr_len); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Create SSL context */ ++ status = tls_open(ssock); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Prepare read buffer */ ++ ssock->asock_rbuf = (void **)pj_pool_calloc(ssock->pool, ++ ssock->param.async_cnt, ++ sizeof(void *)); ++ if (!ssock->asock_rbuf) ++ return PJ_ENOMEM; ++ ++ for (i = 0; i < ssock->param.async_cnt; ++i) { ++ ssock->asock_rbuf[i] = (void *)pj_pool_alloc( ++ ssock->pool, ++ ssock->param.read_buffer_size + ++ sizeof(read_data_t *)); ++ if (!ssock->asock_rbuf[i]) ++ return PJ_ENOMEM; ++ } ++ ++ /* Start read */ ++ status = pj_activesock_start_read2(ssock->asock, ssock->pool, ++ (unsigned) ssock->param.read_buffer_size, ++ ssock->asock_rbuf, ++ PJ_IOQUEUE_ALWAYS_ASYNC); ++ if (status != PJ_SUCCESS) ++ goto on_return; ++ ++ /* Prepare write/send state */ ++ pj_assert(ssock->send_buf.max_len == 0); ++ ssock->send_buf.buf = (char *)pj_pool_alloc(ssock->pool, ++ ssock->param.send_buffer_size); ++ if (!ssock->send_buf.buf) ++ return PJ_ENOMEM; ++ ++ ssock->send_buf.max_len = ssock->param.send_buffer_size; ++ ssock->send_buf.start = ssock->send_buf.buf; ++ ssock->send_buf.len = 0; ++ ++ /* Set server name to connect */ ++ if (ssock->param.server_name.slen) { ++ /* Server name is null terminated already */ ++ ret = gnutls_server_name_set(ssock->session, GNUTLS_NAME_DNS, ++ ssock->param.server_name.ptr, ++ ssock->param.server_name.slen); ++ if (ret < 0) { ++ PJ_LOG(3, (ssock->pool->obj_name, ++ "gnutls_server_name_set() failed: %s", ++ gnutls_strerror(ret))); ++ } ++ } ++ ++ /* Start handshake */ ++ ssock->connection_state = TLS_STATE_HANDSHAKING; ++ ++ status = tls_try_handshake(ssock); ++ if (status != PJ_EPENDING) ++ goto on_return; ++ ++ return PJ_TRUE; ++ ++on_return: ++ return on_handshake_complete(ssock, status); ++} ++ ++static void tls_ciphers_fill(void) ++{ ++ if (!tls_available_ciphers) { ++ tls_init(); ++ tls_deinit(); ++ } ++} ++ ++/* ++ ******************************************************************* ++ * API ++ ******************************************************************* ++ */ ++ ++/* Load credentials from files. */ ++PJ_DEF(pj_status_t) pj_ssl_cert_load_from_files(pj_pool_t *pool, ++ const pj_str_t *CA_file, ++ const pj_str_t *cert_file, ++ const pj_str_t *privkey_file, ++ const pj_str_t *privkey_pass, ++ pj_ssl_cert_t **p_cert) ++{ ++ return pj_ssl_cert_load_from_files2(pool, CA_file, NULL, cert_file, ++ privkey_file, privkey_pass, p_cert); ++} ++ ++/* Load credentials from files. */ ++PJ_DECL(pj_status_t) pj_ssl_cert_load_from_files2( ++ pj_pool_t *pool, ++ const pj_str_t *CA_file, ++ const pj_str_t *CA_path, ++ const pj_str_t *cert_file, ++ const pj_str_t *privkey_file, ++ const pj_str_t *privkey_pass, ++ pj_ssl_cert_t **p_cert) ++{ ++ pj_ssl_cert_t *cert; ++ ++ PJ_ASSERT_RETURN(pool && (CA_file || CA_path) && cert_file && ++ privkey_file, ++ PJ_EINVAL); ++ ++ cert = PJ_POOL_ZALLOC_T(pool, pj_ssl_cert_t); ++ if (CA_file) { ++ pj_strdup_with_null(pool, &cert->CA_file, CA_file); ++ } ++ if (CA_path) { ++ pj_strdup_with_null(pool, &cert->CA_path, CA_path); ++ } ++ pj_strdup_with_null(pool, &cert->cert_file, cert_file); ++ pj_strdup_with_null(pool, &cert->privkey_file, privkey_file); ++ pj_strdup_with_null(pool, &cert->privkey_pass, privkey_pass); ++ ++ *p_cert = cert; ++ ++ return PJ_SUCCESS; ++} ++ ++/* Store credentials. */ ++PJ_DECL(pj_status_t) pj_ssl_sock_set_certificate(pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ const pj_ssl_cert_t *cert) ++{ ++ pj_ssl_cert_t *cert_; ++ ++ PJ_ASSERT_RETURN(ssock && pool && cert, PJ_EINVAL); ++ ++ cert_ = PJ_POOL_ZALLOC_T(pool, pj_ssl_cert_t); ++ pj_memcpy(cert_, cert, sizeof(cert)); ++ pj_strdup_with_null(pool, &cert_->CA_file, &cert->CA_file); ++ pj_strdup_with_null(pool, &cert_->CA_path, &cert->CA_path); ++ pj_strdup_with_null(pool, &cert_->cert_file, &cert->cert_file); ++ pj_strdup_with_null(pool, &cert_->privkey_file, &cert->privkey_file); ++ pj_strdup_with_null(pool, &cert_->privkey_pass, &cert->privkey_pass); ++ ++ ssock->cert = cert_; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Get available ciphers. */ ++PJ_DEF(pj_status_t) pj_ssl_cipher_get_availables(pj_ssl_cipher ciphers[], ++ unsigned *cipher_num) ++{ ++ unsigned int i; ++ ++ PJ_ASSERT_RETURN(ciphers && cipher_num, PJ_EINVAL); ++ ++ tls_ciphers_fill(); ++ ++ if (!tls_available_ciphers) { ++ *cipher_num = 0; ++ return PJ_ENOTFOUND; ++ } ++ ++ *cipher_num = PJ_MIN(*cipher_num, tls_available_ciphers); ++ ++ for (i = 0; i < *cipher_num; ++i) ++ ciphers[i] = tls_ciphers[i].id; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Get cipher name string. */ ++PJ_DEF(const char *)pj_ssl_cipher_name(pj_ssl_cipher cipher) ++{ ++ unsigned int i; ++ ++ tls_ciphers_fill(); ++ ++ for (i = 0; i < tls_available_ciphers; ++i) { ++ if (cipher == tls_ciphers[i].id) ++ return tls_ciphers[i].name; ++ } ++ ++ return NULL; ++} ++ ++ ++/* Get cipher identifier. */ ++PJ_DEF(pj_ssl_cipher) pj_ssl_cipher_id(const char *cipher_name) ++{ ++ unsigned int i; ++ ++ tls_ciphers_fill(); ++ ++ for (i = 0; i < tls_available_ciphers; ++i) { ++ if (!pj_ansi_stricmp(tls_ciphers[i].name, cipher_name)) ++ return tls_ciphers[i].id; ++ } ++ ++ return PJ_TLS_UNKNOWN_CIPHER; ++} ++ ++ ++/* Check if the specified cipher is supported by the TLS backend. */ ++PJ_DEF(pj_bool_t) pj_ssl_cipher_is_supported(pj_ssl_cipher cipher) ++{ ++ unsigned int i; ++ ++ tls_ciphers_fill(); ++ ++ for (i = 0; i < tls_available_ciphers; ++i) { ++ if (cipher == tls_ciphers[i].id) ++ return PJ_TRUE; ++ } ++ ++ return PJ_FALSE; ++} ++ ++/* Create SSL socket instance. */ ++PJ_DEF(pj_status_t) pj_ssl_sock_create(pj_pool_t *pool, ++ const pj_ssl_sock_param *param, ++ pj_ssl_sock_t **p_ssock) ++{ ++ pj_ssl_sock_t *ssock; ++ pj_status_t status; ++ ++ PJ_ASSERT_RETURN(pool && param && p_ssock, PJ_EINVAL); ++ PJ_ASSERT_RETURN(param->sock_type == pj_SOCK_STREAM(), PJ_ENOTSUP); ++ ++ pool = pj_pool_create(pool->factory, "tls%p", 512, 512, NULL); ++ ++ /* Create secure socket */ ++ ssock = PJ_POOL_ZALLOC_T(pool, pj_ssl_sock_t); ++ ssock->pool = pool; ++ ssock->sock = PJ_INVALID_SOCKET; ++ ssock->connection_state = TLS_STATE_NULL; ++ pj_list_init(&ssock->write_pending); ++ pj_list_init(&ssock->write_pending_empty); ++ pj_list_init(&ssock->send_pending); ++ pj_timer_entry_init(&ssock->timer, 0, ssock, &on_timer); ++ pj_ioqueue_op_key_init(&ssock->handshake_op_key, ++ sizeof(pj_ioqueue_op_key_t)); ++ ++ /* Create secure socket mutex */ ++ status = pj_lock_create_recursive_mutex(pool, pool->obj_name, ++ &ssock->circ_buf_output_mutex); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Create input circular buffer mutex */ ++ status = pj_lock_create_simple_mutex(pool, pool->obj_name, ++ &ssock->circ_buf_input_mutex); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Create output circular buffer mutex */ ++ status = pj_lock_create_simple_mutex(pool, pool->obj_name, ++ &ssock->circ_buf_output_mutex); ++ if (status != PJ_SUCCESS) ++ return status; ++ ++ /* Init secure socket param */ ++ ssock->param = *param; ++ ssock->param.read_buffer_size = ((ssock->param.read_buffer_size + 7) >> 3) << 3; ++ ++ if (param->ciphers_num > 0) { ++ unsigned int i; ++ ssock->param.ciphers = (pj_ssl_cipher *) ++ pj_pool_calloc(pool, param->ciphers_num, ++ sizeof(pj_ssl_cipher)); ++ if (!ssock->param.ciphers) ++ return PJ_ENOMEM; ++ ++ for (i = 0; i < param->ciphers_num; ++i) ++ ssock->param.ciphers[i] = param->ciphers[i]; ++ } ++ ++ /* Server name must be null-terminated */ ++ pj_strdup_with_null(pool, &ssock->param.server_name, ¶m->server_name); ++ ++ /* Finally */ ++ *p_ssock = ssock; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* ++ * Close the secure socket. This will unregister the socket from the ++ * ioqueue and ultimately close the socket. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_close(pj_ssl_sock_t *ssock) ++{ ++ pj_pool_t *pool; ++ ++ PJ_ASSERT_RETURN(ssock, PJ_EINVAL); ++ ++ if (!ssock->pool) ++ return PJ_SUCCESS; ++ ++ if (ssock->timer.id != TIMER_NONE) { ++ pj_timer_heap_cancel(ssock->param.timer_heap, &ssock->timer); ++ ssock->timer.id = TIMER_NONE; ++ } ++ ++ tls_sock_reset(ssock); ++ ++ pj_lock_destroy(ssock->circ_buf_output_mutex); ++ pj_lock_destroy(ssock->circ_buf_input_mutex); ++ ++ pool = ssock->pool; ++ ssock->pool = NULL; ++ if (pool) ++ pj_pool_release(pool); ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Associate arbitrary data with the secure socket. */ ++PJ_DEF(pj_status_t) pj_ssl_sock_set_user_data(pj_ssl_sock_t *ssock, ++ void *user_data) ++{ ++ PJ_ASSERT_RETURN(ssock, PJ_EINVAL); ++ ++ ssock->param.user_data = user_data; ++ return PJ_SUCCESS; ++} ++ ++ ++/* Retrieve the user data previously associated with this secure socket. */ ++PJ_DEF(void *)pj_ssl_sock_get_user_data(pj_ssl_sock_t *ssock) ++{ ++ PJ_ASSERT_RETURN(ssock, NULL); ++ ++ return ssock->param.user_data; ++} ++ ++ ++/* Retrieve the local address and port used by specified SSL socket. */ ++PJ_DEF(pj_status_t) pj_ssl_sock_get_info (pj_ssl_sock_t *ssock, ++ pj_ssl_sock_info *info) ++{ ++ pj_bzero(info, sizeof(*info)); ++ ++ /* Established flag */ ++ info->established = (ssock->connection_state == TLS_STATE_ESTABLISHED); ++ ++ /* Protocol */ ++ info->proto = ssock->param.proto; ++ ++ /* Local address */ ++ pj_sockaddr_cp(&info->local_addr, &ssock->local_addr); ++ ++ if (info->established) { ++ int i; ++ gnutls_cipher_algorithm_t lookup; ++ gnutls_cipher_algorithm_t cipher; ++ ++ /* Current cipher */ ++ cipher = gnutls_cipher_get(ssock->session); ++ for (i = 0; ; i++) { ++ unsigned char id[2]; ++ const char *suite = gnutls_cipher_suite_info(i, (unsigned char *)id, ++ NULL, &lookup, NULL, ++ NULL); ++ if (suite) { ++ if (lookup == cipher) { ++ info->cipher = (pj_uint32_t) ((id[0] << 8) | id[1]); ++ break; ++ } ++ } else ++ break; ++ } ++ ++ /* Remote address */ ++ pj_sockaddr_cp(&info->remote_addr, &ssock->rem_addr); ++ ++ /* Certificates info */ ++ info->local_cert_info = &ssock->local_cert_info; ++ info->remote_cert_info = &ssock->remote_cert_info; ++ ++ /* Verification status */ ++ info->verify_status = ssock->verify_status; ++ } ++ ++ /* Last known GnuTLS error code */ ++ info->last_native_err = ssock->last_err; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Starts read operation on this secure socket. */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_read(pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ unsigned buff_size, ++ pj_uint32_t flags) ++{ ++ void **readbuf; ++ unsigned int i; ++ ++ PJ_ASSERT_RETURN(ssock && pool && buff_size, PJ_EINVAL); ++ PJ_ASSERT_RETURN(ssock->connection_state == TLS_STATE_ESTABLISHED, ++ PJ_EINVALIDOP); ++ ++ readbuf = (void**) pj_pool_calloc(pool, ssock->param.async_cnt, ++ sizeof(void *)); ++ if (!readbuf) ++ return PJ_ENOMEM; ++ ++ for (i = 0; i < ssock->param.async_cnt; ++i) { ++ readbuf[i] = pj_pool_alloc(pool, buff_size); ++ if (!readbuf[i]) ++ return PJ_ENOMEM; ++ } ++ ++ return pj_ssl_sock_start_read2(ssock, pool, buff_size, readbuf, flags); ++} ++ ++ ++/* ++ * Same as #pj_ssl_sock_start_read(), except that the application ++ * supplies the buffers for the read operation so that the acive socket ++ * does not have to allocate the buffers. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_read2 (pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ unsigned buff_size, ++ void *readbuf[], ++ pj_uint32_t flags) ++{ ++ unsigned int i; ++ ++ PJ_ASSERT_RETURN(ssock && pool && buff_size && readbuf, PJ_EINVAL); ++ PJ_ASSERT_RETURN(ssock->connection_state == TLS_STATE_ESTABLISHED, ++ PJ_EINVALIDOP); ++ ++ /* Create SSL socket read buffer */ ++ ssock->ssock_rbuf = (read_data_t*)pj_pool_calloc(pool, ++ ssock->param.async_cnt, ++ sizeof(read_data_t)); ++ if (!ssock->ssock_rbuf) ++ return PJ_ENOMEM; ++ ++ /* Store SSL socket read buffer pointer in the activesock read buffer */ ++ for (i = 0; i < ssock->param.async_cnt; ++i) { ++ read_data_t **p_ssock_rbuf = ++ OFFSET_OF_READ_DATA_PTR(ssock, ssock->asock_rbuf[i]); ++ ++ ssock->ssock_rbuf[i].data = readbuf[i]; ++ ssock->ssock_rbuf[i].len = 0; ++ ++ *p_ssock_rbuf = &ssock->ssock_rbuf[i]; ++ } ++ ++ ssock->read_size = buff_size; ++ ssock->read_started = PJ_TRUE; ++ ssock->read_flags = flags; ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* ++ * Same as pj_ssl_sock_start_read(), except that this function is used ++ * only for datagram sockets, and it will trigger \a on_data_recvfrom() ++ * callback instead. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_recvfrom (pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ unsigned buff_size, ++ pj_uint32_t flags) ++{ ++ PJ_UNUSED_ARG(ssock); ++ PJ_UNUSED_ARG(pool); ++ PJ_UNUSED_ARG(buff_size); ++ PJ_UNUSED_ARG(flags); ++ ++ return PJ_ENOTSUP; ++} ++ ++ ++/* ++ * Same as #pj_ssl_sock_start_recvfrom() except that the recvfrom() ++ * operation takes the buffer from the argument rather than creating ++ * new ones. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_recvfrom2 (pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ unsigned buff_size, ++ void *readbuf[], ++ pj_uint32_t flags) ++{ ++ PJ_UNUSED_ARG(ssock); ++ PJ_UNUSED_ARG(pool); ++ PJ_UNUSED_ARG(buff_size); ++ PJ_UNUSED_ARG(readbuf); ++ PJ_UNUSED_ARG(flags); ++ ++ return PJ_ENOTSUP; ++} ++ ++ ++/* ++ * Write the plain data to GnuTLS, it will be encrypted by gnutls_record_send() ++ * and sent via tls_data_push. Note that re-negotitation may be on progress, so ++ * sending data should be delayed until re-negotiation is completed. ++ */ ++static pj_status_t tls_write(pj_ssl_sock_t *ssock, ++ pj_ioqueue_op_key_t *send_key, ++ const void *data, pj_ssize_t size, unsigned flags) ++{ ++ pj_status_t status; ++ int nwritten; ++ pj_ssize_t total_written = 0; ++ ++ /* Ask GnuTLS to encrypt our plaintext now. GnuTLS will use the push ++ * callback to actually write the encrypted bytes into our output circular ++ * buffer. GnuTLS may refuse to "send" everything at once, but since we are ++ * not really sending now, we will just call it again now until it succeeds ++ * (or fails in a fatal way). */ ++ while (total_written < size) { ++ /* Try encrypting using GnuTLS */ ++ nwritten = gnutls_record_send(ssock->session, ((read_data_t *)data) + total_written, ++ size); ++ ++ if (nwritten > 0) { ++ /* Good, some data was encrypted and written */ ++ total_written += nwritten; ++ } else { ++ /* Normally we would have to retry record_send but our internal ++ * state has not changed, so we have to ask for more data first. ++ * We will just try again later, although this should never happen. ++ */ ++ return tls_status_from_err(ssock, nwritten); ++ } ++ } ++ ++ /* All encrypted data is written to the output circular buffer; ++ * now send it on the socket (or notify problem). */ ++ if (total_written == size) ++ status = flush_circ_buf_output(ssock, send_key, size, flags); ++ else ++ status = PJ_ENOMEM; ++ ++ return status; ++} ++ ++ ++/* Flush delayed data sending in the write pending list. */ ++static pj_status_t flush_delayed_send(pj_ssl_sock_t *ssock) ++{ ++ /* Check for another ongoing flush */ ++ if (ssock->flushing_write_pend) { ++ return PJ_EBUSY; ++ } ++ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ ++ /* Again, check for another ongoing flush */ ++ if (ssock->flushing_write_pend) { ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ return PJ_EBUSY; ++ } ++ ++ /* Set ongoing flush flag */ ++ ssock->flushing_write_pend = PJ_TRUE; ++ ++ while (!pj_list_empty(&ssock->write_pending)) { ++ write_data_t *wp; ++ pj_status_t status; ++ ++ wp = ssock->write_pending.next; ++ ++ /* Ticket #1573: Don't hold mutex while calling socket send. */ ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ status = tls_write(ssock, &wp->key, wp->data.ptr, ++ wp->plain_data_len, wp->flags); ++ if (status != PJ_SUCCESS) { ++ /* Reset ongoing flush flag first. */ ++ ssock->flushing_write_pend = PJ_FALSE; ++ return status; ++ } ++ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ pj_list_erase(wp); ++ pj_list_push_back(&ssock->write_pending_empty, wp); ++ } ++ ++ /* Reset ongoing flush flag */ ++ ssock->flushing_write_pend = PJ_FALSE; ++ ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ return PJ_SUCCESS; ++} ++ ++ ++/* Sending is delayed, push back the sending data into pending list. */ ++static pj_status_t delay_send(pj_ssl_sock_t *ssock, ++ pj_ioqueue_op_key_t *send_key, ++ const void *data, pj_ssize_t size, ++ unsigned flags) ++{ ++ write_data_t *wp; ++ ++ pj_lock_acquire(ssock->circ_buf_output_mutex); ++ ++ /* Init write pending instance */ ++ if (!pj_list_empty(&ssock->write_pending_empty)) { ++ wp = ssock->write_pending_empty.next; ++ pj_list_erase(wp); ++ } else { ++ wp = PJ_POOL_ZALLOC_T(ssock->pool, write_data_t); ++ } ++ ++ wp->app_key = send_key; ++ wp->plain_data_len = size; ++ wp->data.ptr = data; ++ wp->flags = flags; ++ ++ pj_list_push_back(&ssock->write_pending, wp); ++ ++ pj_lock_release(ssock->circ_buf_output_mutex); ++ ++ /* Must return PJ_EPENDING */ ++ return PJ_EPENDING; ++} ++ ++ ++/** ++ * Send data using the socket. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_send(pj_ssl_sock_t *ssock, ++ pj_ioqueue_op_key_t *send_key, ++ const void *data, pj_ssize_t *size, ++ unsigned flags) ++{ ++ pj_status_t status; ++ ++ PJ_ASSERT_RETURN(ssock && data && size && (*size > 0), PJ_EINVAL); ++ PJ_ASSERT_RETURN(ssock->connection_state==TLS_STATE_ESTABLISHED, ++ PJ_EINVALIDOP); ++ ++ /* Flush delayed send first. Sending data might be delayed when ++ * re-negotiation is on-progress. */ ++ status = flush_delayed_send(ssock); ++ if (status == PJ_EBUSY) { ++ /* Re-negotiation or flushing is on progress, delay sending */ ++ status = delay_send(ssock, send_key, data, *size, flags); ++ goto on_return; ++ } else if (status != PJ_SUCCESS) { ++ goto on_return; ++ } ++ ++ /* Write data to SSL */ ++ status = tls_write(ssock, send_key, data, *size, flags); ++ if (status == PJ_EBUSY) { ++ /* Re-negotiation is on progress, delay sending */ ++ status = delay_send(ssock, send_key, data, *size, flags); ++ } ++ ++on_return: ++ return status; ++} ++ ++ ++/** ++ * Send datagram using the socket. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_sendto (pj_ssl_sock_t *ssock, ++ pj_ioqueue_op_key_t *send_key, ++ const void *data, pj_ssize_t *size, ++ unsigned flags, ++ const pj_sockaddr_t *addr, int addr_len) ++{ ++ PJ_UNUSED_ARG(ssock); ++ PJ_UNUSED_ARG(send_key); ++ PJ_UNUSED_ARG(data); ++ PJ_UNUSED_ARG(size); ++ PJ_UNUSED_ARG(flags); ++ PJ_UNUSED_ARG(addr); ++ PJ_UNUSED_ARG(addr_len); ++ ++ return PJ_ENOTSUP; ++} ++ ++/** ++ * Starts asynchronous socket accept() operations on this secure socket. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_accept (pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ const pj_sockaddr_t *localaddr, ++ int addr_len) ++{ ++ return pj_ssl_sock_start_accept2(ssock, pool, localaddr, addr_len, ++ &ssock->param); ++} ++ ++/** ++ * Starts asynchronous socket accept() operations on this secure socket. ++ */ ++PJ_DEF(pj_status_t) pj_ssl_sock_start_accept2 (pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ const pj_sockaddr_t *localaddr, ++ int addr_len, ++ const pj_ssl_sock_param *newsock_param) ++{ ++ pj_activesock_cb asock_cb; ++ pj_activesock_cfg asock_cfg; ++ pj_status_t status; ++ ++ PJ_ASSERT_RETURN(ssock && pool && localaddr && addr_len, PJ_EINVAL); ++ ++ /* Verify new socket parameters */ ++ if (newsock_param->grp_lock != ssock->param.grp_lock || ++ newsock_param->sock_af != ssock->param.sock_af || ++ newsock_param->sock_type != ssock->param.sock_type) ++ { ++ return PJ_EINVAL; ++ } ++ ++ /* Create socket */ ++ status = pj_sock_socket(ssock->param.sock_af, ssock->param.sock_type, 0, ++ &ssock->sock); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Apply SO_REUSEADDR */ ++ if (ssock->param.reuse_addr) { ++ int enabled = 1; ++ status = pj_sock_setsockopt(ssock->sock, pj_SOL_SOCKET(), ++ pj_SO_REUSEADDR(), ++ &enabled, sizeof(enabled)); ++ if (status != PJ_SUCCESS) { ++ PJ_PERROR(4,(ssock->pool->obj_name, status, ++ "Warning: error applying SO_REUSEADDR")); ++ } ++ } ++ ++ /* Apply QoS, if specified */ ++ status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, ++ &ssock->param.qos_params, 2, ++ ssock->pool->obj_name, NULL); ++ if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) ++ goto on_error; ++ ++ /* Bind socket */ ++ status = pj_sock_bind(ssock->sock, localaddr, addr_len); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Start listening to the address */ ++ status = pj_sock_listen(ssock->sock, PJ_SOMAXCONN); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Create active socket */ ++ pj_activesock_cfg_default(&asock_cfg); ++ asock_cfg.async_cnt = ssock->param.async_cnt; ++ asock_cfg.concurrency = ssock->param.concurrency; ++ asock_cfg.whole_data = PJ_TRUE; ++ ++ pj_bzero(&asock_cb, sizeof(asock_cb)); ++ asock_cb.on_accept_complete = asock_on_accept_complete; ++ ++ status = pj_activesock_create(pool, ++ ssock->sock, ++ ssock->param.sock_type, ++ &asock_cfg, ++ ssock->param.ioqueue, ++ &asock_cb, ++ ssock, ++ &ssock->asock); ++ ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Start accepting */ ++ pj_ssl_sock_param_copy(pool, &ssock->newsock_param, newsock_param); ++ status = pj_activesock_start_accept(ssock->asock, pool); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Update local address */ ++ ssock->addr_len = addr_len; ++ status = pj_sock_getsockname(ssock->sock, &ssock->local_addr, ++ &ssock->addr_len); ++ if (status != PJ_SUCCESS) ++ pj_sockaddr_cp(&ssock->local_addr, localaddr); ++ ++ ssock->is_server = PJ_TRUE; ++ ++ return PJ_SUCCESS; ++ ++on_error: ++ tls_sock_reset(ssock); ++ return status; ++} ++ ++ ++/** ++ * Starts asynchronous socket connect() operation. ++ */ ++PJ_DECL(pj_status_t) pj_ssl_sock_start_connect(pj_ssl_sock_t *ssock, ++ pj_pool_t *pool, ++ const pj_sockaddr_t *localaddr, ++ const pj_sockaddr_t *remaddr, ++ int addr_len) ++{ ++ pj_activesock_cb asock_cb; ++ pj_activesock_cfg asock_cfg; ++ pj_status_t status; ++ ++ PJ_ASSERT_RETURN(ssock && pool && localaddr && remaddr && addr_len, ++ PJ_EINVAL); ++ ++ /* Create socket */ ++ status = pj_sock_socket(ssock->param.sock_af, ssock->param.sock_type, 0, ++ &ssock->sock); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Apply QoS, if specified */ ++ status = pj_sock_apply_qos2(ssock->sock, ssock->param.qos_type, ++ &ssock->param.qos_params, 2, ++ ssock->pool->obj_name, NULL); ++ if (status != PJ_SUCCESS && !ssock->param.qos_ignore_error) ++ goto on_error; ++ ++ /* Bind socket */ ++ status = pj_sock_bind(ssock->sock, localaddr, addr_len); ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Create active socket */ ++ pj_activesock_cfg_default(&asock_cfg); ++ asock_cfg.async_cnt = ssock->param.async_cnt; ++ asock_cfg.concurrency = ssock->param.concurrency; ++ asock_cfg.whole_data = PJ_TRUE; ++ ++ pj_bzero(&asock_cb, sizeof(asock_cb)); ++ asock_cb.on_connect_complete = asock_on_connect_complete; ++ asock_cb.on_data_read = asock_on_data_read; ++ asock_cb.on_data_sent = asock_on_data_sent; ++ ++ status = pj_activesock_create(pool, ++ ssock->sock, ++ ssock->param.sock_type, ++ &asock_cfg, ++ ssock->param.ioqueue, ++ &asock_cb, ++ ssock, ++ &ssock->asock); ++ ++ if (status != PJ_SUCCESS) ++ goto on_error; ++ ++ /* Save remote address */ ++ pj_sockaddr_cp(&ssock->rem_addr, remaddr); ++ ++ /* Start timer */ ++ if (ssock->param.timer_heap && ++ (ssock->param.timeout.sec != 0 || ssock->param.timeout.msec != 0)) ++ { ++ pj_assert(ssock->timer.id == TIMER_NONE); ++ ssock->timer.id = TIMER_HANDSHAKE_TIMEOUT; ++ status = pj_timer_heap_schedule(ssock->param.timer_heap, ++ &ssock->timer, ++ &ssock->param.timeout); ++ if (status != PJ_SUCCESS) ++ ssock->timer.id = TIMER_NONE; ++ } ++ ++ status = pj_activesock_start_connect(ssock->asock, pool, remaddr, ++ addr_len); ++ ++ if (status == PJ_SUCCESS) ++ asock_on_connect_complete(ssock->asock, PJ_SUCCESS); ++ else if (status != PJ_EPENDING) ++ goto on_error; ++ ++ /* Update local address */ ++ ssock->addr_len = addr_len; ++ status = pj_sock_getsockname(ssock->sock, &ssock->local_addr, ++ &ssock->addr_len); ++ /* Note that we may not get an IP address here. This can ++ * happen for example on Windows, where getsockname() ++ * would return 0.0.0.0 if socket has just started the ++ * async connect. In this case, just leave the local ++ * address with 0.0.0.0 for now; it will be updated ++ * once the socket is established. ++ */ ++ ++ /* Update socket state */ ++ ssock->is_server = PJ_FALSE; ++ ++ return PJ_EPENDING; ++ ++on_error: ++ tls_sock_reset(ssock); ++ return status; ++} ++ ++ ++PJ_DEF(pj_status_t) pj_ssl_sock_renegotiate(pj_ssl_sock_t *ssock) ++{ ++ int status; ++ ++ /* Nothing established yet */ ++ PJ_ASSERT_RETURN(ssock->connection_state == TLS_STATE_ESTABLISHED, ++ PJ_EINVALIDOP); ++ ++ /* Cannot renegotiate; we're a client */ ++ /* FIXME: in fact maybe that's not true */ ++ PJ_ASSERT_RETURN(!ssock->is_server, PJ_EINVALIDOP); ++ ++ /* First call gnutls_rehandshake() to see if this is even possible */ ++ status = gnutls_rehandshake(ssock->session); ++ ++ if (status == GNUTLS_E_SUCCESS) { ++ /* Rehandshake is possible, so try a GnuTLS handshake now. The eventual ++ * gnutls_record_recv() calls could return a few specific values during ++ * this state: ++ * ++ * - GNUTLS_E_REHANDSHAKE: rehandshake message processing ++ * - GNUTLS_E_WARNING_ALERT_RECEIVED: client does not wish to ++ * renegotiate ++ */ ++ ssock->connection_state = TLS_STATE_HANDSHAKING; ++ status = tls_try_handshake(ssock); ++ ++ return status; ++ } else { ++ return tls_status_from_err(ssock, status); ++ } ++} ++ ++#endif /* PJ_HAS_SSL_SOCK */ +diff -ru a/pjlib/src/pj/ssl_sock_ossl.c b/pjlib/src/pj/ssl_sock_ossl.c +--- a/pjlib/src/pj/ssl_sock_ossl.c 2017-01-24 00:41:05.000000000 -0500 ++++ b/pjlib/src/pj/ssl_sock_ossl.c 2017-06-08 13:42:15.188809557 -0400 +@@ -32,8 +32,10 @@ + #include <pj/timer.h> + + +-/* Only build when PJ_HAS_SSL_SOCK is enabled */ +-#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK!=0 ++/* Only build when PJ_HAS_SSL_SOCK is enabled and when PJ_HAS_TLS_SOCK is ++ * disabled (meaning GnuTLS is off) */ ++#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0 && \ ++ defined(PJ_HAS_TLS_SOCK) && PJ_HAS_TLS_SOCK == 0 + + #define THIS_FILE "ssl_sock_ossl.c" + +diff -ru a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c +--- a/pjmedia/src/pjmedia/transport_srtp.c 2017-01-10 23:38:29.000000000 -0500 ++++ b/pjmedia/src/pjmedia/transport_srtp.c 2017-06-08 13:43:29.727001721 -0400 +@@ -30,7 +30,8 @@ + + #if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) + +-#if defined(PJ_HAS_SSL_SOCK) && (PJ_HAS_SSL_SOCK != 0) ++#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0 && \ ++ defined(PJ_HAS_TLS_SOCK) && PJ_HAS_TLS_SOCK == 0 + # include <openssl/rand.h> + + /* Suppress compile warning of OpenSSL deprecation (OpenSSL is deprecated +@@ -1147,7 +1148,8 @@ + key_ok = PJ_TRUE; + + +-#if defined(PJ_HAS_SSL_SOCK) && (PJ_HAS_SSL_SOCK != 0) ++#if defined(PJ_HAS_SSL_SOCK) && PJ_HAS_SSL_SOCK != 0 && \ ++ defined(PJ_HAS_TLS_SOCK) && PJ_HAS_TLS_SOCK == 0 + + /* Include OpenSSL libraries for MSVC */ + # ifdef _MSC_VER + diff --git a/talimatname/genel/p/pjproject-ring/ice_config.patch b/talimatname/genel/p/pjproject-ring/ice_config.patch new file mode 100644 index 000000000..0bc2e4329 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/ice_config.patch @@ -0,0 +1,27 @@ +--- a/pjnath/include/pjnath/config.h ++++ b/pjnath/include/pjnath/config.h +@@ -233,3 +233,3 @@ + #ifndef PJ_ICE_MAX_CAND +-# define PJ_ICE_MAX_CAND 16 ++# define PJ_ICE_MAX_CAND 256 + #endif +@@ -243,3 +243,3 @@ + #ifndef PJ_ICE_ST_MAX_CAND +-# define PJ_ICE_ST_MAX_CAND 8 ++# define PJ_ICE_ST_MAX_CAND 32 + #endif +@@ -254,3 +254,3 @@ + #ifndef PJ_ICE_MAX_STUN +-# define PJ_ICE_MAX_STUN 2 ++# define PJ_ICE_MAX_STUN 3 + #endif +@@ -274,3 +274,3 @@ + #ifndef PJ_ICE_COMP_BITS +-# define PJ_ICE_COMP_BITS 1 ++# define PJ_ICE_COMP_BITS 2 + #endif +@@ -325,3 +325,3 @@ + #ifndef PJ_ICE_MAX_CHECKS +-# define PJ_ICE_MAX_CHECKS 32 ++# define PJ_ICE_MAX_CHECKS 150 + #endif diff --git a/talimatname/genel/p/pjproject-ring/ipv6.patch b/talimatname/genel/p/pjproject-ring/ipv6.patch new file mode 100644 index 000000000..8b42fbbda --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/ipv6.patch @@ -0,0 +1,11 @@ +--- a/pjlib/include/pj/config.h ++++ b/pjlib/include/pj/config.h +@@ -549,7 +549,7 @@ + * Default: 0 (disabled, for now) + */ + #ifndef PJ_HAS_IPV6 +-# define PJ_HAS_IPV6 0 ++# define PJ_HAS_IPV6 1 + #endif + + /** diff --git a/talimatname/genel/p/pjproject-ring/multiple_listeners.patch b/talimatname/genel/p/pjproject-ring/multiple_listeners.patch new file mode 100644 index 000000000..89590107c --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/multiple_listeners.patch @@ -0,0 +1,66 @@ +diff --git a/pjproject/pjsip/src/pjsip/sip_transport.c b/pjproject_new/pjsip/src/pjsip/sip_transport.c +index 4b2cc1a..22e3603 100644 +--- a/pjsip/src/pjsip/sip_transport.c ++++ b/pjsip/src/pjsip/sip_transport.c +@@ -1248,22 +1248,22 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_register_tpfactory( pjsip_tpmgr *mgr, + + pj_lock_acquire(mgr->lock); + +- /* Check that no factory with the same type has been registered. */ ++ /* Check that no factory with the same type and bound address has been registered. */ + status = PJ_SUCCESS; + for (p=mgr->factory_list.next; p!=&mgr->factory_list; p=p->next) { +- if (p->type == tpf->type) { +- status = PJSIP_ETYPEEXISTS; +- break; +- } +- if (p == tpf) { +- status = PJ_EEXISTS; +- break; +- } ++ if (p->type == tpf->type && !pj_sockaddr_cmp(&tpf->local_addr, &p->local_addr)) { ++ status = PJSIP_ETYPEEXISTS; ++ break; ++ } ++ if (p == tpf) { ++ status = PJ_EEXISTS; ++ break; ++ } + } + + if (status != PJ_SUCCESS) { +- pj_lock_release(mgr->lock); +- return status; ++ pj_lock_release(mgr->lock); ++ return status; + } + + pj_list_insert_before(&mgr->factory_list, tpf); +@@ -2047,13 +2047,11 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr, + pj_memcpy(&key.rem_addr, remote, addr_len); + + transport = (pjsip_transport*) +- pj_hash_get(mgr->table, &key, key_len, NULL); +- ++ pj_hash_get(mgr->table, &key, key_len, NULL); ++ unsigned flag = pjsip_transport_get_flag_from_type(type); + if (transport == NULL) { +- unsigned flag = pjsip_transport_get_flag_from_type(type); + const pj_sockaddr *remote_addr = (const pj_sockaddr*)remote; + +- + /* Ignore address for loop transports. */ + if (type == PJSIP_TRANSPORT_LOOP || + type == PJSIP_TRANSPORT_LOOP_DGRAM) +@@ -2135,6 +2135,11 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr, + } + + } else { ++ /* Make sure we don't use another factory than the one given if secure flag is set */ ++ if (flag & PJSIP_TRANSPORT_SECURE) { ++ TRACE_((THIS_FILE, "Can't create new TLS transport with no provided suitable TLS listener.")); ++ return PJSIP_ETPNOTSUITABLE; ++ } + + /* Find factory with type matches the destination type */ + factory = mgr->factory_list.next; diff --git a/talimatname/genel/p/pjproject-ring/notestsapps.patch b/talimatname/genel/p/pjproject-ring/notestsapps.patch new file mode 100644 index 000000000..662f1dbf1 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/notestsapps.patch @@ -0,0 +1,97 @@ +diff --git a/Makefile b/Makefile +index 33a4e6b..a486eb7 100644 +--- a/Makefile ++++ b/Makefile +@@ -4,7 +4,7 @@ include build/host-$(HOST_NAME).mak + include version.mak + + LIB_DIRS = pjlib/build pjlib-util/build pjnath/build third_party/build pjmedia/build pjsip/build +-DIRS = $(LIB_DIRS) pjsip-apps/build $(EXTRA_DIRS) ++DIRS = $(LIB_DIRS) $(EXTRA_DIRS) + + ifdef MINSIZE + MAKE_FLAGS := MINSIZE=1 +diff --git a/pjlib-util/build/Makefile b/pjlib-util/build/Makefile +index cb601cb..862a78a 100644 +--- a/pjlib-util/build/Makefile ++++ b/pjlib-util/build/Makefile +@@ -54,7 +54,6 @@ export UTIL_TEST_OBJS += xml.o encryption.o stun.o resolver_test.o test.o \ + export UTIL_TEST_CFLAGS += $(_CFLAGS) + export UTIL_TEST_CXXFLAGS += $(_CXXFLAGS) + export UTIL_TEST_LDFLAGS += $(PJLIB_UTIL_LDLIB) $(PJLIB_LDLIB) $(_LDFLAGS) +-export UTIL_TEST_EXE:=pjlib-util-test-$(TARGET_NAME)$(HOST_EXE) + + + export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT +diff --git a/pjlib/build/Makefile b/pjlib/build/Makefile +index 1e64950..a75fa65 100644 +--- a/pjlib/build/Makefile ++++ b/pjlib/build/Makefile +@@ -56,7 +56,6 @@ export TEST_OBJS += activesock.o atomic.o echo_clt.o errno.o exception.o \ + export TEST_CFLAGS += $(_CFLAGS) + export TEST_CXXFLAGS += $(_CXXFLAGS) + export TEST_LDFLAGS += $(PJLIB_LDLIB) $(_LDFLAGS) +-export TEST_EXE := pjlib-test-$(TARGET_NAME)$(HOST_EXE) + + + export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT +diff --git a/pjmedia/build/Makefile b/pjmedia/build/Makefile +index 8012cb7..2ca283a 100644 +--- a/pjmedia/build/Makefile ++++ b/pjmedia/build/Makefile +@@ -165,7 +165,6 @@ export PJMEDIA_TEST_LDFLAGS += $(PJMEDIA_CODEC_LDLIB) \ + $(PJLIB_UTIL_LDLIB) \ + $(PJNATH_LDLIB) \ + $(_LDFLAGS) +-export PJMEDIA_TEST_EXE:=pjmedia-test-$(TARGET_NAME)$(HOST_EXE) + + + export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT +diff --git a/pjnath/build/Makefile b/pjnath/build/Makefile +index 1bc08b5..109f79b 100644 +--- a/pjnath/build/Makefile ++++ b/pjnath/build/Makefile +@@ -54,7 +54,6 @@ export PJNATH_TEST_OBJS += ice_test.o stun.o sess_auth.o server.o concur_test.o + export PJNATH_TEST_CFLAGS += $(_CFLAGS) + export PJNATH_TEST_CXXFLAGS += $(_CXXFLAGS) + export PJNATH_TEST_LDFLAGS += $(PJNATH_LDLIB) $(PJLIB_UTIL_LDLIB) $(PJLIB_LDLIB) $(_LDFLAGS) +-export PJNATH_TEST_EXE:=pjnath-test-$(TARGET_NAME)$(HOST_EXE) + + + ############################################################################### +@@ -65,7 +64,6 @@ export PJTURN_CLIENT_OBJS += client_main.o + export PJTURN_CLIENT_CFLAGS += $(_CFLAGS) + export PJTURN_CLIENT_CXXFLAGS += $(_CXXFLAGS) + export PJTURN_CLIENT_LDFLAGS += $(PJNATH_LDLIB) $(PJLIB_UTIL_LDLIB) $(PJLIB_LDLIB) $(_LDFLAGS) +-export PJTURN_CLIENT_EXE:=pjturn-client-$(TARGET_NAME)$(HOST_EXE) + + ############################################################################### + # Defines for building TURN server application +@@ -76,7 +74,6 @@ export PJTURN_SRV_OBJS += allocation.o auth.o listener_udp.o \ + export PJTURN_SRV_CFLAGS += $(_CFLAGS) + export PJTURN_SRV_CXXFLAGS += $(_CXXFLAGS) + export PJTURN_SRV_LDFLAGS += $(PJNATH_LDLIB) $(PJLIB_UTIL_LDLIB) $(PJLIB_LDLIB) $(_LDFLAGS) +-export PJTURN_SRV_EXE:=pjturn-srv-$(TARGET_NAME)$(HOST_EXE) + + + +diff --git a/pjsip/build/Makefile b/pjsip/build/Makefile +index d2a5c2a..7e2ec60 100644 +--- a/pjsip/build/Makefile ++++ b/pjsip/build/Makefile +@@ -165,7 +165,6 @@ export PJSUA2_TEST_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \ + export PJSUA2_TEST_CFLAGS += $(_CFLAGS) $(PJ_VIDEO_CFLAGS) + export PJSUA2_TEST_CXXFLAGS = $(PJSUA2_LIB_CFLAGS) + export PJSUA2_TEST_LDFLAGS += $(PJ_LDXXFLAGS) $(PJ_LDXXLIBS) $(LDFLAGS) +-export PJSUA2_TEST_EXE := pjsua2-test-$(TARGET_NAME)$(HOST_EXE) + + export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT + +@@ -195,7 +194,6 @@ export TEST_LDFLAGS += $(PJSIP_LDLIB) \ + $(PJLIB_UTIL_LDLIB) \ + $(PJNATH_LDLIB) \ + $(_LDFLAGS) +-export TEST_EXE := pjsip-test-$(TARGET_NAME)$(HOST_EXE) + + + export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT diff --git a/talimatname/genel/p/pjproject-ring/pj_ice_sess.patch b/talimatname/genel/p/pjproject-ring/pj_ice_sess.patch new file mode 100644 index 000000000..bd040ffe3 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/pj_ice_sess.patch @@ -0,0 +1,22 @@ +--- a/pjnath/include/pjnath/ice_strans.h ++++ b/pjnath/include/pjnath/ice_strans.h +@@ -845,6 +845,8 @@ PJ_DECL(pj_status_t) pj_ice_strans_sendt + int dst_addr_len); + + ++PJ_DECL(pj_ice_sess *) pj_ice_strans_get_ice_sess(pj_ice_strans *ice_st); ++ + /** + * @} + */ +--- a/pjnath/src/pjnath/ice_strans.c ++++ b/pjnath/src/pjnath/ice_strans.c +@@ -1243,6 +1243,11 @@ PJ_DEF(pj_status_t) pj_ice_strans_sendto + return PJ_EINVALIDOP; + } + ++PJ_DECL(pj_ice_sess *) pj_ice_strans_get_ice_sess( pj_ice_strans *ice_st ) ++{ ++ return ice_st->ice; ++} ++ diff --git a/talimatname/genel/p/pjproject-ring/talimat b/talimatname/genel/p/pjproject-ring/talimat new file mode 100644 index 000000000..c84129c97 --- /dev/null +++ b/talimatname/genel/p/pjproject-ring/talimat @@ -0,0 +1,57 @@ +# Tanım: Open source SIP stack and media stack, built with patches from SavoirFaire Linux (mostly GnuTLS support) +# URL: http://www.pjsip.org/ +# Paketçi: milisarge +# Gerekler: gnutls portaudio speex alsa-lib libsamplerate ffmpeg libsrtp opus gsm libsrtp + +isim=pjproject-ring +_isim=pjproject +surum=2.6 +devir=1 +kaynak=(http://www.pjsip.org/release/2.6/$_name-$surum.tar.bz2 + endianness.patch + gnutls.patch + notestsapps.patch + fix_base64.patch + ipv6.patch + ice_config.patch + multiple_listeners.patch + pj_ice_sess.patch + fix_turn_fallback.patch + fix_ioqueue_ipv6_sendto.patch + add_dtls_transport.patch) + +derle() { + cd "${SRC}/${_name}-${surum}" + + for patch in endianness.patch gnutls.patch notestsapps.patch fix_base64.patch \ + ipv6.patch ice_config.patch multiple_listeners.patch \ + pj_ice_sess.patch fix_turn_fallback.patch \ + fix_ioqueue_ipv6_sendto.patch add_dtls_transport.patch + + do + patch -p1 < ../"$patch" + done + cd "${SRC}/${_name}-${surum}" + export CXXFLAGS="${CXXFLAGS} -DNDEBUG -fPIC -DPJSIP_MAX_PKT_LEN=8000" + export CFLAGS="${CXXFLAGS}" + + ./configure \ + --prefix=/usr \ + --enable-shared \ + --enable-ssl=gnutls \ + --with-external-speex \ + --with-external-srtp \ + --with-external-pa \ + --with-external-gsm \ + --enable-ext-sound \ + --disable-oss \ + --disable-opencore-amr \ + --disable-v4l2 \ + --disable-video \ + --disable-sound + + make dep + make + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/p/plank/talimat b/talimatname/genel/p/plank/talimat new file mode 100644 index 000000000..0ade9f9c2 --- /dev/null +++ b/talimatname/genel/p/plank/talimat @@ -0,0 +1,20 @@ +# Tanım: Basit ve sade dock uygulaması +# URL: https://launchpad.net/plank +# Paketçi: Cihan Alkan +# Gerekler: intltool cairo gnome-common vala gtk3 glibc atk libwnck3 libgee bamf + +isim=plank +surum=0.11.4 +devir=1 +kaynak=(https://launchpad.net/plank/1.0/$surum/+download/plank-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure \ + --prefix='/usr' \ + --sysconfdir='/etc' \ + --disable-apport + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-bluedevil/talimat b/talimatname/genel/p/plasma-bluedevil/talimat new file mode 100644 index 000000000..1702b5437 --- /dev/null +++ b/talimatname/genel/p/plasma-bluedevil/talimat @@ -0,0 +1,23 @@ +# Tanım: Bluetooth teknolojisini KDE çalışma alanı ve uygulamaları içine entegre edin +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-bluez-qt kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kded kf5-kdbusaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-knotifications kf5-kwidgetsaddons kf5-kwindowsystem kf5-plasma-framework shared-mime-info plasma-kde-cli-tools + +isim=plasma-bluedevil +surum=5.8.1 +devir=1 +_isim=bluedevil + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-breeze-gtk/talimat b/talimatname/genel/p/plasma-breeze-gtk/talimat new file mode 100644 index 000000000..f99cc37d7 --- /dev/null +++ b/talimatname/genel/p/plasma-breeze-gtk/talimat @@ -0,0 +1,23 @@ +# Tanım: GTK 2 ve 3 için Breeze (esinti) widget teması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-frameworkintegration kf5-kcmutils kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kguiaddons kf5-ki18n kf5-kwidgetsaddons kf5-kwindowsystem plasma-kdecoration libxcb plasma-kde-cli-tools + + +isim=plasma-breeze-gtk +surum=5.8.1 +devir=1 +_isim=breeze-gtk + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-breeze/talimat b/talimatname/genel/p/plasma-breeze/talimat new file mode 100644 index 000000000..bfb958dcb --- /dev/null +++ b/talimatname/genel/p/plasma-breeze/talimat @@ -0,0 +1,23 @@ +# Tanım: Breeze, Plazma Masaüstü için görsel stil için resim, stil ve kıymetler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-plasma-framework kf5-frameworkintegration kf5-kcmutils kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kguiaddons kf5-ki18n kf5-kwidgetsaddons kf5-kwindowsystem plasma-kdecoration libxcb plasma-kde-cli-tools kf5-kwayland + +isim=plasma-breeze +surum=5.8.1 +devir=1 +_isim=breeze + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-desktop/plasma-desktop.kur-kos b/talimatname/genel/p/plasma-desktop/plasma-desktop.kur-kos new file mode 100644 index 000000000..c9dd4942d --- /dev/null +++ b/talimatname/genel/p/plasma-desktop/plasma-desktop.kur-kos @@ -0,0 +1,2 @@ +xdg-icon-resource forceupdate --theme breeze &> /dev/null +update-desktop-database -q diff --git a/talimatname/genel/p/plasma-desktop/talimat b/talimatname/genel/p/plasma-desktop/talimat new file mode 100644 index 000000000..f309c255c --- /dev/null +++ b/talimatname/genel/p/plasma-desktop/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE Plasma Masaüstü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg plasma-kwin plasma-workspace kf5-attica kf5-baloo kf5-karchive kf5-kauth kf5-kbookmarks kf5-kcmutils kf5-kcodecs kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-kded kf5-kdelibs4support kf5-kemoticons kf5-kglobalaccel kf5-kguiaddons kf5-ki18n kf5-kiconthemes kf5-kio kio-extras kf5-kitemviews kf5-kjobwidgets kf5-knewstuff kf5-knotifications kf5-knotifyconfig kf5-kparts kf5-kpeople kf5-krunner kf5-kservice kf5-kwallet kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-solid kf5-sonnet phonon-qt5 libxcb xcb-util-image libcanberra pulseaudio plasma-breeze plasma-kde-cli-tools plasma-oxygen desktop-file-utils xdg-utils kf5-kactivities-stats kf5-kpackage + +isim=plasma-desktop +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-integration/talimat b/talimatname/genel/p/plasma-integration/talimat new file mode 100644 index 000000000..3162ef170 --- /dev/null +++ b/talimatname/genel/p/plasma-integration/talimat @@ -0,0 +1,22 @@ +# Tanım: Plazma çalışma alanları için Qt Platform Tema entegrasyonu eklentileri. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-kconfigwidgets kf5-ki18n kf5-kiconthemes kf5-kio kf5-knotifications kf5-kwidgetsaddons kf5-kwayland plasma-breeze + +isim=plasma-integration +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kactivitymanagerd/talimat b/talimatname/genel/p/plasma-kactivitymanagerd/talimat new file mode 100644 index 000000000..22a06bfc0 --- /dev/null +++ b/talimatname/genel/p/plasma-kactivitymanagerd/talimat @@ -0,0 +1,24 @@ +# Tanım: KDE Etkinlik kavramı için çekirdek bileşenler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules kf5-kconfig kf5-kdbusaddons kf5-ki18n kf5-kcoreaddons kf5-kwindowsystem kf5-kglobalaccel kf5-kxmlgui kf5-kio + +isim=plasma-kactivitymanagerd +surum=5.8.1 +devir=1 +_isim=kactivitymanagerd + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF .. + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kde-cli-tools/talimat b/talimatname/genel/p/plasma-kde-cli-tools/talimat new file mode 100644 index 000000000..137b0603c --- /dev/null +++ b/talimatname/genel/p/plasma-kde-cli-tools/talimat @@ -0,0 +1,24 @@ +# Tanım: Sistemle daha iyi etkileşim kurmak için KDE Framework'leri temel alan araçlar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdelibs4support kf5-kdesu kf5-ki18n kf5-kiconthemes kf5-kio kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem + +isim=plasma-kde-cli-tools +surum=5.8.1 +devir=1 +_isim=kde-cli-tools + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +ln -sfv ../lib/libexec/kf5/kdesu $PKG/usr/bin/kdesu5 +} diff --git a/talimatname/genel/p/plasma-kde-gtk-config/talimat b/talimatname/genel/p/plasma-kde-gtk-config/talimat new file mode 100644 index 000000000..d4902fdca --- /dev/null +++ b/talimatname/genel/p/plasma-kde-gtk-config/talimat @@ -0,0 +1,26 @@ +# Tanım: KDE 5 için GTK2 ve GTK3 Yapılandırıcı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive kf5-kcmutils kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kiconthemes kf5-kio kf5-knewstuff kf5-kwidgetsaddons plasma-kde-cli-tools + +isim=plasma-kde-gtk-config +surum=5.8.1 +devir=1 +_isim=kde-gtk-config + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DLIBEXEC_INSTALL_DIR=lib \ + -DSYSCONF_INSTALL_DIR=/etc \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/plasma-kdecoration/talimat b/talimatname/genel/p/plasma-kdecoration/talimat new file mode 100644 index 000000000..4333391b7 --- /dev/null +++ b/talimatname/genel/p/plasma-kdecoration/talimat @@ -0,0 +1,23 @@ +# Tanım: Plugin tabanlı kitaplık pencere süslemeleri oluşturmak için +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake kf5-extra-cmake-modules qt5 + +isim=plasma-kdecoration +surum=5.8.1 +devir=1 +_isim=kdecoration + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/plasma-kdeplasma-addons/plasma-kdeplasma-addons.kur-kos b/talimatname/genel/p/plasma-kdeplasma-addons/plasma-kdeplasma-addons.kur-kos new file mode 100644 index 000000000..297ac603c --- /dev/null +++ b/talimatname/genel/p/plasma-kdeplasma-addons/plasma-kdeplasma-addons.kur-kos @@ -0,0 +1,2 @@ +[[ -x xdg-icon-resource ]] && xdg-icon-resource forceupdate --theme hicolor &> /dev/null || true + diff --git a/talimatname/genel/p/plasma-kdeplasma-addons/talimat b/talimatname/genel/p/plasma-kdeplasma-addons/talimat new file mode 100644 index 000000000..b788c5a08 --- /dev/null +++ b/talimatname/genel/p/plasma-kdeplasma-addons/talimat @@ -0,0 +1,24 @@ +# Tanım: Plazma deneyiminizi geliştirmek için her türlü eklenti +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-karchive kf5-kconfig kf5-kconfigwidgets kf5-kcmutils kf5-kcompletion kf5-kcoreaddons kf5-kdelibs4support kf5-ki18n kf5-kio kf5-knewstuff kf5-knotifications kf5-kpackage kf5-kross kf5-krunner kf5-kservice kf5-kunitconversion kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-plasma-framework kf5-sonnet libxcb xcb-util-keysyms xdg-utils plasma-kactivitymanagerd plasma-workspace + +isim=plasma-kdeplasma-addons +surum=5.8.1 +devir=1 +_isim=kdeplasma-addons + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kgamma5/talimat b/talimatname/genel/p/plasma-kgamma5/talimat new file mode 100644 index 000000000..9db5b2230 --- /dev/null +++ b/talimatname/genel/p/plasma-kgamma5/talimat @@ -0,0 +1,23 @@ +# Tanım: Monitörünüzün gama ayarlarını yapma +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdelibs4support kf5-ki18n + +isim=plasma-kgamma5 +surum=5.8.1 +devir=1 +_isim=kgamma5 + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-khotkeys/talimat b/talimatname/genel/p/plasma-khotkeys/talimat new file mode 100644 index 000000000..53895d0b2 --- /dev/null +++ b/talimatname/genel/p/plasma-khotkeys/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE Plazma çalışma alanı kısayol tuşu modülü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-kglobalaccel kf5-ki18n kf5-kio kf5-kservice kf5-ktextwidgets kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui plasma-workspace + +isim=plasma-khotkeys +surum=5.8.1 +devir=1 +_isim=khotkeys + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kinfocenter/talimat b/talimatname/genel/p/plasma-kinfocenter/talimat new file mode 100644 index 000000000..97eb0b04d --- /dev/null +++ b/talimatname/genel/p/plasma-kinfocenter/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir bilgisayar sistemi hakkında bilgi sağlayan bir yardımcı program +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-kdelibs4support kf5-ki18n kf5-kiconthemes kf5-kio kf5-kpackage kf5-kservice kf5-kwidgetsaddons kf5-kxmlgui kf5-solid plasma-kwayland-integration kf5-kwayland + +isim=plasma-kinfocenter +surum=5.8.1 +devir=1 +_isim=kinfocenter + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kmenuedit/plasma-kmenuedit.kur-kos b/talimatname/genel/p/plasma-kmenuedit/plasma-kmenuedit.kur-kos new file mode 100644 index 000000000..b74f6d479 --- /dev/null +++ b/talimatname/genel/p/plasma-kmenuedit/plasma-kmenuedit.kur-kos @@ -0,0 +1 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null diff --git a/talimatname/genel/p/plasma-kmenuedit/talimat b/talimatname/genel/p/plasma-kmenuedit/talimat new file mode 100644 index 000000000..8a70b76fa --- /dev/null +++ b/talimatname/genel/p/plasma-kmenuedit/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE menü düzenleyici +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-ki18n kf5-kiconthemes kf5-kio kf5-kservice kf5-kwidgetsaddons kf5-kxmlgui kf5-sonnet plasma-khotkeys xdg-utils + +isim=plasma-kmenuedit +surum=5.8.1 +devir=1 +_isim=kmenuedit + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kscreen/plasma-kscreen.kur-kos b/talimatname/genel/p/plasma-kscreen/plasma-kscreen.kur-kos new file mode 100644 index 000000000..297ac603c --- /dev/null +++ b/talimatname/genel/p/plasma-kscreen/plasma-kscreen.kur-kos @@ -0,0 +1,2 @@ +[[ -x xdg-icon-resource ]] && xdg-icon-resource forceupdate --theme hicolor &> /dev/null || true + diff --git a/talimatname/genel/p/plasma-kscreen/talimat b/talimatname/genel/p/plasma-kscreen/talimat new file mode 100644 index 000000000..7ce6c5767 --- /dev/null +++ b/talimatname/genel/p/plasma-kscreen/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE'nin ekran yönetimi yazılımı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: plasma-libkscreen kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kglobalaccel kf5-ki18n kf5-kwidgetsaddons kf5-kxmlgui plasma-kde-cli-tools xdg-utils + +isim=plasma-kscreen +surum=5.8.1 +devir=1 +_isim=kscreen + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kscreenlocker/talimat b/talimatname/genel/p/plasma-kscreenlocker/talimat new file mode 100644 index 000000000..aa95f8c2a --- /dev/null +++ b/talimatname/genel/p/plasma-kscreenlocker/talimat @@ -0,0 +1,25 @@ +# Tanım: Güvenli kilit ekran mimarisi için kütüphane ve bileşenler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kconfig kf5-ki18n kf5-plasma-framework kf5-kcmutils kf5-kdeclarative kf5-kidletime kf5-kdelibs4support kf5-kcrash kf5-kglobalaccel kf5-kwayland + +isim=plasma-kscreenlocker +surum=5.8.1 +devir=1 +_isim=kscreenlocker + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -DLIBEXEC_INSTALL_DIR=/usr/lib \ + -DSYSCONF_INSTALL_DIR=/etc \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-ksshaskpass/talimat b/talimatname/genel/p/plasma-ksshaskpass/talimat new file mode 100644 index 000000000..33909b508 --- /dev/null +++ b/talimatname/genel/p/plasma-ksshaskpass/talimat @@ -0,0 +1,22 @@ +# Tanım: Kshaskpass, OpenSSH ile kullanılmak üzere KDE tabanlı bir parola deyimi iletişim kutusu. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcoreaddons kf5-ki18n kf5-kwallet kf5-kwidgetsaddons + +isim=plasma-ksshaskpass +surum=5.8.1 +devir=1 +_isim=ksshaskpass + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-ksysguard/plasma-ksysguard.kur-kos b/talimatname/genel/p/plasma-ksysguard/plasma-ksysguard.kur-kos new file mode 100644 index 000000000..bb8f8fdb7 --- /dev/null +++ b/talimatname/genel/p/plasma-ksysguard/plasma-ksysguard.kur-kos @@ -0,0 +1,2 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null +update-desktop-database -q diff --git a/talimatname/genel/p/plasma-ksysguard/talimat b/talimatname/genel/p/plasma-ksysguard/talimat new file mode 100644 index 000000000..624dcba29 --- /dev/null +++ b/talimatname/genel/p/plasma-ksysguard/talimat @@ -0,0 +1,23 @@ +# Tanım: Sisteminizde çalışan süreçleri takip edin ve kontrol edin +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: plasma-libksysguard kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-knewstuff kf5-knotifications kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui lm-sensors desktop-file-utils xdg-utils + +isim=plasma-ksysguard +surum=5.8.1 +devir=1 +_isim=ksysguard + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kwallet-pam/talimat b/talimatname/genel/p/plasma-kwallet-pam/talimat new file mode 100644 index 000000000..7b6621c7b --- /dev/null +++ b/talimatname/genel/p/plasma-kwallet-pam/talimat @@ -0,0 +1,23 @@ +# Tanım: KWallet PAM entegrasyonu +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kwallet pam + +isim=plasma-kwallet-pam +surum=5.8.1 +devir=1 +_isim=kwallet-pam + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DSYSCONF_INSTALL_DIR=/etc \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kwayland-integration/talimat b/talimatname/genel/p/plasma-kwayland-integration/talimat new file mode 100644 index 000000000..281a46862 --- /dev/null +++ b/talimatname/genel/p/plasma-kwayland-integration/talimat @@ -0,0 +1,24 @@ +# Tanım: Wayland pencere sistemine çeşitli KDE çerçeveleri için entegrasyon eklentileri sağlar. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake kf5-extra-cmake-modules wayland kf5-kwayland kf5-kwindowsystem kf5-kidletime + +isim=plasma-kwayland-integration +surum=5.8.1 +devir=1 +_isim=kwayland-integration + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib \ + -DSYSCONF_INSTALL_DIR=/etc \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kwin/plasma-kwin.kur-kos b/talimatname/genel/p/plasma-kwin/plasma-kwin.kur-kos new file mode 100644 index 000000000..b74f6d479 --- /dev/null +++ b/talimatname/genel/p/plasma-kwin/plasma-kwin.kur-kos @@ -0,0 +1 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null diff --git a/talimatname/genel/p/plasma-kwin/talimat b/talimatname/genel/p/plasma-kwin/talimat new file mode 100644 index 000000000..c16332147 --- /dev/null +++ b/talimatname/genel/p/plasma-kwin/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE pencere yöneticisi +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kauth kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kcrash kf5-kdeclarative kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-kinit kf5-kio kf5-knewstuff kf5-knotifications kf5-kpackage kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-plasma-framework plasma-kdecoration libepoxy libxcb xcb-util-cursor xcb-util-image xcb-util-keysyms kf5-kwayland libinput eudev plasma-kde-cli-tools xorg-mesa xdg-utils kf5-kidletime plasma-kscreenlocker plasma-breeze + +isim=plasma-kwin +surum=5.8.1 +devir=1 +_isim=kwin + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-kwrited/talimat b/talimatname/genel/p/plasma-kwrited/talimat new file mode 100644 index 000000000..cf9219595 --- /dev/null +++ b/talimatname/genel/p/plasma-kwrited/talimat @@ -0,0 +1,23 @@ +# Tanım: Duvar ve yazı mesajları dinleyen KDE servisi. Konsol çıktısını (örn. Yayın iletileri) yakalar ve bir X penceresinde basar. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcoreaddons kf5-kdbusaddons kf5-ki18n kf5-knotifications kf5-kpty + +isim=plasma-kwrited +surum=5.8.1 +devir=1 +_isim=kwrited + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-libkscreen/talimat b/talimatname/genel/p/plasma-libkscreen/talimat new file mode 100644 index 000000000..07ded9632 --- /dev/null +++ b/talimatname/genel/p/plasma-libkscreen/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE ekran yönetimi yazılımı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake kf5-extra-cmake-modules qt5 kf5-kwayland + +isim=plasma-libkscreen +surum=5.8.1 +devir=1 +_isim=libkscreen + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-libksysguard/libksysguard-5.5.5-glibc2.23-1.patch b/talimatname/genel/p/plasma-libksysguard/libksysguard-5.5.5-glibc2.23-1.patch new file mode 100644 index 000000000..44f2c8b0a --- /dev/null +++ b/talimatname/genel/p/plasma-libksysguard/libksysguard-5.5.5-glibc2.23-1.patch @@ -0,0 +1,12 @@ +diff -Naur libksysguard-5.5.5-orig/signalplotter/ksignalplotter.cpp libksysguard-5.5.5/signalplotter/ksignalplotter.cpp +--- libksysguard-5.5.5-orig/signalplotter/ksignalplotter.cpp 2016-03-01 14:37:26.000000000 +0100 ++++ libksysguard-5.5.5/signalplotter/ksignalplotter.cpp 2016-03-17 20:26:35.069995580 +0100 +@@ -18,7 +18,7 @@ + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ +- ++using namespace std; + #ifdef GRAPHICS_SIGNAL_PLOTTER + #define KSignalPlotter KGraphicsSignalPlotter + #define KSignalPlotterPrivate KGraphicsSignalPlotterPrivate diff --git a/talimatname/genel/p/plasma-libksysguard/talimat b/talimatname/genel/p/plasma-libksysguard/talimat new file mode 100644 index 000000000..28f97e404 --- /dev/null +++ b/talimatname/genel/p/plasma-libksysguard/talimat @@ -0,0 +1,25 @@ +# Tanım: Görev yönetimi ve sistem izleme kitaplığı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kauth kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kwidgetsaddons kf5-kwindowsystem kf5-kiconthemes kf5-plasma-framework + +isim=plasma-libksysguard +surum=5.8.1 +devir=1 +_isim=libksysguard + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz + libksysguard-5.5.5-glibc2.23-1.patch ) + +derle() { +cd ${_name}-$surum +patch -Np1 -i ../libksysguard-5.5.5-glibc2.23-1.patch +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-milou/talimat b/talimatname/genel/p/plasma-milou/talimat new file mode 100644 index 000000000..a97169ff0 --- /dev/null +++ b/talimatname/genel/p/plasma-milou/talimat @@ -0,0 +1,23 @@ +# Tanım: Baloo'nun üzerine kurulmuş özel bir arama uygulaması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kconfig kf5-kcoreaddons kf5-kdeclarative kf5-ki18n kf5-krunner kf5-kservice kf5-plasma-framework + +isim=plasma-milou +surum=5.8.1 +devir=1 +_isim=milou + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-nm/talimat b/talimatname/genel/p/plasma-nm/talimat new file mode 100644 index 000000000..3b6dfb024 --- /dev/null +++ b/talimatname/genel/p/plasma-nm/talimat @@ -0,0 +1,22 @@ +# Tanım: Ağ bağlantılarını yönetmek için QML'de yazılmış bir plazma uygulaması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-kdelibs4support kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-knotifications kf5-kservice kf5-kwallet kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-networkmanager-qt kf5-plasma-framework kf5-solid qca-qt5 kf5-modemmanager-qt mobile-broadband-provider-info + +isim=plasma-nm +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-oxygen/talimat b/talimatname/genel/p/plasma-oxygen/talimat new file mode 100644 index 000000000..3d3db821f --- /dev/null +++ b/talimatname/genel/p/plasma-oxygen/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE Oxygen stili +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: kf5-frameworkintegration kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kguiaddons kf5-ki18n kf5-kwidgetsaddons kf5-kwindowsystem plasma-kdecoration libxcb + +isim=plasma-oxygen +surum=5.8.1 +devir=1 +_isim=oxygen + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-pa/talimat b/talimatname/genel/p/plasma-pa/talimat new file mode 100644 index 000000000..cdc627da5 --- /dev/null +++ b/talimatname/genel/p/plasma-pa/talimat @@ -0,0 +1,22 @@ +# Tanım: PulseAudio'yu kullanarak ses hacmi yönetimi için plazma uygulaması +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: kf5-plasma-framework kf5-kcoreaddons kf5-kdeclarative kf5-kglobalaccel kf5-ki18n libcanberra pulseaudio qt5 + +isim=plasma-pa +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-polkit-kde-agent/talimat b/talimatname/genel/p/plasma-polkit-kde-agent/talimat new file mode 100644 index 000000000..1ef2ffba9 --- /dev/null +++ b/talimatname/genel/p/plasma-polkit-kde-agent/talimat @@ -0,0 +1,25 @@ +# Tanım: Program, KDE için bir polkit kimlik doğrulama arayüzü sağlar. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-ki18n kf5-knotifications kf5-kwidgetsaddons kf5-kwindowsystem kf5-kiconthemes polkit-qt5 + +isim=plasma-polkit-kde-agent +surum=5.8.1 +devir=1 +_isim=polkit-kde-agent + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-1-$surum.tar.xz) + +derle() { +cd ${_name}-1-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -DLIBEXEC_INSTALL_DIR=lib/polkit-kde \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/plasma-powerdevil/talimat b/talimatname/genel/p/plasma-powerdevil/talimat new file mode 100644 index 000000000..3a2c0c7fe --- /dev/null +++ b/talimatname/genel/p/plasma-powerdevil/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir Plazma Kabuğunun güç tüketimi ayarlarını yönetir +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: plasma-workspace kf5-kauth polkit-qt5 kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdelibs4support kf5-kglobalaccel kf5-ki18n kf5-kidletime kf5-kio kf5-knotifications kf5-knotifyconfig kf5-kservice kf5-kwidgetsaddons kf5-kxmlgui kf5-solid plasma-libkscreen plasma-workspace kf5-bluez-qt + +isim=plasma-powerdevil +surum=5.8.1 +devir=1 +_isim=powerdevil + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-sddm-kcm/talimat b/talimatname/genel/p/plasma-sddm-kcm/talimat new file mode 100644 index 000000000..d153112cf --- /dev/null +++ b/talimatname/genel/p/plasma-sddm-kcm/talimat @@ -0,0 +1,24 @@ +# Tanım: SDDM için KDE Yapılandırma Modülü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: kf5-extra-cmake-modules sddm qt5 kf5-kio kf5-kauth kf5-kconfigwidgets kf5-kcoreaddons kf5-ki18n kf5-kxmlgui xorg-libx11 xcb-util-image libxcb xorg-libxcursor + +isim=plasma-sddm-kcm +surum=5.8.1 +devir=1 +_isim=sddm-kcm + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib \ + -DKDE_INSTALL_SYSCONFDIR=/etc \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-sdk/talimat b/talimatname/genel/p/plasma-sdk/talimat new file mode 100644 index 000000000..ddb36e779 --- /dev/null +++ b/talimatname/genel/p/plasma-sdk/talimat @@ -0,0 +1,23 @@ +# Tanım: Plazma gelişimi için yararlı uygulamalar +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: qt5-webkit kf5-karchive kf5-kcompletion kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kdeclarative kf5-ki18n kf5-kiconthemes kf5-kio kf5-knewstuff kf5-kpackage kf5-kservice kf5-ktexteditor kf5-kwidgetsaddons kf5-plasma-framework kf5-kitemmodels + +isim=plasma-sdk +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-systemsettings/talimat b/talimatname/genel/p/plasma-systemsettings/talimat new file mode 100644 index 000000000..29490a650 --- /dev/null +++ b/talimatname/genel/p/plasma-systemsettings/talimat @@ -0,0 +1,23 @@ +# Tanım: KDE sistem ayarları +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: kf5-kauth kf5-kcmutils kf5-kcompletion kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-khtml kf5-ki18n kf5-kiconthemes kf5-kio kf5-kitemviews kf5-kservice kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui + +isim=plasma-systemsettings +surum=5.8.1 +devir=1 +_isim=systemsettings + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-user-manager/talimat b/talimatname/genel/p/plasma-user-manager/talimat new file mode 100644 index 000000000..958a0cdfc --- /dev/null +++ b/talimatname/genel/p/plasma-user-manager/talimat @@ -0,0 +1,23 @@ +# Tanım: Sistem kullanıcılarınızı yönetmek için basit bir sistem ayarları modülü +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: accountsservice libpwquality kf5-kconfigwidgets kf5-kcoreaddons kf5-kdelibs4support kf5-ki18n kf5-kiconthemes kf5-kio kf5-kwidgetsaddons qt5 + +isim=plasma-user-manager +surum=5.8.1 +devir=1 +_isim=user-manager + +kaynak=( http://download.kde.org/stable/plasma/$surum/${_name}-$surum.tar.xz) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plasma-workspace-wallpapers/talimat b/talimatname/genel/p/plasma-workspace-wallpapers/talimat new file mode 100644 index 000000000..fde7dabbe --- /dev/null +++ b/talimatname/genel/p/plasma-workspace-wallpapers/talimat @@ -0,0 +1,25 @@ +# Tanım: Plazma Çalışma Alanı için ilave duvar kağıtları +# URL: https://www.kde.org/ +# Paketçi: alihan-oztruk@hotmail.com +# Gerekler: qt5 kf5-extra-cmake-modules + +isim=plasma-workspace-wallpapers +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz) + +_isim=plasma-workspace-wallpapers +devir=1 + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/plasma-workspace/kscreensaver.pam b/talimatname/genel/p/plasma-workspace/kscreensaver.pam new file mode 100644 index 000000000..18791e0b6 --- /dev/null +++ b/talimatname/genel/p/plasma-workspace/kscreensaver.pam @@ -0,0 +1 @@ +auth required pam_unix_auth.so diff --git a/talimatname/genel/p/plasma-workspace/talimat b/talimatname/genel/p/plasma-workspace/talimat new file mode 100644 index 000000000..18aa91964 --- /dev/null +++ b/talimatname/genel/p/plasma-workspace/talimat @@ -0,0 +1,44 @@ +# Tanım: KDE Plasma çalışma alanı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk@hotmail.com +# Gerekler: consolekit2 kf5-baloo kf5-kdesu kf5-kdewebkit kf5-kjsembed kf5-knotifyconfig kf5-krunner plasma-kwin kf5-kxmlrpcclient plasma-libkscreen plasma-libksysguard kf5-networkmanager-qt kf5-ktexteditor kf5-kwayland libdbusmenu-qt5 pm-utils gvfs plasma-kscreenlocker plasma-breeze plasma-kactivitymanagerd kholidays + +isim=plasma-workspace +surum=5.8.1 +devir=1 + +kaynak=( http://download.kde.org/stable/plasma/$surum/$isim-$surum.tar.xz + kscreensaver.pam) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install + +sed 's|qtpaths|qtpaths-qt5|' -i $PKG/usr/bin/startkde +sed 's|qtpaths|qtpaths-qt5|' -i $PKG/usr/bin/startplasmacompositor + +mkdir -p $PKG/etc/pam.d + +cat > $PKG/etc/pam.d/kde << "EOF" +# Begin /etc/pam.d/kde + +auth include system-auth +account include system-account +password include system-password +session include system-session + +# End /etc/pam.d/kde +EOF + +install -v -dm755 $PKG/usr/share/xsessions +ln -sfv /usr/share/xsessions/plasma.desktop $PKG/usr/share/xsessions/kf5-plasma.desktop + +install -D -m644 $SRC/kscreensaver.pam $PKG/etc/pam.d/kscreensaver +} diff --git a/talimatname/genel/p/plasma/talimat b/talimatname/genel/p/plasma/talimat new file mode 100644 index 000000000..4e03c8b65 --- /dev/null +++ b/talimatname/genel/p/plasma/talimat @@ -0,0 +1,15 @@ +# Tanım: This package installs KDE Plasma 5 +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: plasma-bluedevil plasma-breeze plasma-breeze-gtk plasma-desktop plasma-integration plasma-kactivitymanagerd plasma-kde-cli-tools plasma-kdecoration plasma-kde-gtk-config plasma-kdeplasma-addons plasma-kgamma5 plasma-khotkeys plasma-kinfocenter plasma-kmenuedit plasma-kscreen plasma-kscreenlocker plasma-ksshaskpass plasma-ksysguard plasma-kwallet-pam plasma-kwayland-integration plasma-kwin plasma-kwrited plasma-libkscreen plasma-libksysguard plasma-milou plasma-nm plasma-oxygen plasma-pa plasma-polkit-kde-agent plasma-powerdevil plasma-sddm-kcm plasma-sdk plasma-systemsettings plasma-user-manager plasma-workspace plasma-workspace-wallpapers + +isim=plasma +surum=5.8.1 +devir=1 + +kaynak=(talimat) + +derle() { +echo "KDE Plasma 5" +} + diff --git a/talimatname/genel/p/plib/talimat b/talimatname/genel/p/plib/talimat new file mode 100644 index 000000000..a398ebb53 --- /dev/null +++ b/talimatname/genel/p/plib/talimat @@ -0,0 +1,17 @@ +# Tanım: Taşınabilir oyun kütüphaneler takımı +# URL: http://plib.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: freeglut xorg-libxmu + +isim=plib +surum=1.8.5 +devir=1 +kaynak=(http://plib.sourceforge.net/dist/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --with-x + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pluma/pluma.kur-kos b/talimatname/genel/p/pluma/pluma.kur-kos new file mode 100755 index 000000000..3b2f1e8c0 --- /dev/null +++ b/talimatname/genel/p/pluma/pluma.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas + +/usr/bin/update-desktop-database diff --git a/talimatname/genel/p/pluma/talimat b/talimatname/genel/p/pluma/talimat new file mode 100644 index 000000000..78dbadae0 --- /dev/null +++ b/talimatname/genel/p/pluma/talimat @@ -0,0 +1,26 @@ +# Tanım: MATE için güçlü bir metin editörü +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool itstool gobject-introspection iso-codes gtksourceview3 libpeas +# Grup: mate + +isim=pluma +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i 's/python/python2/' plugins/externaltools/data/switch-c.tool.in + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --enable-gtk-doc=no \ + --enable-python + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/plymouth/plymouthd.conf b/talimatname/genel/p/plymouth/plymouthd.conf new file mode 100644 index 000000000..b744c958d --- /dev/null +++ b/talimatname/genel/p/plymouth/plymouthd.conf @@ -0,0 +1,3 @@ +# Administrator customizations go in this file +#[Daemon] +Theme=tribar diff --git a/talimatname/genel/p/plymouth/talimat b/talimatname/genel/p/plymouth/talimat new file mode 100644 index 000000000..b16130237 --- /dev/null +++ b/talimatname/genel/p/plymouth/talimat @@ -0,0 +1,46 @@ +# Tanım: Kernel modulleri desteğine sahip bir grafik önyükleme başlatma ekranı +# URL: http://www.freedesktop.org/wiki/Software/Plymouth +# Paketçi: milisarge +# Gerekler: xorg-libdrm pango docbook-xsl gtk2 + +isim=plymouth +surum=0.8.8 +devir=1 + +#kaynak=(https://www.freedesktop.org/software/plymouth/releases/$isim-$surum.tar.xz +kaynak=(http://www.freedesktop.org/software/$isim/releases/$isim-$surum.tar.bz2 + https://raw.githubusercontent.com/yakar/milis-linux-wallpapers/master/milis-linux-tree.png + plymouthd.conf) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --exec-prefix=/usr \ + --libdir=/usr/lib \ + --libexecdir=/usr/lib \ + --infodir=/usr/info \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --mandir=/usr/man \ + --enable-tracing \ + --without-rhgb-compat-link \ + --with-gdm-autostart-file=yes \ + --without-system-root-install \ + --program-prefix="" \ + --program-suffix="" \ + --with-logo=/usr/share/plymouth/milis.png \ + --enable-gtk --enable-gdm-transition --enable-pango \ + --enable-systemd-integration=no \ + --disable-documentation + make || return 1 + + make install DESTDIR=$PKG || exit 1 + + rm -f "$PKG"/usr/lib/plymouth/*.la + #rm -rf $PKG/*.wants + + install -Dm644 "$SRC/milis-linux-tree.png" "$PKG/usr/share/plymouth/milis.png" + install -Dm644 "$SRC/plymouthd.conf" "$PKG/etc/plymouth/plymouthd.conf" + cd /sources/milis.git/ayarlar/servisler + make DESTDIR=$PKG kur-plymouth +} diff --git a/talimatname/genel/p/pm-quirks/talimat b/talimatname/genel/p/pm-quirks/talimat new file mode 100644 index 000000000..5c631d8cf --- /dev/null +++ b/talimatname/genel/p/pm-quirks/talimat @@ -0,0 +1,15 @@ +# Tanım: Pm-utils, askıya alma ve HAL adına devam etmeyi içeren küçük bir komut koleksiyonudur. +# URL: http://pm-utils.freedesktop.org/wiki/ +# Paketçi: milisarge +# Gerekler: + +isim=pm-quirks +surum=20100619 +devir=1 + +kaynak=(http://pm-utils.freedesktop.org/releases/pm-quirks-${surum}.tar.gz) + +derle() { + install -m755 -d "${PKG}/usr/lib/pm-utils/video-quirks" + install -m644 video-quirks/*.quirkdb "${PKG}/usr/lib/pm-utils/video-quirks/" +} diff --git a/talimatname/genel/p/pm-utils/talimat b/talimatname/genel/p/pm-utils/talimat new file mode 100644 index 000000000..d2651c197 --- /dev/null +++ b/talimatname/genel/p/pm-utils/talimat @@ -0,0 +1,35 @@ +# Tanım: Askıya alma ve hazırda bekletme güç yönetimi için yardımcı programlar ve komut dosyaları +# URL: http://pm-utils.freedesktop.org +# Paketçi: milisarge +# Gerekler: pm-quirks + +isim=pm-utils +surum=1.4.1 +devir=1 + +kaynak=(http://pm-utils.freedesktop.org/releases/pm-utils-${surum}.tar.gz + http://downloads.nutyx.org/files/patchs/$isim/02-logging-append.patch + http://downloads.nutyx.org/files/patchs/$isim/12-fix-intel-audio-powersave-hook.patch + http://downloads.nutyx.org/files/patchs/$isim/13-49bluetooth-sync.patch + http://downloads.nutyx.org/files/patchs/$isim/14-disable-sata-alpm.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i "${SRC}/02-logging-append.patch" + patch -Np1 -i "${SRC}/12-fix-intel-audio-powersave-hook.patch" + patch -Np1 -i "${SRC}/13-49bluetooth-sync.patch" + patch -Np1 -i "${SRC}/14-disable-sata-alpm.patch" + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var + make + make DESTDIR="$PKG" install + + rm -f "${PKG}/usr/lib/pm-utils/sleep.d/55NetworkManager" + + rm -f "${PKG}/usr/lib/pm-utils/power.d/"{harddrive,disable_wol} + + rm -fr "${PKG}/usr/share/doc" +} + + diff --git a/talimatname/genel/p/podofo/talimat b/talimatname/genel/p/podofo/talimat new file mode 100644 index 000000000..8d268d634 --- /dev/null +++ b/talimatname/genel/p/podofo/talimat @@ -0,0 +1,25 @@ +# Tanım: C ++ kütüphanesinin PDF dosya formatıyla çalışması için. +# URL: http://podofo.sourceforge.net +# Paketçi: milisarge +# Gerekler: cmake xorg-fontconfig freetype libidn libpng libtiff lua51 + +isim=podofo +surum=0.9.5 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr .. \ + -DFREETYPE_INCLUDE_DIR=/usr/include/freetype2 ..\ + -DLUA_INCLUDE_DIR=/usr/include/lua5.1 .. \ + -DPODOFO_BUILD_SHARED=1 \ + -DPODOFO_HAVE_JPEG_LIB=1 \ + -DPODOFO_HAVE_PNG_LIB=1 \ + -DPODOFO_HAVE_TIFF_LIB=1 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/poedit/talimat b/talimatname/genel/p/poedit/talimat new file mode 100644 index 000000000..568896375 --- /dev/null +++ b/talimatname/genel/p/poedit/talimat @@ -0,0 +1,19 @@ +# Tanım: Çapraz platform gettext katalogları (.po dosyaları) editörü +# URL: http://www.poedit.net/ +# Paketçi: Cihan_Alkan +# Gerekler: boost gtkspell wxgtk lucenepp +# Grup: geliştirme + +isim=poedit +surum=2.0.5 +devir=1 +kaynak=(https://github.com/vslavik/poedit/releases/download/v$surum-oss/poedit-${surum}.tar.gz) + +derle() { + cd "${SRC}"/${isim}-${surum} + ./configure --with-gtk=gtk3 \ + --prefix=/usr --libexecdir=/usr/lib/poedit --with-wx-config=/usr/bin/wx-config + make CPPFLAGS+=' -DUCHAR_TYPE=uint16_t' + make DESTDIR="${PKG}" install + install -Dm644 COPYING "${PKG}"/usr/share/licenses/${isim}/LICENSE +} diff --git a/talimatname/genel/p/polkit-gnome/talimat b/talimatname/genel/p/polkit-gnome/talimat new file mode 100644 index 000000000..8fdf09997 --- /dev/null +++ b/talimatname/genel/p/polkit-gnome/talimat @@ -0,0 +1,30 @@ +# Tanım: GNOME için eski polkit kimlik doğrulama aracı +# URL: http://hal.freedesktop.org/docs/polkit-gnome +# Paketçi: milisarge +# Gerekler: polkit gtk3 + +isim=polkit-gnome +surum=0.105 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/0.105/$isim-$surum.tar.xz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib/polkit-gnome +make +make DESTDIR=$PKG install +mkdir -p $PKG/etc/xdg/autostart +cat > $PKG/etc/xdg/autostart/polkit-gnome-authentication-agent-1.desktop << "EOF" +[Desktop Entry] +Name=PolicyKit Authentication Agent +Comment=PolicyKit Authentication Agent +Exec=/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 +Terminal=false +Type=Application +Categories= +NoDisplay=true +OnlyShowIn=GNOME;XFCE;Unity; +AutostartCondition=GNOME3 unless-session gnome +EOF +} diff --git a/talimatname/genel/p/polkit-qt5/talimat b/talimatname/genel/p/polkit-qt5/talimat new file mode 100644 index 000000000..7dd911a1a --- /dev/null +++ b/talimatname/genel/p/polkit-qt5/talimat @@ -0,0 +1,21 @@ +# Tanım: Geliştiricilerin güzel bir Qt tarzı API ile PolicyKit API'sine erişmelerini sağlayan bir kütüphane +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: polkit qt5 + +isim=polkit-qt5 +devir=1 +surum=0.112.0 +_isim=polkit-qt-1 + +kaynak=(http://download.kde.org/stable/apps/KDE4.x/admin/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/polkit/polkit.okubeni b/talimatname/genel/p/polkit/polkit.okubeni new file mode 100644 index 000000000..d65f3e4f7 --- /dev/null +++ b/talimatname/genel/p/polkit/polkit.okubeni @@ -0,0 +1,4 @@ +Si necessaire faites en root: +groupadd -fg 27 polkitd +useradd -c "PolicyKit Daemon Owner" -d /etc/polkit-1 -u 27 \ +-g polkitd -s /bin/false polkitd diff --git a/talimatname/genel/p/polkit/talimat b/talimatname/genel/p/polkit/talimat new file mode 100644 index 000000000..fe1bad696 --- /dev/null +++ b/talimatname/genel/p/polkit/talimat @@ -0,0 +1,34 @@ +# Tanım: Sistem genelinde ayrıcalıkları kontrol etmek için uygulama geliştirme araç seti +# URL: http://hal.freedesktop.org/docs/polkit +# Paketçi: milisarge +# Gerekler: glib js1 gobject-introspection intltool libxslt docbook-xsl + +isim=polkit +surum=0.113 +devir=1 + +kaynak=(http://www.freedesktop.org/software/$isim/releases/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--mandir=/usr/share/man \ +--localstatedir=/var \ +--enable-libsystemd-login=no \ +--disable-static +make||make -j1 +make DESTDIR=$PKG install + +cat > $PKG/etc/pam.d/polkit-1 << "EOF" +# Begin /etc/pam.d/polkit-1 + +auth include system-auth +account include system-account +password include system-password +session include system-session + +# End /etc/pam.d/polkit-1 +EOF +} diff --git a/talimatname/genel/p/polyml/talimat b/talimatname/genel/p/polyml/talimat new file mode 100644 index 000000000..d3163f2ff --- /dev/null +++ b/talimatname/genel/p/polyml/talimat @@ -0,0 +1,17 @@ +# Tanım: standart ML derleyicisinin güncel gerçeklemesi +# URL: http://www.polyml.org +# Paketçi: milisarge +# Gerekler: libffi + +isim=polyml +surum=5.7 +devir=1 +kaynak=(https://github.com/${isim}/${isim}/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$SRC/$isim-$surum" + ./configure --prefix=/usr --without-x --with-system-libffi --with-gmp --enable-shared + make + make -k check + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/p/ponyc/talimat b/talimatname/genel/p/ponyc/talimat new file mode 100644 index 000000000..6a86a3268 --- /dev/null +++ b/talimatname/genel/p/ponyc/talimat @@ -0,0 +1,34 @@ +# Tanım: Aktör modellemeye dayanan yüksek performanslı dil. +# URL: http://ponylang.org/ +# Paketçi: milisarge +# Gerekler: llvm pcre2 binutils-gold +# Grup: geliştirme + +isim=ponyc +surum=0.21.2 +devir=1 +kaynak=(https://github.com/ponylang/ponyc/archive/$surum.tar.gz::$isim-$surum.tar.gz + https://github.com/winksaville/ponyc/commit/64b64a21b1be70caf4202eb1b1fa22dac1bd6575.patch) + +derle() { + cd ponyc-$surum + sed -i 's/-Werror //' Makefile + patch -p1 -i ../64b64a21b1be70caf4202eb1b1fa22dac1bd6575.patch + make config=release prefix=/usr arch=x86-64 verbose= default_pic=true + mkdir docs + build/release/ponyc packages/stdlib -rexpr -g -o docs + make config=release prefix=/usr arch=x86-64 verbose= default_pic=true test + install -Dm755 build/release/ponyc "$PKG"/usr/lib/pony/"$surum"/bin/ponyc + install -Dm644 build/release/libponyrt-pic.a "$PKG"/usr/lib/libponyrt-pic.a + install -Dm644 build/release/libponyc.a "$PKG"/usr/lib/libponyc.a + install -Dm644 src/libponyrt/pony.h "$PKG"/usr/include/pony.h + # Ponyc is designed to read its standard packages from the same directory. + install -dm755 "$PKG"/usr/bin + ln -sf /usr/lib/pony/"$surum"/bin/ponyc "$PKG"/usr/bin + cp -dr --no-preserve=ownership packages "$PKG"/usr/lib/pony/"$surum" + # Let's include the examples as documentation is scarce. + install -dm755 "$PKG"/usr/share/doc/pony + cp -dr --no-preserve=ownership examples "$PKG"/usr/share/doc/pony + cp -dr docs/* "$PKG"/usr/share/doc/pony + install -Dm644 LICENSE "$PKG"/usr/share/licenses/"$isim"/LICENSE +} diff --git a/talimatname/genel/p/poppler-glib/talimat b/talimatname/genel/p/poppler-glib/talimat new file mode 100644 index 000000000..47fb4a364 --- /dev/null +++ b/talimatname/genel/p/poppler-glib/talimat @@ -0,0 +1,34 @@ +# Tanım:Xpdf 3.0'a dayalı PDF işleme kütüphanesi +# URL: http://poppler.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: poppler xorg-libxxf86vm libpng xorg-fontconfig libjpeg-turbo cairo libxml2 openjpeg lcms lcms2 glib + +isim=poppler-glib +surum=0.46.0 +devir=1 + +kaynak=(http://poppler.freedesktop.org/poppler-$surum.tar.xz) + +derle() { +cd poppler-$surum + +CXXFLAGS="-std=c++11" + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --disable-poppler-qt4 \ + --disable-poppler-qt5 \ + --enable-poppler-glib \ + --disable-xpdf-headers + +make +make -C poppler DESTDIR=$PKG install-libLTLIBRARIES +make -C glib DESTDIR=$PKG install +install -m755 -d $PKG/usr/lib/pkgconfig +install -m644 poppler-glib.pc $PKG/usr/lib/pkgconfig/ + + +rm -f $PKG/usr/lib/libpoppler.* +rm -rf $PKG/usr/share/gtk-doc/html/poppler/ +} diff --git a/talimatname/genel/p/poppler-qt4/talimat b/talimatname/genel/p/poppler-qt4/talimat new file mode 100644 index 000000000..bb786b14b --- /dev/null +++ b/talimatname/genel/p/poppler-qt4/talimat @@ -0,0 +1,31 @@ +# Tanım: Xpdf 3.0'a dayalı PDF işleme kütüphanesi +# URL: http://poppler.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: poppler xorg-libxxf86vm libpng xorg-fontconfig libjpeg-turbo cairo libxml2 openjpeg lcms lcms2 qt4 + +isim=poppler-qt4 +surum=0.46.0 +devir=1 + +kaynak=(http://poppler.freedesktop.org/poppler-$surum.tar.xz) + +derle() { + cd poppler-$surum + + CXXFLAGS="-std=c++11" + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --enable-qt4 \ + --disable-qt5 \ + --disable-glib \ + --enable-xpdf-headers + make + make -C poppler DESTDIR=$PKG install-libLTLIBRARIES + make -C qt4 DESTDIR=$PKG install + + mkdir -p $PKG/usr/lib/pkgconfig + install -m644 poppler-qt4.pc $PKG/usr/lib/pkgconfig/ + rm -f $PKG/usr/lib/libpoppler.* +} diff --git a/talimatname/genel/p/poppler-qt5/talimat b/talimatname/genel/p/poppler-qt5/talimat new file mode 100644 index 000000000..da45d50d7 --- /dev/null +++ b/talimatname/genel/p/poppler-qt5/talimat @@ -0,0 +1,26 @@ +# Tanım: Xpdf 3.0'a dayalı PDF işleme kütüphanesi +# URL: http://poppler.freedesktop.org/ +# Paketçi: Cihan_Alkan +# Gerekler: poppler xorg-libxxf86vm libpng xorg-fontconfig libjpeg-turbo cairo libxml2 openjpeg lcms lcms2 qt5 +# Grup: kütüphane + +isim=poppler-qt5 +surum=0.61.1 +devir=1 + +kaynak=(http://poppler.freedesktop.org/poppler-$surum.tar.xz) + +derle() { + mkdir build + cd build + cmake ../poppler-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib \ + -DENABLE_XPDF_HEADERS=ON \ + -DENABLE_GTK_DOC=ON + make + make -C qt5 DESTDIR="${PKG}" install + install -m755 -d "${PKG}/usr/lib/pkgconfig" + install -m644 poppler-qt5.pc "${PKG}/usr/lib/pkgconfig/" +} diff --git a/talimatname/genel/p/poppler/talimat b/talimatname/genel/p/poppler/talimat new file mode 100644 index 000000000..43067d9a3 --- /dev/null +++ b/talimatname/genel/p/poppler/talimat @@ -0,0 +1,46 @@ +# Tanım: Xpdf 3.0'a dayalı PDF işleme kütüphanesi +# URL: http://poppler.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: xorg-libxxf86vm libpng xorg-fontconfig libjpeg-turbo cairo libxml2 openjpeg lcms2 + +datasurum=0.4.7 +isim=poppler +surum=0.46.0 +devir=1 + +kaynak=( +http://poppler.freedesktop.org/$isim-$surum.tar.xz +http://poppler.freedesktop.org/poppler-data-$dataversion.tar.gz) + +derle() { +cd poppler-$surum + +CXXFLAGS="-std=c++11" + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --enable-build-type=release \ + --enable-cmyk \ + --enable-xpdf-headers + +make +make DESTDIR=$PKG install + +cd ../poppler-data-$dataversion +make prefix=/usr DESTDIR=$PKG install + +rm -f $PKG/usr/lib/pkgconfig/poppler-{glib,qt4,qt5}.pc +rm -f $PKG/usr/lib/poppler-{glib*,qt4*,qt5*} +rm -f $PKG/usr/lib/libpoppler-{glib*,qt4*,qt5*} + +rm -f $PKG/usr/bin/poppler-glib-demo +rm -rf $PKG/usr/include/poppler/glib/ + +rm -f $PKG/usr/bin/poppler-qt4-demo +rm -rf $PKG/usr/include/poppler/qt4/ + +rm -f $PKG/usr/bin/poppler-qt5-demo +rm -rf $PKG/usr/include/poppler/qt5/ + +} diff --git a/talimatname/genel/p/popt/talimat b/talimatname/genel/p/popt/talimat new file mode 100644 index 000000000..5a072831c --- /dev/null +++ b/talimatname/genel/p/popt/talimat @@ -0,0 +1,17 @@ +# Tanım: Bazı programlar tarafından komut satırı seçeneklerini ayrıştırmak için kullanılan popt kitaplıkları. +# URL: http://freshmeat.net/projects/popt/ +# Paketçi: milisarge +# Gerekler: + +isim=popt +surum=1.16 +devir=1 + +kaynak=(http://rpm5.org/files/popt/popt-1.16.tar.gz) + +derle() { +cd popt-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/portaudio/talimat b/talimatname/genel/p/portaudio/talimat new file mode 100644 index 000000000..cfa78bf10 --- /dev/null +++ b/talimatname/genel/p/portaudio/talimat @@ -0,0 +1,19 @@ +# Tanım: Ücretsiz, çapraz platform, açık kaynak, ses G/Ç kitaplığı +# URL: http://www.portaudio.com +# Paketçi: milisarge +# Gerekler: jack + +isim=portaudio +surum=19_20140130 +devir=1 + +kaynak=(http://www.portaudio.com/archives/pa_stable_v${surum}.tgz) + +derle() { +cd portaudio +./configure --prefix=/usr --enable-cxx +make||make -j1 +make DESTDIR=$PKG install + +install -Dm0644 LICENSE.txt $SRC/usr/share/licenses/portaudio/LICENSE.txt +} diff --git a/talimatname/genel/p/portmidi/portmidi-217-build-fix.patch b/talimatname/genel/p/portmidi/portmidi-217-build-fix.patch new file mode 100644 index 000000000..69ca37891 --- /dev/null +++ b/talimatname/genel/p/portmidi/portmidi-217-build-fix.patch @@ -0,0 +1,30 @@ +diff -rup portmidi.orig/pm_java/CMakeLists.txt portmidi/pm_java/CMakeLists.txt +--- portmidi.orig/pm_java/CMakeLists.txt 2009-11-04 16:20:44.000000000 +0100 ++++ portmidi/pm_java/CMakeLists.txt 2012-01-24 21:13:08.513182169 +0100 +@@ -15,13 +15,11 @@ if(UNIX) + add_custom_command(OUTPUT pmdefaults/PmDefaultsFrame.class + COMMAND javac -classpath . pmdefaults/PmDefaultsFrame.java + MAIN_DEPENDENCY pmdefaults/PmDefaultsFrame.java +- DEPENDS pmdefaults/PmDefaults.java +- WORKING_DIRECTORY pm_java) ++ DEPENDS pmdefaults/PmDefaults.java) + add_custom_command(OUTPUT pmdefaults/PmDefaults.class + COMMAND javac -classpath . pmdefaults/PmDefaults.java + MAIN_DEPENDENCY pmdefaults/PmDefaults.java +- DEPENDS pmdefaults/PmDefaultsFrame.java +- WORKING_DIRECTORY pm_java) ++ DEPENDS pmdefaults/PmDefaultsFrame.java) + add_custom_command(OUTPUT ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar + COMMAND cp pmdefaults/portmusic_logo.png . + COMMAND jar cmf pmdefaults/manifest.txt pmdefaults.jar +@@ -31,8 +29,7 @@ if(UNIX) + COMMAND mv pmdefaults.jar ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + COMMAND rm portmusic_logo.png + MAIN_DEPENDENCY pmdefaults/PmDefaults.class +- DEPENDS ${PMDEFAULTS_ALL_CLASSES} +- WORKING_DIRECTORY pm_java) ++ DEPENDS ${PMDEFAULTS_ALL_CLASSES}) + add_custom_target(pmdefaults_target ALL + DEPENDS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pmdefaults.jar) + # message(STATUS "add_custom_target: pmdefaults.jar") + diff --git a/talimatname/genel/p/portmidi/talimat b/talimatname/genel/p/portmidi/talimat new file mode 100644 index 000000000..01e247a20 --- /dev/null +++ b/talimatname/genel/p/portmidi/talimat @@ -0,0 +1,39 @@ +# Tanım: Gerçek zamanlı MIDI giriş/çıkış için platform bağımsız kütüphane +# URL: http://portmedia.sourceforge.net +# Paketçi: milisarge +# Gerekler: cmake glib alsa-lib openjdk + +isim=portmidi +surum=217 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/portmedia/$isim/$surum/$isim-src-$surum.zip + portmidi-217-build-fix.patch) + +derle() { + + cd $isim + sed -i "s#/usr/local#/usr#" */CMakeLists.txt pm_python/setup.py + mkdir -p pm_java/Release + JAVA_HOME="/opt/jdk" + export PATH=$PATH:$JAVA_HOME/bin + patch -p1 -i $SRC/portmidi-217-build-fix.patch + + cmake . \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_CXX_FLAGS="-O2 -fPIC" \ + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=$PKG/usr/bin \ + -DJAVA_AWT_INCLUDE_PATH="$JAVA_HOME/include" \ + -DJAVA_INCLUDE_PATH="$JAVA_HOME/include" \ + -DJAVA_INCLUDE_PATH2="$JAVA_HOME/include/linux" \ + -DJAVA_JVM_LIBRARY="$JAVA_HOME/jre/lib/amd64/server/libjvm.so" \ + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=Release \ + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=Release \ + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=Release + make -j1 + make DESTDIR=$PKG install + + # Fix missing symlink for libporttime.so (FS#21528) + ln -s libportmidi.so $PKG/usr/lib/libporttime.so +} + diff --git a/talimatname/genel/p/postfix/postfix.kos-kur b/talimatname/genel/p/postfix/postfix.kos-kur new file mode 100644 index 000000000..0f601fd02 --- /dev/null +++ b/talimatname/genel/p/postfix/postfix.kos-kur @@ -0,0 +1,5 @@ +groupadd -g 32 postfix +groupadd -g 33 postdrop +useradd -c "Postfix Daemon User" -d /var/spool/postfix -g postfix \ + -s /bin/false -u 32 postfix +chown -v postfix:postfix /var/mail diff --git a/talimatname/genel/p/postfix/talimat b/talimatname/genel/p/postfix/talimat new file mode 100644 index 000000000..dad65d7a9 --- /dev/null +++ b/talimatname/genel/p/postfix/talimat @@ -0,0 +1,38 @@ +# Tanım: Ana makinenizin diğer kullanıcılarına e-posta göndermek için Posta Aktarma Aracısı (MTA) +# URL: http://www.postfix.org +# Paketçi: milisarge +# Gerekler: db cyrus-sasl openssl icu mariadb openldap pcre postgresql sqlite + +isim=postfix +surum=3.0.3 +devir=1 + +kaynak=(ftp://ftp.porcupine.org/mirrors/postfix-release/official/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + source /etc/blfs-bootscripts + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + + + + make CCARGS="-DUSE_TLS -I/usr/include/openssl/ \ + -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl" \ + AUXLIBS="-lssl -lcrypto -lsasl2" \ + makefiles + + make + + sh postfix-install -non-interactive \ + daemon_directory=$PKG/usr/lib/postfix \ + manpage_directory=$PKG/usr/share/man \ + html_directory=$PKG/usr/share/doc/postfix-3.0.3/html \ + readme_directory=$PKG/usr/share/doc/postfix-3.0.3/readme + + cd $scripts-$scriptsversion + make DESTDIR=$PKG install-postfix + +} diff --git a/talimatname/genel/p/postgresql/postgresql.kurulum b/talimatname/genel/p/postgresql/postgresql.kurulum new file mode 100644 index 000000000..2bcc7f3fd --- /dev/null +++ b/talimatname/genel/p/postgresql/postgresql.kurulum @@ -0,0 +1,24 @@ +install -v -dm700 /srv/pgsql/data && +install -v -dm755 /run/postgresql && + +groupadd -g 41 postgres && +useradd -c "PostgreSQL Server" -g postgres -d /srv/pgsql/data \ + -u 41 postgres && + +chown -Rv postgres:postgres /srv/pgsql /run/postgresql + +su - postgres -c '/usr/bin/initdb -D /srv/pgsql/data' + +su - postgres -c '/usr/bin/postgres -D /srv/pgsql/data > \ + /srv/pgsql/data/logfile 2>&1 &' + +su - postgres -c '/usr/bin/createdb test' && +echo "create table t1 ( name varchar(20), state_province varchar(20) );" \ + | (su - postgres -c '/usr/bin/psql test ') && +echo "insert into t1 values ('Billy', 'NewYork');" \ + | (su - postgres -c '/usr/bin/psql test ') && +echo "insert into t1 values ('Evanidus', 'Quebec');" \ + | (su - postgres -c '/usr/bin/psql test ') && +echo "insert into t1 values ('Jesse', 'Ontario');" \ + | (su - postgres -c '/usr/bin/psql test ') && +echo "select * from t1;" | (su - postgres -c '/usr/bin/psql test') diff --git a/talimatname/genel/p/postgresql/talimat b/talimatname/genel/p/postgresql/talimat new file mode 100644 index 000000000..a6bbd7292 --- /dev/null +++ b/talimatname/genel/p/postgresql/talimat @@ -0,0 +1,25 @@ +# Tanım: Gelişmiş nesne-ilişkisel veritabanı yönetim sistemi (ORDBMS). +# URL: http://www.postgresql.org/docs +# Paketçi: milisarge +# Gerekler: + +isim=postgresql +surum=9.6.3 +devir=1 +kaynak=(https://ftp.postgresql.org/pub/source/v$surum/postgresql-$surum.tar.bz2) + +derle() { + cd $isim-$surum + sed -i '/DEFAULT_PGSOCKET_DIR/s@/tmp@/run/postgresql@' src/include/pg_config_manual.h && + ./configure --prefix=/usr \ + --enable-thread-safety \ + --with-openssl + + make + make DESTDIR=$PKG install + cd doc/src/sgml + make DESTDIR=$PKG install-man + rm -rf $PKG/usr/share/doc + cd /sources/milis.git/ayarlar/servisler + make DESTDIR=$PKG kur-$isim +} diff --git a/talimatname/genel/p/ppp/ppp.kos-kur b/talimatname/genel/p/ppp/ppp.kos-kur new file mode 100644 index 000000000..d82853035 --- /dev/null +++ b/talimatname/genel/p/ppp/ppp.kos-kur @@ -0,0 +1,4 @@ +if [ -z "`grep '^pppusers:' /etc/group`" ] +then + /sbin/groupadd -g 52 pppusers +fi diff --git a/talimatname/genel/p/ppp/pppd.servis b/talimatname/genel/p/ppp/pppd.servis new file mode 100644 index 000000000..833f04897 --- /dev/null +++ b/talimatname/genel/p/ppp/pppd.servis @@ -0,0 +1,50 @@ +#!/bin/sh +# Begin $rc_base/init.d/sshd + +# Based on sysklogd script from LFS-3.1 and earlier. +# Rewritten by Gerard Beekmans - gerard@linuxfromscratch.org +# Add create user and Groups - thierryn1@hispeed.ch + +# $Id: pppd,v 1.2 2008/02/03 10:08:07 root Exp $ + +. /etc/rc.d/init.d/functions + +newgroup=pppusers +newid=52 +getent group $newgroup > /dev/null || /sbin/groupadd -g $newid $newgroup + +case "$1" in + start) + mknod /dev/ppp c 108 0 + boot_mesg "Starting PPP Daemon..." + loadproc /usr/sbin/pppd > /dev/null + ;; + + stop) + boot_mesg "Stopping PPP Daemon..." + killproc /usr/sbin/pppd + ;; + + reload) + boot_mesg "Reloading PPP Daemon..." + reloadproc /usr/sbin/pppd > /dev/null + ;; + + restart) + $0 stop + sleep 1 + $0 start + ;; + + status) + statusproc /usr/sbin/pppd + ;; + + *) + echo "Usage: $0 {start|stop|reload|restart|status}" + exit 1 + ;; +esac + +# End $rc_base/init.d/sshd + diff --git a/talimatname/genel/p/ppp/talimat b/talimatname/genel/p/ppp/talimat new file mode 100644 index 000000000..8f317b9f1 --- /dev/null +++ b/talimatname/genel/p/ppp/talimat @@ -0,0 +1,24 @@ +# Tanım: dialup ağ yapılandırması için noktadan noktaya arkaplan çalışanı +# URL: http://samba.org/ppp +# Paketçi: milisarge +# Gerekler: libpcap +# Grup: ağ + +isim=ppp +surum=2.4.7 +devir=1 + +kaynak=(http://samba.org/ftp/$isim/$isim-$surum.tar.gz + pppd.servis) + +derle() { + unset MAKEFLAGS + export CFLAGS="$CFLAGS -D_GNU_SOURCE" + cd $isim-$surum + ./configure --prefix=/usr + make + make INSTROOT=$PKG install-etcppp + make INSTROOT=$PKG install + mkdir -p $PKG/etc/rc.d/init.d/ + install -m755 ../pppd.servis $PKG/etc/rc.d/init.d/pppd +} diff --git a/talimatname/genel/p/pptp/talimat b/talimatname/genel/p/pptp/talimat new file mode 100644 index 000000000..af09bbf9f --- /dev/null +++ b/talimatname/genel/p/pptp/talimat @@ -0,0 +1,18 @@ +# Tanım: Tescilli Microsoft Noktadan Noktaya Tünel Protokolü, PPTP için istemci. +# URL: http://pptpclient.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: ppp + +isim=pptp +surum=1.7.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/pptpclient/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's|BINDIR=$(DESTDIR)/usr|BINDIR=$(DESTDIR)|' Makefile + sed -i 's|/bin/ip|/sbin/ip|g' routing.c + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/premake/talimat b/talimatname/genel/p/premake/talimat new file mode 100644 index 000000000..71e367c82 --- /dev/null +++ b/talimatname/genel/p/premake/talimat @@ -0,0 +1,17 @@ +# Tanım: A simple build configuration and project generation tool using lua +# URL: http://industriousone.com/premake +# Paketçi: milisarge +# Gerekler: + +isim=premake +surum=4.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/premake/Premake/4.3/premake-4.3-src.zip) + +derle() { + cd "$SRC/premake-$surum/build/gmake.unix" + make + cd "$SRC/premake-$surum" + install -Dm755 "bin/release/premake4" "${PKG}/usr/bin/premake4" + install -Dm644 LICENSE.txt "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/print-manager/talimat b/talimatname/genel/p/print-manager/talimat new file mode 100644 index 000000000..5a1bb7d1a --- /dev/null +++ b/talimatname/genel/p/print-manager/talimat @@ -0,0 +1,24 @@ +# Tanım: Yazıcı ayarlama aracı +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 cups kf5-kconfig kf5-kconfigwidgets kf5-kcoreaddons kf5-kdbusaddons kf5-kiconthemes kf5-ki18n kf5-kcmutils kf5-kio kf5-knotifications kf5-plasma-framework kf5-kwidgetsaddons kf5-kwindowsystem +# Grup: kde + +isim=print-manager +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/privoxy/privoxy.logrotate.d b/talimatname/genel/p/privoxy/privoxy.logrotate.d new file mode 100644 index 000000000..3f31b170f --- /dev/null +++ b/talimatname/genel/p/privoxy/privoxy.logrotate.d @@ -0,0 +1,9 @@ +/var/log/privoxy/logfile { + missingok + create 660 root privoxy + notifempty + compress + postrotate + /bin/kill -HUP `cat /var/run/privoxy.pid 2>/dev/null` 2> /dev/null || true + endscript +} diff --git a/talimatname/genel/p/privoxy/privoxy.sysusers b/talimatname/genel/p/privoxy/privoxy.sysusers new file mode 100644 index 000000000..fd8a377ca --- /dev/null +++ b/talimatname/genel/p/privoxy/privoxy.sysusers @@ -0,0 +1 @@ +u privoxy 42 "Privoxy" diff --git a/talimatname/genel/p/privoxy/talimat b/talimatname/genel/p/privoxy/talimat new file mode 100644 index 000000000..e28cb1a05 --- /dev/null +++ b/talimatname/genel/p/privoxy/talimat @@ -0,0 +1,62 @@ +# Tanım: A web proxy with advanced filtering capabilities. +# URL: https://www.privoxy.org +# Paketçi: milisarge +# Gerekler: pcre + +isim=privoxy +surum=3.0.26 +devir=1 +kaynak=(https://downloads.sourceforge.net/ijbswa/privoxy-$surum-stable-src.tar.gz + privoxy.logrotate.d + privoxy.sysusers) + +derle() { + cd "${SRC}/${isim}-${surum}-stable" + + autoheader + + autoconf + + ./configure --prefix=/usr --sysconfdir=/etc/privoxy --enable-compression + + make + + sed -i ' + + s+^confdir \.+confdir /etc/privoxy+ + + s+^logdir \.+logdir /var/log/privoxy+ + + s+^#\?user-manual .*+user-manual /usr/share/doc/privoxy/user-manual/+' config + + cd "${SRC}/${isim}-${surum}-stable" + + install -Dm644 "$SRC/privoxy.sysusers" "$PKG/usr/lib/sysusers.d/privoxy.conf" + + install -Dm644 "$SRC/privoxy.logrotate.d" "$PKG/etc/logrotate.d/privoxy" + + install -Dm755 {,"$PKG"/usr/bin/}privoxy + + install -Dm644 {,"$PKG"/usr/share/man/man1/}privoxy.1 + + install -d -o42 -g42 "$PKG"/var/log/privoxy + + install -d "$PKG"/etc/privoxy/ + + install -m644 config trust *.{action,filter} "$PKG"/etc/privoxy/ # -m0660 upstream + + find templates -type f -exec install -Dm644 '{}' "$PKG"/etc/privoxy/'{}' \; + + (d=$PKG/usr/share/doc/privoxy + + cd doc/webserver + + install -Dm644 {privoxy-,"$d"/}index.html + + install -m644 p_doc.css ../../{AUTHORS,README,ChangeLog} "$d"/ + + install -Dm644 {,"$d"/user-manual/}p_doc.css + + find user-manual developer-manual faq man-page \( -name '*.html' -o -name '*.jpg' \) -exec install -Dm644 '{}' "$d"/'{}' \;) + +} diff --git a/talimatname/genel/p/procmail/talimat b/talimatname/genel/p/procmail/talimat new file mode 100644 index 000000000..c15f4b536 --- /dev/null +++ b/talimatname/genel/p/procmail/talimat @@ -0,0 +1,20 @@ +# Tanım: Gelen postaları filtrelemek ve sıralamak için özerk bir posta işlemcisi +# URL: http://www.ring.gr.jp/archives/net/mail/procmail/ +# Paketçi: milisarge +# Gerekler: + +isim=procmail +surum=3.22 +devir=1 + +kaynak=(http://www.ring.gr.jp/archives/net/mail/$isim/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + sed -i 's/getline/get_line/' src/*.[ch] + make BASENAME=$PKG LOCKINGTEST=$PKG/tmp MANDIR=$PKG/usr/share/man install + make BASENAME=$PKG install-suid + +} diff --git a/talimatname/genel/p/proftpd/proftpd.conf b/talimatname/genel/p/proftpd/proftpd.conf new file mode 100644 index 000000000..a5bf6bf7c --- /dev/null +++ b/talimatname/genel/p/proftpd/proftpd.conf @@ -0,0 +1,55 @@ +# This is a basic ProFTPD configuration file +# It establishes a single server and a single anonymous login. + +ServerName "ProFTPD Default Installation" +ServerType standalone +DefaultServer on + +# Port 21 is the standard FTP port. +Port 21 +# Umask 022 is a good standard umask to prevent new dirs and files +# from being group and world writable. +Umask 022 + +# To prevent DoS attacks, set the maximum number of child processes +# to 30. If you need to allow more than 30 concurrent connections +# at once, simply increase this value. Note that this ONLY works +# in standalone mode, in inetd mode you should use an inetd server +# that allows you to limit maximum number of processes per service + +MaxInstances 30 + +# Set the user and group that the server normally runs at. +User proftpd +Group proftpd + +# To cause every FTP user to be "jailed" (chrooted) into their home +# directory, uncomment this line. +#DefaultRoot ~ + + +# Normally, files should be overwritable. +<Directory /*> + AllowOverwrite on +</Directory> + +# A basic anonymous configuration, no upload directories. +<Anonymous ~proftpd> + User proftpd + Group proftpd + # Clients should be able to login with "anonymous" as well as "proftpd" + UserAlias anonymous proftpd + + # Limit the maximum number of anonymous logins + MaxClients 10 + + # 'welcome.msg' should be displayed at login, and '.message' displayed + # in each newly chdired directory. + DisplayLogin welcome.msg + DisplayChdir .message + + # Limit WRITE everywhere in the anonymous chroot + <Limit WRITE> + DenyAll + </Limit> +</Anonymous> diff --git a/talimatname/genel/p/proftpd/proftpd.kos-kur b/talimatname/genel/p/proftpd/proftpd.kos-kur new file mode 100644 index 000000000..30302f628 --- /dev/null +++ b/talimatname/genel/p/proftpd/proftpd.kos-kur @@ -0,0 +1,7 @@ +groupadd -g 46 proftpd +useradd -c proftpd -d /srv/ftp -g proftpd \ + -s /usr/bin/proftpdshell -u 46 proftpd + +install -v -d -m775 -o proftpd -g proftpd /srv/ftp +ln -v -s /bin/false /usr/bin/proftpdshell +echo /usr/bin/proftpdshell >> /etc/shells diff --git a/talimatname/genel/p/proftpd/talimat b/talimatname/genel/p/proftpd/talimat new file mode 100644 index 000000000..7149aae0c --- /dev/null +++ b/talimatname/genel/p/proftpd/talimat @@ -0,0 +1,32 @@ +# Tanım: Bir ağ üzerinden büyük dosya arşivlerine hizmet etmek için güvenli ve son derece yapılandırılabilir bir FTP arka plan programı +# URL: ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5a.tar.gz +# Paketçi: milisarge +# Gerekler: libcap pam mariadb openssl pcre postgresql + +isim=proftpd +surum=1.3.5a +devir=1 +kaynak=(ftp://ftp.proftpd.org/distrib/source/$isim-$surum.tar.gz + proftpd.conf) + +derle() { + +cd $isim-$surum + +source /etc/blfs-bootscripts +wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 +tar xvf $scripts-$scriptsversion.tar.bz2 + + +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/run + +make +make DESTDIR=$PKG install + +install -v -m755 -d $PKG/etc +cp -v $SRC/proftpd.conf $PKG/etc + +cd $scripts-$scriptsversion +make DESTDIR=$PKG install-proftpd + +} diff --git a/talimatname/genel/p/proj/talimat b/talimatname/genel/p/proj/talimat new file mode 100644 index 000000000..625627e11 --- /dev/null +++ b/talimatname/genel/p/proj/talimat @@ -0,0 +1,24 @@ +# Tanım: Kartografik Projeksiyonlar kütüphanesi +# URL: http://trac.osgeo.org/proj/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: kütüphane + +isim=proj +surum=4.9.3 +devir=1 +kaynak=(https://github.com/OSGeo/proj.4/archive/$surum.tar.gz::$isim-$surum.tar.gz + http://download.osgeo.org/proj/proj-datumgrid-1.6.zip) + +derle() { + bsdtar -p -o -C "${SRC}"/proj.4-$surum/nad -xf "${DERLEME_KAYNAKDIZIN}"/proj-datumgrid-1.6.zip + cd "${SRC}"/$isim.4-$surum + + autoreconf -if + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install + rm -rf "${PKG}"/usr/share/man + install -Dm644 COPYING "${PKG}"/usr/share/licenses/$isim/LICENSE +} + diff --git a/talimatname/genel/p/proot/talimat b/talimatname/genel/p/proot/talimat new file mode 100644 index 000000000..c0ef42113 --- /dev/null +++ b/talimatname/genel/p/proot/talimat @@ -0,0 +1,23 @@ +# Tanım: chroot,mount --bind ve binfmt_misc ayrıcalık/kurulum olmaksızın +# URL: http://proot.me +# Paketçi: Cihan_Alkan +# Gerekler: talloc python-docutils libxslt +# Grup: sistem + +isim=proot +surum=git +devir=1 +kaynak=() + +derle() { + adres="https://github.com/proot-me/PRoot" + git_indir ${adres} ${isim} + cd $SRC/${isim}/src + + make -f GNUmakefile + cd ../ + install -m755 -d "${PKG}"/usr/bin + install -m755 $SRC/${isim}/src/${isim} "${PKG}"/usr/bin + install -m755 -d "${PKG}"/usr/share/man/man1/ + install -m644 -T $SRC/${isim}/doc/proot/man.1 "${PKG}"/usr/share/man/man1/${isim}.1 +} diff --git a/talimatname/genel/p/protobuf-c/talimat b/talimatname/genel/p/protobuf-c/talimat new file mode 100644 index 000000000..a9e8a9ef7 --- /dev/null +++ b/talimatname/genel/p/protobuf-c/talimat @@ -0,0 +1,19 @@ +# Tanım: C'de protokol arabellekleri uygulaması +# URL: https://github.com/protobuf-c/protobuf-c +# Paketçi: Cihan_Alkan +# Gerekler: protobuf +# Grup: kütüphane + +isim=protobuf-c +surum=1.3.0 +devir=1 + +kaynak=(https://github.com/protobuf-c/protobuf-c/releases/download/v$surum/$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr --disable-static + make + make DESTDIR="$PKG" install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/protobuf/talimat b/talimatname/genel/p/protobuf/talimat new file mode 100644 index 000000000..46ea8c351 --- /dev/null +++ b/talimatname/genel/p/protobuf/talimat @@ -0,0 +1,17 @@ +# Tanım: Google veri değişim biçim aracı +# URL: http://code.google.com/p/protobuf/ +# Paketçi: milisarge +# Gerekler: python-setuptools clang unzip +# Grup: + +isim=protobuf +surum=3.5.1 +devir=1 + +kaynak=(https://github.com/google/protobuf/archive/v3.5.1.tar.gz::protobuf-$surum.tar.gz) +derle() { +cd ${isim}-$surum +./autogen.sh +./configure --prefix=/usr --disable-static +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/prun/talimat b/talimatname/genel/p/prun/talimat new file mode 100644 index 000000000..87886c9ed --- /dev/null +++ b/talimatname/genel/p/prun/talimat @@ -0,0 +1,25 @@ +# Tanım: Dağıtılmış cron ve iş zamanlayıcı +# URL: https://github.com/abudnik/prun +# Paketçi: Cihan_Alkan +# Gerekler: cmake boost python3 +# Grup: sistem + +isim=prun +surum=git +devir=1 +kaynak=() + +derle() { + adres1="https://github.com/abudnik/prun.git" + git_indir ${adres1} ${isim} + cd ${isim} + + cmake -DCMAKE_INSTALL_PREFIX=/usr -DRelease=true . + make + make DESTDIR="$PKG" install + mkdir -p $PKG/etc/rc.d + mv $PKG/etc/init.d $PKG/etc/rc.d/ + mv $PKG/etc/rc.d/init.d/prun-master.init $PKG/etc/rc.d/init.d/prun-master + mv $PKG/etc/rc.d/init.d/prun-worker.init $PKG/etc/rc.d/init.d/prun-worker +} + diff --git a/talimatname/genel/p/psi/talimat b/talimatname/genel/p/psi/talimat new file mode 100644 index 000000000..b75d9068b --- /dev/null +++ b/talimatname/genel/p/psi/talimat @@ -0,0 +1,22 @@ +# Tanım: Psi qt tabanlı xmpp mesajlaşma aracı +# URL: http://psi-im.org/ +# Paketçi: milisarge +# Gerekler: qca-qt5 qt5 + +isim=psi +surum=1.0 +devir=1 +kaynak=(https://sourceforge.net/projects/psi/files/Psi/1.0/$isim-$surum.tar.xz) + +derle() { + cd psi-$surum + ./configure --prefix=/usr \ + --libdir=/usr/lib \ + --enable-whiteboarding \ + --qtselect=5 + sed -e 's|/usr/X11R6/include|/usr/include/X11|g' -i Makefile + make + make INSTALL_ROOT=$PKG install + install -D -m 0644 $PKG/usr/share/icons/hicolor/48x48/apps/psi.png $PKG/usr/share/pixmaps/psi.png + rm -rf $(find $PKG -type f -name 'COPYING') $(find $PKG -type f -name 'README') +} diff --git a/talimatname/genel/p/psutil/talimat b/talimatname/genel/p/psutil/talimat new file mode 100644 index 000000000..1fcd23fc7 --- /dev/null +++ b/talimatname/genel/p/psutil/talimat @@ -0,0 +1,14 @@ +# Tanım: Çalışan süreçler ve sistem kullanımı hakkında bilgi almak için kütüphane +# URL: https://github.com/giampaolo/psutil +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=psutil +surum=3.1.1 +devir=1 +kaynak=(https://pypi.python.org/packages/source/p/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + python setup.py install -O1 --prefix='/usr' --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/pth/talimat b/talimatname/genel/p/pth/talimat new file mode 100644 index 000000000..5593825bc --- /dev/null +++ b/talimatname/genel/p/pth/talimat @@ -0,0 +1,20 @@ +# Tanım: Unix platformları için çok taşınabilir bir POSIX / ANSI-C tabanlı kitaplık içerir +# URL: http://www.gnu.org/software/pth/ +# Paketçi: milisarge +# Gerekler: + +isim=pth +surum=2.0.7 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +sed -i 's#$(LOBJS): Makefile#$(LOBJS): pth_p.h Makefile#' Makefile.in +./configure --prefix=/usr \ +--mandir=/usr/share/man \ +--disable-static +make +make -j1 DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/ptlib/talimat b/talimatname/genel/p/ptlib/talimat new file mode 100644 index 000000000..693459e88 --- /dev/null +++ b/talimatname/genel/p/ptlib/talimat @@ -0,0 +1,20 @@ +# Tanım: Uzun yıllar önce PWLib olarak ortaya çıkmış bir sınıf kitaplığı. +# URL: http://ftp.gnu.org/gun/pth +# Paketçi: milisarge +# Gerekler: alsa-lib expat pulseaudio + +isim=ptlib +surum=2.10.11 +devir=1 + +kaynak=(ftp://ftp.gnome.org/pub/GNOME/sources/$isim/${surum%.*}/$isim-$surum.tar.xz + http://www.linuxfromscratch.org/patches/blfs/svn/ptlib-$surum-bison_fixes-1.patch) + +derle() { +cd $isim-$surum +patch -Np1 -i ../ptlib-$surum-bison_fixes-1.patch +./configure --prefix=/usr +make +make DESTDIR=$PKG install +chmod -v 755 $PKG/usr/lib/libpt.so.2.10.11 +} diff --git a/talimatname/genel/p/pugixml/talimat b/talimatname/genel/p/pugixml/talimat new file mode 100644 index 000000000..487eb4aa7 --- /dev/null +++ b/talimatname/genel/p/pugixml/talimat @@ -0,0 +1,21 @@ +# Tanım: XPath desteği ile hafif, basit ve hızlı C ++ ayrıştırıcısı. +# URL: http://pugixml.org +# Paketçi: Cihan Alkan +# Gerekler: cmake + +isim=pugixml +surum=1.8 +devir=1 +kaynak=(http://github.com/zeux/pugixml/releases/download/v$surum/pugixml-$surum.tar.gz) + +derle() { +mkdir -p build + cd build + cmake "$SRC/pugixml-$surum" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_SHARED_LIBS=ON +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/pulseaudio/pulseaudio.desktop b/talimatname/genel/p/pulseaudio/pulseaudio.desktop new file mode 100644 index 000000000..392443307 --- /dev/null +++ b/talimatname/genel/p/pulseaudio/pulseaudio.desktop @@ -0,0 +1,87 @@ +[Desktop Entry] +Version=1.0 +Name=PulseAudio Sound System +Name[as]=PulseAudio শব্দ ব্যৱস্থা +Name[bn_IN]=PulseAudio শব্দ ব্যবস্থা +Name[ca]=Sistema de so PulseAudio +Name[cs]=Zvukový systém PulseAudio +Name[de]=PulseAudio Sound System +Name[de_CH]=PulseAudio Sound System +Name[el]=Σύστημα ήχου PulseAudio +Name[es]=Sistema de Sonido PulseAudio +Name[fi]=PulseAudio-äänijärjestelmä +Name[fr]=Système de son PulseAudio +Name[gu]=PulseAudio સાઉન્ડ સિસ્ટમ +Name[he]=מערכת הקול PulseAudio +Name[hi]=पल्सऑडियो ध्वनि तंत्र +Name[hu]=PulseAudio hangrendszer +Name[id]=Sistem Suara PulseAudio +Name[it]=Sistema sonoro PulseAudio +Name[ja]=PulseAudio サウンドシステム +Name[kn]=PulseAudio ಧ್ವನಿ ವ್ಯವಸ್ಥೆ +Name[ko]=펄스오디오 사운드 시스템 +Name[ml]=PulseAudio സൌണ്ട് സിസ്റ്റം +Name[mr]=PulseAudio आवाज प्रणाली +Name[nl]=PulseAudio geluidssysteem +Name[or]=PulseAudio ଧ୍ୱନି ତନ୍ତ୍ର +Name[pa]=ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਸਿਸਟਮ +Name[pl]=System dźwięku PulseAudio +Name[pt]=Sistema de Som PulseAudio +Name[pt_BR]=Sistema de som PulseAudio +Name[ru]=Звуковая система PulseAudio +Name[sk]=Zvukový systém PulseAudio +Name[sr]=PulseAudio звучни систем +Name[sr@latin]=PulseAudio zvučni sistem +Name[sv]=PulseAudio ljudsystem +Name[ta]=பள்ஸ் ஆடியோ ஒலி கணினி +Name[te]=PulseAudio శబ్దపు సిస్టమ్ +Name[tr]=PulseAudio Ses Sistemi +Name[uk]=Звукова система PulseAudio +Name[zh_CN]=PulseAudio 声音系统 +Name[zh_TW]=PulseAudio 音效系統 +Comment=Start the PulseAudio Sound System +Comment[as]=PulseAudio শব্দ ব্যৱস্থা আৰম্ভ কৰা হ'ব +Comment[bn_IN]=PulseAudio শব্দ ব্যবস্থা আরম্ভ করা হবে +Comment[ca]=Inicialitza el sistema de so PulseAudio +Comment[cs]=Spustit zvukový systém PulseAudio +Comment[de]=Das PulseAudio Sound System starten +Comment[de_CH]=Das PulseAudio Sound System starten +Comment[el]=Έναρξη του συστήματος ήχου PulseAudio +Comment[es]=Iniciar el Sistema de Sonido PulseAudio +Comment[fi]=Käynnistä PulseAudio-äänijärjestelmä +Comment[fr]=Démarrer le système de son PulseAudio +Comment[gu]=PulseAudio સાઉન્ડ સિસ્ટમને શરૂ કરો +Comment[he]=התחל את מערכת הקול PulseAudio +Comment[hi]=पल्सऑडियो ध्वनि तंत्र प्रारंभ करें +Comment[hu]=A PulseAudio hangrendszer elindítása +Comment[id]=Memulai Sistem Suara PulseAudio +Comment[it]=Avvia il sistema sonoro PulseAudio +Comment[ja]=PulseAudio サウンドシステムを開始 +Comment[kn]=PulseAudio ಧ್ವನಿ ವ್ಯವಸ್ಥೆಯನ್ನು ಆರಂಭಿಸಿ +Comment[ko]=펄스오디오 사운드 시스템을 시작합니다 +Comment[ml]=PulseAudio സൌണ്ട് സിസ്റ്റം ആരംഭിക്കുക +Comment[mr]=PulseAudio आवाज प्रणाली सुरू करा +Comment[nl]=Start het PulseAudio geluidssysteem +Comment[or]=PulseAudio ଧ୍ୱନି ତନ୍ତ୍ରକୁ ଆରମ୍ଭ କରନ୍ତୁ +Comment[pa]=ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਸਿਸਟਮ ਚਲਾਓ +Comment[pl]=Uruchomienie systemu dźwięku PulseAudio +Comment[pt]=Inciar o Sistema de Som PulseAudio +Comment[pt_BR]=Iniciar o sistema de som PulseAudio +Comment[ru]=Запуск звуковой системы PulseAudio +Comment[sk]=Spustenie zvukového systému PulseAudio +Comment[sr]=Покрени PulseAudio звучни систем +Comment[sr@latin]=Pokreni PulseAudio zvučni sistem +Comment[sv]=Starta ljudsystemet PulseAudio +Comment[ta]=பள்ஸ் ஆடியோ ஒலி கணினியை துவக்கவும +Comment[te]=PulseAudio శబ్దపు సిస్టమ్‌ను ప్రారంభించుము +Comment[tr]=PulseAudio Ses Sistemini Başlat +Comment[uk]=Запустити звукову систему PulseAudio +Comment[zh_CN]=启动 PulseAudio 声音系统 +Comment[zh_TW]=啟動 PulseAudio 音效系統 +Exec=pulseaudio -D +Terminal=false +Type=Application +Categories= +GenericName= +X-GNOME-Autostart-Phase=Initialization +X-KDE-autostart-phase=1 diff --git a/talimatname/genel/p/pulseaudio/pulseaudio.kur-kos b/talimatname/genel/p/pulseaudio/pulseaudio.kur-kos new file mode 100644 index 000000000..de81e1c2c --- /dev/null +++ b/talimatname/genel/p/pulseaudio/pulseaudio.kur-kos @@ -0,0 +1,2 @@ +#!/bin/bash +cp -f /sources/milis.git/talimatname/genel/p/pulseaudio/pulseaudio.desktop /etc/xdg/autostart/pulseaudio.desktop diff --git a/talimatname/genel/p/pulseaudio/talimat b/talimatname/genel/p/pulseaudio/talimat new file mode 100644 index 000000000..e95cc7ba9 --- /dev/null +++ b/talimatname/genel/p/pulseaudio/talimat @@ -0,0 +1,42 @@ +# Tanım: Özellikli, genel amaçlı bir ses sunucusu +# URL: http://www.pulseaudio.org +# Paketçi: milisarge +# Gerekler: fftw intltool sbc json-c bluez attr libasyncns tdb jack avahi soxr libsndfile alsa-lib dbus glib libcap openssl speex + +isim=pulseaudio +surum=11.1 +devir=1 + +kaynak=(http://freedesktop.org/software/pulseaudio/releases/pulseaudio-$surum.tar.xz + pulseaudio.desktop) + +derle() { + + cd pulseaudio-$surum + + #NOCONFIGURE=1 ./bootstrap.sh + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --with-udev-rules-dir=/usr/lib/udev/rules.d \ + --with-pulsedsp-location='/usr/lib/pulseaudio' \ + --with-database=tdb \ + --disable-tcpwrap \ + --disable-rpath \ + --disable-bluez4 \ + --disable-samplerate \ + --disable-default-build-tests + + make + make DESTDIR=$PKG install + mkdir -p $PKG/usr/share/icons/hicolor/scalable/devices + for size in 16 22 32 48 64 128; do + mkdir -p $PKG/usr/share/icons/hicolor/${size}x${size}/{apps,devices} + ln -s ../apps/pulseaudio.png $PKG/usr/share/icons/hicolor/${size}x${size}/devices/audio-backend-pulseaudio.png + done + mkdir -p $PKG/etc/xdg/autostart + cp -f $SRC/pulseaudio.desktop $PKG/etc/xdg/autostart/ + rm -f $PKG/etc/dbus-1/system.d/pulseaudio-system.conf +} diff --git a/talimatname/genel/p/pv/talimat b/talimatname/genel/p/pv/talimat new file mode 100644 index 000000000..2c875cf61 --- /dev/null +++ b/talimatname/genel/p/pv/talimat @@ -0,0 +1,17 @@ +# Tanım: Pipeline veri akışını izlemeye yarayan konsol uygulaması +# URL: http://www.ivarch.com/programs/pv.shtml +# Paketçi: milisarge +# Gerekler: + +isim=pv +surum=1.6.6 +devir=1 +kaynak=(https://www.ivarch.com/programs/sources/pv-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + ./configure --prefix=/usr --mandir=/usr/share/man + make + make DESTDIR="$PKG" install + install -Dm0644 doc/COPYING "$PKG/usr/share/licenses/$isim/COPYING" +} diff --git a/talimatname/genel/p/pyattrs/talimat b/talimatname/genel/p/pyattrs/talimat new file mode 100644 index 000000000..7f636f3d1 --- /dev/null +++ b/talimatname/genel/p/pyattrs/talimat @@ -0,0 +1,25 @@ +# Tanım: Demirbaşsız nitelikler. +# URL: https://attrs.readthedocs.org/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pyattrs +surum=17.4.0 +devir=1 +kaynak=(https://pypi.io/packages/source/a/attrs/attrs-$surum.tar.gz) + +derle() { + + cp -a attrs-$surum{,-py3} + + cd "$SRC"/attrs-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/attrs-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pybitmessage/talimat b/talimatname/genel/p/pybitmessage/talimat new file mode 100644 index 000000000..022c31eb0 --- /dev/null +++ b/talimatname/genel/p/pybitmessage/talimat @@ -0,0 +1,62 @@ +# Tanım: Şifreli mesajları başka bir kişiye veya birçok aboneye göndermek için merkezi olmayan ve güvenilir P2P iletişim protokolü +# URL: https://github.com/Bitmessage/PyBitmessage +# Paketçi: Oltulu +# Gerekler: python sqlite python-msgpack qt4 python-qt4 +# Grup: ağ güvenlik + +isim=pybitmessage +surum=0.6.2 +devir=1 +kaynak=(https://github.com/Bitmessage/PyBitmessage/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + +# Başlatıcı +cat > $SRC/pybitmessage.sh << "EOF" && +#!/bin/sh +cd /usr/share/pybitmessage +exec python2 bitmessagemain.py +EOF + + cd "$SRC/PyBitmessage-$surum" + + echo 'Fixing Python version...' + find . -type f -print0 | xargs -0 sed -i 's#/usr/bin/python#/usr/bin/python2#g' + find . -type f -print0 | xargs -0 sed -i 's#/usr/bin/env python#/usr/bin/env python2#g' + + cd src/bitmsghash + make + + cd "$SRC/PyBitmessage-$surum" + + echo 'Paylaşılan dosyaları yükleniyor...' + mkdir -p "$PKG"/usr/share/$isim + cp -R src/* "$PKG"/usr/share/$isim + + echo 'Masaüstü simgelerini yükleniyor...' + install -D -m644 src/images/can-icon-24px.png "$PKG/usr/share/icons/hicolor/24x24/apps/$isim.png" + install -D -m644 desktop/can-icon.svg "$PKG/usr/share/icons/hicolor/scalable/apps/$isim.svg" + install -D -m644 desktop/can-icon.svg "$PKG/usr/share/pixmaps/$isim.svg" + + echo 'Çalıştırılabilir dosya yükleniyor...' + install -D -m755 $SRC/pybitmessage.sh "$PKG/usr/bin/$isim" + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Type=Application +Name=PyBitmessage +GenericName=Bitmesaj İstemcisi +Comment=Şifreli mesaj gönder +Exec=pybitmessage %F +Icon=pybitmessage +Terminal=false +Categories=Office;Email; +EOF + + echo 'Man sayfası yükleniyor...' + mkdir -p "$PKG/usr/share/man/man1" + install -m644 man/pybitmessage.1.gz "$PKG/usr/share/man/man1" + +} diff --git a/talimatname/genel/p/pycertifi/talimat b/talimatname/genel/p/pycertifi/talimat new file mode 100644 index 000000000..f323b0577 --- /dev/null +++ b/talimatname/genel/p/pycertifi/talimat @@ -0,0 +1,24 @@ +# Tanım: Mozilla'nın CA Paketini sağlamak için Python paketi +# URL: http://pypi.python.org/pypi/certifi +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pycertifi +surum=2018.1.18 +devir=1 + +kaynak=(https://pypi.python.org/packages/15/d4/2f888fc463d516ff7bf2379a4e9a552fef7f22a94147655d9b1097108248/certifi-2018.1.18.tar.gz) + +derle() { + cp -a certifi-$surum{,-py3} + + cd "$SRC"/certifi-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/certifi-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build +} diff --git a/talimatname/genel/p/pychardet/talimat b/talimatname/genel/p/pychardet/talimat new file mode 100644 index 000000000..79e49ddf3 --- /dev/null +++ b/talimatname/genel/p/pychardet/talimat @@ -0,0 +1,24 @@ +# Tanım: Otomatik algılama karakteri kodlaması için Python modülü +# URL: https://pypi.io/packages/source/c/chardet +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pychardet +surum=3.0.4 +devir=1 + +kaynak=(https://pypi.io/packages/source/c/chardet/chardet-${surum}.tar.gz) + +derle() { + cp -a chardet-$surum{,-py3} + + cd "$SRC"/chardet-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/chardet-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build +} diff --git a/talimatname/genel/p/pycharm/talimat b/talimatname/genel/p/pycharm/talimat new file mode 100644 index 000000000..95d207c45 --- /dev/null +++ b/talimatname/genel/p/pycharm/talimat @@ -0,0 +1,42 @@ +# Tanım: Profesyonel Geliştiriciler için Python IDE +# URL: http://www.jetbrains.com/pycharm/ +# Paketçi: Oltulu +# Gerekler: giflib glibc openjdk freefont-ttf python3-setuptools python-setuptools +# Grup: geliştirme + +isim=pycharm +surum=2017.3.1 +devir=1 +kaynak=(https://download.jetbrains.com/python/pycharm-community-${surum}.tar.gz) + +derle() { + cd pycharm-community-${surum} + + python helpers/pydev/setup_cython.py build_ext --inplace + python3 helpers/pydev/setup_cython.py build_ext --inplace + rm -rf bin/fsnotifier{,-arm} lib/libpty/linux/x86 + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Version=1.0 +Type=Application +Name=PyCharm Topluluk Sürümü +Comment=Profesyonel Geliştiriciler için Python IDE +Exec=/usr/bin/pycharm %f +Icon=pycharm +Terminal=false +StartupNotify=true +StartupWMClass=jetbrains-pycharm-ce +Categories=Development;IDE;Python; +EOF + + install -dm 755 "${PKG}"/usr/{bin,share/{applications,doc,licenses,pixmaps,pycharm}} + cp -dr --no-preserve='ownership' bin helpers lib plugins "${PKG}"/usr/share/pycharm/ + cp -dr --no-preserve='ownership' help "${PKG}"/usr/share/doc/pycharm/ + cp -dr --no-preserve='ownership' license "${PKG}"/usr/share/licenses/pycharm/ + ln -s /usr/share/pycharm/bin/pycharm.sh $PKG/usr/bin/pycharm + ln -s /usr/share/pycharm/bin/pycharm.png "${PKG}"/usr/share/pixmaps/ + +} diff --git a/talimatname/genel/p/pycparser/talimat b/talimatname/genel/p/pycparser/talimat new file mode 100644 index 000000000..439c6bd5b --- /dev/null +++ b/talimatname/genel/p/pycparser/talimat @@ -0,0 +1,20 @@ +# Tanım: Pythonda yazılmış C ayrıştırıcı and AST üretici +# URL: https://github.com/eliben/pycparser +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=pycparser +surum=2.17 +devir=1 +kaynak=(https://github.com/eliben/$isim/archive/release_v$surum.zip::$isim-$surum.zip) + +derle() { + cd $isim-release_v$surum + /usr/bin/python setup.py build + + cd pycparser + /usr/bin/python _build_tables.py + cd - + + /usr/bin/python setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/pycups/talimat b/talimatname/genel/p/pycups/talimat new file mode 100644 index 000000000..283448557 --- /dev/null +++ b/talimatname/genel/p/pycups/talimat @@ -0,0 +1,21 @@ +# Tanım: Python CUPS Bağlamaları +# URL: http://cyberelk.net/tim/software/pycups/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pycups +surum=1.9.73 +devir=1 + +kaynak=(http://cyberelk.net/tim/data/${isim}/${isim}-${surum}.tar.bz2) + +derle() { + cp -a ${isim}-${surum} ${isim}-${surum}-python3 + cd ${isim}-${surum} + python2 setup.py build + python2 setup.py install --root="${PKG}" --optimize=1 + cd "${SRC}"/${isim}-${surum}-python3 + python3 setup.py build + python3 setup.py install --root="${PKG}" --optimize=1 +} diff --git a/talimatname/genel/p/pycurl/talimat b/talimatname/genel/p/pycurl/talimat new file mode 100644 index 000000000..bad2c53ab --- /dev/null +++ b/talimatname/genel/p/pycurl/talimat @@ -0,0 +1,25 @@ +# Tanım: Libcurl için bir Python arabirimi +# URL: http://pycurl.sourceforge.net/ +# Paketçi: Oltulu +# Gerekler: python python-setuptools python3 python3-setuptools +# Grup: kütüphane + +isim=pycurl +surum=7.43.0.1 +devir=1 +kaynak=(https://github.com/pycurl/pycurl/archive/REL_${surum//./_}.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd $isim-REL_7_43_0_1 + make + python3 setup.py build --with-ssl + python3 setup.py install -O1 --root="$PKG" + install -D -m644 COPYING-MIT "$PKG"/usr/share/licenses/$isim/LICENSE + + make + python2 setup.py build --with-ssl + python2 setup.py install -O1 --root="$PKG" + install -D -m644 COPYING-MIT "$PKG"/usr/share/licenses/$isim/LICENSE + +} diff --git a/talimatname/genel/p/pydateutil/talimat b/talimatname/genel/p/pydateutil/talimat new file mode 100644 index 000000000..45aa78eb9 --- /dev/null +++ b/talimatname/genel/p/pydateutil/talimat @@ -0,0 +1,25 @@ +# Tanım: Standart datetime modülüne güçlü eklentiler sağlar +# URL: https://github.com/dateutil/dateutil +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools python-six python3-six +# Grup: kütüphane + +isim=pydateutil +surum=2.6.1 +devir=1 +kaynak=(https://github.com/dateutil/dateutil/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cp -a dateutil-$surum{,-py3} + + cd "$SRC"/dateutil-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/dateutil-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pydbus/talimat b/talimatname/genel/p/pydbus/talimat new file mode 100644 index 000000000..67fdff2aa --- /dev/null +++ b/talimatname/genel/p/pydbus/talimat @@ -0,0 +1,22 @@ +# Tanım: Pythonic DBus kitaplığı +# URL: https://github.com/LEW21/pydbus +# Paketçi: Oltulu +# Gerekler: python python3 python-setuptools python3-setuptools + +isim=pydbus +surum=0.6.0 +devir=1 +kaynak=(https://github.com/LEW21/pydbus/archive/v$surum.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd $SRC/pydbus-$surum + python3 setup.py \ + install \ + --root="${PKG}" \ + --optimize=1 + + python2 setup.py \ + install \ + --root="${PKG}" \ + --optimize=1 +} diff --git a/talimatname/genel/p/pydecorator/talimat b/talimatname/genel/p/pydecorator/talimat new file mode 100644 index 000000000..9f06b02aa --- /dev/null +++ b/talimatname/genel/p/pydecorator/talimat @@ -0,0 +1,23 @@ +# Tanım: Python Decorator modulü +# URL: http://pypi.python.org/pypi/decorator +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pydecorator +surum=4.2.1 +devir=1 + +kaynak=(https://pypi.python.org/packages/70/f1/cb9373195639db13063f55eb06116310ad691e1fd125e6af057734dc44ea/decorator-4.2.1.tar.gz) + +derle() { + cp -a decorator-$surum{,-py3} + cd "$SRC"/decorator-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 + + cd "$SRC"/decorator-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/pyenchant/talimat b/talimatname/genel/p/pyenchant/talimat new file mode 100644 index 000000000..60ec2985a --- /dev/null +++ b/talimatname/genel/p/pyenchant/talimat @@ -0,0 +1,26 @@ +# Tanım: PyEnchant, Enchant kitaplığına dayanan Python için bir yazım denetimi kitaplığıdır +# URL: https://pypi.python.org/pypi/pyenchant +# Paketçi: Cihan_Alkan +# Gerekler: python-setuptools python3-setuptools python python3 enchant +# Grup:kütüphane + +isim=pyenchant +surum=2.0.0 +devir=1 +kaynak=(https://github.com/rfk/pyenchant/archive/v${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cp -r pyenchant-${surum} pyenchant3-${surum} + + cd ${SRC}/pyenchant-${surum} + + python setup.py build + python setup.py install --root=${PKG} --optimize=1 + + cd ${SRC}/pyenchant3-${surum} + + python3 setup.py build + python3 setup.py install --root=${PKG} --optimize=1 + +} diff --git a/talimatname/genel/p/pygments/talimat b/talimatname/genel/p/pygments/talimat new file mode 100644 index 000000000..50e3ddd1f --- /dev/null +++ b/talimatname/genel/p/pygments/talimat @@ -0,0 +1,25 @@ +# Tanım: Python ile yazılmış basit bir pythonic şablon dili +# URL: http://jinja.pocoo.org/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pygments +surum=2.2.0 +devir=1 +kaynak=(https://pypi.org/packages/source/P/Pygments/Pygments-$surum.tar.gz) + +derle() { + + cp -a Pygments-$surum{,-py3} + + cd "$SRC"/Pygments-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/Pygments-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pyidna/talimat b/talimatname/genel/p/pyidna/talimat new file mode 100644 index 000000000..1682edcb6 --- /dev/null +++ b/talimatname/genel/p/pyidna/talimat @@ -0,0 +1,24 @@ +# Tanım: Uygulamalardaki Uluslararası Alan Adları (IDNA) +# URL: https://github.com/kjd/idna +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pyidna +surum=2.6 +devir=1 + +kaynak=(https://pypi.io/packages/source/i/idna/idna-$surum.tar.gz) + +derle() { + cp -a idna-$surum{,-py3} + + cd "$SRC"/idna-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/idna-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build +} diff --git a/talimatname/genel/p/pyjinja/talimat b/talimatname/genel/p/pyjinja/talimat new file mode 100644 index 000000000..f1f814404 --- /dev/null +++ b/talimatname/genel/p/pyjinja/talimat @@ -0,0 +1,25 @@ +# Tanım: Python ile yazılmış basit bir pythonic şablon dili +# URL: http://jinja.pocoo.org/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools pymarkupsafe +# Grup: kütüphane + +isim=pyjinja +surum=2.10 +devir=1 +kaynak=(https://pypi.org/packages/source/J/Jinja2/Jinja2-$surum.tar.gz) + +derle() { + + cp -a Jinja2-$surum{,-py3} + + cd "$SRC"/Jinja2-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/Jinja2-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pymarkupsafe/talimat b/talimatname/genel/p/pymarkupsafe/talimat new file mode 100644 index 000000000..8584860d1 --- /dev/null +++ b/talimatname/genel/p/pymarkupsafe/talimat @@ -0,0 +1,25 @@ +# Tanım: Python için bir XML/HTML/XHTML İşaretleme güvenli dize uygular +# URL: http://pypi.python.org/pypi/MarkupSafe +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pymarkupsafe +surum=1.0 +devir=1 +kaynak=(https://pypi.io/packages/source/M/MarkupSafe/MarkupSafe-${surum}.tar.gz) + +derle() { + + cp -a MarkupSafe-$surum{,-py3} + + cd "$SRC"/MarkupSafe-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/MarkupSafe-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pympv/talimat b/talimatname/genel/p/pympv/talimat new file mode 100644 index 000000000..756a8d3b0 --- /dev/null +++ b/talimatname/genel/p/pympv/talimat @@ -0,0 +1,16 @@ +# Tanım: Mpv media player'a Python arabirimi +# URL: https://github.com/jaseg/python-mpv +# Paketçi: Cihan_Alkan +# Gerekler: mpv python python-setuptools python3 python3-setuptools +# Grup: kütüphane + +isim=pympv +surum=0.3.8 +devir=1 +kaynak=(https://github.com/jaseg/python-mpv/archive/v0.3.8.tar.gz::$isim-$surum.tar.gz) + +derle() { +cd python-mpv-${surum} + python2 setup.py install --root="$PKG/" --optimize=1 + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/p/pynetworkx/talimat b/talimatname/genel/p/pynetworkx/talimat new file mode 100644 index 000000000..8442bc177 --- /dev/null +++ b/talimatname/genel/p/pynetworkx/talimat @@ -0,0 +1,23 @@ +# Tanım: Karmaşık ağların yapısı, dinamikleri ve işlevlerinin oluşturulması, manipülasyonu ve çalışılması için Python paketi. +# URL: http://networkx.github.io +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools pydecorator +# Grup: kütüphane + +isim=pynetworkx +surum=2.1 +devir=1 + +kaynak=(https://github.com/networkx/networkx/archive/networkx-$surum.tar.gz::networkx-$surum.tar.gz) + +derle() { + cp -a networkx-networkx-$surum{,-py3} + cd "$SRC"/networkx-networkx-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 + + cd "$SRC"/networkx-networkx-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/pypam/talimat b/talimatname/genel/p/pypam/talimat new file mode 100644 index 000000000..2597b3e04 --- /dev/null +++ b/talimatname/genel/p/pypam/talimat @@ -0,0 +1,19 @@ +# Tanım: linux pam python modülü +# URL: https://pypi.python.org/pypi/python-pam/ +# Paketçi: Cihan Alkan +# Gerekler: python python-setuptools +# Grup: kütüphane + +isim=pypam +surum=1.8.3 +devir=1 + +kaynak=(https://github.com/FirefighterBlu3/python-pam/archive/v1.8.3.tar.gz::python-pam-$surum.tar.gz) + +derle() { + cp -a python-pam-$surum{,-py3} + cd python-pam-$surum + python2 setup.py install --prefix=/usr --root=$PKG + cd $SRC/python-pam-$surum-py3 + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/pypdf/talimat b/talimatname/genel/p/pypdf/talimat new file mode 100644 index 000000000..42d0caf94 --- /dev/null +++ b/talimatname/genel/p/pypdf/talimat @@ -0,0 +1,18 @@ +# Tanım: PDF araç seti olarak inşa edilmiş bir Saf Python kütüphanesi +# URL: http://pybrary.net/pyPdf +# Paketçi: Cihan_Alkan +# Gerekler: python-setuptools python3-setuptools python python3 +# Grup: kütüphane + +isim=pypdf +surum=1.13 +devir=1 +kaynak=(https://pypi.io/packages/source/p/pyPdf/pyPdf-$surum.tar.gz) + +derle() { + cd pyPdf-$surum + python setup.py build + python3 setup.py build + python setup.py install --root="$PKG" + python3 setup.py install --root="$PKG" +} diff --git a/talimatname/genel/p/pypeg2/talimat b/talimatname/genel/p/pypeg2/talimat new file mode 100644 index 000000000..99d82d0c1 --- /dev/null +++ b/talimatname/genel/p/pypeg2/talimat @@ -0,0 +1,21 @@ +# Tanım: Python için özlü bir PEG Ayrıştırıcı-Çevirici +# URL: http://fdik.org/pyPEG/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pypeg2 +surum=2.15.2 +devir=1 +kaynak=(https://pypi.python.org/packages/source/p/pyPEG2/pyPEG2-$surum.tar.gz) + +derle() { + + cp -a pyPEG2-$surum{,-py3} + + cd "$SRC"/pyPEG2-$surum + python2 setup.py install --root="$PKG" --prefix=/usr --optimize=1 + + cd "$SRC"/pyPEG2-$surum-py3 + python3 setup.py install --root="$PKG" --prefix=/usr --optimize=1 +} diff --git a/talimatname/genel/p/pyprctl/talimat b/talimatname/genel/p/pyprctl/talimat new file mode 100644 index 000000000..f1b660d98 --- /dev/null +++ b/talimatname/genel/p/pyprctl/talimat @@ -0,0 +1,24 @@ +# Tanım: Python (ic) linux prctl syscall arayüzü +# URL: https://github.com/seveas/python-prctl +# Paketçi: Cihan_Alkan +# Gerekler: python python-setuptools python3 python3-setuptools libcap +# Grup: kütüphane + +isim=pyprctl +surum=1.6.1 +devir=1 +kaynak=(https://github.com/seveas/python-prctl/archive/v1.6.1.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cp -a python-prctl-1.6.1{,-py3} + + cd "$SRC"/python-prctl-1.6.1 + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 + + cd "$SRC"/python-prctl-1.6.1-py3 + python3 setup.py build + python3 setup.py install --root="$PKG" --optimize=1 + +} diff --git a/talimatname/genel/p/pypy/talimat b/talimatname/genel/p/pypy/talimat new file mode 100644 index 000000000..4730b0769 --- /dev/null +++ b/talimatname/genel/p/pypy/talimat @@ -0,0 +1,47 @@ +# Tanım: JIT destekli pythonda yazılmış python +# URL: http://pypy.org +# Paketçi: milisarge +# Gerekler: python tk sqlite mercurial pycparser libffi + +isim=pypy +surum=5.10.0 +devir=1 +kaynak=(https://bitbucket.org/pypy/pypy/downloads/pypy2-v$surum-src.tar.bz2) + +derle() { + + cd pypy2-v${surum}-src/pypy/goal + rm -rf /tmp/usession-release-pypy2.7-v${surum}* + python2 ../../rpython/bin/rpython -Ojit --shared targetpypystandalone || cd /tmp/usession-release-pypy2.7-v${surum}-0/testing_1/ && make -j3 + cd $SRC/pypy2-v${surum}-src/pypy/goal + cp /tmp/usession-release-pypy2.7-v${surum}-0/testing_1/pypy-c . + cp /tmp/usession-release-pypy2.7-v${surum}-0/testing_1/libpypy-c.so . + # Compile binary modules + PYTHONPATH=../.. ./pypy-c ../tool/build_cffi_imports.py + + cd $SRC/pypy2-v${surum}-src + + # Prepare installation + sed -i -e 's/\'--owner=root'\>//g' pypy/tool/release/package.py + sed -i -e 's/\'--group=root'\>//g' pypy/tool/release/package.py + python2 pypy/tool/release/package.py --archive-name pypy --targetdir . + mkdir unpacked + tar xf pypy.tar.bz2 -C unpacked + + # Install pypy + cd unpacked + install -Dm755 pypy/bin/pypy "${PKG}"/opt/pypy/bin/pypy + install -Dm755 pypy/bin/libpypy-c.so "${PKG}"/usr/lib/libpypy-c.so + cp -r pypy/include pypy/lib_pypy pypy/lib-python pypy/site-packages "${PKG}"/opt/pypy/ + cd .. + + # Install symlink + mkdir -p "${PKG}"/usr/bin + ln -s /opt/pypy/bin/pypy "${PKG}"/usr/bin/pypy + + # Install misc stuff + install -Dm644 README.rst "${PKG}"/opt/pypy/README.rst + install -Dm644 LICENSE "${PKG}"/opt/pypy/LICENSE + install -Dm644 LICENSE "${PKG}"/usr/share/licenses/pypy/LICENSE + rm -rf /tmp/usession-release-pypy2.7-v${surum}* +} diff --git a/talimatname/genel/p/pyrdflib/talimat b/talimatname/genel/p/pyrdflib/talimat new file mode 100644 index 000000000..f76060eb0 --- /dev/null +++ b/talimatname/genel/p/pyrdflib/talimat @@ -0,0 +1,25 @@ +# Tanım: RDF ile çalışmak için bir Python kütüphanesi +# URL: http://rdflib.net/ +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools pymarkupsafe +# Grup: kütüphane + +isim=pyrdflib +surum=4.2.2 +devir=1 +kaynak=(https://github.com/RDFLib/rdflib/archive/4.2.2.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cp -a rdflib-$surum{,-py3} + + cd "$SRC"/rdflib-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 + + cd "$SRC"/rdflib-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 + +} diff --git a/talimatname/genel/p/pyreportlab/talimat b/talimatname/genel/p/pyreportlab/talimat new file mode 100644 index 000000000..6690a90bb --- /dev/null +++ b/talimatname/genel/p/pyreportlab/talimat @@ -0,0 +1,21 @@ +# Tanım: Kanıtlanmış bir endüstri gücü PDF oluşturma çözümü +# URL: http://www.reportlab.org/rl_toolkit.html +# Paketçi: Cihan_Alkan +# Gerekler: python3-pip python python3 freetype python-pillow python3-pillow python-pip +# Grup: kütüphane + +isim=pyreportlab +surum=3.4.0 +devir=1 +kaynak=(https://pypi.python.org/packages/87/f9/53b34c58d3735a6df7d5c542bf4de60d699cfa6035e113ca08b3ecdcca3f/reportlab-3.4.0.tar.gz) + +derle() { + cp -rf reportlab-$surum "python3-reportlab-$surum" + + cd "$SRC/reportlab-$surum" + python2 setup.py install --root=$PKG --optimize=1 + install -D -m644 LICENSE.txt $PKG/usr/share/licenses/$isim/license.txt + + cd "$SRC/python3-reportlab-$surum" + python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/pyrequests/talimat b/talimatname/genel/p/pyrequests/talimat new file mode 100644 index 000000000..720a43535 --- /dev/null +++ b/talimatname/genel/p/pyrequests/talimat @@ -0,0 +1,25 @@ +# Tanım: İnsanlar için Python HTTP +# URL: https://github.com/requests/requests +# Paketçi: Cihan Alkan +# Gerekler: python-chardet python python3 python-setuptools python3-setuptools pyurllibs +# Grup: kütüphane + +isim=pyrequests +surum=2.18.4 +devir=1 + +kaynak=(https://github.com/requests/requests/archive/v2.18.4.tar.gz::requests-$surum.tar.gz) + +derle() { + cp -a requests-$surum{,-py3} + + cd "$SRC"/requests-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/requests-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/pysensors/talimat b/talimatname/genel/p/pysensors/talimat new file mode 100644 index 000000000..b9e6b94c5 --- /dev/null +++ b/talimatname/genel/p/pysensors/talimat @@ -0,0 +1,14 @@ +# Tanım: Libsensors'a python bağları (ctypes aracılığıyla) +# URL: https://bitbucket.org/blackjack/pysensors/ +# Paketçi: milisarge +# Gerekler: python python-setuptools lm-sensors + +isim=pysensors +surum=0.0.3 +devir=2 +kaynak=(https://pypi.python.org/packages/source/P/PySensors/PySensors-$surum.tar.gz) + +derle() { + cd PySensors-$surum + python setup.py install -O1 --prefix='/usr' --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-apsw/talimat b/talimatname/genel/p/python-apsw/talimat new file mode 100644 index 000000000..082e1605f --- /dev/null +++ b/talimatname/genel/p/python-apsw/talimat @@ -0,0 +1,16 @@ +# Tanım: SQLite için Python2 sarmalayıcı. +# URL: https://github.com/rogerbinns/apsw +# Paketçi: milisarge +# Gerekler: python sqlite + +isim=python-apsw +surum=3.8.4.3 +devir=1 + +kaynak=( +https://github.com/rogerbinns/apsw/archive/$surum-r1.tar.gz) + +derle() { + cd apsw-$surum-r1 + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-atspi/talimat b/talimatname/genel/p/python-atspi/talimat new file mode 100644 index 000000000..28c6aff8a --- /dev/null +++ b/talimatname/genel/p/python-atspi/talimat @@ -0,0 +1,17 @@ +# Tanım: Bu pakette, GNOME Erişilebilirlik'in temel bileşenleri için Python bağları bulunmaktadır. +# URL: http://www.cairographics.org/ +# Paketçi: milisarge +# Gerekler: python-gobject at-spi2-core + +isim=python-atspi +surum=2.16.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/pyatspi/${surum%.*}/pyatspi-$surum.tar.xz) + +derle() { +cd pyatspi-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/python-beautifulsoup3/talimat b/talimatname/genel/p/python-beautifulsoup3/talimat new file mode 100644 index 000000000..4d5507567 --- /dev/null +++ b/talimatname/genel/p/python-beautifulsoup3/talimat @@ -0,0 +1,16 @@ +# Tanım: Ekran sıyırma gibi hızlı dönüş projeleri için tasarlanmış bir Python HTML / XML ayrıştırıcı +# URL: http://www.crummy.com/software/BeautifulSoup/index.html +# Paketçi: milisarge +# Gerekler: python + +isim=python-beautifulsoup3 +surum=3.2.1 +devir=1 + +kaynak=( +http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-$surum.tar.gz) + +derle() { + cd BeautifulSoup-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-cairo/talimat b/talimatname/genel/p/python-cairo/talimat new file mode 100644 index 000000000..7320b121f --- /dev/null +++ b/talimatname/genel/p/python-cairo/talimat @@ -0,0 +1,17 @@ +# Tanım: Cairo kütüphanesi için Python2 konektörü +# URL: http://www.cairographics.org/ +# Paketçi: milisarge +# Gerekler: cairo + +isim=python-cairo +surum=1.10.0 +devir=1 + +kaynak=(http://cairographics.org/releases/py2cairo-$surum.tar.bz2) + +derle() { + cd py2cairo-$surum + python2 ./waf configure --prefix=/usr + ./waf build + ./waf install --destdir=$PKG +} diff --git a/talimatname/genel/p/python-caja/talimat b/talimatname/genel/p/python-caja/talimat new file mode 100644 index 000000000..ba66b841d --- /dev/null +++ b/talimatname/genel/p/python-caja/talimat @@ -0,0 +1,22 @@ +# Tanım: Python Caja için bağlama, Caja özellik sayfası ve menü öğesi uzantılarının Python'da yazılmasına izin vermek +# URL: http://www.mate-desktop.org/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool caja python-gobject + +isim=python-caja +surum=1.20.0 +devir=1 +kaynak=(http://pub.mate-desktop.org/releases/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i 's/python-config/python2-config/' configure + PYTHON=/usr/bin/python2 ./configure \ + --prefix=/usr + + #https://bugzilla.gnome.org/show_bug.cgi?id=656231 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/python-cffi/talimat b/talimatname/genel/p/python-cffi/talimat new file mode 100644 index 000000000..982ec2aca --- /dev/null +++ b/talimatname/genel/p/python-cffi/talimat @@ -0,0 +1,15 @@ +# Tanım: Python çağıran C kodu için Yabancı Fonksiyon Arayüzü. +# URL: http://cffi.readthedocs.org/ +# Paketçi: milisarge +# Gerekler: libffi python-cparser + +isim=python-cffi +_isim=cffi +surum=1.5.2 +devir=1 +kaynak=(http://pypi.python.org/packages/source/c/$_name/$_name-$surum.tar.gz) + +derle() { + cd $_name-$surum + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-chardet/talimat b/talimatname/genel/p/python-chardet/talimat new file mode 100644 index 000000000..50d37d957 --- /dev/null +++ b/talimatname/genel/p/python-chardet/talimat @@ -0,0 +1,16 @@ +# Tanım: Karakter kodlaması otomatik algılama için Python modülü. +# URL: https://github.com/erikrose/chardet +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-chardet +_isim=chardet +surum=2.3.0 +devir=1 +kaynak=(https://pypi.python.org/packages/source/c/$_name/$_name-$surum.tar.gz) + +derle() { + cd $_name-$surum + /usr/bin/python2 setup.py build + /usr/bin/python2 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python-cherrypy/talimat b/talimatname/genel/p/python-cherrypy/talimat new file mode 100644 index 000000000..489f7ff81 --- /dev/null +++ b/talimatname/genel/p/python-cherrypy/talimat @@ -0,0 +1,16 @@ +# Tanım: Pythonic, nesne yönelimli bir web geliştirme çerçevesi. +# URL: http://www.cherrypy.org/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-cherrypy +surum=3.6.0 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/C/CherryPy/CherryPy-$surum.tar.gz) + +derle() { + cd CherryPy-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-cparser/talimat b/talimatname/genel/p/python-cparser/talimat new file mode 100644 index 000000000..3c77685d6 --- /dev/null +++ b/talimatname/genel/p/python-cparser/talimat @@ -0,0 +1,21 @@ +# Tanım: C ayrıştırıcı ve AST jeneratörü Python ile yazılmış. +# URL: https://github.com/eliben/pycparser +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-cparser +_isim=pycparser +surum=2.14 +devir=1 +kaynak=(https://github.com/eliben/$_name/archive/release_v$surum.zip) + +derle() { + cd $_name-release_v$surum + /usr/bin/python2 setup.py build + + cd pycparser + /usr/bin/python2 _build_tables.py + cd - + + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-crypto/talimat b/talimatname/genel/p/python-crypto/talimat new file mode 100644 index 000000000..e6cdf8722 --- /dev/null +++ b/talimatname/genel/p/python-crypto/talimat @@ -0,0 +1,17 @@ +# Tanım: Python için şifreleme modülleri. +# URL: http://www.dlitz.net/software/pycrypto/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-crypto +surum=2.6.1 +devir=1 + +kaynak=( +http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-$surum.tar.gz) + +derle() { + cd pycrypto-$surum + python2 setup.py build + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-cryptography/talimat b/talimatname/genel/p/python-cryptography/talimat new file mode 100644 index 000000000..26cb5d46a --- /dev/null +++ b/talimatname/genel/p/python-cryptography/talimat @@ -0,0 +1,16 @@ +# Tanım: Şifreleme tariflerini ve ilkelleri Python geliştiricilerine sunacak şekilde tasarlanmış bir paket +# URL: http://pypi.python.org/pypi/cryptography +# Paketçi: milisarge +# Gerekler: python-six python-cffi python-enum34 python-pyasn1 + +isim=python-cryptography +_isim=cryptography +surum=1.2.3 +devir=1 +kaynak=(http://pypi.python.org/packages/source/c/$_name/$_name-$surum.tar.gz) + +derle() { + cd $_name-$surum + /usr/bin/python2 setup.py build + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-cssselect/talimat b/talimatname/genel/p/python-cssselect/talimat new file mode 100644 index 000000000..c75f0962c --- /dev/null +++ b/talimatname/genel/p/python-cssselect/talimat @@ -0,0 +1,15 @@ +# Tanım: CSS3 Seçicilerini ayrıştıran ve XPath 1.0'a çeviren bir Python2 kitaplığı. +# URL: http://pypi.python.org/pypi/cssselect +# Paketçi: milisarge +# Gerekler: python + +isim=python-cssselect +surum=1.0.1 +devir=1 + +kaynak=(https://pypi.python.org/packages/77/ff/9c865275cd19290feba56344eba570e719efb7ca5b34d67ed12b22ebbb0d/cssselect-$surum.tar.gz) + +derle() { + cd cssselect-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-cssutils/talimat b/talimatname/genel/p/python-cssutils/talimat new file mode 100644 index 000000000..a42dab6cf --- /dev/null +++ b/talimatname/genel/p/python-cssutils/talimat @@ -0,0 +1,19 @@ +# Tanım: Python için CSS Basamaklı Stil Sayfaları kitaplığı. +# URL: http://cthedot.de/cssutils/ +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-cssutils +surum=1.0 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/c/cssutils/cssutils-$surum.zip) + +derle() { + cd cssutils-$surum + python2 setup.py install --prefix=/usr --root=$PKG + + # rm tests (FS#27567) + rm -rf $PKG/usr/lib/python2.7/site-packages/tests +} diff --git a/talimatname/genel/p/python-cups/talimat b/talimatname/genel/p/python-cups/talimat new file mode 100644 index 000000000..62324e1e6 --- /dev/null +++ b/talimatname/genel/p/python-cups/talimat @@ -0,0 +1,16 @@ +# Tanım: Python CUPS Bağlantıları +# URL: http://cyberelk.net/tim/software/pycups/ +# Paketçi: milisarge +# Gerekler: cups python + +isim=python-cups +surum=1.9.73 +devir=1 + +kaynak=( +http://cyberelk.net/tim/data/pycups/pycups-$surum.tar.bz2) + +derle() { + cd pycups-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-distutils-extra/talimat b/talimatname/genel/p/python-distutils-extra/talimat new file mode 100644 index 000000000..f6cf5463d --- /dev/null +++ b/talimatname/genel/p/python-distutils-extra/talimat @@ -0,0 +1,14 @@ +# Tanım: Python derleme sistemi +# URL: https://launchpad.net/python-distutils-extra +# Paketçi: milisarge +# Gerekler: python python-setuptools intltool + +isim=python-distutils-extra +surum=2.40 +devir=1 +kaynak=(https://launchpad.net/ubuntu/+archive/primary/+files/python-distutils-extra_2.40.tar.xz) + +derle() { + cd $isim-$surum + python setup.py install --root="$PKG/" +} diff --git a/talimatname/genel/p/python-django/talimat b/talimatname/genel/p/python-django/talimat new file mode 100644 index 000000000..4de518b34 --- /dev/null +++ b/talimatname/genel/p/python-django/talimat @@ -0,0 +1,21 @@ +# Tanım: python2 django web framework +# URL: https://www.djangoproject.com/ +# Paketçi: milisarge +# Gerekler: python-setuptools python + +isim=python-django +surum=1.11.2 +devir=1 + +kaynak=(https://pypi.python.org/packages/c0/31/4bffd9183066eea645430114419c30b030b599320da8246701b81c6a78d2/Django-1.11.2.tar.gz) + +derle() { + cd Django-$surum + python2 setup.py build + python2 setup.py install --prefix=/usr --root=$PKG --optimize=1 + ln -s django-admin.py "$PKG"/usr/bin/django-admin2.py + ln -s django-admin "$PKG"/usr/bin/django-admin2 + install -Dm644 extras/django_bash_completion "$PKG"/usr/share/bash-completion/completions/django-admin2.py + ln -s django-admin.py "$PKG"/usr/share/bash-completion/completions/django-admin2 + ln -s django-admin.py "$PKG"/usr/share/bash-completion/completions/manage2.py +} diff --git a/talimatname/genel/p/python-dnspython/talimat b/talimatname/genel/p/python-dnspython/talimat new file mode 100644 index 000000000..647170b89 --- /dev/null +++ b/talimatname/genel/p/python-dnspython/talimat @@ -0,0 +1,16 @@ +# Tanım: Python için bir DNS araç seti. +# URL: http://www.dnspython.org/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-dnspython +surum=1.11.1 +devir=1 + +kaynak=( +http://www.dnspython.org/kits/$surum/dnspython-$surum.tar.gz) + +derle() { + cd dnspython-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-docutils/talimat b/talimatname/genel/p/python-docutils/talimat new file mode 100644 index 000000000..000e0a38d --- /dev/null +++ b/talimatname/genel/p/python-docutils/talimat @@ -0,0 +1,15 @@ +# Tanım: Düz metin dökümanlarını HTML, XML veya LaTeX gibi formatlara dönüştürmek için araçlar seti +# URL: http://docutils.sourceforge.net +# Paketçi: milisarge +# Gerekler: python + +isim=python-docutils +surum=0.12 +devir=1 + +kaynak=(http://downloads.sourceforge.net/docutils/docutils-$surum.tar.gz) + +derle() { + cd docutils-$surum + python2 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python-ecdsa/talimat b/talimatname/genel/p/python-ecdsa/talimat new file mode 100644 index 000000000..8598a2e98 --- /dev/null +++ b/talimatname/genel/p/python-ecdsa/talimat @@ -0,0 +1,15 @@ +# Tanım: ECDSA'nın Python'da uygulanması +# URL: https://github.com/warner/python-ecdsa +# Paketçi: milisarge +# Gerekler: python + +isim=python-ecdsa +surum=0.11 +devir=1 + +kaynak=(http://pypi.python.org/packages/source/e/ecdsa/ecdsa-$surum.tar.gz) + +derle() { + cd ecdsa-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-enum34/talimat b/talimatname/genel/p/python-enum34/talimat new file mode 100644 index 000000000..820b726f1 --- /dev/null +++ b/talimatname/genel/p/python-enum34/talimat @@ -0,0 +1,17 @@ +# Tanım: Python 3.4'ün enum paketinin arka portu. Bu modül, eski Python sürümleri için bu veri türünün bir arka portu sağlar. +# URL: https://pypi.python.org/pypi/enum34 +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-enum34 +_isim=enum34 +surum=1.1.2 +devir=1 +kaynak=(http://pypi.python.org/packages/source/e/$_name/$_name-$surum.tar.gz) + +derle() { + cd $_name-$surum + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 + + rm $PKG/usr/lib/python*/site-packages/enum/{LICENSE,README} +} diff --git a/talimatname/genel/p/python-fonttools/talimat b/talimatname/genel/p/python-fonttools/talimat new file mode 100644 index 000000000..8ed49c8d4 --- /dev/null +++ b/talimatname/genel/p/python-fonttools/talimat @@ -0,0 +1,15 @@ +# Tanım: Font dosyalarını değiştirmek için araçlar +# URL: http://sourceforge.net/projects/fonttools/ +# Paketçi: milisarge +# Gerekler: python python-numpy python-setuptools + +isim=python-fonttools +surum=2.4 +devir=1 + +kaynak=(http://pypi.python.org/packages/source/F/FontTools/FontTools-$surum.tar.gz) + +derle() { + cd FontTools-$surum + python2 setup.py build install --root=$PKG +} diff --git a/talimatname/genel/p/python-gconf/talimat b/talimatname/genel/p/python-gconf/talimat new file mode 100644 index 000000000..09e1b8b63 --- /dev/null +++ b/talimatname/genel/p/python-gconf/talimat @@ -0,0 +1,24 @@ +# Tanım: GConf yapılandırma veritabanı sistemi için Python bağları +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: python-gtk gconf + +_isim=gnome-python + +isim=python-gconf +surum=2.28.1 +devir=1 + +kaynak=(http://download.gnome.org/sources/$_name/${surum%.*}/$_name-$surum.tar.bz2) + +derle() { + cd $_name-$surum + PYTHON=python2 ./configure --prefix=/usr \ + --disable-gtk-doc \ + --disable-allbindings \ + --enable-gconf + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc + rm -rf $PKG/usr/lib/pkgconfig +} diff --git a/talimatname/genel/p/python-geoip/talimat b/talimatname/genel/p/python-geoip/talimat new file mode 100644 index 000000000..36295fe63 --- /dev/null +++ b/talimatname/genel/p/python-geoip/talimat @@ -0,0 +1,17 @@ +# Tanım: GeoIP aramaları için Python API'sı +# URL: https://pypi.python.org/pypi/pygeoip/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python + +isim=python-geoip +surum=0.2.7 +devir=1 +_isim=pygeoip + +kaynak=( https://pypi.python.org/packages/source/p/${_name}/${_name}-$surum.tar.gz) + +derle() { +cd ${_name}-$surum +python setup.py build +python setup.py install --optimize=1 --root=$PKG +} diff --git a/talimatname/genel/p/python-gitdb/talimat b/talimatname/genel/p/python-gitdb/talimat new file mode 100644 index 000000000..c7d92d55a --- /dev/null +++ b/talimatname/genel/p/python-gitdb/talimat @@ -0,0 +1,15 @@ +# Tanım: python için gitdb nesne kütüphanesi +# URL: https://github.com/gitpython-developers/gitdb +# Paketçi: milisarge +# Gerekler: python python-setuptools python-smmap + +isim=python-gitdb +_isim=gitdb +surum=0.6.4 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/${_name:0:1}/${_name}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-gitpython/talimat b/talimatname/genel/p/python-gitpython/talimat new file mode 100644 index 000000000..e34604ef2 --- /dev/null +++ b/talimatname/genel/p/python-gitpython/talimat @@ -0,0 +1,16 @@ +# Tanım: python için Git kütüphanesi +# URL: http://pyyaml.org/wiki/PyYAML +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-gitpython +_isim=GitPython +_name2=gitpython +surum=2.1.3 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/g/${_name2}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-gobject/talimat b/talimatname/genel/p/python-gobject/talimat new file mode 100644 index 000000000..2f3d60024 --- /dev/null +++ b/talimatname/genel/p/python-gobject/talimat @@ -0,0 +1,21 @@ +# Tanım: GLib'in GObject sınıfı için Python 2'nin bağlantılarını sağlar. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: python-cairo gobject-introspection xorg-libxxf86vm libffi + +isim=python-gobject +surum=3.24.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/pygobject/${surum%.*}/pygobject-$surum.tar.xz) + +derle() { +cd pygobject-$surum +mkdir python2 +pushd python2 +../configure --prefix=/usr \ +--with-python=/usr/bin/python2 +make +popd +make DESTDIR=$PKG -C python2 install +} diff --git a/talimatname/genel/p/python-gobject2/pygobject-2.16.1-fixdetection.patch b/talimatname/genel/p/python-gobject2/pygobject-2.16.1-fixdetection.patch new file mode 100644 index 000000000..714144d62 --- /dev/null +++ b/talimatname/genel/p/python-gobject2/pygobject-2.16.1-fixdetection.patch @@ -0,0 +1,13 @@ +diff -p -up pygobject-2.16.1/pygtk.py.fixdetection pygobject-2.16.1/pygtk.py +--- pygobject-2.16.1/pygtk.py.fixdetection 2009-02-20 22:27:14.000000000 +0100 ++++ pygobject-2.16.1/pygtk.py 2009-02-23 09:44:55.000000000 +0100 +@@ -57,6 +57,9 @@ def _get_available_versions(): + # skip empty directories + if not os.listdir(pathname): + continue ++ # only accept directories containing gtk.py or gobject.so ++ if not glob.glob(os.path.join(pathname, "gtk.py")) and not glob.glob(os.path.join(pathname,"gobject.so")): ++ continue + + if not versions.has_key(filename[-3:]): + versions[filename[-3:]] = pathname diff --git a/talimatname/genel/p/python-gobject2/pygobject-2.28.6-fixes-1.patch b/talimatname/genel/p/python-gobject2/pygobject-2.28.6-fixes-1.patch new file mode 100644 index 000000000..c43d99820 --- /dev/null +++ b/talimatname/genel/p/python-gobject2/pygobject-2.28.6-fixes-1.patch @@ -0,0 +1,720 @@ +Submitted By: Andrew Benton <andy at benton dot eu dot com> (gobject-introspection) and Armin K. <krejzi at email dot com>, after thomas kaedin (git) +Date: 2012-03-29 (gobject-introspection) and 2014-03-04 (git) +Initial Package Version: 2.28.6 +Upstream Status: not submitted (gobject-introspection) and committed (git) +Origin: Andrew Benton (gobject-introspection) and upstream (git) +Tanım: Fixes compiling with recent versions of gobject-introspection; and upstream fixes + +diff -Naur pygobject-2.28.6.orig/configure.ac pygobject-2.28.6/configure.ac +--- pygobject-2.28.6.orig/configure.ac 2011-06-13 13:33:56.000000000 -0300 ++++ pygobject-2.28.6/configure.ac 2014-03-04 18:36:07.947079909 -0300 +@@ -85,7 +85,7 @@ + AM_PROG_CC_STDC + AM_PROG_CC_C_O + +-# check that we have the minimum version of python necisary to build ++# check that we have the minimum version of python necessary to build + JD_PATH_PYTHON(python_min_ver) + + # check if we are building for python 3 +@@ -236,7 +236,7 @@ + AC_ARG_ENABLE(introspection, + AC_HELP_STRING([--enable-introspection], [Use introspection information]), + enable_introspection=$enableval, +- enable_introspection=yes) ++ enable_introspection=no) + if test "$enable_introspection" != no; then + AC_DEFINE(ENABLE_INTROSPECTION,1,Use introspection information) + PKG_CHECK_MODULES(GI, +@@ -262,6 +262,9 @@ + AC_SUBST(INTROSPECTION_SCANNER) + AC_SUBST(INTROSPECTION_COMPILER) + ++dnl Do not install codegen for Python 3. ++AM_CONDITIONAL(ENABLE_CODEGEN, test $build_py3k = false) ++ + dnl add required cflags ... + if test "x$GCC" = "xyes"; then + JH_ADD_CFLAG([-Wall]) +@@ -281,8 +284,6 @@ + Makefile + pygobject-2.0.pc + pygobject-2.0-uninstalled.pc +- codegen/Makefile +- codegen/pygobject-codegen-2.0 + docs/Makefile + docs/reference/entities.docbook + docs/xsl/fixxref.py +@@ -295,6 +296,13 @@ + examples/Makefile + tests/Makefile + PKG-INFO) ++ ++if test $build_py3k = false; then ++ AC_CONFIG_FILES( ++ codegen/Makefile ++ codegen/pygobject-codegen-2.0) ++fi ++ + AC_OUTPUT + + echo +diff -Naur pygobject-2.28.6.orig/gi/module.py pygobject-2.28.6/gi/module.py +--- pygobject-2.28.6.orig/gi/module.py 2011-06-13 13:30:25.000000000 -0300 ++++ pygobject-2.28.6/gi/module.py 2014-03-04 18:36:07.947079909 -0300 +@@ -24,7 +24,11 @@ + + import os + import gobject +-import string ++try: ++ maketrans = ''.maketrans ++except AttributeError: ++ # fallback for Python 2 ++ from string import maketrans + + import gi + from .overrides import registry +@@ -124,7 +128,7 @@ + # Don't use upper() here to avoid locale specific + # identifier conversion (e. g. in Turkish 'i'.upper() == 'i') + # see https://bugzilla.gnome.org/show_bug.cgi?id=649165 +- ascii_upper_trans = string.maketrans( ++ ascii_upper_trans = maketrans( + 'abcdefgjhijklmnopqrstuvwxyz', + 'ABCDEFGJHIJKLMNOPQRSTUVWXYZ') + for value_info in info.get_values(): +diff -Naur pygobject-2.28.6.orig/gi/overrides/Gtk.py pygobject-2.28.6/gi/overrides/Gtk.py +--- pygobject-2.28.6.orig/gi/overrides/Gtk.py 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/gi/overrides/Gtk.py 2014-03-04 18:36:07.949079863 -0300 +@@ -35,6 +35,18 @@ + Gtk = modules['Gtk']._introspection_module + __all__ = [] + ++if Gtk._version == '2.0': ++ import warnings ++ warn_msg = "You have imported the Gtk 2.0 module. Because Gtk 2.0 \ ++was not designed for use with introspection some of the \ ++interfaces and API will fail. As such this is not supported \ ++by the pygobject development team and we encourage you to \ ++port your app to Gtk 3 or greater. PyGTK is the recomended \ ++python module to use with Gtk 2.0" ++ ++ warnings.warn(warn_msg, RuntimeWarning) ++ ++ + class Widget(Gtk.Widget): + + def translate_coordinates(self, dest_widget, src_x, src_y): +@@ -401,16 +413,22 @@ + def __init__(self, + parent=None, + flags=0, +- type=Gtk.MessageType.INFO, ++ message_type=Gtk.MessageType.INFO, + buttons=Gtk.ButtonsType.NONE, + message_format=None, + **kwds): + + if message_format != None: + kwds['text'] = message_format ++ ++ if 'type' in kwds: ++ import warnings ++ warnings.warn("The use of the keyword type as a parameter of the Gtk.MessageDialog constructor has been depricated. Please use message_type instead.", DeprecationWarning) ++ message_type = kwds['type'] ++ + Gtk.MessageDialog.__init__(self, + _buttons_property=buttons, +- message_type=type, ++ message_type=message_type, + **kwds) + Dialog.__init__(self, parent=parent, flags=flags) + +@@ -619,12 +637,18 @@ + def forward_search(self, string, flags, limit): + success, match_start, match_end = super(TextIter, self).forward_search(string, + flags, limit) +- return (match_start, match_end,) ++ if success: ++ return (match_start, match_end) ++ else: ++ return None + + def backward_search(self, string, flags, limit): + success, match_start, match_end = super(TextIter, self).backward_search(string, + flags, limit) +- return (match_start, match_end,) ++ if success: ++ return (match_start, match_end) ++ else: ++ return None + + def begins_tag(self, tag=None): + return super(TextIter, self).begins_tag(tag) +diff -Naur pygobject-2.28.6.orig/gi/pygi-foreign-cairo.c pygobject-2.28.6/gi/pygi-foreign-cairo.c +--- pygobject-2.28.6.orig/gi/pygi-foreign-cairo.c 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/gi/pygi-foreign-cairo.c 2014-03-04 18:36:07.949079863 -0300 +@@ -30,7 +30,7 @@ + #include <pycairo/py3cairo.h> + #endif + +-Pycairo_CAPI_t *Pycairo_CAPI; ++static Pycairo_CAPI_t *Pycairo_CAPI; + + #include "pygi-foreign.h" + +@@ -114,10 +114,15 @@ + Py_RETURN_NONE; + } + +-static PyMethodDef _gi_cairo_functions[] = {}; ++static PyMethodDef _gi_cairo_functions[] = {0,}; + PYGLIB_MODULE_START(_gi_cairo, "_gi_cairo") + { ++#if PY_VERSION_HEX < 0x03000000 + Pycairo_IMPORT; ++#else ++ Pycairo_CAPI = (Pycairo_CAPI_t*) PyCObject_Import("cairo", "CAPI"); ++#endif ++ + if (Pycairo_CAPI == NULL) + return PYGLIB_MODULE_ERROR_RETURN; + +diff -Naur pygobject-2.28.6.orig/gi/pygi-info.c pygobject-2.28.6/gi/pygi-info.c +--- pygobject-2.28.6.orig/gi/pygi-info.c 2011-06-13 13:30:25.000000000 -0300 ++++ pygobject-2.28.6/gi/pygi-info.c 2014-03-04 18:35:32.473899924 -0300 +@@ -162,9 +162,6 @@ + case GI_INFO_TYPE_CONSTANT: + type = &PyGIConstantInfo_Type; + break; +- case GI_INFO_TYPE_ERROR_DOMAIN: +- type = &PyGIErrorDomainInfo_Type; +- break; + case GI_INFO_TYPE_UNION: + type = &PyGIUnionInfo_Type; + break; +@@ -481,7 +478,6 @@ + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: +- case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: +@@ -860,7 +856,6 @@ + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: +- case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: +diff -Naur pygobject-2.28.6.orig/gio/gio-types.defs pygobject-2.28.6/gio/gio-types.defs +--- pygobject-2.28.6.orig/gio/gio-types.defs 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/gio/gio-types.defs 2014-03-04 18:36:07.950079840 -0300 +@@ -526,7 +526,7 @@ + ) + ) + +-(define-enum MountMountFlags ++(define-flags MountMountFlags + (in-module "gio") + (c-name "GMountMountFlags") + (gtype-id "G_TYPE_MOUNT_MOUNT_FLAGS") +@@ -545,7 +545,7 @@ + ) + ) + +-(define-enum DriveStartFlags ++(define-flags DriveStartFlags + (in-module "gio") + (c-name "GDriveStartFlags") + (gtype-id "G_TYPE_DRIVE_START_FLAGS") +@@ -770,7 +770,7 @@ + ) + ) + +-(define-enum SocketMsgFlags ++(define-flags SocketMsgFlags + (in-module "gio") + (c-name "GSocketMsgFlags") + (gtype-id "G_TYPE_SOCKET_MSG_FLAGS") +diff -Naur pygobject-2.28.6.orig/gobject/gobjectmodule.c pygobject-2.28.6/gobject/gobjectmodule.c +--- pygobject-2.28.6.orig/gobject/gobjectmodule.c 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/gobject/gobjectmodule.c 2014-03-04 18:36:07.952079793 -0300 +@@ -312,13 +312,6 @@ + pyglib_gil_state_release(state); + } + +-static void +-pyg_object_class_init(GObjectClass *class, PyObject *py_class) +-{ +- class->set_property = pyg_object_set_property; +- class->get_property = pyg_object_get_property; +-} +- + typedef struct _PyGSignalAccumulatorData { + PyObject *callable; + PyObject *user_data; +@@ -484,15 +477,14 @@ + } + + static PyObject * +-add_signals (GType instance_type, PyObject *signals) ++add_signals (GObjectClass *klass, PyObject *signals) + { + gboolean ret = TRUE; +- GObjectClass *oclass; + Py_ssize_t pos = 0; + PyObject *key, *value, *overridden_signals = NULL; ++ GType instance_type = G_OBJECT_CLASS_TYPE (klass); + + overridden_signals = PyDict_New(); +- oclass = g_type_class_ref(instance_type); + while (PyDict_Next(signals, &pos, &key, &value)) { + const gchar *signal_name; + gchar *signal_name_canon, *c; +@@ -530,7 +522,6 @@ + if (!ret) + break; + } +- g_type_class_unref(oclass); + if (ret) + return overridden_signals; + else { +@@ -800,14 +791,12 @@ + } + + static gboolean +-add_properties (GType instance_type, PyObject *properties) ++add_properties (GObjectClass *klass, PyObject *properties) + { + gboolean ret = TRUE; +- GObjectClass *oclass; + Py_ssize_t pos = 0; + PyObject *key, *value; + +- oclass = g_type_class_ref(instance_type); + while (PyDict_Next(properties, &pos, &key, &value)) { + const gchar *prop_name; + GType prop_type; +@@ -873,7 +862,7 @@ + Py_DECREF(slice); + + if (pspec) { +- g_object_class_install_property(oclass, 1, pspec); ++ g_object_class_install_property(klass, 1, pspec); + } else { + PyObject *type, *value, *traceback; + ret = FALSE; +@@ -883,7 +872,7 @@ + g_snprintf(msg, 256, + "%s (while registering property '%s' for GType '%s')", + PYGLIB_PyUnicode_AsString(value), +- prop_name, g_type_name(instance_type)); ++ prop_name, G_OBJECT_CLASS_NAME(klass)); + Py_DECREF(value); + value = PYGLIB_PyUnicode_FromString(msg); + } +@@ -892,11 +881,63 @@ + } + } + +- g_type_class_unref(oclass); + return ret; + } + + static void ++pyg_object_class_init(GObjectClass *class, PyObject *py_class) ++{ ++ PyObject *gproperties, *gsignals, *overridden_signals; ++ PyObject *class_dict = ((PyTypeObject*) py_class)->tp_dict; ++ ++ class->set_property = pyg_object_set_property; ++ class->get_property = pyg_object_get_property; ++ ++ /* install signals */ ++ /* we look this up in the instance dictionary, so we don't ++ * accidentally get a parent type's __gsignals__ attribute. */ ++ gsignals = PyDict_GetItemString(class_dict, "__gsignals__"); ++ if (gsignals) { ++ if (!PyDict_Check(gsignals)) { ++ PyErr_SetString(PyExc_TypeError, ++ "__gsignals__ attribute not a dict!"); ++ return; ++ } ++ if (!(overridden_signals = add_signals(class, gsignals))) { ++ return; ++ } ++ if (PyDict_SetItemString(class_dict, "__gsignals__", ++ overridden_signals)) { ++ return; ++ } ++ Py_DECREF(overridden_signals); ++ ++ PyDict_DelItemString(class_dict, "__gsignals__"); ++ } else { ++ PyErr_Clear(); ++ } ++ ++ /* install properties */ ++ /* we look this up in the instance dictionary, so we don't ++ * accidentally get a parent type's __gproperties__ attribute. */ ++ gproperties = PyDict_GetItemString(class_dict, "__gproperties__"); ++ if (gproperties) { ++ if (!PyDict_Check(gproperties)) { ++ PyErr_SetString(PyExc_TypeError, ++ "__gproperties__ attribute not a dict!"); ++ return; ++ } ++ if (!add_properties(class, gproperties)) { ++ return; ++ } ++ PyDict_DelItemString(class_dict, "__gproperties__"); ++ /* Borrowed reference. Py_DECREF(gproperties); */ ++ } else { ++ PyErr_Clear(); ++ } ++} ++ ++static void + pyg_register_class_init(GType gtype, PyGClassInitFunc class_init) + { + GSList *list; +@@ -1068,7 +1109,7 @@ + */ + static void + pyg_type_add_interfaces(PyTypeObject *class, GType instance_type, +- PyObject *bases, gboolean new_interfaces, ++ PyObject *bases, + GType *parent_interfaces, guint n_parent_interfaces) + { + int i; +@@ -1082,7 +1123,6 @@ + guint k; + PyObject *base = PyTuple_GET_ITEM(bases, i); + GType itype; +- gboolean is_new = TRUE; + const GInterfaceInfo *iinfo; + GInterfaceInfo iinfo_copy; + +@@ -1099,16 +1139,6 @@ + if (!G_TYPE_IS_INTERFACE(itype)) + continue; + +- for (k = 0; k < n_parent_interfaces; ++k) { +- if (parent_interfaces[k] == itype) { +- is_new = FALSE; +- break; +- } +- } +- +- if ((new_interfaces && !is_new) || (!new_interfaces && is_new)) +- continue; +- + iinfo = pyg_lookup_interface_info(itype); + if (!iinfo) { + gchar *error; +@@ -1129,7 +1159,7 @@ + int + pyg_type_register(PyTypeObject *class, const char *type_name) + { +- PyObject *gtype, *gsignals, *gproperties, *overridden_signals; ++ PyObject *gtype; + GType parent_type, instance_type; + GType *parent_interfaces; + guint n_parent_interfaces; +@@ -1216,88 +1246,22 @@ + } + + /* +- * Note: Interfaces to be implemented are searched twice. First +- * we register interfaces that are already implemented by a parent +- * type. The second time, the remaining interfaces are +- * registered, i.e. the ones that are not implemented by a parent +- * type. In between these two loops, properties and signals are +- * registered. It has to be done this way, in two steps, +- * otherwise glib will complain. If registering all interfaces +- * always before properties, you get an error like: +- * +- * ../gobject:121: Warning: Object class +- * test_interface+MyObject doesn't implement property +- * 'some-property' from interface 'TestInterface' +- * +- * If, on the other hand, you register interfaces after +- * registering the properties, you get something like: +- * +- * ../gobject:121: Warning: cannot add interface type +- * `TestInterface' to type `test_interface+MyUnknown', since +- * type `test_interface+MyUnknown' already conforms to +- * interface +- * +- * This looks like a GLib quirk, but no bug has been filed +- * upstream. However we have a unit test for this particular +- * problem, which can be found in test_interfaces.py, class +- * TestInterfaceImpl. ++ * Note, all interfaces need to be registered before the first ++ * g_type_class_ref(), see bug #686149. + * + * See also comment above pyg_type_add_interfaces(). + */ +- pyg_type_add_interfaces(class, instance_type, class->tp_bases, FALSE, ++ pyg_type_add_interfaces(class, instance_type, class->tp_bases, + parent_interfaces, n_parent_interfaces); + +- /* we look this up in the instance dictionary, so we don't +- * accidentally get a parent type's __gsignals__ attribute. */ +- gsignals = PyDict_GetItemString(class->tp_dict, "__gsignals__"); +- if (gsignals) { +- if (!PyDict_Check(gsignals)) { +- PyErr_SetString(PyExc_TypeError, +- "__gsignals__ attribute not a dict!"); +- g_free(parent_interfaces); +- return -1; +- } +- if (!(overridden_signals = add_signals(instance_type, gsignals))) { +- g_free(parent_interfaces); +- return -1; +- } +- if (PyDict_SetItemString(class->tp_dict, "__gsignals__", +- overridden_signals)) { +- g_free(parent_interfaces); +- return -1; +- } +- Py_DECREF(overridden_signals); +- } else { +- PyErr_Clear(); +- } + +- /* we look this up in the instance dictionary, so we don't +- * accidentally get a parent type's __gsignals__ attribute. */ +- gproperties = PyDict_GetItemString(class->tp_dict, "__gproperties__"); +- if (gproperties) { +- if (!PyDict_Check(gproperties)) { +- PyErr_SetString(PyExc_TypeError, +- "__gproperties__ attribute not a dict!"); +- g_free(parent_interfaces); +- return -1; +- } +- if (!add_properties(instance_type, gproperties)) { +- g_free(parent_interfaces); +- return -1; +- } +- PyDict_DelItemString(class->tp_dict, "__gproperties__"); +- /* Borrowed reference. Py_DECREF(gproperties); */ +- } else { +- PyErr_Clear(); ++ gclass = g_type_class_ref(instance_type); ++ if (PyErr_Occurred() != NULL) { ++ g_type_class_unref(gclass); ++ g_free(parent_interfaces); ++ return -1; + } + +- /* Register new interfaces, that are _not_ already defined by +- * the parent type. FIXME: See above. +- */ +- pyg_type_add_interfaces(class, instance_type, class->tp_bases, TRUE, +- parent_interfaces, n_parent_interfaces); +- +- gclass = g_type_class_ref(instance_type); + if (pyg_run_class_init(instance_type, gclass, class)) { + g_type_class_unref(gclass); + g_free(parent_interfaces); +@@ -1306,9 +1270,8 @@ + g_type_class_unref(gclass); + g_free(parent_interfaces); + +- if (gsignals) +- PyDict_DelItemString(class->tp_dict, "__gsignals__"); +- ++ if (PyErr_Occurred() != NULL) ++ return -1; + return 0; + } + +diff -Naur pygobject-2.28.6.orig/gobject/propertyhelper.py pygobject-2.28.6/gobject/propertyhelper.py +--- pygobject-2.28.6.orig/gobject/propertyhelper.py 2011-06-13 13:30:25.000000000 -0300 ++++ pygobject-2.28.6/gobject/propertyhelper.py 2014-03-04 18:36:07.953079770 -0300 +@@ -188,14 +188,16 @@ + return TYPE_STRING + elif type_ == object: + return TYPE_PYOBJECT +- elif isinstance(type_, type) and issubclass(type_, _gobject.GObject): ++ elif (isinstance(type_, type) and ++ issubclass(type_, (_gobject.GObject, ++ _gobject.GEnum))): + return type_.__gtype__ + elif type_ in [TYPE_NONE, TYPE_INTERFACE, TYPE_CHAR, TYPE_UCHAR, +- TYPE_INT, TYPE_UINT, TYPE_BOOLEAN, TYPE_LONG, +- TYPE_ULONG, TYPE_INT64, TYPE_UINT64, TYPE_ENUM, +- TYPE_FLAGS, TYPE_FLOAT, TYPE_DOUBLE, TYPE_POINTER, +- TYPE_BOXED, TYPE_PARAM, TYPE_OBJECT, TYPE_STRING, +- TYPE_PYOBJECT]: ++ TYPE_INT, TYPE_UINT, TYPE_BOOLEAN, TYPE_LONG, ++ TYPE_ULONG, TYPE_INT64, TYPE_UINT64, ++ TYPE_FLOAT, TYPE_DOUBLE, TYPE_POINTER, ++ TYPE_BOXED, TYPE_PARAM, TYPE_OBJECT, TYPE_STRING, ++ TYPE_PYOBJECT]: + return type_ + else: + raise TypeError("Unsupported type: %r" % (type_,)) +@@ -224,6 +226,12 @@ + elif ptype == TYPE_PYOBJECT: + if default is not None: + raise TypeError("object types does not have default values") ++ elif gobject.type_is_a(ptype, TYPE_ENUM): ++ if default is None: ++ raise TypeError("enum properties needs a default value") ++ elif not gobject.type_is_a(default, ptype): ++ raise TypeError("enum value %s must be an instance of %r" % ++ (default, ptype)) + + def _get_minimum(self): + ptype = self.type +@@ -291,7 +299,8 @@ + if ptype in [TYPE_INT, TYPE_UINT, TYPE_LONG, TYPE_ULONG, + TYPE_INT64, TYPE_UINT64, TYPE_FLOAT, TYPE_DOUBLE]: + args = self._get_minimum(), self._get_maximum(), self.default +- elif ptype == TYPE_STRING or ptype == TYPE_BOOLEAN: ++ elif (ptype == TYPE_STRING or ptype == TYPE_BOOLEAN or ++ ptype.is_a(TYPE_ENUM)): + args = (self.default,) + elif ptype == TYPE_PYOBJECT: + args = () +diff -Naur pygobject-2.28.6.orig/gobject/pygobject.c pygobject-2.28.6/gobject/pygobject.c +--- pygobject-2.28.6.orig/gobject/pygobject.c 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/gobject/pygobject.c 2014-03-04 18:36:07.954079747 -0300 +@@ -991,7 +991,9 @@ + PyObject * + pygobject_new_sunk(GObject *obj) + { +- g_object_set_qdata (obj, pygobject_ref_sunk_key, GINT_TO_POINTER (1)); ++ if (obj) ++ g_object_set_qdata (obj, pygobject_ref_sunk_key, GINT_TO_POINTER (1)); ++ + return pygobject_new_full(obj, TRUE, NULL); + } + +diff -Naur pygobject-2.28.6.orig/Makefile.am pygobject-2.28.6/Makefile.am +--- pygobject-2.28.6.orig/Makefile.am 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/Makefile.am 2014-03-04 18:36:07.954079747 -0300 +@@ -1,7 +1,11 @@ + ACLOCAL_AMFLAGS = -I m4 + AUTOMAKE_OPTIONS = 1.7 + +-SUBDIRS = docs codegen glib gobject gio examples ++SUBDIRS = docs glib gobject gio examples ++ ++if ENABLE_CODEGEN ++SUBDIRS += codegen ++endif + + if ENABLE_INTROSPECTION + SUBDIRS += gi +diff -Naur pygobject-2.28.6.orig/tests/Makefile.am pygobject-2.28.6/tests/Makefile.am +--- pygobject-2.28.6.orig/tests/Makefile.am 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/tests/Makefile.am 2014-03-04 18:36:07.955079724 -0300 +@@ -104,6 +104,7 @@ + test-floating.h \ + test-thread.h \ + test-unknown.h \ ++ te_ST@nouppera \ + org.gnome.test.gschema.xml + + EXTRA_DIST += $(TEST_FILES_STATIC) $(TEST_FILES_GI) $(TEST_FILES_GIO) +diff -Naur pygobject-2.28.6.orig/tests/test_gdbus.py pygobject-2.28.6/tests/test_gdbus.py +--- pygobject-2.28.6.orig/tests/test_gdbus.py 2011-06-13 13:33:49.000000000 -0300 ++++ pygobject-2.28.6/tests/test_gdbus.py 2014-03-04 18:36:07.956079701 -0300 +@@ -67,8 +67,10 @@ + + def test_native_calls_async(self): + def call_done(obj, result, user_data): +- user_data['result'] = obj.call_finish(result) +- user_data['main_loop'].quit() ++ try: ++ user_data['result'] = obj.call_finish(result) ++ finally: ++ user_data['main_loop'].quit() + + main_loop = gobject.MainLoop() + data = {'main_loop': main_loop} +diff -Naur pygobject-2.28.6.orig/tests/test_properties.py pygobject-2.28.6/tests/test_properties.py +--- pygobject-2.28.6.orig/tests/test_properties.py 2011-06-13 13:30:25.000000000 -0300 ++++ pygobject-2.28.6/tests/test_properties.py 2014-03-04 18:36:07.956079701 -0300 +@@ -14,6 +14,8 @@ + G_MININT, G_MAXINT, G_MAXUINT, G_MINLONG, G_MAXLONG, \ + G_MAXULONG + ++from gi.repository import Gio ++ + if sys.version_info < (3, 0): + TEST_UTF8 = "\xe2\x99\xa5" + UNICODE_UTF8 = unicode(TEST_UTF8, 'UTF-8') +@@ -34,6 +36,9 @@ + uint64 = gobject.property( + type=TYPE_UINT64, flags=PARAM_READWRITE|PARAM_CONSTRUCT) + ++ enum = gobject.property( ++ type=Gio.SocketType, default=Gio.SocketType.STREAM) ++ + class TestProperties(unittest.TestCase): + def testGetSet(self): + obj = PropertyObject() +@@ -61,8 +66,9 @@ + self.failUnless(pspec.name in ['normal', + 'construct', + 'construct-only', +- 'uint64']) +- self.assertEqual(len(obj), 4) ++ 'uint64', ++ 'enum']) ++ self.assertEqual(len(obj), 5) + + def testNormal(self): + obj = new(PropertyObject, normal="123") +@@ -127,6 +133,34 @@ + (etype, ex) = sys.exc_info()[2:] + self.fail(str(ex)) + ++ def testEnum(self): ++ obj = new(PropertyObject) ++ self.assertEqual(obj.props.enum, Gio.SocketType.STREAM) ++ self.assertEqual(obj.enum, Gio.SocketType.STREAM) ++ obj.enum = Gio.SocketType.DATAGRAM ++ self.assertEqual(obj.props.enum, Gio.SocketType.DATAGRAM) ++ self.assertEqual(obj.enum, Gio.SocketType.DATAGRAM) ++ obj.props.enum = Gio.SocketType.STREAM ++ self.assertEqual(obj.props.enum, Gio.SocketType.STREAM) ++ self.assertEqual(obj.enum, Gio.SocketType.STREAM) ++ obj.props.enum = 2 ++ self.assertEqual(obj.props.enum, Gio.SocketType.DATAGRAM) ++ self.assertEqual(obj.enum, Gio.SocketType.DATAGRAM) ++ obj.enum = 1 ++ self.assertEqual(obj.props.enum, Gio.SocketType.STREAM) ++ self.assertEqual(obj.enum, Gio.SocketType.STREAM) ++ ++ self.assertRaises(TypeError, setattr, obj, 'enum', 'foo') ++ self.assertRaises(TypeError, setattr, obj, 'enum', object()) ++ ++ self.assertRaises(TypeError, gobject.property, type=Gio.SocketType) ++ self.assertRaises(TypeError, gobject.property, type=Gio.SocketType, ++ default=Gio.SocketProtocol.TCP) ++ self.assertRaises(TypeError, gobject.property, type=Gio.SocketType, ++ default=object()) ++ self.assertRaises(TypeError, gobject.property, type=Gio.SocketType, ++ default=1) ++ + def testRange(self): + # kiwi code + def max(c): +@@ -270,8 +304,6 @@ + # self.assertRaises(TypeError, gobject.property, type=bool, default=0) + self.assertRaises(TypeError, gobject.property, type=bool, default='ciao mamma') + self.assertRaises(TypeError, gobject.property, type=bool) +- self.assertRaises(TypeError, gobject.property, type=GEnum) +- self.assertRaises(TypeError, gobject.property, type=GEnum, default=0) + self.assertRaises(TypeError, gobject.property, type=object, default=0) + self.assertRaises(TypeError, gobject.property, type=complex) + self.assertRaises(TypeError, gobject.property, flags=-10) diff --git a/talimatname/genel/p/python-gobject2/talimat b/talimatname/genel/p/python-gobject2/talimat new file mode 100644 index 000000000..80e4d2732 --- /dev/null +++ b/talimatname/genel/p/python-gobject2/talimat @@ -0,0 +1,21 @@ +# Tanım: GLib'in GObject sınıfı için Python 2'nin bağlantılarını sağlar. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: python-cairo xorg-libxxf86vm gobject-introspection + +isim=python-gobject2 +surum=2.28.6 +devir=1 + +kaynak=( http://ftp.gnome.org/pub/gnome/sources/pygobject/${surum%.*}/pygobject-$surum.tar.xz + pygobject-2.28.6-fixes-1.patch + pygobject-2.16.1-fixdetection.patch) + +derle() { +cd pygobject-$surum +patch -Np1 -i $SRC/pygobject-2.28.6-fixes-1.patch +patch -Np1 -i $SRC/pygobject-2.16.1-fixdetection.patch +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/python-gtk/talimat b/talimatname/genel/p/python-gtk/talimat new file mode 100644 index 000000000..36fe8946e --- /dev/null +++ b/talimatname/genel/p/python-gtk/talimat @@ -0,0 +1,18 @@ +# Tanım: GLib'in GObject sınıfı için Python 2'nin bağlantılarını sağlar. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: python-gobject2 python-cairo libglade + +isim=python-gtk +surum=2.24.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/pygtk/${surum%.*}/pygtk-$surum.tar.bz2) + +derle() { +cd pygtk-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/p/python-gtksourceview2/talimat b/talimatname/genel/p/python-gtksourceview2/talimat new file mode 100644 index 000000000..519624e03 --- /dev/null +++ b/talimatname/genel/p/python-gtksourceview2/talimat @@ -0,0 +1,18 @@ +# Tanım: GtkSourceView widget'ı için Python bağları +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: gtksourceview2 python-gtk + +isim=python-gtksourceview2 +surum=2.10.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/pygtksourceview/2.10/pygtksourceview-${surum}.tar.bz2) + +derle() { +cd pygtksourceview-$surum +PYTHON=python2 ./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var --disable-static --disable-docs +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/p/python-httplib2/python-httplib2.cert.patch b/talimatname/genel/p/python-httplib2/python-httplib2.cert.patch new file mode 100644 index 000000000..8683bdda7 --- /dev/null +++ b/talimatname/genel/p/python-httplib2/python-httplib2.cert.patch @@ -0,0 +1,30 @@ +diff -ur httplib2-0.8.orig/python2/httplib2/__init__.py httplib2-0.8/python2/httplib2/__init__.py +--- httplib2-0.8.orig/python2/httplib2/__init__.py 2014-05-01 23:25:52.459852279 +0200 ++++ httplib2-0.8/python2/httplib2/__init__.py 2014-05-01 23:28:08.822391994 +0200 +@@ -190,9 +190,8 @@ + import ca_certs_locater + CA_CERTS = ca_certs_locater.get() + except ImportError: +- # Default CA certificates file bundled with httplib2. +- CA_CERTS = os.path.join( +- os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt") ++ # Use system CA certificates ++ CA_CERTS = "/etc/ssl/certs/ca-certificates.crt" + + # Which headers are hop-by-hop headers by default + HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade'] +diff -ur httplib2-0.8.orig/python3/httplib2/__init__.py httplib2-0.8/python3/httplib2/__init__.py +--- httplib2-0.8.orig/python3/httplib2/__init__.py 2013-03-06 21:40:54.000000000 +0100 ++++ httplib2-0.8/python3/httplib2/__init__.py 2014-05-01 23:28:36.822913468 +0200 +@@ -123,9 +123,8 @@ + # Which headers are hop-by-hop headers by default + HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade'] + +-# Default CA certificates file bundled with httplib2. +-CA_CERTS = os.path.join( +- os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt") ++# Use system CA certificates ++CA_CERTS = "/etc/ssl/certs/ca-certificates.crt" + + def _get_end2end_headers(response): + hopbyhop = list(HOP_BY_HOP) \ No newline at end of file diff --git a/talimatname/genel/p/python-httplib2/python-httplib2.ssl_hostname.patch b/talimatname/genel/p/python-httplib2/python-httplib2.ssl_hostname.patch new file mode 100644 index 000000000..50494ad9a --- /dev/null +++ b/talimatname/genel/p/python-httplib2/python-httplib2.ssl_hostname.patch @@ -0,0 +1,21 @@ +diff -r 93291649202b python2/httplib2/__init__.py +--- a/python2/httplib2/__init__.py Tue Mar 26 14:17:48 2013 -0400 ++++ b/python2/httplib2/__init__.py Tue Apr 23 10:32:15 2013 +0300 +@@ -1030,7 +1030,7 @@ + raise CertificateHostnameMismatch( + 'Server presented certificate that does not match ' + 'host %s: %s' % (hostname, cert), hostname, cert) +- except ssl_SSLError, e: ++ except (ssl_SSLError, CertificateHostnameMismatch), e: + if sock: + sock.close() + if self.sock: +@@ -1040,7 +1040,7 @@ + # to get at more detailed error information, in particular + # whether the error is due to certificate validation or + # something else (such as SSL protocol mismatch). +- if e.errno == ssl.SSL_ERROR_SSL: ++ if hasattr(e, 'errno') and e.errno == ssl.SSL_ERROR_SSL: + raise SSLHandshakeError(e) + else: + raise \ No newline at end of file diff --git a/talimatname/genel/p/python-httplib2/talimat b/talimatname/genel/p/python-httplib2/talimat new file mode 100644 index 000000000..9372c758b --- /dev/null +++ b/talimatname/genel/p/python-httplib2/talimat @@ -0,0 +1,23 @@ +# Tanım: Birçok özelliği destekleyen kapsamlı HTTP istemci kütüphanesi. +# URL: http://code.google.com/p/httplib2/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-httplib2 +surum=0.9 +devir=1 + +kaynak=( +https://github.com/jcgregorio/httplib2/archive/v${surum}.tar.gz +$isim.ssl_hostname.patch +$isim.cert.patch) + +derle() { + cd httplib2-$surum + # Patch, ref FS#36839 + patch -p1 -i $SRC/$isim.ssl_hostname.patch + # Patch, ref FS#40179 + patch -p1 -i $SRC/$isim.cert.patch + # + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-keybinder/talimat b/talimatname/genel/p/python-keybinder/talimat new file mode 100644 index 000000000..a6f4808cf --- /dev/null +++ b/talimatname/genel/p/python-keybinder/talimat @@ -0,0 +1,21 @@ +# Tanım: Genel klavye kısayollarını kaydetmek için kullanılan kitaplık - Python 2 bağları. +# URL: https://github.com/engla/keybinder +# Paketçi: milisarge +# Gerekler: keybinder python-gtk gnome-common + +_anaisim=keybinder +isim=python-keybinder +surum=0.3.1 +devir=1 + +kaynak=(https://github.com/engla/${_ananame}/archive/master.zip) + +derle() { + cd "${_ananame}-master" + export PYTHON=/usr/bin/python2 + ./autogen.sh --prefix=/usr + make + make DESTDIR="${PKG}/" install + rm -rf "${PKG}"/usr/lib/{girepository-1.0,libkeybinder*,pkgconfig} + rm -rf "${PKG}"/usr/{include,share} +} diff --git a/talimatname/genel/p/python-levenshtein/talimat b/talimatname/genel/p/python-levenshtein/talimat new file mode 100644 index 000000000..973e782e9 --- /dev/null +++ b/talimatname/genel/p/python-levenshtein/talimat @@ -0,0 +1,15 @@ +# Tanım: Dize düzenleme uzaklıkları ve benzerlikleri hesaplamak için Python uzantısı +# URL: http://pypi.python.org/pypi/python-Levenshtein/ +# Paketçi: Cihan Alkan +# Gerekler: python python-setuptools +# Grup: kütüphane + +isim=python-levenshtein +surum=0.12.0 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/p/python-Levenshtein/python-Levenshtein-$surum.tar.gz) + +derle() { + cd python-Levenshtein-$surum + python2 setup.py build install -O1 --prefix=/usr --root="$PKG" +} diff --git a/talimatname/genel/p/python-lxml/talimat b/talimatname/genel/p/python-lxml/talimat new file mode 100644 index 000000000..3f8ec6901 --- /dev/null +++ b/talimatname/genel/p/python-lxml/talimat @@ -0,0 +1,18 @@ +# Tanım: Libxml2 ve libxslt kitaplıkları için Python2 bağlaması. +# URL: http://lxml.de/ +# Paketçi: milisarge +# Gerekler: libxslt python-beautifulsoup3 python-cssselect + +isim=python-lxml +surum=3.7.3 +devir=1 + +kaynak=(https://pypi.io/packages/source/l/lxml/lxml-$surum.tar.gz) + +derle() { + cd lxml-$surum + python2 setup.py install --prefix=/usr --root=$PKG + # Belgeleme + install -d $PKG/usr/share/doc/$isim-$surum + cp -r doc/html $PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/p/python-magic/talimat b/talimatname/genel/p/python-magic/talimat new file mode 100644 index 000000000..11ee6b50d --- /dev/null +++ b/talimatname/genel/p/python-magic/talimat @@ -0,0 +1,15 @@ +# Tanım: Magic kütüphanesi için python bağlantısı. +# URL: http://darwinsys.com/file/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: python-setuptools + +isim=python-magic +surum=5.29 +devir=1 +kaynak=(ftp://ftp.astron.com/pub/file/file-${surum}.tar.gz) + +derle() { + cd "${SRC}/file-${surum}/python" + python setup.py install --root="${PKG}" --optimize=1 + install -Dm0644 "${SRC}/file-${surum}/COPYING" "${PKG}/usr/share/licenses/${isim}/COPYING" +} diff --git a/talimatname/genel/p/python-mako/talimat b/talimatname/genel/p/python-mako/talimat new file mode 100644 index 000000000..6eadbb417 --- /dev/null +++ b/talimatname/genel/p/python-mako/talimat @@ -0,0 +1,15 @@ +# Tanım: Python ile yazılmış bir şablon kütüphanesi. +# URL: http://www.makotemplates.org/ +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-mako +surum=1.0.1 +devir=1 +kaynak=(https://pypi.python.org/packages/source/M/Mako/Mako-$surum.tar.gz) + +derle() { + cd Mako-$surum + /usr/bin/python2 setup.py build + /usr/bin/python2 setup.py install --prefix=/usr --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-msgpack/talimat b/talimatname/genel/p/python-msgpack/talimat new file mode 100644 index 000000000..86035f788 --- /dev/null +++ b/talimatname/genel/p/python-msgpack/talimat @@ -0,0 +1,22 @@ +# Tanım: Python için MessagePack seri hale getirici uygulaması +# URL: https://github.com/msgpack/msgpack-python +# Paketçi: Oltulu +# Gerekler: cython python-setuptools +# Grup: kütüphane + +isim=python-msgpack +surum=0.4.8 +devir=1 +kaynak=(https://pypi.io/packages/source/m/msgpack-python/msgpack-python-$surum.tar.gz) + +derle() { + + cd msgpack-python-$surum + python2 setup.py build --build-lib=build/python + find build/python -type f -exec \ + sed -i '1s,^#! \?/usr/bin/\(env \|\)python$,#!/usr/bin/python,' {} \; + + python2 setup.py build --build-lib=build/python \ + install --root="$PKG" --optimize=1 + +} diff --git a/talimatname/genel/p/python-nassl/talimat b/talimatname/genel/p/python-nassl/talimat new file mode 100644 index 000000000..48ead2f8b --- /dev/null +++ b/talimatname/genel/p/python-nassl/talimat @@ -0,0 +1,15 @@ +# Tanım: Python2.7 ve SSLyze için deneysel openssl bağlayıcısı +# URL: http://pypi.python.org/pypi/nassl +# Paketçi: milisarge +# Gerekler: python + +isim=python-nassl +surum=0.15.1 +devir=1 +kaynak=(https://pypi.python.org/packages/88/9b/31de4f1419d310d0c967d2dcd38e880b413c0912433a448866c4db0dcd02/nassl-0.15.1.tar.gz) + +derle() { + cd "$SRC/nassl-$surum" + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/python-netifaces/talimat b/talimatname/genel/p/python-netifaces/talimat new file mode 100644 index 000000000..d1d6146c1 --- /dev/null +++ b/talimatname/genel/p/python-netifaces/talimat @@ -0,0 +1,16 @@ +# Tanım: Python'daki ağ arabirimi bilgilerine erişmek için taşınabilir modül. +# URL: http://alastairs-place.net/netifaces/ +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-netifaces +surum=0.10.4 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/n/netifaces/netifaces-$surum.tar.gz) + +derle() { + cd netifaces-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-notify/talimat b/talimatname/genel/p/python-notify/talimat new file mode 100644 index 000000000..de09cf115 --- /dev/null +++ b/talimatname/genel/p/python-notify/talimat @@ -0,0 +1,22 @@ +# Tanım: Libnotify için bağlayıcı python +# URL: http://www.galago-project.org/ +# Paketçi: milisarge +# Gerekler: libnotify python-gtk dbus-glib + +isim=python-notify +surum=0.1.1 +devir=1 + +kaynak=(http://www.galago-project.org/files/releases/source/notify-python/notify-python-$surum.tar.gz + http://downloads.nutyx.org/files/patchs/$isim/python-notify-0.1.1-fix-gtk-symbols-1.patch + http://downloads.nutyx.org/files/patchs/$isim/libnotify07.patch) + +derle() { + cd notify-python-$surum + patch -p1 < $SRC/libnotify07.patch + patch -Np1 -i ../python-notify-0.1.1-fix-gtk-symbols-1.patch + PYTHON=/usr/bin/python2 ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/p/python-numpy/talimat b/talimatname/genel/p/python-numpy/talimat new file mode 100644 index 000000000..f620f3df4 --- /dev/null +++ b/talimatname/genel/p/python-numpy/talimat @@ -0,0 +1,18 @@ +# Tanım: python bilimsel araç kütüphanesi +# URL: http://numpy.scipy.org/ +# Paketçi: milisarge +# Gerekler: python-setuptools lapack + +isim=python-numpy +surum=1.11.2 +devir=1 + +kaynak=(http://sourceforge.net/projects/numpy/files/NumPy/$surum/numpy-$surum.tar.gz) + +derle() { + cd numpy-$surum + export Atlas=None + export LDFLAGS="$LDFLAGS -shared" + python2 setup.py config_fc --fcompiler=gnu95 build + python2 setup.py config_fc --fcompiler=gnu95 install --prefix=/usr --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-oauth2/talimat b/talimatname/genel/p/python-oauth2/talimat new file mode 100644 index 000000000..94960ffe2 --- /dev/null +++ b/talimatname/genel/p/python-oauth2/talimat @@ -0,0 +1,17 @@ +# Tanım: OAuth 1.0 istemcileri ve sunucuları oluşturmak için tamamen test edilmiş, soyut bir arayüz. +# URL: https://github.com/simplegeo/python-oauth2 +# Paketçi: milisarge +# Gerekler: python-httplib2 python-setuptools + +isim=python-oauth2 +surum=1.5.211 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/o/oauth2/oauth2-$surum.tar.gz) + +derle() { + cd oauth2-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} + diff --git a/talimatname/genel/p/python-opengl/talimat b/talimatname/genel/p/python-opengl/talimat new file mode 100644 index 000000000..8a9ca2050 --- /dev/null +++ b/talimatname/genel/p/python-opengl/talimat @@ -0,0 +1,15 @@ +# Tanım: Çapraz platform Python, OpenGL ve ilgili API'lere bağlanır. +# URL: http://pyopengl.sourceforge.net/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: freeglut python-setuptools + +isim=python-opengl +surum=3.1.0 +devir=1 + +kaynak=( https://pypi.python.org/packages/source/P/PyOpenGL/PyOpenGL-$surum.tar.gz) + +derle() { + cd PyOpenGL-$surum + python2 setup.py install --prefix=/usr --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-openssl/talimat b/talimatname/genel/p/python-openssl/talimat new file mode 100644 index 000000000..a28a4f8e6 --- /dev/null +++ b/talimatname/genel/p/python-openssl/talimat @@ -0,0 +1,15 @@ +# Tanım: OpenSSL kütüphanesine Python arabirimi. +# URL: http://pypi.python.org/pypi/pyOpenSSL +# Paketçi: milisarge +# Gerekler: python-cryptography + +isim=python-openssl +surum=0.15.1 +devir=1 +kaynak=(http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-$surum.tar.gz) + +derle() { + cd pyOpenSSL-$surum + /usr/bin/python2 setup.py build + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-paramiko/talimat b/talimatname/genel/p/python-paramiko/talimat new file mode 100644 index 000000000..a6d063a89 --- /dev/null +++ b/talimatname/genel/p/python-paramiko/talimat @@ -0,0 +1,16 @@ +# Tanım: SSH2 protokolünü uygulayan Python modülü +# URL: https://github.com/paramiko/paramiko/ +# Paketçi: milisarge +# Gerekler: python python-crypto python-ecdsa + +isim=python-paramiko +surum=1.15.1 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/p/paramiko/paramiko-$surum.tar.gz) + +derle() { + cd paramiko-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-parted/talimat b/talimatname/genel/p/python-parted/talimat new file mode 100644 index 000000000..e6c3ed2ab --- /dev/null +++ b/talimatname/genel/p/python-parted/talimat @@ -0,0 +1,17 @@ +# Tanım: Libparted'e Python bağları +# URL: https://fedorahosted.org/pyparted/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: parted python + +isim=python-parted +surum=3.10.0 +devir=1 +_isim=pyparted + +kaynak=( https://fedorahosted.org/releases/p/y/${_name}/${_name}-$surum.tar.gz) + +derle() { +cd ${_name}-$surum +python setup.py build +python setup.py install --optimize=1 --root=$PKG +} diff --git a/talimatname/genel/p/python-pcapy/talimat b/talimatname/genel/p/python-pcapy/talimat new file mode 100644 index 000000000..aec82757e --- /dev/null +++ b/talimatname/genel/p/python-pcapy/talimat @@ -0,0 +1,17 @@ +# Tanım: A simplified object-oriented Python wrapper for libpcap +# URL: https://github.com/CoreSecurity/pcapy +# Paketçi: milisarge +# Gerekler: git python-setuptools python libpcap +# Grup: kütüphane + +isim=python-pcapy +surum=git +devir=1 +kaynak=() + +derle() { + git_indir https://github.com/CoreSecurity/pcapy $isim + cd "${SRC}/${isim}" + python2 setup.py install --root="$PKG/" --optimize=1 + install -D -m644 LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/p/python-pexpect/talimat b/talimatname/genel/p/python-pexpect/talimat new file mode 100644 index 000000000..26576379f --- /dev/null +++ b/talimatname/genel/p/python-pexpect/talimat @@ -0,0 +1,14 @@ +# Tanım: Diğer programların otomasyon ve kontrolu için kullanılan python kütüphanesi. +# URL: http://pexpect.readthedocs.org/en/stable/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-pexpect +surum=4.2.1 +devir=1 +kaynak=(https://pypi.python.org/packages/e8/13/d0b0599099d6cd23663043a2a0bb7c61e58c6ba359b2656e6fb000ef5b98/pexpect-$surum.tar.gz) + +derle() { + cd "pexpect-$surum" + python setup.py install --root="$PKG" +} diff --git a/talimatname/genel/p/python-pillow/talimat b/talimatname/genel/p/python-pillow/talimat new file mode 100644 index 000000000..fe640bc4c --- /dev/null +++ b/talimatname/genel/p/python-pillow/talimat @@ -0,0 +1,32 @@ +# Tanım: Python Görüntüleme Kitaplığı (PIL) çatalı +# URL: http://python-imaging.github.io/ +# Paketçi: milisarge +# Gerekler: python python-setuptools lcms libwebp tk sane openjpeg + +isim=python-pillow +surum=4.1.1 +_sanever=2.8.3 +_appisim=Pillow +devir=1 + +kaynak=(https://files.pythonhosted.org/packages/source/P/Pillow/Pillow-$surum.tar.gz + https://github.com/python-pillow/Sane/archive/v$_sanever.tar.gz) + +derle() { + cd $SRC + sed -i "s|os.path.join|'../libImaging', &|" $SRC/Sane-$_sanever/setup.py + cp -r $SRC/Sane-${_sanever} $SRC/${_appname}-$surum/Sane + + cd Pillow-$surum + python2 setup.py install --prefix=/usr --root=$PKG + cd Sane + python2 setup.py install --prefix=/usr --root=$PKG + cd ../libImaging + install -dm755 $PKG/usr/include/python2.7 + install -m644 -t $PKG/usr/include/python2.7 *.h + # rename /bin/*.py to * + cd $PKG/usr/bin + for f in *.py; do + mv $f "${f%.py}2" + done +} diff --git a/talimatname/genel/p/python-pip/talimat b/talimatname/genel/p/python-pip/talimat new file mode 100644 index 000000000..cc6c54d31 --- /dev/null +++ b/talimatname/genel/p/python-pip/talimat @@ -0,0 +1,19 @@ +# Tanım: Python-pip (pypi python paketlerini yüklemek için kolay kurulum değiştirme) +# URL: http://www.pip-installer.org +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-pip +surum=9.0.1 +devir=1 + +kaynak=(https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz) + +derle() { + cd pip-$surum + python2 setup.py install --prefix=/usr --root=$PKG + + mkdir -p $PKG/usr/share/doc/$isim-$surum + cp -Rf docs/* $PKG/usr/share/doc/$isim-$surum +} + diff --git a/talimatname/genel/p/python-polib/talimat b/talimatname/genel/p/python-polib/talimat new file mode 100644 index 000000000..74f914d1e --- /dev/null +++ b/talimatname/genel/p/python-polib/talimat @@ -0,0 +1,14 @@ +# Tanım: Gettext dosyalarını işlemek için bir kütüphane +# URL: http://polib.readthedocs.org/en/latest/index.html +# Paketçi: milisarge +# Gerekler: python + +isim=python-polib +surum=1.0.4 +devir=1 +kaynak=(https://bitbucket.org/izi/polib/downloads/polib-${surum}.tar.gz) +derle() { +cd polib-$surum +python2 setup.py build +python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-poppler/pypoppler-0.12.1-poppler-0.16.0.patch b/talimatname/genel/p/python-poppler/pypoppler-0.12.1-poppler-0.16.0.patch new file mode 100644 index 000000000..42acdde66 --- /dev/null +++ b/talimatname/genel/p/python-poppler/pypoppler-0.12.1-poppler-0.16.0.patch @@ -0,0 +1,12 @@ +--- poppler.defs.orig 2010-12-30 05:55:07.000000000 +0000 ++++ poppler.defs 2010-12-30 05:55:27.000000000 +0000 +@@ -1794,7 +1794,7 @@ + + (define-method get_text + (of-object "PopplerPage") +- (c-name "poppler_page_get_text") ++ (c-name "poppler_page_get_selected_text") + (return-type "char*") + (parameters + '("PopplerSelectionStyle" "style") + diff --git a/talimatname/genel/p/python-poppler/python-poppler-0.12.1-poppler-0.39.0-changes.patch b/talimatname/genel/p/python-poppler/python-poppler-0.12.1-poppler-0.39.0-changes.patch new file mode 100644 index 000000000..53ae1dd70 --- /dev/null +++ b/talimatname/genel/p/python-poppler/python-poppler-0.12.1-poppler-0.39.0-changes.patch @@ -0,0 +1,20 @@ +--- poppler.defs 2009-09-27 16:07:59.000000000 +0700 ++++ poppler.defs 2015-12-22 16:36:14.000000000 +0600 +@@ -579,16 +579,4 @@ + ) + +-(define-enum Orientation +- (in-module "Poppler") +- (c-name "PopplerOrientation") +- (gtype-id "POPPLER_TYPE_ORIENTATION") +- (values +- '("portrait" "POPPLER_ORIENTATION_PORTRAIT") +- '("landscape" "POPPLER_ORIENTATION_LANDSCAPE") +- '("upsidedown" "POPPLER_ORIENTATION_UPSIDEDOWN") +- '("seascape" "POPPLER_ORIENTATION_SEASCAPE") +- ) +-) +- + (define-enum PageTransitionType + (in-module "Poppler") + diff --git a/talimatname/genel/p/python-poppler/talimat b/talimatname/genel/p/python-poppler/talimat new file mode 100644 index 000000000..16fda9bd9 --- /dev/null +++ b/talimatname/genel/p/python-poppler/talimat @@ -0,0 +1,36 @@ +# Tanım: Poppler için Python 2.x bağları +# URL: https://launchpad.net/poppler-python +# Paketçi: Cihan_Alkan +# Gerekler: python-gtk poppler-glib python-cairo +# Grup: kütüphane + +isim=python-poppler +surum=0.12.1 +devir=1 +kaynak=(https://launchpad.net/poppler-python/trunk/development/+download/pypoppler-$surum.tar.gz + pypoppler-0.12.1-poppler-0.16.0.patch + python-poppler-0.12.1-poppler-0.39.0-changes.patch) + +derle() { + + cd $SRC/pypoppler-$surum + + # poppler 0.16 compat + patch -Np0 -i \ + "$SRC/pypoppler-0.12.1-poppler-0.16.0.patch" + + # poppler 0.18 compat + sed -i "/pixbuf/,/^)/d" poppler.defs + + # poppler 0.39 compat + patch -Np0 -i $SRC/python-poppler-0.12.1-poppler-0.39.0-changes.patch + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var + PYTHON=python + make + + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/p/python-protobuf/talimat b/talimatname/genel/p/python-protobuf/talimat new file mode 100644 index 000000000..a0f7cca62 --- /dev/null +++ b/talimatname/genel/p/python-protobuf/talimat @@ -0,0 +1,18 @@ +# Tanım: Google veri değişim biçim aracının python api'si +# URL: http://code.google.com/p/protobuf/ +# Paketçi: milisarge +# Gerekler: protobuf python-setuptools + +_isim=protobuf + +isim=python-protobuf +surum=2.6.1 +devir=1 + +kaynak=(https://github.com/google/protobuf/releases/download/$surum/protobuf-$surum.tar.bz2) + +derle() +{ +cd ${_name}-$surum/python +python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-psutil/talimat b/talimatname/genel/p/python-psutil/talimat new file mode 100644 index 000000000..6020e7f8f --- /dev/null +++ b/talimatname/genel/p/python-psutil/talimat @@ -0,0 +1,17 @@ +# Tanım: Python2 için çapraz platform işlem ve sistem yardımcı programları modülü. +# URL: http://code.google.com/p/psutil/ +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-psutil +surum=2.1.3 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/p/psutil/psutil-$surum.tar.gz) + +derle() { + cd psutil-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} + diff --git a/talimatname/genel/p/python-ptyprocess/talimat b/talimatname/genel/p/python-ptyprocess/talimat new file mode 100644 index 000000000..f518e6327 --- /dev/null +++ b/talimatname/genel/p/python-ptyprocess/talimat @@ -0,0 +1,14 @@ +# Tanım: Sahte terminal altında altsüreç çalıştırma +# URL: https://github.com/pexpect/ptyprocess +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-ptyprocess +surum=0.5.1 +devir=1 +kaynak=(https://pypi.python.org/packages/source/p/ptyprocess/ptyprocess-$surum.tar.gz) + +derle() { + cd ptyprocess-$surum + python setup.py install --root="$PKG/" --prefix=/usr --optimize=0 +} diff --git a/talimatname/genel/p/python-pyasn1/talimat b/talimatname/genel/p/python-pyasn1/talimat new file mode 100644 index 000000000..f66e13dc5 --- /dev/null +++ b/talimatname/genel/p/python-pyasn1/talimat @@ -0,0 +1,15 @@ +# Tanım: ASN.1 türleri ve codec bileşenleri. +# URL: http://pypi.python.org/pypi/pyasn1 +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-pyasn1 +_isim=pyasn1 +surum=0.1.9 +devir=1 +kaynak=(http://pypi.python.org/packages/source/p/$_name/$_name-$surum.tar.gz) + +derle() { + cd $_name-$surum + /usr/bin/python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-pyaudio/talimat b/talimatname/genel/p/python-pyaudio/talimat new file mode 100644 index 000000000..74b0cbe36 --- /dev/null +++ b/talimatname/genel/p/python-pyaudio/talimat @@ -0,0 +1,15 @@ +# Tanım: PortAudio için python kütüphanesi +# URL: http://people.csail.mit.edu/hubert/pyaudio +# Paketçi: milisarge +# Gerekler: portaudio python-setuptools + +isim=python-pyaudio +surum=0.2.11 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/P/PyAudio/PyAudio-$surum.tar.gz) + +derle() { + cd $SRC/PyAudio-$surum + python setup.py build + python setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python-pycountry/talimat b/talimatname/genel/p/python-pycountry/talimat new file mode 100644 index 000000000..87f094d6b --- /dev/null +++ b/talimatname/genel/p/python-pycountry/talimat @@ -0,0 +1,16 @@ +# Tanım: ISO ülkesi, alt bölüm, dil, para birimi ve senaryo tanımları ve çevirileri +# URL: http://pypi.python.org/pypi/pycountry +# Paketçi: milisarge +# Gerekler: python-setuptools python-lxml + +isim=python-pycountry +surum=1.5 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/p/pycountry/pycountry-$surum.tar.gz) + +derle() { + cd pycountry-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-pygame/talimat b/talimatname/genel/p/python-pygame/talimat new file mode 100644 index 000000000..3277c6323 --- /dev/null +++ b/talimatname/genel/p/python-pygame/talimat @@ -0,0 +1,16 @@ +# Tanım: Python game-oyun kütüphanesi +# URL: http://www.pygame.org +# Paketçi: milisarge +# Gerekler: python-setuptools python sdl-mixer sdl-ttf sdl-image portmidi + +isim=python-pygame +_isim=pygame +surum=1.9.3 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/${_isim::1}/pygame/pygame-$surum.tar.gz) + +derle() { + cd ${_isim}-${surum} + python2 config.py -auto + python2 setup.py install --root="${PKG}" --prefix=/usr +} diff --git a/talimatname/genel/p/python-pygments/talimat b/talimatname/genel/p/python-pygments/talimat new file mode 100644 index 000000000..2c566b8be --- /dev/null +++ b/talimatname/genel/p/python-pygments/talimat @@ -0,0 +1,16 @@ +# Tanım: Python sözdizimi vurgulayıcı +# URL: https://pypi.python.org/pypi/Pygments +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-pygments +surum=1.6 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/P/Pygments/Pygments-$surum.tar.gz) + +derle() { + cd Pygments-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-pyinotify/talimat b/talimatname/genel/p/python-pyinotify/talimat new file mode 100644 index 000000000..e347dedf8 --- /dev/null +++ b/talimatname/genel/p/python-pyinotify/talimat @@ -0,0 +1,25 @@ +# Tanım: Python modülü, inotify ile Linux platformlarındaki dosya sistemleri olaylarını izlemek için kullanılır. +# URL: http://github.com/seb-m/pyinotify +# Paketçi: Cihan_Alkan +# Gerekler: python +# Grup: kütüphane + +isim=python-pyinotify +surum=0.9.6 +devir=1 +kaynak=(https://github.com/seb-m/pyinotify/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $SRC/pyinotify-$surum + + python setup.py build + sed \ + -e 's_#!/usr/bin/env python_&2_' \ + -i python2/pyinotify.py + + python setup.py install --root=$PKG -O1 + + install -d $PKG/usr/share/licenses/python2-pyinotify + install -m644 COPYING \ + $PKG/usr/share/licenses/python2-pyinotify +} diff --git a/talimatname/genel/p/python-pyrex/talimat b/talimatname/genel/p/python-pyrex/talimat new file mode 100644 index 000000000..5a11c6c35 --- /dev/null +++ b/talimatname/genel/p/python-pyrex/talimat @@ -0,0 +1,17 @@ +# Tanım: Python modülleri +# URL: http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/ +# Paketçi: Cihan Alkan +# Gerekler: python python-setuptools +# Grup: kütüphane + +isim=python-pyrex +surum=0.9.9 +devir=1 +kaynak=(http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/Pyrex-${surum}.tar.gz) + +derle() { + cd Pyrex-${surum} + python2 setup.py build + + python2 setup.py install -O1 --root="${PKG}" --prefix=/usr +} diff --git a/talimatname/genel/p/python-pythondialog/talimat b/talimatname/genel/p/python-pythondialog/talimat new file mode 100644 index 000000000..b64579198 --- /dev/null +++ b/talimatname/genel/p/python-pythondialog/talimat @@ -0,0 +1,15 @@ +# Tanım: python2 dialog arayüzü +# URL: http://pythondialog.sf.net +# Paketçi: milisarge +# Gerekler: python + +isim=python-pythondialog +_isim=pythondialog +surum=3.4.0 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/${_name}/${_name}/${surum}/python2-${_name}-${surum}.tar.bz2) + +derle() { + cd python2-${_name}-$surum + python2 ./setup.py install --prefix=/usr --root="${PKG}" -O1 +} diff --git a/talimatname/genel/p/python-pytz/talimat b/talimatname/genel/p/python-pytz/talimat new file mode 100644 index 000000000..ef08978bf --- /dev/null +++ b/talimatname/genel/p/python-pytz/talimat @@ -0,0 +1,15 @@ +# Tanım: Python yerel zaman kütüphanesi +# URL: http://pypi.python.org/pypi/pytz +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-pytz +surum=2017.2 +devir=1 + +kaynak=(https://pypi.python.org/packages/a4/09/c47e57fc9c7062b4e83b075d418800d322caa87ec0ac21e6308bd3a2d519/pytz-2017.2.zip) + +derle() { + cd pytz-$surum + python2 setup.py install --root=$PKG/ +} diff --git a/talimatname/genel/p/python-pyxml/talimat b/talimatname/genel/p/python-pyxml/talimat new file mode 100644 index 000000000..9a474942f --- /dev/null +++ b/talimatname/genel/p/python-pyxml/talimat @@ -0,0 +1,17 @@ +# Tanım: Python XML, selinux-refpolicy için gereklilik +# URL: https://github.com/actmd/PyXML +# Paketçi: Oltulu +# Gerekler: python python-setuptools +# Grup: kütüphane + +isim=python-pyxml +surum=0.8.4 +devir=1 +kaynak=(https://github.com/actmd/PyXML/archive/${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $SRC/PyXML-$surum/ + python2 setup.py build + python2 setup.py install --root="$PKG/" --optimize=1 +} + diff --git a/talimatname/genel/p/python-pyyaml/talimat b/talimatname/genel/p/python-pyyaml/talimat new file mode 100644 index 000000000..151d43fc2 --- /dev/null +++ b/talimatname/genel/p/python-pyyaml/talimat @@ -0,0 +1,18 @@ +# Tanım: Yeni nesil YAML ayrıştırıcı ve vericiyi uygulayan Python modülü +# URL: http://pyyaml.org/ +# Paketçi: milisarge +# Gerekler: python python3 yaml + +isim=python-pyyaml +surum=3.11 +devir=1 + +kaynak=(http://pyyaml.org/download/pyyaml/PyYAML-$surum.tar.gz) + +derle() { +cd PyYAML-$surum +python setup.py build +python setup.py install --optimize=1 --root=$PKG +python3 setup.py build +python3 setup.py install --optimize=1 --root=$PKG +} diff --git a/talimatname/genel/p/python-qt4/talimat b/talimatname/genel/p/python-qt4/talimat new file mode 100644 index 000000000..c32df7bc8 --- /dev/null +++ b/talimatname/genel/p/python-qt4/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt4 için bağlayıcı python +# URL: http://www.riverbankcomputing.co.uk/software/pyqt/intro +# Paketçi: milisarge +# Gerekler: dbus-python python-sip qt4 phonon-qt4 + +isim=python-qt4 +surum=4.11.2 +devir=1 + +kaynak=(http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-$surum/PyQt-x11-gpl-$surum.tar.gz) +derle() { +cd PyQt-x11-gpl-$surum + +python2 configure-ng.py \ + -v /usr/share/sip \ + -q /usr/lib/qt4/bin/qmake \ + --confirm-license \ + --qsci-api + +find -name 'Makefile' | xargs sed -i 's|-Wl,-rpath,/usr/lib||g;s|-Wl,-rpath,.* ||g' +make +make DESTDIR=$PKG INSTALL_ROOT=$PKG install + +install -Dm644 PyQt4.api $PKG/usr/share/qt4/qsci/api/python/PyQt4.api +} diff --git a/talimatname/genel/p/python-qt5/talimat b/talimatname/genel/p/python-qt5/talimat new file mode 100644 index 000000000..5e93a86a9 --- /dev/null +++ b/talimatname/genel/p/python-qt5/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt5 için bağlayıcı pythonu +# URL: http://www.riverbankcomputing.co.uk/software/pyqt/intro +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: dbus-python python-sip qt5 qt5-webkit python-opengl python + +isim=python-qt5 +surum=5.7 +devir=1 + +kaynak=(http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-$surum/PyQt5_gpl-$surum.tar.gz) +derle() { +cd PyQt5_gpl-$surum + +python2 configure.py \ + -q /usr/bin/qmake-qt5 \ + --confirm-license \ + --no-sip-files \ + --qsci-api + +find -name 'Makefile' | xargs sed -i 's|-Wl,-rpath,/usr/lib||g;s|-Wl,-rpath,.* ||g' +make +make DESTDIR=$PKG INSTALL_ROOT=$PKG install + +install -Dm644 PyQt5.api $PKG/usr/share/qt/qsci/api/python/PyQt5.api +} diff --git a/talimatname/genel/p/python-reportlab/talimat b/talimatname/genel/p/python-reportlab/talimat new file mode 100644 index 000000000..c82fa89f2 --- /dev/null +++ b/talimatname/genel/p/python-reportlab/talimat @@ -0,0 +1,17 @@ +# Tanım: Kanıtlanmış bir endüstri gücü PDF oluşturma çözümü +# URL: http://www.reportlab.org/rl_toolkit.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python python-pillow freetype python-pip + +isim=python-reportlab +surum=3.3.0 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/r/reportlab/reportlab-$surum.tar.gz) + +derle() { + cd reportlab-$surum + python2 setup.py install --prefix=/usr --root=$PKG --optimize=1 + python2 setup.py tests +} diff --git a/talimatname/genel/p/python-rsvg/talimat b/talimatname/genel/p/python-rsvg/talimat new file mode 100644 index 000000000..b37d5d8eb --- /dev/null +++ b/talimatname/genel/p/python-rsvg/talimat @@ -0,0 +1,19 @@ +# Tanım: Librsvg kütüphanesi için bağlayıcı python. +# URL: http://www.gnome.org +# Paketçi: milisarge +# Gerekler: python-gtk librsvg + +_isim=gnome-python-desktop + +isim=python-rsvg +surum=2.32.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/${_name}/${surum%.*}-$surum.tar.bz2) +derle() { +cd ${_name}-$surum +./configure --prefix=/usr +make -C rsvg install DESTDIR=$PKG +install -m755 -d $PKG/usr/share/pygtk/2.0/defs +install -m644 rsvg/rsvg.defs $PKG/usr/share/pygtk/2.0/defs/ +} diff --git a/talimatname/genel/p/python-setproctitle/talimat b/talimatname/genel/p/python-setproctitle/talimat new file mode 100644 index 000000000..c6457c1fe --- /dev/null +++ b/talimatname/genel/p/python-setproctitle/talimat @@ -0,0 +1,21 @@ +# Tanım: Bir python işleminin işlem başlığını değiştirmesine izin verir +# URL: https://github.com/dvarrazzo/py-setproctitle +# Paketçi: Cihan Alkan +# Gerekler: python + +isim=python-setproctitle +surum=1.1.10 +devir=1 + +kaynak=(https://files.pythonhosted.org/packages/source/s/setproctitle/setproctitle-$surum.tar.gz) + + +derle() { + cd setproctitle-$surum + rm -rf ../buildpy2; mkdir ../buildpy2 + python2 setup.py build -b ../buildpy2 + find ../buildpy2 -name \*.py -exec sed -r '1 s|^#!(.*)python$|#!\1python2|' -i {} + + python2 setup.py install --skip-build -O1 --root="$PKG" + install -m0644 -D COPYRIGHT "$PKG/usr/share/licenses/$isim/COPYRIGHT" + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-setuptools-scm/talimat b/talimatname/genel/p/python-setuptools-scm/talimat new file mode 100644 index 000000000..7b2597499 --- /dev/null +++ b/talimatname/genel/p/python-setuptools-scm/talimat @@ -0,0 +1,18 @@ +# Tanım: Python paketlerindeki scm verilerinin yönetimini sağlayan setuptools eklentisi +# URL: https://github.com/pypa/setuptools_scm +# Paketçi: milisarge +# Gerekler: python sqlite python-setuptools + +isim=python-setuptools-scm +surum=1.15.6 +devir=1 + +kaynak=(https://github.com/pypa/setuptools_scm/archive/v$surum.tar.gz) + +derle() { + export SETUPTOOLS_SCM_PRETEND_VERSION=$surum + cd "$SRC"/setuptools_scm-$surum + python2 setup.py build + python2 setup.py egg_info + python2 setup.py install --root "$PKG" +} diff --git a/talimatname/genel/p/python-setuptools/talimat b/talimatname/genel/p/python-setuptools/talimat new file mode 100644 index 000000000..13891f1e4 --- /dev/null +++ b/talimatname/genel/p/python-setuptools/talimat @@ -0,0 +1,20 @@ +# Tanım: Python paketlerini kolayca indirin, oluşturun, yükleyin, yükseltin ve kaldırın +# URL: https://bitbucket.org/pypa/setuptools +# Paketçi: milisarge +# Gerekler: python sqlite libffi + +isim=python-setuptools +surum=36.0.1 +devir=1 + +kaynak=(https://files.pythonhosted.org/packages/source/${name:8:1}/${name#*-}/${name#*-}-$surum.zip) + +derle() { + cd ${name#*-}-$surum + export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0 + python2 bootstrap.py + python2 setup.py build + python2 setup.py install --prefix=/usr --root=$PKG --optimize=1 + unset SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES + rm $PKG/usr/bin/easy_install +} diff --git a/talimatname/genel/p/python-simplejson/talimat b/talimatname/genel/p/python-simplejson/talimat new file mode 100644 index 000000000..8a04dc4f2 --- /dev/null +++ b/talimatname/genel/p/python-simplejson/talimat @@ -0,0 +1,16 @@ +# Tanım: Python için basit ve hızlı, genişletilebilir JSON kodlayıcı / kod çözücü. +# URL: http://undefined.org/python/#simplejson +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-simplejson +surum=3.6.3 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/s/simplejson/simplejson-$surum.tar.gz) + +derle() { + cd simplejson-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-sip/talimat b/talimatname/genel/p/python-sip/talimat new file mode 100644 index 000000000..a14216e40 --- /dev/null +++ b/talimatname/genel/p/python-sip/talimat @@ -0,0 +1,22 @@ +# Tanım: C ve C ++ kitaplıkları için Python bağlamaları oluşturmayı kolaylaştıran bir araç +# URL: http://www.riverbankcomputing.co.uk/software/sip/intro +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python + +isim=python-sip +surum=4.18.1 +devir=1 + +kaynak=(http://sourceforge.net/projects/pyqt/files/sip/sip-$surum/sip-$surum.tar.gz ) + +derle() { + cd sip-$surum + python2 configure.py -b /usr/bin \ + -d /usr/lib/python2.7/site-packages \ + -e /usr/include/python2.7 \ + -v /usr/share/sip + make + make DESTDIR=$PKG install + chmod 644 $PKG/usr/lib/python2.7/site-packages/sipdistutils.py +} + diff --git a/talimatname/genel/p/python-six/talimat b/talimatname/genel/p/python-six/talimat new file mode 100644 index 000000000..d572761ec --- /dev/null +++ b/talimatname/genel/p/python-six/talimat @@ -0,0 +1,17 @@ +# Tanım: Python 2 ve 3 uyumluluk programları. +# URL: http://pypi.python.org/pypi/six/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-six +surum=1.7.3 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/s/six/six-$surum.tar.gz) + +derle() { + cd six-$surum + python2 setup.py check + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-smmap/talimat b/talimatname/genel/p/python-smmap/talimat new file mode 100644 index 000000000..71eb130e7 --- /dev/null +++ b/talimatname/genel/p/python-smmap/talimat @@ -0,0 +1,16 @@ +# Tanım: python için bellek harita yöneticisinin saf git uygulaması +# URL: https://github.com/gitpython-developers/smmap +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-smmap +_isim=smmap2 +surum=0.9.0 +devir=1 +kaynak=(https://pypi.org/packages/source/s/${_name}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python setup.py build + python setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python-tweepy/talimat b/talimatname/genel/p/python-tweepy/talimat new file mode 100644 index 000000000..79c8dcf70 --- /dev/null +++ b/talimatname/genel/p/python-tweepy/talimat @@ -0,0 +1,16 @@ +# Tanım: Tüm Twitter API'sına erişmek için bir Python kitaplığı. +# URL: http://pypi.python.org/pypi/tweepy/ +# Paketçi: milisarge +# Gerekler: python-simplejson + +isim=python-tweepy +surum=2.2 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/t/tweepy/tweepy-$surum.tar.gz) + +derle() { + cd tweepy-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-twisted/talimat b/talimatname/genel/p/python-twisted/talimat new file mode 100644 index 000000000..5101d96b4 --- /dev/null +++ b/talimatname/genel/p/python-twisted/talimat @@ -0,0 +1,14 @@ +# Tanım: Python olay odaklı ağ oluşturma çerçevesi. +# URL: http://www.twistedmatrix.com/ +# Paketçi: milisarge +# Gerekler: python python-setuptools python-zope_interface + +isim=python-twisted +surum=15.5.0 +devir=1 +kaynak=(http://pypi.python.org/packages/source/T/Twisted/Twisted-$surum.tar.bz2) + +derle() { + cd Twisted-$surum + /usr/bin/python2 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python-typing/talimat b/talimatname/genel/p/python-typing/talimat new file mode 100644 index 000000000..be0f41429 --- /dev/null +++ b/talimatname/genel/p/python-typing/talimat @@ -0,0 +1,15 @@ +# Tanım: Python için yazım ipuçları +# URL: https://pypi.python.org/pypi/typing/ +# Paketçi: milisarge +# Gerekler: python-setuptools python + +isim=python-typing +surum=3.6.1 +devir=1 +kaynak=(https://pypi.python.org/packages/17/75/3698d7992a828ad6d7be99c0a888b75ed173a9280e53dbae67326029b60e/typing-3.6.1.tar.gz) + +derle() { + cd "$SRC/typing-$surum" + python2 setup.py build + python2 setup.py install --prefix=/usr --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/python-urwid/talimat b/talimatname/genel/p/python-urwid/talimat new file mode 100644 index 000000000..260442bef --- /dev/null +++ b/talimatname/genel/p/python-urwid/talimat @@ -0,0 +1,16 @@ +# Tanım: Urwid, Curses tabanlı bir Python kullanıcı arabirimi kütüphanesi. +# URL: http://excess.org/urwid/ +# Paketçi: milisarge +# Gerekler: python-setuptools + +isim=python-urwid +surum=1.2.1 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/u/urwid/urwid-$surum.tar.gz) + +derle() { + cd urwid-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-virtualenv/talimat b/talimatname/genel/p/python-virtualenv/talimat new file mode 100644 index 000000000..fcd58c1c2 --- /dev/null +++ b/talimatname/genel/p/python-virtualenv/talimat @@ -0,0 +1,15 @@ +# Tanım: İzole edilmiş Python ortamları yaratmak için kullanılan araç. +# URL: https://virtualenv.pypa.io/ +# Paketçi: milisarge +# Gerekler: python + +isim=python-virtualenv +surum=15.1.0 +devir=1 + +kaynak=(https://pypi.python.org/packages/d4/0c/9840c08189e030873387a73b90ada981885010dd9aea134d6de30cd24cb8/virtualenv-15.1.0.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd virtualenv-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-vte/talimat b/talimatname/genel/p/python-vte/talimat new file mode 100644 index 000000000..b27e13cc1 --- /dev/null +++ b/talimatname/genel/p/python-vte/talimat @@ -0,0 +1,37 @@ +# Tanım: VTE widget seti için Python bağları +# URL: http://developer.gnome.org/arch/gnome/widgets/vte.html +# Paketçi: milisarge +# Gerekler: vte vala + +isim=python-vte +surum=0.28.2 +devir=1 +kaynak=(ftp://ftp.gnome.org/pub/gnome/sources/vte/${surum%.*}/vte-$surum.tar.xz ) + +derle() { + cd vte-$surum + + ./configure --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --disable-static \ + --disable-debugging \ + --enable-python \ + --disable-gtk-doc \ + --with-xft2 \ + --with-pangox + + make + make DESTDIR=$PKG install + + + rm -rf $PKG/usr/lib/libvte.la + rm -rf $PKG/usr/lib/libvte.so* + rm -rf $PKG/usr/lib/libvte.so.9.2800.2 + rm -rf $PKG/usr/lib/pkgconfig/ + rm -rf $PKG/usr/lib/vte/ + rm -rf $PKG/usr/include + rm -rf $PKG/usr/share + rm -rf $PKG/usr/bin + rm -rf $PKG/usr/{share}/{gtk-doc,locale} + rm -rf $PKG/usr/lib/vte/gnome-pty-helper +} diff --git a/talimatname/genel/p/python-xdg/talimat b/talimatname/genel/p/python-xdg/talimat new file mode 100644 index 000000000..2cccfba63 --- /dev/null +++ b/talimatname/genel/p/python-xdg/talimat @@ -0,0 +1,15 @@ +# Tanım: FreeDesktop standartlarına erişmek için kullanılan Python kütüphanesi +# URL: http://freedesktop.org/wiki/Software/pyxdg +# Paketçi: geantbrun at gmail dot com +# Gerekler: python + +isim=python-xdg +surum=0.25 +devir=1 + +kaynak=(http://people.freedesktop.org/~takluyver/pyxdg-$surum.tar.gz) + +derle() { + cd pyxdg-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python-xlib/talimat b/talimatname/genel/p/python-xlib/talimat new file mode 100644 index 000000000..da14fd433 --- /dev/null +++ b/talimatname/genel/p/python-xlib/talimat @@ -0,0 +1,16 @@ +# Tanım: Python için tamamen işlevsel bir X istemci kitaplığı programları +# URL: https://github.com/python-xlib/python-xlib +# Paketçi: Cihan Alkan +# Gerekler: python python-six python-setuptools +# Grup: kütüphane + +isim=python-xlib +surum=0.20 +devir=1 + +kaynak=(https://github.com/python-xlib/python-xlib/releases/download/$surum/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + python2 setup.py install --root="$PKG" +} diff --git a/talimatname/genel/p/python-yaml/talimat b/talimatname/genel/p/python-yaml/talimat new file mode 100644 index 000000000..c52265bcf --- /dev/null +++ b/talimatname/genel/p/python-yaml/talimat @@ -0,0 +1,14 @@ +# Tanım: python için yaml ayrıştırıcı +# URL: http://pyyaml.org/wiki/PyYAML +# Paketçi: milisarge +# Gerekler: python + +isim=python-yaml +surum=3.12 +devir=1 +kaynak=(http://pyyaml.org/download/pyyaml/PyYAML-$surum.tar.gz) + +derle() { + cd PyYAML-$surum + python2 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python-zope_interface/talimat b/talimatname/genel/p/python-zope_interface/talimat new file mode 100644 index 000000000..18ed2ccad --- /dev/null +++ b/talimatname/genel/p/python-zope_interface/talimat @@ -0,0 +1,14 @@ +# Tanım: Zope3 arayüz kütüphanesi. +# URL: http://pypi.python.org/pypi/zope.interface/ +# Paketçi: milisarge +# Gerekler: python python-setuptools + +isim=python-zope_interface +surum=4.1.3 +devir=1 +kaynak=(http://pypi.python.org/packages/source/z/zope.interface/zope.interface-$surum.tar.gz) + +derle() { + cd zope.interface-$surum + /usr/bin/python2 setup.py install --root=$PKG --prefix=/usr +} diff --git a/talimatname/genel/p/python/python.okubeni b/talimatname/genel/p/python/python.okubeni new file mode 100644 index 000000000..5ea722781 --- /dev/null +++ b/talimatname/genel/p/python/python.okubeni @@ -0,0 +1 @@ +configure uses pkgconfig to find libffi. There is a circular dependency here: Pkgconfig requires Glib which requires Python 2. there is a circular dependency with the Tk package as it requires Xorg to be installed but parts of Xorg depend on Python diff --git a/talimatname/genel/p/python/python.png b/talimatname/genel/p/python/python.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4a3d85f057ccfeb48b88b5f0ce7c2f02912a60 GIT binary patch literal 2162 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/p/python/talimat b/talimatname/genel/p/python/talimat new file mode 100644 index 000000000..dd3a5ff54 --- /dev/null +++ b/talimatname/genel/p/python/talimat @@ -0,0 +1,43 @@ +# Tanım: Sonraki nesil python üst düzey betik dili +# URL: URL: http://www.python.org +# Paketçi: milisarge +# Gerekler: libffi sqlite + +_pybasever=2.7 + +isim=python +surum=2.7.11 +devir=1 + +kaynak=( +http://www.python.org/ftp/python/$surum/Python-$surum.tar.xz +python.png) + + +derle() { + cd Python-$surum + ./configure --prefix=/usr \ + --with-system-expat \ + --with-system-ffi \ + --enable-shared \ + --enable-unicode=ucs4 + make + make DESTDIR=$PKG install + chmod -v 755 $PKG/usr/lib/libpython2.7.so.1.0 + + # Part of python3 + rm -f $PKG/usr/bin/2to3 + + mkdir -p $PKG/usr/share/applications + echo "[Desktop Entry] +Categories=Development;Documentation +Exec=xdg-open file:///usr/share/doc/python-$surum/index.html +Icon=python +StartupNotify=false +Terminal=false +Type=Application +Name=Python Documentation +Name[tr]=Dokumentasyon Python" > $PKG/usr/share/applications/python.desktop + install -Dm644 $SRC/$isim.png \ + $PKG/usr/share/icons/hicolor/48x48/apps/$isim.png +} diff --git a/talimatname/genel/p/python3-astroid/talimat b/talimatname/genel/p/python3-astroid/talimat new file mode 100644 index 000000000..a5a93be1a --- /dev/null +++ b/talimatname/genel/p/python3-astroid/talimat @@ -0,0 +1,16 @@ +# Tanım: Python 3 Logilab projeleri tarafından kullanılan faydalı modüller. +# URL: https://bitbucket.org/logilab/astroid +# Paketçi: yasarciv67@gmail.com +# Gerekler: python3 python3-six python3-setuptools + +isim=python3-astroid +surum=1.4.5 +devir=1 + +kaynak=(https://pypi.python.org/packages/source/a/astroid/astroid-${surum}.tar.gz) + +derle() { + cd astroid-$surum + python3 setup.py check + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-beautifulsoup4/talimat b/talimatname/genel/p/python3-beautifulsoup4/talimat new file mode 100644 index 000000000..14f05f333 --- /dev/null +++ b/talimatname/genel/p/python3-beautifulsoup4/talimat @@ -0,0 +1,15 @@ +# Tanım: Ekran sıyırma gibi hızlı dönüş projeleri için tasarlanmış bir Python HTML / XML ayrıştırıcı +# URL: http://www.crummy.com/software/BeautifulSoup/index.html +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-beautifulsoup4 +surum=4.6.0 +devir=1 + +kaynak=(http://www.crummy.com/software/BeautifulSoup/bs4/download/${surum%.*}-$surum.tar.gz) + +derle() { + cd beautifulsoup4-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-cairo/python3-cairo-1.10.0-waf-python3.4.patch b/talimatname/genel/p/python3-cairo/python3-cairo-1.10.0-waf-python3.4.patch new file mode 100644 index 0000000000000000000000000000000000000000..a7d17bb5dbf09a077b3f001ba43bf8a63575ba2e GIT binary patch literal 160375 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∨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 H694-@WQi(< literal 0 HcmV?d00001 diff --git a/talimatname/genel/p/python3-cairo/talimat b/talimatname/genel/p/python3-cairo/talimat new file mode 100644 index 000000000..1ea9a0569 --- /dev/null +++ b/talimatname/genel/p/python3-cairo/talimat @@ -0,0 +1,19 @@ +# Tanım: Cairo kütüphanesi için Python3 konnektörü. +# URL: http://www.cairographics.org/ +# Paketçi:alihan-ozturk28@hotmail.com +# Gerekler: python3 cairo + +isim=python3-cairo +surum=1.10.0 +devir=1 + +kaynak=(http://cairographics.org/releases/pycairo-$surum.tar.bz2 + python3-cairo-1.10.0-waf-python3.4.patch) + +derle() { + cd pycairo-$surum + patch -i ../python3-cairo-1.10.0-waf-python3.4.patch + PYTHON=python3 ./waf configure --prefix=/usr + ./waf build + ./waf install --destdir=$PKG +} diff --git a/talimatname/genel/p/python3-cffi/talimat b/talimatname/genel/p/python3-cffi/talimat new file mode 100644 index 000000000..f4d65dfdf --- /dev/null +++ b/talimatname/genel/p/python3-cffi/talimat @@ -0,0 +1,16 @@ +# Tanım: Python çağıran C kodu için Yabancı Fonksiyon Arayüzü. +# URL: http://cffi.readthedocs.org/ +# Paketçi: milisarge +# Gerekler: libffi python3-cparser +# Grup: kütüphane + +isim=python3-cffi +_isim=cffi +surum=1.11.5 +devir=1 +kaynak=(http://pypi.python.org/packages/source/c/$_isim/$_isim-$surum.tar.gz) + +derle() { + cd $_isim-$surum + /usr/bin/python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-cparser/talimat b/talimatname/genel/p/python3-cparser/talimat new file mode 100644 index 000000000..959563f76 --- /dev/null +++ b/talimatname/genel/p/python3-cparser/talimat @@ -0,0 +1,22 @@ +# Tanım: C ayrıştırıcı ve AST jeneratörü Python ile yazılmış. +# URL: https://github.com/eliben/pycparser +# Paketçi: Cihan_Alkan +# Gerekler: python3-setuptools +# Grup: kütüphane + +isim=python3-cparser +_isim=pycparser +surum=2.18 +devir=1 +kaynak=(https://github.com/eliben/$_isim/archive/release_v$surum.zip) + +derle() { + cd $_isim-release_v$surum + /usr/bin/python3 setup.py build + + cd pycparser + /usr/bin/python3 _build_tables.py + cd - + + /usr/bin/python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-cryptography/talimat b/talimatname/genel/p/python3-cryptography/talimat new file mode 100644 index 000000000..11dcae263 --- /dev/null +++ b/talimatname/genel/p/python3-cryptography/talimat @@ -0,0 +1,17 @@ +# Tanım: Şifreleme tariflerini ve ilkelleri Python geliştiricilerine sunacak şekilde tasarlanmış bir paket +# URL: http://pypi.python.org/pypi/cryptography +# Paketçi: Cihan_Alkan +# Gerekler: python3-six python3-cffi python3-enum34 python3-pyasn1 +# Grup: kütüphane + +isim=python3-cryptography +_isim=cryptography +surum=2.2.2 +devir=1 +kaynak=(https://pypi.io/packages/source/c/cryptography/cryptography-$surum.tar.gz) + +derle() { + cd $_isim-$surum + /usr/bin/python3 setup.py build + /usr/bin/python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-cssselect/talimat b/talimatname/genel/p/python3-cssselect/talimat new file mode 100644 index 000000000..251c85c0d --- /dev/null +++ b/talimatname/genel/p/python3-cssselect/talimat @@ -0,0 +1,15 @@ +# Tanım: CSS3 Seçicilerini ayrıştıran ve XPath 1.0'a çeviren bir Python3 kitaplığı. +# URL: http://pypi.python.org/pypi/cssselect +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-cssselect +surum=1.0.1 +devir=1 + +kaynak=(https://pypi.python.org/packages/77/ff/9c865275cd19290feba56344eba570e719efb7ca5b34d67ed12b22ebbb0d/cssselect-$surum.tar.gz) + +derle() { + cd cssselect-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-distutils-extra/talimat b/talimatname/genel/p/python3-distutils-extra/talimat new file mode 100644 index 000000000..0e31a2a12 --- /dev/null +++ b/talimatname/genel/p/python3-distutils-extra/talimat @@ -0,0 +1,14 @@ +# Tanım: Python3 derleme sistemi +# URL: https://launchpad.net/python-distutils-extra +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools intltool + +isim=python3-distutils-extra +surum=2.40 +devir=1 +kaynak=(https://launchpad.net/ubuntu/+archive/primary/+files/python-distutils-extra_2.40.tar.xz) + +derle() { + cd python-distutils-extra-$surum + python3 setup.py install --root="$PKG/" +} diff --git a/talimatname/genel/p/python3-django/talimat b/talimatname/genel/p/python3-django/talimat new file mode 100644 index 000000000..aa4d6e500 --- /dev/null +++ b/talimatname/genel/p/python3-django/talimat @@ -0,0 +1,21 @@ +# Tanım: python3 django web framework +# URL: https://www.djangoproject.com/ +# Paketçi: milisarge +# Gerekler: python3-setuptools python3 + +isim=python3-django +surum=1.11.2 +devir=1 + +kaynak=(https://pypi.python.org/packages/c0/31/4bffd9183066eea645430114419c30b030b599320da8246701b81c6a78d2/Django-1.11.2.tar.gz) + +derle() { + cd Django-$surum + python3 setup.py build + python3 setup.py install --prefix=/usr --root=$PKG --optimize=1 + ln -s django-admin.py "$PKG"/usr/bin/django-admin3.py + ln -s django-admin "$PKG"/usr/bin/django-admin3 + install -Dm644 extras/django_bash_completion "$PKG"/usr/share/bash-completion/completions/django-admin.py + ln -s django-admin.py "$PKG"/usr/share/bash-completion/completions/django-admin + ln -s django-admin.py "$PKG"/usr/share/bash-completion/completions/manage.py +} diff --git a/talimatname/genel/p/python3-enum34/talimat b/talimatname/genel/p/python3-enum34/talimat new file mode 100644 index 000000000..a84277991 --- /dev/null +++ b/talimatname/genel/p/python3-enum34/talimat @@ -0,0 +1,17 @@ +# Tanım: Python 3.4 Enum backported +# URL: https://pypi.python.org/pypi/enum34 +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools +# Grup: kütüphane + +isim=python3-enum34 +_isim=enum34 +surum=1.1.6 +devir=1 +kaynak=(https://pypi.python.org/packages/bf/3e/31d502c25302814a7c2f1d3959d2a3b3f78e509002ba91aea64993936876/enum34-1.1.6.tar.gz) + +derle() { + cd "$SRC/$_name-$surum" + python3 setup.py install --root="$PKG" --optimize=1 + install -Dm644 enum/LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/p/python3-geoip/talimat b/talimatname/genel/p/python3-geoip/talimat new file mode 100644 index 000000000..b81ae581e --- /dev/null +++ b/talimatname/genel/p/python3-geoip/talimat @@ -0,0 +1,17 @@ +# Tanım: GeoIP aramaları için Python3 API +# URL: https://pypi.python.org/pypi/pygeoip/ +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-geoip +surum=1.3.2 +devir=1 +_isim=pygeoip + +kaynak=(https://pypi.python.org/packages/source/G/GeoIP/GeoIP-$surum.tar.gz) + +derle() { + cd GeoIP-$surum + python3 setup.py build + python3 setup.py install --optimize=1 --root=$PKG +} diff --git a/talimatname/genel/p/python3-gitdb/talimat b/talimatname/genel/p/python3-gitdb/talimat new file mode 100644 index 000000000..858ec90b1 --- /dev/null +++ b/talimatname/genel/p/python3-gitdb/talimat @@ -0,0 +1,15 @@ +# Tanım: python için gitdb nesne kütüphanesi +# URL: http://pyyaml.org/wiki/PyYAML +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools python3-smmap + +isim=python3-gitdb +_isim=gitdb +surum=0.6.4 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/${_name:0:1}/${_name}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-gitpython/talimat b/talimatname/genel/p/python3-gitpython/talimat new file mode 100644 index 000000000..87a75d546 --- /dev/null +++ b/talimatname/genel/p/python3-gitpython/talimat @@ -0,0 +1,16 @@ +# Tanım: python için Git kütüphanesi +# URL: http://pyyaml.org/wiki/PyYAML +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-gitpython +_isim=GitPython +_name2=gitpython +surum=2.1.3 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/g/${_name2}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-gobject/talimat b/talimatname/genel/p/python3-gobject/talimat new file mode 100644 index 000000000..0562607b6 --- /dev/null +++ b/talimatname/genel/p/python3-gobject/talimat @@ -0,0 +1,21 @@ +# Tanım: GLib'in GObject sınıfı için Python 2'nin bağlantılarını sağlar. +# URL: http://www.gnome.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python3 python3-cairo gobject-introspection xorg-libxxf86vm libffi + +isim=python3-gobject +surum=3.18.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/pygobject/${surum%.*}/pygobject-$surum.tar.xz) + +derle() { +cd pygobject-$surum +mkdir python3 +pushd python3 +../configure --prefix=/usr \ +--with-python=/usr/bin/python3 +make +popd +make DESTDIR=$PKG -C python3 install +} diff --git a/talimatname/genel/p/python3-lxml/talimat b/talimatname/genel/p/python3-lxml/talimat new file mode 100644 index 000000000..1605d7a0b --- /dev/null +++ b/talimatname/genel/p/python3-lxml/talimat @@ -0,0 +1,15 @@ +# Tanım: Libxml2 ve libxslt kitaplıkları için Python3 bağlaması. +# URL: http://lxml.de/ +# Paketçi: milisarge +# Gerekler: libxslt python3-beautifulsoup4 python3-cssselect + +isim=python3-lxml +surum=3.8.0 +devir=1 + +kaynak=(https://pypi.io/packages/source/l/lxml/lxml-$surum.tar.gz) + +derle() { + cd lxml-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-magic/talimat b/talimatname/genel/p/python3-magic/talimat new file mode 100644 index 000000000..fed0981db --- /dev/null +++ b/talimatname/genel/p/python3-magic/talimat @@ -0,0 +1,15 @@ +# Tanım: Magic kütüphanesi için python bağlantısı. +# URL: http://darwinsys.com/file/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: python3 python3-setuptools + +isim=python3-magic +surum=5.29 +devir=1 +kaynak=(ftp://ftp.astron.com/pub/file/file-${surum}.tar.gz) + +derle() { + cd "${SRC}/file-${surum}/python" + python3 setup.py install --root="${PKG}" --optimize=1 + install -Dm0644 "${SRC}/file-${surum}/COPYING" "${PKG}/usr/share/licenses/${isim}/COPYING" +} diff --git a/talimatname/genel/p/python3-mprpc/talimat b/talimatname/genel/p/python3-mprpc/talimat new file mode 100644 index 000000000..fc5966a2c --- /dev/null +++ b/talimatname/genel/p/python3-mprpc/talimat @@ -0,0 +1,16 @@ +# Tanım: Hızlı MessagePack RPC kütüphanesi +# URL: https://github.com/studio-ousia/mprpc +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-mprpc +_isim=mprpc +surum=0.1.14 +devir=1 + +kaynak=(https://github.com/studio-ousia/mprpc/archive/v0.1.14.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $_name-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-multipledispatch/talimat b/talimatname/genel/p/python3-multipledispatch/talimat new file mode 100644 index 000000000..99f5a29ac --- /dev/null +++ b/talimatname/genel/p/python3-multipledispatch/talimat @@ -0,0 +1,15 @@ +# Tanım: Multiple dispatch implementation in Python +# URL: https://github.com/mrocklin/multipledispatch +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-multipledispatch +surum=0.4.8 +devir=1 +kaynak=(https://github.com/mrocklin/multipledispatch/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}"/multipledispatch-$surum + python3 setup.py build + python3 setup.py install --skip-build --prefix=/usr --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/python3-numpy/talimat b/talimatname/genel/p/python3-numpy/talimat new file mode 100644 index 000000000..ff7213141 --- /dev/null +++ b/talimatname/genel/p/python3-numpy/talimat @@ -0,0 +1,18 @@ +# Tanım: python3 bilimsel araç kütüphanesi +# URL: http://numpy.scipy.org/ +# Paketçi: milisarge +# Gerekler: python3-setuptools lapack + +isim=python3-numpy +surum=1.11.2 +devir=1 + +kaynak=(http://sourceforge.net/projects/numpy/files/NumPy/$surum/numpy-$surum.tar.gz) + +derle() { + cd numpy-$surum + export Atlas=None + export LDFLAGS="$LDFLAGS -shared" + python3 setup.py config_fc --fcompiler=gnu95 build + python3 setup.py config_fc --fcompiler=gnu95 install --prefix=/usr --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-opengl/talimat b/talimatname/genel/p/python3-opengl/talimat new file mode 100644 index 000000000..fabe719ee --- /dev/null +++ b/talimatname/genel/p/python3-opengl/talimat @@ -0,0 +1,15 @@ +# Tanım: Çapraz platform Python, OpenGL ve ilgili API'lere bağlanır. +# URL: http://pyopengl.sourceforge.net/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python3 freeglut python3-setuptools + +isim=python3-opengl +surum=3.1.0 +devir=1 + +kaynak=( https://pypi.python.org/packages/source/P/PyOpenGL/PyOpenGL-$surum.tar.gz) + +derle() { + cd PyOpenGL-$surum + python3 setup.py install --prefix=/usr --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-openssl/talimat b/talimatname/genel/p/python3-openssl/talimat new file mode 100644 index 000000000..60ab464f0 --- /dev/null +++ b/talimatname/genel/p/python3-openssl/talimat @@ -0,0 +1,15 @@ +# Tanım: OpenSSL kütüphanesine Python arabirimi. +# URL: http://pypi.python.org/pypi/pyOpenSSL +# Paketçi: Cihan_Alkan +# Gerekler: python3-cryptography + +isim=python3-openssl +surum=18.0.0 +devir=1 +kaynak=(https://github.com/pyca/pyopenssl/archive/${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd pyopenssl-$surum + /usr/bin/python3 setup.py build + /usr/bin/python3 setup.py install --root=$PKG --optimize=1 --skip-build +} diff --git a/talimatname/genel/p/python3-parted/talimat b/talimatname/genel/p/python3-parted/talimat new file mode 100644 index 000000000..e3dd5932c --- /dev/null +++ b/talimatname/genel/p/python3-parted/talimat @@ -0,0 +1,17 @@ +# Tanım: Libparted'e Python bağları +# URL: https://fedorahosted.org/pyparted/ +# Paketçi: milisarge +# Gerekler: parted python3 + +isim=python3-parted +surum=3.10.7 +devir=1 +_isim=pyparted + +kaynak=(https://github.com/rhinstaller/${_name}/archive/v${surum}.tar.gz) + +derle() { + cd ${_name}-$surum + python3 setup.py build + python3 setup.py install --optimize=1 --root=$PKG +} diff --git a/talimatname/genel/p/python3-pexpect/talimat b/talimatname/genel/p/python3-pexpect/talimat new file mode 100644 index 000000000..739981f03 --- /dev/null +++ b/talimatname/genel/p/python3-pexpect/talimat @@ -0,0 +1,14 @@ +# Tanım: Diğer programların otomasyon ve kontrolu için kullanılan python3 kütüphanesi. +# URL: http://pexpect.readthedocs.org/en/stable/ +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-pexpect +surum=4.2.1 +devir=1 +kaynak=(https://pypi.python.org/packages/e8/13/d0b0599099d6cd23663043a2a0bb7c61e58c6ba359b2656e6fb000ef5b98/pexpect-$surum.tar.gz) + +derle() { + cd "pexpect-$surum" + python3 setup.py install --root="$PKG" +} diff --git a/talimatname/genel/p/python3-pillow/talimat b/talimatname/genel/p/python3-pillow/talimat new file mode 100644 index 000000000..b07c37f0a --- /dev/null +++ b/talimatname/genel/p/python3-pillow/talimat @@ -0,0 +1,32 @@ +# Tanım: Python Görüntüleme Kitaplığı (PIL) çatalı +# URL: http://python-imaging.github.io/ +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools lcms libwebp tk sane openjpeg + +isim=python3-pillow +surum=4.2.1 +_sanever=2.8.3 +_appisim=Pillow +devir=1 + +kaynak=(https://files.pythonhosted.org/packages/source/P/$_appname/$_appname-$surum.tar.gz + https://github.com/python-pillow/Sane/archive/v$_sanever.tar.gz) + +derle() { + cd $SRC + sed -i "s|os.path.join|'../libImaging', &|" $SRC/Sane-$_sanever/setup.py + cp -r $SRC/Sane-${_sanever} $SRC/${_appname}-$surum/Sane + + cd Pillow-$surum + python3 setup.py install --prefix=/usr --root=$PKG + cd Sane + python3 setup.py install --prefix=/usr --root=$PKG + cd ../libImaging + install -dm755 $PKG/usr/include/python3.5m + install -m644 -t $PKG/usr/include/python3.5m *.h + + cd $PKG/usr/bin + for f in *.py; do + mv $f "${f%.py}2" + done +} diff --git a/talimatname/genel/p/python3-pip/talimat b/talimatname/genel/p/python3-pip/talimat new file mode 100644 index 000000000..526afad74 --- /dev/null +++ b/talimatname/genel/p/python3-pip/talimat @@ -0,0 +1,19 @@ +# Tanım: Python-pip (pypi python paketlerini yüklemek için kolay kurulum değiştirme) +# URL: http://www.pip-installer.org +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-pip +surum=9.0.1 +devir=1 + +kaynak=(https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz) + +derle() { + cd pip-$surum + python3 setup.py install --prefix=/usr --root=$PKG + + mkdir -p $PKG/usr/share/doc/$isim-$surum + cp -Rf docs/* $PKG/usr/share/doc/$isim-$surum +} + diff --git a/talimatname/genel/p/python3-psutil/talimat b/talimatname/genel/p/python3-psutil/talimat new file mode 100644 index 000000000..f8108c4b3 --- /dev/null +++ b/talimatname/genel/p/python3-psutil/talimat @@ -0,0 +1,17 @@ +# Tanım: Python3 için çapraz platform işlem ve sistem yardımcı programları modülü. +# URL: http://code.google.com/p/psutil/ +# Paketçi: milisarge +# Gerekler: python3-setuptools + +isim=python3-psutil +surum=2.1.3 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/p/psutil/psutil-$surum.tar.gz) + +derle() { + cd psutil-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} + diff --git a/talimatname/genel/p/python3-pyasn1/talimat b/talimatname/genel/p/python3-pyasn1/talimat new file mode 100644 index 000000000..b89dd225f --- /dev/null +++ b/talimatname/genel/p/python3-pyasn1/talimat @@ -0,0 +1,15 @@ +# Tanım: Python 3 için ASN.1 kütüphanesi +# URL: https://pypi.io/packages/source/p/pyasn1 +# Paketçi: Cihan_Alkan +# Gerekler: python3-setuptools +# Grup: kütüphane + +isim=python3-pyasn1 +surum=0.4.2 +devir=1 +kaynak=(https://pypi.io/packages/source/p/pyasn1/pyasn1-$surum.tar.gz) + +derle() { + cd pyasn1-${surum} + python3 setup.py install --root="${PKG}" +} diff --git a/talimatname/genel/p/python3-pyaudio/talimat b/talimatname/genel/p/python3-pyaudio/talimat new file mode 100644 index 000000000..0376737ad --- /dev/null +++ b/talimatname/genel/p/python3-pyaudio/talimat @@ -0,0 +1,15 @@ +# Tanım: PortAudio için python3 kütüphanesi +# URL: http://people.csail.mit.edu/hubert/pyaudio +# Paketçi: milisarge +# Gerekler: portaudio python3-setuptools + +isim=python3-pyaudio +surum=0.2.11 +devir=1 +kaynak=(https://files.pythonhosted.org/packages/source/P/PyAudio/PyAudio-$surum.tar.gz) + +derle() { + cd $SRC/PyAudio-$surum + python3 setup.py build + python3 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python3-pylint/talimat b/talimatname/genel/p/python3-pylint/talimat new file mode 100644 index 000000000..22172bfc9 --- /dev/null +++ b/talimatname/genel/p/python3-pylint/talimat @@ -0,0 +1,18 @@ +# Tanım: Hataları ve kalitesiz işaretleri arayan Python kodunu analiz eder +# URL: http://pylint.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: python3-astroid python3-setuptools python3-six + +isim=python3-pylint +surum=1.6.4 +devir=1 + +#kaynak=(http://pypi.python.org/packages/source/p/pylint/pylint-${surum}.tar.gz) +kaynak=() + +derle() { + git clone https://github.com/PyCQA/pylint.git + cd pylint + python3 setup.py check + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-pyrr/talimat b/talimatname/genel/p/python3-pyrr/talimat new file mode 100644 index 000000000..22b34f7e5 --- /dev/null +++ b/talimatname/genel/p/python3-pyrr/talimat @@ -0,0 +1,14 @@ +# Tanım: Numpy i kullanarak 3D matematik fonksiyon kütüphanesi +# URL: https://github.com/adamlwgriffiths/Pyrr +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools python3-multipledispatch python3-numpy + +isim=python3-pyrr +surum=0.9.2 +devir=1 +kaynak=(https://github.com/adamlwgriffiths/Pyrr/archive/${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$SRC/Pyrr-$surum" + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/p/python3-pythondialog/talimat b/talimatname/genel/p/python3-pythondialog/talimat new file mode 100644 index 000000000..fdc79a72c --- /dev/null +++ b/talimatname/genel/p/python3-pythondialog/talimat @@ -0,0 +1,15 @@ +# Tanım: python3 dialog arayüzü +# URL: http://pythondialog.sf.net +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-pythondialog +_isim=pythondialog +surum=3.4.0 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/${_name}/${_name}/${surum}/python3-${_name}-${surum}.tar.bz2) + +derle() { + cd "${SRC}/${_name}-${surum}" + python3 ./setup.py install --prefix=/usr --root="${PKG}" -O1 +} diff --git a/talimatname/genel/p/python3-pytz/talimat b/talimatname/genel/p/python3-pytz/talimat new file mode 100644 index 000000000..2903515f3 --- /dev/null +++ b/talimatname/genel/p/python3-pytz/talimat @@ -0,0 +1,15 @@ +# Tanım: Python yerel zaman kütüphanesi +# URL: http://pypi.python.org/pypi/pytz +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-pytz +surum=2017.2 +devir=1 + +kaynak=(https://pypi.python.org/packages/a4/09/c47e57fc9c7062b4e83b075d418800d322caa87ec0ac21e6308bd3a2d519/pytz-2017.2.zip) + +derle() { + cd pytz-$surum + python3 setup.py install --root=$PKG/ +} diff --git a/talimatname/genel/p/python3-qt5/talimat b/talimatname/genel/p/python3-qt5/talimat new file mode 100644 index 000000000..80d4e869c --- /dev/null +++ b/talimatname/genel/p/python3-qt5/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt5 için bağlayıcı python +# URL: https://sourceforge.net/projects/pyqt/f +# Paketçi: milisarge +# Gerekler: dbus-python python3-sip qt5 qt5-webkit python3-opengl python3 qt5-webengine + +isim=python3-qt5 +surum=5.9 +devir=1 + +kaynak=(http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-$surum/PyQt5_gpl-$surum.tar.gz) +derle() { +cd PyQt5_gpl-$surum + +python3 configure.py \ + -q /usr/bin/qmake-qt5 \ + --confirm-license \ + --no-sip-files \ + --qsci-api + +find -name 'Makefile' | xargs sed -i 's|-Wl,-rpath,/usr/lib||g;s|-Wl,-rpath,.* ||g' +make +make DESTDIR=$PKG INSTALL_ROOT=$PKG install + +install -Dm644 PyQt5.api $PKG/usr/share/qt/qsci/api/python/PyQt5.api +} diff --git a/talimatname/genel/p/python3-reportlab/talimat b/talimatname/genel/p/python3-reportlab/talimat new file mode 100644 index 000000000..998006250 --- /dev/null +++ b/talimatname/genel/p/python3-reportlab/talimat @@ -0,0 +1,17 @@ +# Tanım: Kanıtlanmış bir endüstri gücü PDF oluşturma çözümü +# URL: http://www.reportlab.org/rl_toolkit.html +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: python3 python3-pillow freetype python3-pip + +isim=python3-reportlab +surum=3.3.0 +devir=1 + +kaynak=( +https://pypi.python.org/packages/source/r/reportlab/reportlab-$surum.tar.gz) + +derle() { + cd reportlab-$surum + python3 setup.py install --prefix=/usr --root=$PKG + python3 setup.py tests +} diff --git a/talimatname/genel/p/python3-setuptools-scm/talimat b/talimatname/genel/p/python3-setuptools-scm/talimat new file mode 100644 index 000000000..5d05cd8b7 --- /dev/null +++ b/talimatname/genel/p/python3-setuptools-scm/talimat @@ -0,0 +1,18 @@ +# Tanım: Python paketlerindeki scm verilerinin yönetimini sağlayan setuptools eklentisi +# URL: https://github.com/pypa/setuptools_scm +# Paketçi: milisarge +# Gerekler: python3 sqlite python3-setuptools + +isim=python3-setuptools-scm +surum=1.15.6 +devir=1 + +kaynak=(https://github.com/pypa/setuptools_scm/archive/v$surum.tar.gz) + +derle() { + export SETUPTOOLS_SCM_PRETEND_VERSION=$surum + cd "$SRC"/setuptools_scm-$surum + python3 setup.py build + python3 setup.py egg_info + python3 setup.py install --root "$PKG" +} diff --git a/talimatname/genel/p/python3-setuptools/talimat b/talimatname/genel/p/python3-setuptools/talimat new file mode 100644 index 000000000..e055b08e9 --- /dev/null +++ b/talimatname/genel/p/python3-setuptools/talimat @@ -0,0 +1,20 @@ +# Tanım: Python paketlerini kolayca indirin, oluşturun, yükleyin, yükseltin ve kaldırın +# URL: https://bitbucket.org/pypa/setuptools +# Paketçi: milisarge +# Gerekler: python3 sqlite libffi + +isim=python3-setuptools +surum=36.0.1 +devir=1 + +kaynak=(https://files.pythonhosted.org/packages/source/${name:8:1}/${name#*-}/${name#*-}-$surum.zip) + +derle() { + cd ${name#*-}-$surum + export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0 + python3 bootstrap.py + python3 setup.py build + python3 setup.py install --prefix=/usr --root=$PKG --optimize=1 + unset SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES + rm $PKG/usr/bin/easy_install +} diff --git a/talimatname/genel/p/python3-sip/talimat b/talimatname/genel/p/python3-sip/talimat new file mode 100644 index 000000000..4b7785960 --- /dev/null +++ b/talimatname/genel/p/python3-sip/talimat @@ -0,0 +1,22 @@ +# Tanım: C ve C ++ kitaplıkları için Python bağlamaları oluşturmayı kolaylaştıran bir araç +# URL: http://www.riverbankcomputing.co.uk/software/sip/intro +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-sip +surum=4.19.3 +devir=1 + +kaynak=(http://sourceforge.net/projects/pyqt/files/sip/sip-$surum/sip-$surum.tar.gz ) + +derle() { + cd sip-$surum + python3 configure.py -b /usr/bin \ + -d /usr/lib/python3.5/site-packages \ + -e /usr/include/python3.5* \ + -v /usr/share/sip + make + make DESTDIR=$PKG install + chmod 644 $PKG/usr/lib/python3.5/site-packages/sipdistutils.py +} + diff --git a/talimatname/genel/p/python3-six/talimat b/talimatname/genel/p/python3-six/talimat new file mode 100644 index 000000000..41173d432 --- /dev/null +++ b/talimatname/genel/p/python3-six/talimat @@ -0,0 +1,18 @@ +# Tanım: Python3 uyumluluk programları. +# URL: http://pypi.python.org/pypi/six/ +# Paketçi: milisarge +# Gerekler: python + +isim=python3-six +surum=1.7.3 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/s/six/six-$surum.tar.gz) + +derle() { + cd six-$surum + python3 setup.py check + python3 setup.py install --prefix=/usr --root=$PKG +} + diff --git a/talimatname/genel/p/python3-smmap/talimat b/talimatname/genel/p/python3-smmap/talimat new file mode 100644 index 000000000..ebfc8a93f --- /dev/null +++ b/talimatname/genel/p/python3-smmap/talimat @@ -0,0 +1,16 @@ +# Tanım: python için bellek harita yöneticisinin saf git uygulaması +# URL: https://github.com/gitpython-developers/smmap +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools + +isim=python3-smmap +_isim=smmap2 +surum=0.9.0 +devir=1 +kaynak=(https://pypi.org/packages/source/s/${_name}/${_name}-${surum}.tar.gz) + +derle() { + cd "${SRC}/${_name}-${surum}" + python3 setup.py build + python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-thrift/talimat b/talimatname/genel/p/python3-thrift/talimat new file mode 100644 index 000000000..34ac78450 --- /dev/null +++ b/talimatname/genel/p/python3-thrift/talimat @@ -0,0 +1,14 @@ +# Tanım: python3 için thrift kütüphanesi +# URL: https://thrift.apache.org/ +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools thrift + +isim=python3-thrift +surum=0.10.0 +devir=1 +kaynak=(https://pypi.python.org/packages/a3/ea/84a41e03f1ab14fb314c8bcf1c451090efa14c5cdfb9797d1079f502b54e/thrift-0.10.0.zip) + +derle() { + cd "thrift-${surum}" + python3 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/p/python3-virtualenv/talimat b/talimatname/genel/p/python3-virtualenv/talimat new file mode 100644 index 000000000..d5835d073 --- /dev/null +++ b/talimatname/genel/p/python3-virtualenv/talimat @@ -0,0 +1,17 @@ +# Tanım: İzole edilmiş Python ortamları yaratmak için kullanılan araç. +# URL: https://virtualenv.pypa.io/ +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-virtualenv +surum=14.0.5 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/v/virtualenv/virtualenv-$surum.tar.gz) + +derle() { + cd virtualenv-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} + diff --git a/talimatname/genel/p/python3-xdg/talimat b/talimatname/genel/p/python3-xdg/talimat new file mode 100644 index 000000000..a8fcb6ee8 --- /dev/null +++ b/talimatname/genel/p/python3-xdg/talimat @@ -0,0 +1,15 @@ +# Tanım: FreeDesktop standartlarına erişmek için kullanılan Python3 kütüphanesi +# URL: http://freedesktop.org/wiki/Software/pyxdg +# Paketçi: geantbrun at gmail dot com +# Gerekler: python3 + +isim=python3-xdg +surum=0.25 +devir=1 + +kaynak=(http://people.freedesktop.org/~takluyver/pyxdg-$surum.tar.gz) + +derle() { + cd pyxdg-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/p/python3-yaml/talimat b/talimatname/genel/p/python3-yaml/talimat new file mode 100644 index 000000000..e033cc526 --- /dev/null +++ b/talimatname/genel/p/python3-yaml/talimat @@ -0,0 +1,14 @@ +# Tanım: python için yaml ayrıştırıcı +# URL: http://pyyaml.org/wiki/PyYAML +# Paketçi: milisarge +# Gerekler: python3 + +isim=python3-yaml +surum=3.12 +devir=1 +kaynak=(http://pyyaml.org/download/pyyaml/PyYAML-$surum.tar.gz) + +derle() { + cd PyYAML-$surum + python3 setup.py install --root=$PKG +} diff --git a/talimatname/genel/p/python3/python3.okubeni b/talimatname/genel/p/python3/python3.okubeni new file mode 100644 index 000000000..5ea722781 --- /dev/null +++ b/talimatname/genel/p/python3/python3.okubeni @@ -0,0 +1 @@ +configure uses pkgconfig to find libffi. There is a circular dependency here: Pkgconfig requires Glib which requires Python 2. there is a circular dependency with the Tk package as it requires Xorg to be installed but parts of Xorg depend on Python diff --git a/talimatname/genel/p/python3/python3.png b/talimatname/genel/p/python3/python3.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4a3d85f057ccfeb48b88b5f0ce7c2f02912a60 GIT binary patch literal 2162 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/p/python3/talimat b/talimatname/genel/p/python3/talimat new file mode 100644 index 000000000..c84631a6f --- /dev/null +++ b/talimatname/genel/p/python3/talimat @@ -0,0 +1,68 @@ +# Tanım: Sonraki nesil python üst düzey betik dili +# URL: http://www.python.org +# Paketçi: milisarge +# Gerekler: sqlite + +isim=python3 +surum=3.5.1 +devir=1 + +kaynak=( +http://www.python.org/ftp/python/$surum/Python-$surum.tar.xz +python3.png) + +docsurum=3.5.0a3 + +derle() { + cd Python-$surum + ./configure --prefix=/usr \ + --enable-shared \ + --with-system-expat \ + --with-system-ffi \ + --without-ensurepip + make + make DESTDIR=$PKG install + + chmod -v 755 $PKG/usr/lib/libpython3.5m.so + chmod -v 755 $PKG//usr/lib/libpython3.so + +# Install all HTML Docs files with desktop menu integration + + install -v -dm755 $PKG/usr/share/doc/$isim-$docversion/html + cd $SRC + wget --no-check-certificate -c https://www.python.org/ftp/python/doc/${docversion:0:5}/python-${docversion}-docs-html.tar.bz2 + tar --strip-components=1 \ + --no-same-owner \ + --no-same-permissions \ + -C $PKG/usr/share/doc/$isim-$docversion/html \ + -xvf python-$docversion-docs-html.tar.bz2 + + find $PKG/usr/share/doc/$isim-$docversion -type d -exec chmod 0755 {} \; + find $PKG/usr/share/doc/$isim-$docversion -type f -exec chmod 0644 {} \; + + mkdir -p $PKG/usr/share/applications + echo "[Desktop Entry] +Categories=Development;Documentation +Exec=xdg-open file:///usr/share/doc/python3-$docversion/html/index.html +Icon=python3 +StartupNotify=false +Terminal=false +Type=Application +Name=Python 3 Documentation +Name[fr]=Documentation Python 3" > $PKG/usr/share/applications/python3.desktop + install -Dm644 $SRC/$isim.png \ + $PKG/usr/share/icons/hicolor/48x48/apps/$isim.png +} +doc () { +cd $PKG +bsdtar -cf \ +bsdtar -cf \ +$PKGMK_PACKAGE_DIR/$isim.doc#$surum-any.mps \ +usr/share/doc/$isim-$docversion \ +usr/share/applications/$isim.desktop \ +usr/share/icons/hicolor/48x48/apps/$isim.png + +rm -r usr/share/{doc,applications/$isim.desktop,icons/hicolor/48x48/apps/$isim.png} + +} + diff --git a/talimatname/genel/p/pytwodict/talimat b/talimatname/genel/p/pytwodict/talimat new file mode 100644 index 000000000..7b614be59 --- /dev/null +++ b/talimatname/genel/p/pytwodict/talimat @@ -0,0 +1,18 @@ +# Tanım: Python için basit iki yönlü sıralı sözlük +# URL: https://github.com/MrS0m30n3/twodict +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Gruplar: kütüphane + +isim=pytwodict +surum=1.2 +devir=1 + +kaynak=(https://github.com/MrS0m30n3/twodict/archive/1.2.tar.gz::$isim-$surum.tar.gz) + +derle() { +cd twodict-$surum + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + python setup.py install --root="$PKG" --optimize=1 + python3 setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/p/pyurllibs/talimat b/talimatname/genel/p/pyurllibs/talimat new file mode 100644 index 000000000..565b74859 --- /dev/null +++ b/talimatname/genel/p/pyurllibs/talimat @@ -0,0 +1,24 @@ +# Tanım: İş parçacıklı bağlantı havuzu ve dosya postası desteğiyle HTTP kitaplığı +# URL: https://github.com/shazow/urllib3 +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pyurllibs +surum=1.22 +devir=1 + +kaynak=(https://github.com/shazow/urllib3/archive/$surum.tar.gz::urllib3-$surum.tar.gz) + +derle() { + cp -a urllib3-$surum{,-py3} + + cd "$SRC"/urllib3-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 --skip-build + + cd "$SRC"/urllib3-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 --skip-build +} diff --git a/talimatname/genel/p/pywget/talimat b/talimatname/genel/p/pywget/talimat new file mode 100644 index 000000000..56ab6f9da --- /dev/null +++ b/talimatname/genel/p/pywget/talimat @@ -0,0 +1,16 @@ +# Tanım: Wget python bağlayıcı kütüphane +# URL: http://bitbucket.org/techtonik/e19779610914 +# Paketçi: Cihan_Alkan +# Gerekler: python python-setuptools python3 python3-setuptools +# Grup: kütüphane + +isim=pywget +surum=3.2 +devir=1 +kaynak=(https://bitbucket.org/techtonik/python-wget/get/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd techtonik-python-wget-e19779610914 + python setup.py install --root="$PKG/" --optimize=1 + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/p/pyxapp/talimat b/talimatname/genel/p/pyxapp/talimat new file mode 100644 index 000000000..1ea33da77 --- /dev/null +++ b/talimatname/genel/p/pyxapp/talimat @@ -0,0 +1,24 @@ +# Tanım: Python Xapp Kütüphanesi +# URL: https://github.com/linuxmint/python-xapp +# Paketçi: Cihan_Alkan +# Gerekler: python python3 python-setuptools python3-setuptools +# Grup: kütüphane + +isim=pyxapp +surum=1.0.1 +devir=1 + +kaynak=(https://github.com/linuxmint/python-xapp/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cp -a python-xapp-$surum{,-py3} + + cd "$SRC"/python-xapp-$surum + python setup.py build + python setup.py install --root="$PKG" --optimize=1 + + cd "$SRC"/python-xapp-$surum-py3 + python3 setup.py build + + python3 setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/q/qbs/talimat b/talimatname/genel/q/qbs/talimat new file mode 100644 index 000000000..028a21ed7 --- /dev/null +++ b/talimatname/genel/q/qbs/talimat @@ -0,0 +1,23 @@ +# Tanım: Çapraz platform oluşturma aracı +# URL: https://wiki.qt.io/Qbs +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: geliştirme + +isim=qbs +surum=1.10.0 +devir=1 + +kaynak=(https://github.com/qbs/qbs/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd qbs-$surum + qmake-qt5 QBS_INSTALL_PREFIX=/usr \ + QBS_LIBEXEC_INSTALL_DIR=/usr/lib/qbs \ + QBS_RELATIVE_LIBEXEC_PATH=../lib/qbs \ + CONFIG+=qbs_enable_project_file_updates \ + qbs.pro + make + + INSTALL_ROOT="$PKG" make install +} diff --git a/talimatname/genel/q/qca-qt5/talimat b/talimatname/genel/q/qca-qt5/talimat new file mode 100644 index 000000000..e02d8637c --- /dev/null +++ b/talimatname/genel/q/qca-qt5/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt5 Şifreleme Mimarisi +# URL : http://delta.affinix.com/qca/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 nss cmake doxygen + +isim=qca-qt5 +surum=2.1.1 +devir=1 + +kaynak=(http://download.kde.org/stable/qca/$surum/src/qca-$surum.tar.xz) + +derle() { +cd qca-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTS=OFF \ + -DQCA_SUFFIX=qt5 \ + -DQCA_INSTALL_IN_QT_PREFIX=ON + +make +make DESTDIR=$PKG install + + +rm $PKG/usr/lib/qt5/mkspecs/features/crypto.prf +} + diff --git a/talimatname/genel/q/qca/talimat b/talimatname/genel/q/qca/talimat new file mode 100644 index 000000000..56406407a --- /dev/null +++ b/talimatname/genel/q/qca/talimat @@ -0,0 +1,23 @@ +# Tanım: Qt Şifreleme Mimarisi (Qt4). +# URL: http://delta.affinix.com/qca/ +# Paketçi: milisage +# Gerekler: qt4 + +isim=qca +surum=2.1.0 +devir=1 + +kaynak=(http://delta.affinix.com/download/$isim/2.0/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=$PKG/$QT4DIR \ + -DCMAKE_BUILD_TYPE=Release \ + -DQT4_BUILD=ON \ + .. + make + make INSTALL_ROOT=$PKG install + find $PKG -name "*.pc" -exec sed -i "s,$PKG,,g" {} \; +} diff --git a/talimatname/genel/q/qemu-all/talimat b/talimatname/genel/q/qemu-all/talimat new file mode 100644 index 000000000..d7cecfec3 --- /dev/null +++ b/talimatname/genel/q/qemu-all/talimat @@ -0,0 +1,41 @@ +# Tanım: QEMU, iyi öykünme hızı elde etmek için dinamik çeviri kullanan bir işlemci öykünücüsüdür (PC, PowerPC, PowerMac, güneş, Mips, ARM vb.) +# URL: http://www.qemu.org +# Paketçi: milisarge +# Gerekler: gtk2 gtk3 sdl glib python vte vte3 xorg-mesa nss lzo cyrus-sasl alsa-lib alsa-plugins alsa-utils curl check bluez ncurses nfs-utils libgcrypt libcap-ng gnutls libusb bzip2 usbutils bridge-utils + +isim=qemu-all +surum=2.6.0 +devir=1 +kaynak=(http://wiki.qemu.org/download/qemu-$surum.tar.bz2) + +derle() { + + cd qemu-$surum + + ./configure --prefix=/usr \ + --cc="${CC:=gcc}" \ + --host-cc="${CC:=gcc}" \ + --sysconfdir=/etc \ + --disable-docs \ + --libexecdir=/usr/lib/qemu \ + --disable-gtk \ + --localstatedir=/var + + # Düzeltme, libcap ile ilgili sorunları içerir + sed -i -e '/#include "qemu\/xattr.h"/d' \ + -e 's|#include <sys/resource.h>|#include <sys/resource.h>\r\n#include "qemu\/xattr.h"|g' \ + fsdev/virtfs-proxy-helper.c + + make ${MAKEFLAGS:=} + make DESTDIR=$PKG install + + make qemu.1 qemu-img.1 qemu-nbd.8 + install -D -m 644 qemu.1 $PKG/usr/share/man1/qemu.1 + install -D -m 644 qemu-img.1 $PKG/usr/share/man1/qemu-img.1 + install -D -m 644 qemu-nbd.8 $PKG/usr/share/man8/qemu-nbd.8 + + install -d $PKG/etc/udev/rules.d/ + echo 'KERNEL=="kvm", NAME="kvm", OWNER="root", GROUP="kvm", MODE="0660"' > \ + $PKG/etc/udev/rules.d/60-kvm.rules + +} diff --git a/talimatname/genel/q/qjson/talimat b/talimatname/genel/q/qjson/talimat new file mode 100644 index 000000000..c0f91c081 --- /dev/null +++ b/talimatname/genel/q/qjson/talimat @@ -0,0 +1,21 @@ +# Tanım: JSON verilerini QVariant nesnelerine eşleyen bir qt tabanlı kitaplık +# URL: http://qjson.sourceforge.net +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake qt5 + +isim=qjson +surum=0.8.2 +devir=1 + +kaynak=( http://source.pisilinux.org/1.0/qjson-0.82_d0f62e65.tar.gz) + +derle() { +cd $isim +mkdir build +cd build +cmake .. \ +-DCMAKE_INSTALL_PREFIX=/usr \ +-DCMAKE_BUILD_TYPE=Release +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/qlibc/talimat b/talimatname/genel/q/qlibc/talimat new file mode 100644 index 000000000..4787a27af --- /dev/null +++ b/talimatname/genel/q/qlibc/talimat @@ -0,0 +1,18 @@ +# Tanım: Hızlı ve sade C kütüphaneleri +# Url: https://github.com/wolkykim/qlibc +# Paketçi: milisarge +# Gerekler: + +isim=qlibc +surum=2.4.2 +devir=1 +kaynak=(https://github.com/wolkykim/qlibc/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make tests + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/q/qmmp/talimat b/talimatname/genel/q/qmmp/talimat new file mode 100644 index 000000000..8740fbb3d --- /dev/null +++ b/talimatname/genel/q/qmmp/talimat @@ -0,0 +1,21 @@ +# Tanım: Qt5 tabanlı ses oynatıcı +# URL: http://qmmp.ylsoftware.com/ +# Paketçi: Cihan_Alkan +# Gerekler: alsa-lib curl desktop-file-utils hicolor-icon-theme libmad libvorbis libogg libxkbcommon taglib xdg-utils qt5 cmake flac jack libmpcdec pulseaudio ffmpeg libcdio-paranoia libcddb libmms libsamplerate libmodplug libsndfile wavpack xorg-mesa faad2 libgme opusfile wildmidi +# Grup: medya + + +isim=qmmp +surum=1.2.0 +devir=1 +kaynak=(http://qmmp.ylsoftware.com/files/$isim-$surum.tar.bz2) + +derle() { + + cd $isim-$surum + cmake . -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib \ + -DUSE_HAL:BOOL=FALSE + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/q/qpdf/talimat b/talimatname/genel/q/qpdf/talimat new file mode 100644 index 000000000..08f8b8f44 --- /dev/null +++ b/talimatname/genel/q/qpdf/talimat @@ -0,0 +1,18 @@ +# Tanım: Qpdf paketi, PDF dosyaları üzerinde yapısal, içerik koruma dönüştürmeleri yapan komut satırı programları ve kitaplığı içerir. +# URL: http://qpdf.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: pcre libxslt + +isim=qpdf +surum=20170726 +devir=2 +kaynak=(https://github.com/qpdf/qpdf/archive/master.zip::$isim-$surum.tar.gz) + +derle() { + cd $isim-master + ./autogen.sh + ./configure --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/qps/qps.desktop b/talimatname/genel/q/qps/qps.desktop new file mode 100644 index 000000000..cb74c7a15 --- /dev/null +++ b/talimatname/genel/q/qps/qps.desktop @@ -0,0 +1,87 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> +<head> +<title>svntogit/community.git - Git clone of the 'community' repository + + + + + + + + + + + +
+ +
+ +
+
+
+ + + +
+summaryrefslogtreecommitdiffstats
+ + + +
+
+
blob: f3da91f991711e11e10ab0b8009a0d1002734ece (plain) + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+
[Desktop Entry]
+Categories=Application;System;
+Name=qps
+GenericName=Visual process manager
+Comment=GUI version version of "ps" or "top"
+Exec=qps
+Icon=qps.xpm
+Terminal=false
+Type=Application
+Encoding=UTF-8
+StartupNotify=false
+
+
+
+

Copyright © 2002-2016 Judd Vinet and Aaron Griffin. The Arch Linux name and logo +are recognized trademarks. Some rights reserved. The registered trademark +Linux® is used pursuant to a sublicense from LMI, the exclusive licensee +of Linus Torvalds, owner of the mark on a world-wide basis.

+
+
+ + diff --git a/talimatname/genel/q/qps/talimat b/talimatname/genel/q/qps/talimat new file mode 100644 index 000000000..4a586f0ae --- /dev/null +++ b/talimatname/genel/q/qps/talimat @@ -0,0 +1,22 @@ +# Tanım: Qt için süreç yöneticisi +# URL: https://github.com/QtDesktop/qps/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: qt5 + +isim=qps +surum=1.10.16 +devir=1 +kaynak=(https://github.com/QtDesktop/$isim/archive/v$surum.tar.gz \ +qps.desktop) + +derle() { + + cd $SRC/$isim-$surum + cmake . + make + install -D -m 755 src/qps $PKG/usr/bin/qps + install -D -m 644 qps.1 $PKG/usr/share/man/man1/qps.1 + install -D -m 644 $SRC/qps.desktop $PKG/usr/share/applications/qps.desktop + install -D -m 644 icon/icon.xpm $PKG/usr/share/pixmaps/qps.xpm + +} diff --git a/talimatname/genel/q/qqwing/talimat b/talimatname/genel/q/qqwing/talimat new file mode 100644 index 000000000..5247a3a97 --- /dev/null +++ b/talimatname/genel/q/qqwing/talimat @@ -0,0 +1,20 @@ +# Tanım: Sudoku üreten ve çözen yazılım +# URL: https://qqwing.com/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: oyun + +isim=qqwing +surum=1.3.4 +devir=1 + +kaynak=(https://qqwing.com/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR=$PKG install + rm -rf "${PKG}"/usr/share/man +} diff --git a/talimatname/genel/q/qrencode/talimat b/talimatname/genel/q/qrencode/talimat new file mode 100644 index 000000000..7112fd589 --- /dev/null +++ b/talimatname/genel/q/qrencode/talimat @@ -0,0 +1,17 @@ +# Tanım: C kütüphanesi, bir QR Code sembolündeki verileri şifrelemek için kullanılır. +# URL: http://megaui.net/fukuchi/works/qrencode/index.en.html +# Paketçi: milisarge +# Gerekler: libpng sdl + +isim=qrencode +surum=4.0.0 +devir=1 + +kaynak=(http://megaui.net/fukuchi/works/${isim}/${isim}-${surum}.tar.bz2) + +derle() { + cd $SRC/$isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/qt4/talimat b/talimatname/genel/q/qt4/talimat new file mode 100644 index 000000000..afc3e70a1 --- /dev/null +++ b/talimatname/genel/q/qt4/talimat @@ -0,0 +1,168 @@ +# Tanım: Qt, GUI uygulamaları geliştirmek için yaygın olarak kullanılan çapraz platform bir çerçevedir +# URL: http://www.qt.io/ +# Paketçi: milisarge +# Gerekler: glib atk pango cairo gdk-pixbuf xorg-fontconfig xorg-libsm xorg-libxrandr xorg-libxv xorg-libxi xorg-libxinerama xorg-libxcursor xorg-libxfixes xorg-mesa xorg-glu alsa-lib dbus icu libjpeg-turbo libmng libtiff openssl sqlite cups gtk2 gstreamer-plugins-base postgresql pulseaudio unixodbc + +isim=qt4 +surum=4.8.7 +devir=6 + +_isim=qt-everywhere-opensource-src-${surum} + +kaynak=(http://download.qt-project.org/official_releases/qt/${surum%.*}.tar.gz) + +derle() { + +QT4PREFIX=/usr +QT4DIR=$QT4PREFIX +QT4BINDIR=$QT4PREFIX/lib/qt4/bin + +cd ${_name} + + ./configure -prefix $QT4PREFIX \ + -bindir $QT4BINDIR \ + -plugindir /usr/lib/qt4/plugins \ + -importdir /usr/lib/qt4/imports \ + -headerdir /usr/include/qt4 \ + -datadir /usr/share/qt4 \ + -sysconfdir /etc/xdg \ + -docdir /usr/share/doc/qt4 \ + -demosdir /usr/share/doc/qt4/demos \ + -examplesdir /usr/share/doc/qt4/examples \ + -translationdir /usr/share/qt4/translations \ + -confirm-license \ + -opensource \ + -release \ + -dbus-linked \ + -openssl-linked \ + -system-sqlite \ + -no-phonon \ + -no-phonon-backend \ + -no-webkit \ + -no-openvg \ + -nomake demos \ + -nomake examples \ + -nomake docs \ + -optimized-qmake + +make + +find . -name "*.pc" -exec perl -pi -e "s, -L$PWD/?\S+,,g" {} \; + +make INSTALL_ROOT=$PKG install + +rm -rf $PKG/usr/tests + +for file in $PKG/usr/lib/libQt*.prl; do + sed -r -e '/^QMAKE_PRL_BUILD_DIR/d' \ + -e 's/(QMAKE_PRL_LIBS =).*/\1/' \ + -i $file + +done +unset file + +install -v -Dm644 src/gui/dialogs/images/qtlogo-64.png \ + $PKG/usr/share/pixmaps/qt4logo.png + +install -v -Dm644 tools/assistant/tools/assistant/images/assistant-128.png \ + $PKG//usr/share/pixmaps/assistant-qt4.png + +install -v -Dm644 tools/designer/src/designer/images/designer.png \ + /usr/share/pixmaps/designer-qt4.png + +install -v -Dm644 tools/linguist/linguist/images/icons/linguist-128-32.png \ + $PKG/usr/share/pixmaps/linguist-qt4.png + +install -v -Dm644 tools/qdbus/qdbusviewer/images/qdbusviewer-128.png \ + $PKG/usr/share/pixmaps/qdbusviewer-qt4.png + +install -dm755 $PKG/usr/share/applications + +install -d $PKG/usr/bin + +for i in $PKG/usr/lib/qt4/bin/*; do + ln -s /usr/lib/qt4/bin/$(basename $i) $PKG/usr/bin/$(basename $i)-qt4 +done + +cat > $PKG/usr/share/applications/assistant-qt4.desktop << EOF +[Desktop Entry] +Name=Qt4 Assistant +Comment=Shows Qt4 documentation and examples +Exec=$QT4BINDIR/assistant +Icon=assistant-qt4.png +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development;Documentation; +EOF + +cat > $PKG/usr/share/applications/designer-qt4.desktop << EOF +[Desktop Entry] +Name=Qt4 Designer +Comment=Design GUIs for Qt4 applications +Exec=$QT4BINDIR/designer +Icon=designer-qt4.png +MimeType=application/x-designer; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF + +cat > $PKG/usr/share/applications/linguist-qt4.desktop << EOF +[Desktop Entry] +Name=Qt4 Linguist +Comment=Add translations to Qt4 applications +Exec=$QT4BINDIR/linguist +Icon=linguist-qt4.png +MimeType=text/vnd.trolltech.linguist;application/x-linguist; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF + +cat > $PKG/usr/share/applications/qdbusviewer-qt4.desktop << EOF +[Desktop Entry] +Name=Qt4 QDbusViewer +GenericName=D-Bus Debugger +Comment=Debug D-Bus applications +Exec=$QT4BINDIR/qdbusviewer +Icon=qdbusviewer-qt4.png +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development;Debugger; +EOF + +cat > $PKG/usr/share/applications/qtconfig-qt4.desktop << EOF +[Desktop Entry] +Name=Qt4 Config +Comment=Configure Qt4 behavior, styles, fonts +Exec=$QT4BINDIR/qtconfig +Icon=qt4logo.png +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Settings; +EOF + +mkdir -p $PKG/etc/profile.d +cat > $PKG/etc/profile.d/qt4.sh << EOF +# Begin /etc/profile.d/qt4.sh + +QT4PREFIX=$QT4PREFIX +QT4DIR=$QT4PREFIX +QT4BINDIR=$QT4BINDIR +QTDIR=$QT4DIR +export QT4PREFIX QT4DIR QTDIR QT4BINDIR + +# End /etc/profile.d/qt4.sh +EOF + +cat > $PKG/usr/bin/setqt4 << EOF +if [ "x\$QT5BINDIR" != "x/usr/bin" ] && [ "x\$QT5BINDIR" != "x" ]; then pathremove $QT5BINDIR; fi +if [ "x\$QT4BINDIR" != "x/usr/bin" ]; then pathprepend $QT4BINDIR; fi +echo \$PATH +EOF +} diff --git a/talimatname/genel/q/qt5-gstreamer/qt5-gstreamer-1.6.patch b/talimatname/genel/q/qt5-gstreamer/qt5-gstreamer-1.6.patch new file mode 100644 index 000000000..be33810f3 --- /dev/null +++ b/talimatname/genel/q/qt5-gstreamer/qt5-gstreamer-1.6.patch @@ -0,0 +1,38 @@ +From e2ca8094aa8d0eac1c3a98df66fe94ce0c754088 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jos=C3=A9=20Manuel=20Santamar=C3=ADa?= +Date: Fri, 2 Oct 2015 15:00:29 +0300 +Subject: Fix compilation with GStreamer >= 1.5.1 + +apply gstreamer pkg-config definitions To ensure gstreamer builds correctly, +pick up its cflags in FindGstreamer and apply them to the build as definitions + +https://lists.ubuntu.com/archives/kubuntu-devel/2015-August/009819.html + +https://bugzilla.gnome.org/show_bug.cgi?id=751382 + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4d3e7dd..5744015 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -106,6 +106,7 @@ find_package(GObject) + macro_log_feature(GOBJECT_FOUND "GObject" "Required to build QtGLib" "http://www.gtk.org/" TRUE) + + set(CMAKE_REQUIRED_INCLUDES ${QTGSTREAMER_INCLUDES}) ++add_definitions(${GSTREAMER_DEFINITIONS}) + include(CheckCXXSourceCompiles) + check_cxx_source_compiles(" + #include +diff --git a/cmake/modules/FindGStreamer.cmake b/cmake/modules/FindGStreamer.cmake +index dab91ac..fe6cde1 100644 +--- a/cmake/modules/FindGStreamer.cmake ++++ b/cmake/modules/FindGStreamer.cmake +@@ -36,6 +36,7 @@ if (PKG_CONFIG_FOUND) + exec_program(${PKG_CONFIG_EXECUTABLE} + ARGS --variable pluginsdir gstreamer-${GSTREAMER_ABI_VERSION} + OUTPUT_VARIABLE PKG_GSTREAMER_PLUGIN_DIR) ++ set(GSTREAMER_DEFINITIONS ${PKG_GSTREAMER_CFLAGS}) + endif() + + find_library(GSTREAMER_LIBRARY +-- +cgit v0.10.2 diff --git a/talimatname/genel/q/qt5-gstreamer/talimat b/talimatname/genel/q/qt5-gstreamer/talimat new file mode 100644 index 000000000..f801e74c4 --- /dev/null +++ b/talimatname/genel/q/qt5-gstreamer/talimat @@ -0,0 +1,27 @@ +# Tanım: GStreamer için Qt5 bağları. +# URL: http://gstreamer.freedesktop.org/modules/qt-gstreamer.htm +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake boost xorg-mesa doxygen gstreamer1-plugins-good qt5 + +isim=qt5-gstreamer +surum=1.2.0 +devir=1 + +kaynak=(http://gstreamer.freedesktop.org/src/qt-gstreamer/qt-gstreamer-$surum.tar.xz + qt5-gstreamer-1.6.patch) + +derle() { + mkdir build + cd qt-gstreamer-$surum + patch -p1 -i ../qt5-gstreamer-1.6.patch + + cd ../build + cmake ../qt-gstreamer-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DQTGSTREAMER_EXAMPLES=OFF \ + -DQT_VERSION=5 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/qt5-pas/talimat b/talimatname/genel/q/qt5-pas/talimat new file mode 100644 index 000000000..973759a8d --- /dev/null +++ b/talimatname/genel/q/qt5-pas/talimat @@ -0,0 +1,17 @@ +# Tanım: Ücretsiz Pascal Qt5 bağlayıcı kütüphanesi lazarus tarafından güncellendi +# URL: https://svn.freepascal.org/svn/lazarus/trunk/lcl/interfaces/qt5/cbindings +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: geliştirme + +isim=qt5-pas +surum=2.6 +devir=1 +kaynak=(http://http.debian.net/debian/pool/main/libq/libqtpas/libqtpas_2.6~beta.orig.tar.xz) + +derle() { + cd cbindings + qmake-qt5 "QT += x11extras" + make + make INSTALL_ROOT="$PKG" install +} diff --git a/talimatname/genel/q/qt5-styleplugins/talimat b/talimatname/genel/q/qt5-styleplugins/talimat new file mode 100644 index 000000000..d3be78d01 --- /dev/null +++ b/talimatname/genel/q/qt5-styleplugins/talimat @@ -0,0 +1,20 @@ +# Tanım: Qt5 için ek stil eklentileri +# URL: https://code.qt.io/cgit/qt/qtstyleplugins +# Paketçi: Cihan Alkan +# Gerekler: gtk2 qt5 +# Grup: deepin + +isim=qt5-styleplugins +surum=5.0.0 +devir=1 +kaynak=(https://github.com/qt/qtstyleplugins/archive/v5.0.0.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd qtstyleplugins-$surum + qmake-qt5 PREFIX='/usr' \ + LIBDIR='/usr/lib' \ + QMAKE_CFLAGS_RELEASE="$CFLAGS" \ + QMAKE_CXXFLAGS_RELEASE="$CXXFLAGS" + make + make INSTALL_ROOT="${PKG}" install +} diff --git a/talimatname/genel/q/qt5-webengine/clip-ft-glyph.diff b/talimatname/genel/q/qt5-webengine/clip-ft-glyph.diff new file mode 100644 index 000000000..4ca703504 --- /dev/null +++ b/talimatname/genel/q/qt5-webengine/clip-ft-glyph.diff @@ -0,0 +1,162 @@ +# HG changeset patch +# User Lee Salzman +# Date 1504120456 14400 +# Wed Aug 30 15:14:16 2017 -0400 +# Node ID 708d52f954b6d7ca2497fcb5b5084c6483300e89 +# Parent 33224536ce20d942576cd4b9ffb350d6dce397bc +clip FreeType glyph bitmap to mask in Skia + +MozReview-Commit-ID: 9NqLj9SkHFo + +diff --git a/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.cpp b/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.cpp +--- a/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.cpp ++++ b/gfx/skia/skia/src/ports/SkFontHost_FreeType_common.cpp +@@ -390,65 +390,131 @@ void SkScalerContext_FreeType_Base::gene + const SkMatrix& bitmapTransform) + { + const bool doBGR = SkToBool(fRec.fFlags & SkScalerContext::kLCD_BGROrder_Flag); + const bool doVert = SkToBool(fRec.fFlags & SkScalerContext::kLCD_Vertical_Flag); + + switch ( face->glyph->format ) { + case FT_GLYPH_FORMAT_OUTLINE: { + FT_Outline* outline = &face->glyph->outline; +- FT_BBox bbox; +- FT_Bitmap target; + + int dx = 0, dy = 0; + if (fRec.fFlags & SkScalerContext::kSubpixelPositioning_Flag) { + dx = SkFixedToFDot6(glyph.getSubXFixed()); + dy = SkFixedToFDot6(glyph.getSubYFixed()); + // negate dy since freetype-y-goes-up and skia-y-goes-down + dy = -dy; + } +- FT_Outline_Get_CBox(outline, &bbox); +- /* +- what we really want to do for subpixel is +- offset(dx, dy) +- compute_bounds +- offset(bbox & !63) +- but that is two calls to offset, so we do the following, which +- achieves the same thing with only one offset call. +- */ +- FT_Outline_Translate(outline, dx - ((bbox.xMin + dx) & ~63), +- dy - ((bbox.yMin + dy) & ~63)); ++ ++ memset(glyph.fImage, 0, glyph.rowBytes() * glyph.fHeight); + + if (SkMask::kLCD16_Format == glyph.fMaskFormat) { ++ FT_Outline_Translate(outline, dx, dy); + FT_Error err = FT_Render_Glyph(face->glyph, doVert ? FT_RENDER_MODE_LCD_V : + FT_RENDER_MODE_LCD); + if (err) { + SK_TRACEFTR(err, "Could not render glyph."); +- sk_bzero(glyph.fImage, glyph.computeImageSize()); + return; + } ++ + SkMask mask; + glyph.toMask(&mask); ++#ifdef SK_SHOW_TEXT_BLIT_COVERAGE ++ memset(mask.fImage, 0x80, mask.fBounds.height() * mask.fRowBytes); ++#endif ++ FT_GlyphSlotRec& ftGlyph = *face->glyph; ++ ++ if (!SkIRect::Intersects(mask.fBounds, ++ SkIRect::MakeXYWH( ftGlyph.bitmap_left, ++ -ftGlyph.bitmap_top, ++ ftGlyph.bitmap.width, ++ ftGlyph.bitmap.rows))) ++ { ++ return; ++ } ++ ++ // If the FT_Bitmap extent is larger, discard bits of the bitmap outside the mask. ++ // If the SkMask extent is larger, shrink mask to fit bitmap (clearing discarded). ++ unsigned char* origBuffer = ftGlyph.bitmap.buffer; ++ // First align the top left (origin). ++ if (-ftGlyph.bitmap_top < mask.fBounds.fTop) { ++ int32_t topDiff = mask.fBounds.fTop - (-ftGlyph.bitmap_top); ++ ftGlyph.bitmap.buffer += ftGlyph.bitmap.pitch * topDiff; ++ ftGlyph.bitmap.rows -= topDiff; ++ ftGlyph.bitmap_top = -mask.fBounds.fTop; ++ } ++ if (ftGlyph.bitmap_left < mask.fBounds.fLeft) { ++ int32_t leftDiff = mask.fBounds.fLeft - ftGlyph.bitmap_left; ++ ftGlyph.bitmap.buffer += leftDiff; ++ ftGlyph.bitmap.width -= leftDiff; ++ ftGlyph.bitmap_left = mask.fBounds.fLeft; ++ } ++ if (mask.fBounds.fTop < -ftGlyph.bitmap_top) { ++ mask.fImage += mask.fRowBytes * (-ftGlyph.bitmap_top - mask.fBounds.fTop); ++ mask.fBounds.fTop = -ftGlyph.bitmap_top; ++ } ++ if (mask.fBounds.fLeft < ftGlyph.bitmap_left) { ++ mask.fImage += sizeof(uint16_t) * (ftGlyph.bitmap_left - mask.fBounds.fLeft); ++ mask.fBounds.fLeft = ftGlyph.bitmap_left; ++ } ++ // Origins aligned, clean up the width and height. ++ int ftVertScale = (doVert ? 3 : 1); ++ int ftHoriScale = (doVert ? 1 : 3); ++ if (mask.fBounds.height() * ftVertScale < SkToInt(ftGlyph.bitmap.rows)) { ++ ftGlyph.bitmap.rows = mask.fBounds.height() * ftVertScale; ++ } ++ if (mask.fBounds.width() * ftHoriScale < SkToInt(ftGlyph.bitmap.width)) { ++ ftGlyph.bitmap.width = mask.fBounds.width() * ftHoriScale; ++ } ++ if (SkToInt(ftGlyph.bitmap.rows) < mask.fBounds.height() * ftVertScale) { ++ mask.fBounds.fBottom = mask.fBounds.fTop + ftGlyph.bitmap.rows / ftVertScale; ++ } ++ if (SkToInt(ftGlyph.bitmap.width) < mask.fBounds.width() * ftHoriScale) { ++ mask.fBounds.fRight = mask.fBounds.fLeft + ftGlyph.bitmap.width / ftHoriScale; ++ } + if (fPreBlend.isApplicable()) { +- copyFT2LCD16(face->glyph->bitmap, mask, doBGR, ++ copyFT2LCD16(ftGlyph.bitmap, mask, doBGR, + fPreBlend.fR, fPreBlend.fG, fPreBlend.fB); + } else { +- copyFT2LCD16(face->glyph->bitmap, mask, doBGR, ++ copyFT2LCD16(ftGlyph.bitmap, mask, doBGR, + fPreBlend.fR, fPreBlend.fG, fPreBlend.fB); + } ++ // Restore the buffer pointer so FreeType can properly free it. ++ ftGlyph.bitmap.buffer = origBuffer; + } else { ++ FT_BBox bbox; ++ FT_Bitmap target; ++ FT_Outline_Get_CBox(outline, &bbox); ++ /* ++ what we really want to do for subpixel is ++ offset(dx, dy) ++ compute_bounds ++ offset(bbox & !63) ++ but that is two calls to offset, so we do the following, which ++ achieves the same thing with only one offset call. ++ */ ++ FT_Outline_Translate(outline, dx - ((bbox.xMin + dx) & ~63), ++ dy - ((bbox.yMin + dy) & ~63)); ++ + target.width = glyph.fWidth; + target.rows = glyph.fHeight; + target.pitch = glyph.rowBytes(); + target.buffer = reinterpret_cast(glyph.fImage); + target.pixel_mode = compute_pixel_mode( (SkMask::Format)fRec.fMaskFormat); + target.num_grays = 256; + +- memset(glyph.fImage, 0, glyph.rowBytes() * glyph.fHeight); + FT_Outline_Get_Bitmap(face->glyph->library, outline, &target); ++#ifdef SK_SHOW_TEXT_BLIT_COVERAGE ++ for (int y = 0; y < glyph.fHeight; ++y) { ++ for (int x = 0; x < glyph.fWidth; ++x) { ++ uint8_t& a = ((uint8_t*)glyph.fImage)[(glyph.rowBytes() * y) + x]; ++ a = SkTMax(a, 0x20); ++ } ++ } ++#endif + } + } break; + + case FT_GLYPH_FORMAT_BITMAP: { + FT_Pixel_Mode pixel_mode = static_cast(face->glyph->bitmap.pixel_mode); + SkMask::Format maskFormat = static_cast(glyph.fMaskFormat); + + // Assume that the other formats do not exist. diff --git a/talimatname/genel/q/qt5-webengine/gzip_string.py b/talimatname/genel/q/qt5-webengine/gzip_string.py new file mode 100644 index 000000000..68f9ea1a0 --- /dev/null +++ b/talimatname/genel/q/qt5-webengine/gzip_string.py @@ -0,0 +1,43 @@ +# Copyright (c) 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Provides gzip utilities for strings. +""" +import cStringIO +import gzip +import subprocess + + +def GzipStringRsyncable(data): + # Make call to host system's gzip to get access to --rsyncable option. This + # option makes updates much smaller - if one line is changed in the resource, + # it won't have to push the entire compressed resource with the update. + # Instead, --rsyncable breaks the file into small chunks, so that one doesn't + # affect the other in compression, and then only that chunk will have to be + # updated. + gzip_proc = subprocess.Popen(['gzip', '--stdout', + '--best', '--no-name'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + data, stderr = gzip_proc.communicate(data) + if gzip_proc.returncode != 0: + raise subprocess.CalledProcessError(gzip_proc.returncode, 'gzip', + stderr) + return data + + +def GzipString(data): + # Gzipping using Python's built in gzip: Windows doesn't ship with gzip, and + # OSX's gzip does not have an --rsyncable option built in. Although this is + # not preferable to --rsyncable, it is an option for the systems that do + # not have --rsyncable. If used over GzipStringRsyncable, the primary + # difference of this function's compression will be larger updates every time + # a compressed resource is changed. + gzip_output = cStringIO.StringIO() + with gzip.GzipFile(mode='wb', compresslevel=9, fileobj=gzip_output, + mtime=0) as gzip_file: + gzip_file.write(data) + data = gzip_output.getvalue() + gzip_output.close() + return data diff --git a/talimatname/genel/q/qt5-webengine/harmony-fix.diff b/talimatname/genel/q/qt5-webengine/harmony-fix.diff new file mode 100644 index 000000000..803730f0d --- /dev/null +++ b/talimatname/genel/q/qt5-webengine/harmony-fix.diff @@ -0,0 +1,69 @@ +diff -u -r qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/third_party/skia/src/ports/SkFontHost_FreeType.cpp qtwebengine-opensource-src-5.9.1-ftfixes/src/3rdparty/chromium/third_party/skia/src/ports/SkFontHost_FreeType.cpp +--- qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/third_party/skia/src/ports/SkFontHost_FreeType.cpp 2017-09-19 17:38:43.659642835 +0200 ++++ qtwebengine-opensource-src-5.9.1-ftfixes/src/3rdparty/chromium/third_party/skia/src/ports/SkFontHost_FreeType.cpp 2017-09-19 17:38:50.492991631 +0200 +@@ -80,7 +80,7 @@ + + class FreeTypeLibrary : SkNoncopyable { + public: +- FreeTypeLibrary() : fLibrary(nullptr), fIsLCDSupported(false), fLCDExtra(0) { ++ FreeTypeLibrary() : fLibrary(nullptr) { + if (FT_New_Library(&gFTMemory, &fLibrary)) { + return; + } +@@ -90,8 +90,6 @@ + // Default { 0x10, 0x40, 0x70, 0x40, 0x10 } adds up to 0x110, simulating ink spread. + // SetLcdFilter must be called before SetLcdFilterWeights. + if (FT_Library_SetLcdFilter(fLibrary, FT_LCD_FILTER_DEFAULT) == 0) { +- fIsLCDSupported = true; +- fLCDExtra = 2; //Using a filter adds one full pixel to each side. + + #ifdef SK_FONTHOST_FREETYPE_USE_NORMAL_LCD_FILTER + // Adds to 0x110 simulating ink spread, but provides better results than default. +@@ -124,13 +122,9 @@ + } + + FT_Library library() { return fLibrary; } +- bool isLCDSupported() { return fIsLCDSupported; } +- int lcdExtra() { return fLCDExtra; } + + private: + FT_Library fLibrary; +- bool fIsLCDSupported; +- int fLCDExtra; + + // FT_Library_SetLcdFilterWeights was introduced in FreeType 2.4.0. + // The following platforms provide FreeType of at least 2.4.0. +@@ -633,17 +627,6 @@ + rec->fTextSize = SkIntToScalar(1 << 14); + } + +- if (isLCD(*rec)) { +- // TODO: re-work so that FreeType is set-up and selected by the SkFontMgr. +- SkAutoMutexAcquire ama(gFTMutex); +- ref_ft_library(); +- if (!gFTLibrary->isLCDSupported()) { +- // If the runtime Freetype library doesn't support LCD, disable it here. +- rec->fMaskFormat = SkMask::kA8_Format; +- } +- unref_ft_library(); +- } +- + SkPaint::Hinting h = rec->getHinting(); + if (SkPaint::kFull_Hinting == h && !isLCD(*rec)) { + // collapse full->normal hinting if we're not doing LCD +@@ -1046,11 +1029,11 @@ + void SkScalerContext_FreeType::updateGlyphIfLCD(SkGlyph* glyph) { + if (isLCD(fRec)) { + if (fLCDIsVert) { +- glyph->fHeight += gFTLibrary->lcdExtra(); +- glyph->fTop -= gFTLibrary->lcdExtra() >> 1; ++ glyph->fHeight += 2; ++ glyph->fTop -= 1; + } else { +- glyph->fWidth += gFTLibrary->lcdExtra(); +- glyph->fLeft -= gFTLibrary->lcdExtra() >> 1; ++ glyph->fWidth += 2; ++ glyph->fLeft -= 1; + } + } + } diff --git a/talimatname/genel/q/qt5-webengine/last-commit-position.patch b/talimatname/genel/q/qt5-webengine/last-commit-position.patch new file mode 100644 index 000000000..307bfb230 --- /dev/null +++ b/talimatname/genel/q/qt5-webengine/last-commit-position.patch @@ -0,0 +1,28 @@ +diff -pruN qtwebengine-opensource-src-5.9.1.orig/src/3rdparty/chromium/tools/gn/BUILD.gn qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/tools/gn/BUILD.gn +--- qtwebengine-opensource-src-5.9.1.orig/src/3rdparty/chromium/tools/gn/BUILD.gn 2017-08-06 08:14:54.775770614 +0000 ++++ qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/tools/gn/BUILD.gn 2017-08-06 08:17:54.230085298 +0000 +@@ -269,7 +269,6 @@ executable("gn") { + + deps = [ + ":gn_lib", +- ":last_commit_position", + "//base", + "//build/config/sanitizers:deps", + "//build/win:default_exe_manifest", +diff -pruN qtwebengine-opensource-src-5.9.1.orig/src/3rdparty/chromium/tools/gn/gn_main.cc qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/tools/gn/gn_main.cc +--- qtwebengine-opensource-src-5.9.1.orig/src/3rdparty/chromium/tools/gn/gn_main.cc 2017-08-06 08:14:54.746771855 +0000 ++++ qtwebengine-opensource-src-5.9.1/src/3rdparty/chromium/tools/gn/gn_main.cc 2017-08-06 08:18:53.627541541 +0000 +@@ -12,13 +12,7 @@ + #include "tools/gn/standard_out.h" + #include "tools/gn/switches.h" + +-// Only the GN-generated build makes this header for now. +-// TODO(brettw) consider adding this if we need it in GYP. +-#if defined(GN_BUILD) +-#include "tools/gn/last_commit_position.h" +-#else + #define LAST_COMMIT_POSITION "UNKNOWN" +-#endif + + namespace { + diff --git a/talimatname/genel/q/qt5-webengine/talimat b/talimatname/genel/q/qt5-webengine/talimat new file mode 100644 index 000000000..6cbfb0ce9 --- /dev/null +++ b/talimatname/genel/q/qt5-webengine/talimat @@ -0,0 +1,34 @@ +# Tanım: Bir WebKit2 tabanlı uygulama sınıfları ve yeni bir QML API'sı +# URL: http://qt-project.org/ +# Paketçi: milisarge +# Gerekler: ffmpeg jsoncpp libvpx libevent libsrtp xorg-libxdamage protobuf nss gstreamer1-plugins-base libwebp xorg-libxcomposite libxslt gstreamer1-plugins-good python ruby qt5 ninja + +isim=qt5-webengine +_isim=qtwebengine +surum=5.9.1 +devir=1 + +#kaynak=(http://download.qt.io/official_releases/qt/5.9/$surum/submodules/$_name-opensource-src-$surum.tar.xz) +kaynak=(http://download.qt.io/official_releases/qt/${surum%.*}/$surum/single/qt-everywhere-opensource-src-$surum.tar.xz + last-commit-position.patch + clip-ft-glyph.diff + harmony-fix.diff + gzip_string.py) + +derle() { + cd $SRC/qt-everywhere-opensource-src-$surum/qtwebengine/ + + #patch -p1 -i $SRC/last-commit-position.patch + patch -d src/3rdparty/chromium/third_party -Np3 < $SRC/clip-ft-glyph.diff + patch -Np1 -i $SRC/harmony-fix.diff + + install -d build + cd build + cp -rf $SRC/gzip_string.py $SRC/qt-everywhere-opensource-src-5.9.1/qtwebengine/src/3rdparty/chromium/tools/grit/grit/format/ + qmake-qt5 WEBENGINE_CONFIG+="use_proprietary_codecs use_system_ffmpeg use_system_icu" ../qtwebengine.pro + make + make INSTALL_ROOT=$PKG install + find "$PKG/usr/lib" -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \; + +} diff --git a/talimatname/genel/q/qt5-webkit/qt5-webkit-icu59.patch b/talimatname/genel/q/qt5-webkit/qt5-webkit-icu59.patch new file mode 100644 index 000000000..2ad514c6a --- /dev/null +++ b/talimatname/genel/q/qt5-webkit/qt5-webkit-icu59.patch @@ -0,0 +1,73 @@ +diff --git a/Source/WTF/wtf/Compiler.h b/Source/WTF/wtf/Compiler.h +index ead844f..e62cfd4 100644 +--- a/Source/WTF/wtf/Compiler.h ++++ b/Source/WTF/wtf/Compiler.h +@@ -61,6 +61,7 @@ + #define WTF_COMPILER_SUPPORTS_HAS_TRIVIAL_DESTRUCTOR __has_feature(has_trivial_destructor) + #define WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS __has_feature(cxx_strong_enums) + #define WTF_COMPILER_SUPPORTS_CXX_REFERENCE_QUALIFIED_FUNCTIONS __has_feature(cxx_reference_qualified_functions) ++#define WTF_COMPILER_SUPPORTS_CXX_NEW_CHAR_TYPES !defined(_LIBCPP_HAS_NO_UNICODE_CHARS) + + #endif + +@@ -142,6 +143,7 @@ + #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS 1 + #endif + #if GCC_VERSION_AT_LEAST(4, 5, 0) ++#define WTF_COMPILER_SUPPORTS_CXX_NEW_CHAR_TYPES 1 + #define WTF_COMPILER_SUPPORTS_CXX_EXPLICIT_CONVERSIONS 1 + #endif + #if GCC_VERSION_AT_LEAST(4, 6, 0) +diff --git a/Source/WTF/wtf/TypeTraits.h b/Source/WTF/wtf/TypeTraits.h +index b9e46bc..876fa45 100644 +--- a/Source/WTF/wtf/TypeTraits.h ++++ b/Source/WTF/wtf/TypeTraits.h +@@ -75,6 +75,10 @@ namespace WTF { + #if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED) + template<> struct IsInteger { static const bool value = true; }; + #endif ++#if COMPILER_SUPPORTS(CXX_NEW_CHAR_TYPES) ++ template<> struct IsInteger { static const bool value = true; }; ++ template<> struct IsInteger { static const bool value = true; }; ++#endif + + template struct IsFloatingPoint { static const bool value = false; }; + template<> struct IsFloatingPoint { static const bool value = true; }; +---qtwebkit-opensource-src-5.5.1/Source/JavaScriptCore/API/JSStringRef.h.orig 2015-10-13 06:37:10.000000000 +0200 ++++ qtwebkit-opensource-src-5.5.1/Source/JavaScriptCore/API/JSStringRef.h 2017-04-24 12:26:42.495345570 +0200 +@@ -32,6 +32,7 @@ + #include + #endif + #include /* for size_t */ ++#include + + #ifdef __cplusplus + extern "C" { +@@ -43,7 +44,7 @@ + @typedef JSChar + @abstract A Unicode character. + */ +- typedef unsigned short JSChar; ++ typedef char16_t JSChar; + #else + typedef wchar_t JSChar; + #endif +--- qtwebkit-opensource-src-5.5.1/Source/WebKit2/Shared/API/c/WKString.h.orig 2015-10-13 06:37:12.000000000 +0200 ++++ qtwebkit-opensource-src-5.5.1/Source/WebKit2/Shared/API/c/WKString.h 2017-04-24 12:27:33.432011867 +0200 +@@ -31,6 +31,7 @@ + #ifndef __cplusplus + #include + #endif ++#include + + #ifdef __cplusplus + extern "C" { +@@ -38,7 +39,7 @@ + + #if !defined(WIN32) && !defined(_WIN32) \ + && !((defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__linux__)) /* RVCT */ +- typedef unsigned short WKChar; ++ typedef char16_t WKChar; + #else + typedef wchar_t WKChar; + #endif diff --git a/talimatname/genel/q/qt5-webkit/talimat b/talimatname/genel/q/qt5-webkit/talimat new file mode 100644 index 000000000..3b4497989 --- /dev/null +++ b/talimatname/genel/q/qt5-webkit/talimat @@ -0,0 +1,26 @@ +# Tanım: Bir WebKit2 tabanlı uygulama sınıfları ve yeni bir QML API'sı +# URL: http://qt-project.org/ +# Paketçi: milisarge +# Gerekler: cmake gstreamer1-plugins-base libwebp xorg-libxcomposite libxslt gstreamer1-plugins-good python ruby qt5 hyphen + +isim=qt5-webkit +_isim=qtwebkit +surum=5.9.0 +devir=1 + +kaynak=(http://download.qt.io/community_releases/5.9/$surum-final/$_name-opensource-src-$surum.tar.xz + qt5-webkit-icu59.patch) + +derle() { + cd $_name-opensource-src-$surum + patch -p1 -i $SRC/qt5-webkit-icu59.patch + install -d build + cd build + qmake-qt5 .. + make + make INSTALL_ROOT=$PKG install + + find "$PKG/usr/lib" -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \; + +} diff --git a/talimatname/genel/q/qt5/qt5-logo.png b/talimatname/genel/q/qt5/qt5-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a32b068deb2c8bb23baf0ba5ac759837029b23 GIT binary patch literal 3495 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 VFfjcU`L+N6002ovPDHLkV1oVstF{0D literal 0 HcmV?d00001 diff --git a/talimatname/genel/q/qt5/talimat b/talimatname/genel/q/qt5/talimat new file mode 100644 index 000000000..3dcd4f70d --- /dev/null +++ b/talimatname/genel/q/qt5/talimat @@ -0,0 +1,152 @@ +# Tanım: Qt ücretsiz sürümü, sürüm 5.x +# URL: http://qt-project.org/ +# Paketçi: milisarge +# Gerekler: hunspell xorg-proto xorg-libxkbfile xorg-xtrans xorg-libx11 xorg-libxext xorg-libfs xorg-libice xorg-libsm xorg-libxscrnsaver xorg-libxt xorg-libxmu xorg-libxpm xorg-libxaw xorg-libxfixes xorg-libxcomposite xorg-libxrender xorg-libxcursor xorg-libxdamage xorg-libfontenc xorg-libxfont xorg-libxft xorg-libxi xorg-libxinerama xorg-libxrandr xorg-libxres xorg-libxtst xorg-libxv xorg-libxvmc xorg-libxxf86dga xorg-libxxf86vm xorg-libdmx xorg-libpciaccess xorg-libxkbfile xorg-libxshmfence xcb-proto xcb-util-image xcb-util-keysyms xcb-util-renderutil xcb-util-wm alsa-lib ca-certificates cups dbus glib gstreamer-plugins-base icu jasper libproxy libinput libjpeg-turbo libmng libpng libtiff libwebp xorg-mesa mtdev openssl pcre sqlite ruby gstreamer1-plugins-base geoclue gtk2 harfbuzz postgresql pulseaudio unixodbc libxkbcommon mariadb + +isim=qt5 +surum=5.9.1 +devir=1 + +_isim=qt-everywhere-opensource-src-${surum} + +kaynak=(http://download.qt.io/official_releases/qt/${surum%.*}/$surum/single/qt-everywhere-opensource-src-$surum.tar.xz + qt5-logo.png) + +derle() { + +cd ${_name}* + # Respect system CXX + [ "$CXX" ] || CXX=g++ + sed -i "/^QMAKE_CXX\s/s|=.*|= $CXX|" qtbase/mkspecs/common/g++-base.conf + + # Remove obsolete xorg path + sed -i 's|X11R6/||g' qtbase/mkspecs/*/*.conf + + # Respect system CXXFLAGS + sed -i "s|^\(QMAKE_CFLAGS_RELEASE.*\)|\1 ${CXXFLAGS}|" qtbase/mkspecs/common/gcc-base.conf + + # Respect system LDFLAGS + sed -i "s|^\(QMAKE_LFLAGS_RELEASE.*\)|\1 ${LDFLAGS}|" qtbase/mkspecs/common/g++-unix.conf + + export QTDIR="$PWD" + export LD_LIBRARY_PATH="$QTDIR/qtbase/lib:$QTDIR/qttools/lib:$LD_LIBRARY_PATH" + export QT_PLUGIN_PATH="$QTDIR/qtbase/plugins" + + ./configure \ + -prefix /usr/ \ + -archdatadir /usr/lib/qt5 \ + -bindir /usr/lib/qt5/bin \ + -datadir /usr/share/qt5 \ + -docdir /usr/share/doc/qt5-$surum \ + -examplesdir /usr/share/doc/qt5-$surum/examples \ + -headerdir /usr/include/qt5 \ + -libdir /usr/lib \ + -sysconfdir /usr/etc/xdg \ + -confirm-license \ + -dbus-linked \ + -no-egl \ + -nomake examples \ + -no-pch \ + -no-rpath \ + -no-separate-debug-info \ + -no-strip \ + -opengl desktop \ + -opensource \ + -openssl-linked \ + -optimized-qmake \ + -reduce-relocations \ + -release \ + -shared \ + -skip qtwebengine + + make + make -j1 INSTALL_ROOT=$PKG install + + # Fix paths + find $PKG/usr/lib/ -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d;s/\(QMAKE_PRL_LIBS =\).*/\1/' {} \; + + sed -e "s|$PWD/qtbase|/usr/lib/qt5|g" \ + -i $PKG/usr/lib/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri + + rm -r $PKG/usr/share/doc + + # Install useful symlinks + install -d $PKG/usr/bin + for file in $PKG/usr/lib/qt5/bin/*; do + ln -s ../lib/qt5/bin/$(basename $file) $PKG/usr/bin/$(basename $file)-qt5 + done + + # Add menu entries for all those hidden but great Qt applications: + # # Qt5 logo: + install -d $PKG/usr/share/icons/hicolor/48x48/apps + + install -m 0644 $SRC/qt5-logo.png $PKG/usr/share/icons/hicolor/48x48/apps/qt5-logo.png + + # Assistant icons + install -m 0644 -D qttools/src/assistant/assistant/images/assistant.png $PKG/usr/share/icons/hicolor/32x32/apps/qt5-assistant.png + install -m 0644 -D qttools/src/assistant/assistant/images/assistant-128.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-assistant.png + + # Designer icon + install -m 0644 -D qttools/src/designer/src/designer/images/designer.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-designer.png + + # QDbusViewer icons + install -m 0644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer.png $PKG/usr/share/icons/hicolor/32x32/apps/qt5-qdbusviewer.png + install -m 0644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer-128.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-qdbusviewer.png + + # Linguist icons + for icon in qttools/src/linguist/linguist/images/icons/linguist-*-32.png ; do + size=$(echo $(basename ${icon}) | cut -d- -f2) + install -m 0644 -D ${icon} $PKG/usr/share/icons/hicolor/${size}x${size}/apps/qt5-linguist.png + done + + # And the .desktop files too: + install -d $PKG/usr/share/applications + cat < $PKG/usr/share/applications/qt5-designer.desktop +[Desktop Entry] +Name=Qt5 Designer +GenericName=Arayüz tasarımı +Comment=Qt5 uygulamaları için arayüz tasarımı +Exec=designer-qt5 -qt=5 +Icon=qt5-designer +MimeType=application/x-designer; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF + cat < $PKG/usr/share/applications/qt5-assistant.desktop +[Desktop Entry] +Name=Qt5 Asistan +Comment=Qt5 belgelerini ve örneklerini gösterir +Exec=assistant-qt5 -qt=5 +Icon=qt5-assistant +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development;Documentation; +EOF + cat < $PKG/usr/share/applications/qt5-linguist.desktop +[Desktop Entry] +Name=Qt5 Linguist +Comment=Qt5 uygulamalarına dil ekleme +Exec=linguist-qt5 -qt=5 +Icon=qt5-linguist +MimeType=text/vnd.trolltech.linguist;application/x-linguist; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF + cat < $PKG/usr/share/applications/qt5-qdbusviewer.desktop +[Desktop Entry] +Name=Qt5 QDbusViewer +GenericName=Qt5 D-Bus Debugger +Comment=D-Bus uygulamalarında hata ayıklama +Exec=qdbusviewer-qt5 +Icon=qt5-qdbusviewer +Terminal=false +Type=Application +Categories=Qt;Development;Debugger; +EOF +} diff --git a/talimatname/genel/q/qtav/talimat b/talimatname/genel/q/qtav/talimat new file mode 100644 index 000000000..15dcc5e94 --- /dev/null +++ b/talimatname/genel/q/qtav/talimat @@ -0,0 +1,17 @@ +# Tanım: Qt ve FFmpeg'e dayalı çapraz platformlu çoklu oynatma çerçevesi +# URL: http://www.qtav.org/ +# Paketçi: Oltulu +# Gerekler: qt5 taglib ffmpeg desktop-file-utils xorg-libxv openal uchardet +# Grup: multimedya + +isim=qtav +surum=1.12.0 +devir=1 +kaynak=(https://github.com/wang-bin/QtAV/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd QtAV-$surum + qmake-qt5 "CONFIG+=no_rpath recheck" + make + make INSTALL_ROOT="$PKG" install +} diff --git a/talimatname/genel/q/qtchess/qtchess.desktop b/talimatname/genel/q/qtchess/qtchess.desktop new file mode 100644 index 000000000..157809261 --- /dev/null +++ b/talimatname/genel/q/qtchess/qtchess.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Satranç Oyunu +Comment=P2P Satranç Oyunu +Exec=/usr/bin/qtchess +Icon=/usr/share/icons/hicolor/48x48/qtchess.png +Terminal=false +Type=Application +Categories=Game; +MimeType=text/html;/text/xml;application/xhtml_xml; +StartupNotify=true diff --git a/talimatname/genel/q/qtchess/talimat b/talimatname/genel/q/qtchess/talimat new file mode 100644 index 000000000..0257adf9d --- /dev/null +++ b/talimatname/genel/q/qtchess/talimat @@ -0,0 +1,22 @@ +# Tanım: qt tabanlı P2P satranç oyunu +# URL: http://qtchess.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: qt5 + +isim=qtchess +surum=20160904 +_surum=2016.09.04 +devir=1 + +kaynak=(https://github.com/textbrowser/qtchess/archive/v${_version}.tar.gz + qtchess.desktop) + +derle() { + cd "$isim-$_version" + qmake-qt5 -o Makefile qtchess.pro + sed -i s_'-Werror'__g Makefile # stack protector is not proctecting small arrays + make + install -Dm755 QtChess -- "${PKG}/usr/bin/qtchess" + install -Dm644 $SRC/qtchess.desktop -- "${PKG}/usr/share/applications/${isim}.desktop" + install -Dm644 Images/chess.png -- "${PKG}/usr/share/icons/hicolor/48x48/$isim.png" +} diff --git a/talimatname/genel/q/qtcreator/talimat b/talimatname/genel/q/qtcreator/talimat new file mode 100644 index 000000000..894bc5eb1 --- /dev/null +++ b/talimatname/genel/q/qtcreator/talimat @@ -0,0 +1,30 @@ +# Tanım: Hafif, çapraz platformlu entegre geliştirme ortamı +# URL: http://qt-project.org +# Paketçi: Cihan_Alkan +# Gerekler: qt5 clang qbs + +isim=qtcreator +surum=4.5.0 +devir=1 + +kaynak=(http://download.qt.io/official_releases/qtcreator/${surum%.*}/${surum}/qt-creator-opensource-src-${surum}.tar.xz) + +derle() { + [[ -d build ]] && rm -r build + mkdir build + + # fix hardcoded libexec path + sed -e 's|libexec\/qtcreator|lib\/qtcreator|g' -i qt-creator-opensource-src-${surum}/qtcreator.pri + # use system qbs + rm -r qt-creator-opensource-src-${surum}/src/shared/qbs + + cd build + + qmake-qt5 LLVM_INSTALL_DIR=/usr QBS_INSTALL_DIR=/usr CONFIG-=journald QMAKE_CFLAGS_ISYSTEM=-I \ + DEFINES+=QBS_ENABLE_PROJECT_FILE_UPDATES "$SRC"/qt-creator-opensource-src-${surum}/qtcreator.pro + make + + make INSTALL_ROOT="${PKG}/usr/" install + + install -Dm644 ${SRC}/qt-creator-opensource-src-${surum}/LICENSE.GPL3-EXCEPT ${PKG}/usr/share/licenses/qtcreator/LICENSE.GPL3-EXCEPT +} diff --git a/talimatname/genel/q/qterminal/talimat b/talimatname/genel/q/qterminal/talimat new file mode 100644 index 000000000..a943da7a9 --- /dev/null +++ b/talimatname/genel/q/qterminal/talimat @@ -0,0 +1,21 @@ +# Tanım: Qt tabanlı hafif bir terminal emülatörü. +# URL: http://lxqt.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: liblxqt lxqt-qtermwidget lxqt-l10n + +isim=qterminal +surum=0.7.1 +devir=1 +kaynak=(https://github.com/lxde/$isim/releases/download/$surum/$isim-$surum.tar.xz) + + +derle() { + mkdir -v build + cd build + cmake $SRC/$isim-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBDIR=lib + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/qtermwidget/talimat b/talimatname/genel/q/qtermwidget/talimat new file mode 100644 index 000000000..616801fe3 --- /dev/null +++ b/talimatname/genel/q/qtermwidget/talimat @@ -0,0 +1,22 @@ +# Tanım: Terminal Widget based on qt4 +# URL: http://sourceforge.net/projects/qterminal/ +# Maintainer: https://github.com/qterminal/qtermwidget.git +# Paketçi: pierre at nutyx dot org +# Gerekler: qt4 + +isim=qtermwidget +surum=20130206 +devir=2 + +kaynak=(http://downloads.nutyx.org/files/patchs/$isim/$isim-$surum.tar.bz2) +derle() +{ +cd $isim-$surum +mkdir build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX=/usr + +make + +make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/q/qtkeychain-qt5/talimat b/talimatname/genel/q/qtkeychain-qt5/talimat new file mode 100644 index 000000000..c416f3418 --- /dev/null +++ b/talimatname/genel/q/qtkeychain-qt5/talimat @@ -0,0 +1,25 @@ +# Tanım: Güvenli kimlik bilgisi deposu için destek sağlar +# URL: https://github.com/frankosterfeld/qtkeychain +# Paketçi: milisarge +# Gerekler: cmake qt5 icu + + +isim=qtkeychain-qt5 +devir=3 +surum=0.5 +_isim=qtkeychain +kaynak=(https://github.com/frankosterfeld/qtkeychain/archive/$surum.zip ) + +derle() { +mkdir build +cd build +cmake ../$_name-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_LIBEXECDIR=lib/$isim \ + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/q/qtox/talimat b/talimatname/genel/q/qtox/talimat new file mode 100644 index 000000000..4db1c2bff --- /dev/null +++ b/talimatname/genel/q/qtox/talimat @@ -0,0 +1,20 @@ +# Tanım: C++/Qt tabanlı tox bağlanıcısı +# URL: https://github.com/qTox/qTox +# Paketçi: milisarge +# Gerekler: cmake qt5 desktop-file-utils openal qrencode gtk2 ffmpeg sqlcipher toxcore + +isim=qtox +name2=qTox +surum=1.10.1 +devir=1 +kaynak=(https://github.com/$isim2/$isim2/archive/v$surum.tar.gz) + +derle() { + cd $isim2-$surum + install -d build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="/usr" + make test + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/q/qtwebkit/talimat b/talimatname/genel/q/qtwebkit/talimat new file mode 100644 index 000000000..fc421bd01 --- /dev/null +++ b/talimatname/genel/q/qtwebkit/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt4 lib için QtWebkit modülü +# Url: http://trac.webkit.org/wiki/QtWebKit +# Paketçi: milisarge +# Gerekler: ruby python qt4 + +PKGMK_IGNORE_UNPACK="yes" + + +isim=qtwebkit +surum=2.3.4 +devir=1 +_isim=qt-everywhere-opensource-src-${_qtversion} +kaynak=(http://download.kde.org/stable/qtwebkit-2.3/$surum/src/qtwebkit-$surum.tar.gz + http://www.linuxfromscratch.org/patches/blfs/svn/qtwebkit-2.3.4-gcc5-1.patch) +derle() { +mkdir qtwebkit-$surum +cd qtwebkit-$surum +tar xf ../qtwebkit-$surum.tar.gz +source setqt4 +patch -Np1 -i ../qtwebkit-2.3.4-gcc5-1.patch +[ -z $QTDIR ] && QTDIR="/usr" + +Tools/Scripts/build-webkit --qt --no-webkit2 --prefix=$QT4PREFIX +make INSTALL_ROOT=$PKG -C WebKitBuild/Release install +} diff --git a/talimatname/genel/q/quadrapassel/quadrapassel.kur-kos b/talimatname/genel/q/quadrapassel/quadrapassel.kur-kos new file mode 100644 index 000000000..7048548c7 --- /dev/null +++ b/talimatname/genel/q/quadrapassel/quadrapassel.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q +gtk-update-icon-cache -f -q /usr/share/icons/hicolor diff --git a/talimatname/genel/q/quadrapassel/talimat b/talimatname/genel/q/quadrapassel/talimat new file mode 100644 index 000000000..188410a93 --- /dev/null +++ b/talimatname/genel/q/quadrapassel/talimat @@ -0,0 +1,18 @@ +# Tanım: Düşen blokları bir araya getirin (GNOME için Tetris benzeri oyun) +# URL: https://live.gnome.org/Quadrapassel +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache intltool itstool gobject-introspection desktop-file-utils hicolor-icon-theme clutter-gtk libcanberra librsvg + +isim=quadrapassel +surum=3.22.0 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${version:0:4}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --disable-schemas-compile +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/q/quicklisp/talimat b/talimatname/genel/q/quicklisp/talimat new file mode 100644 index 000000000..3cabc2fc8 --- /dev/null +++ b/talimatname/genel/q/quicklisp/talimat @@ -0,0 +1,19 @@ +# Tanım: Common Lisp için kütüphane yöneticisi +# URL: https://www.quicklisp.org +# Paketçi: milisarge +# Gerekler: sbcl +# Grup: geliştirme + +isim=quicklisp +surum=20150128 +devir=1 +kaynak=(https://beta.quicklisp.org/quicklisp.lisp) + +derle() { + echo $(awk '/qlqs-info/ {print $3}' $isim.lisp |tr -d - |tr -d \)) + echo -ne "(quicklisp-quickstart:install :path \"$PKG/usr/lib/$isim\")\n(quit)\n" | sbcl --no-userinit --load $isim.lisp + chmod 777 -R "$PKG"/usr/lib/$isim/dists + chmod 777 -R "$PKG"/usr/lib/$isim/local-projects + install -d "$PKG"/etc/default + echo -ne "(load \"/usr/lib/$isim/setup\")\n" > "$PKG"/etc/default/$isim +} diff --git a/talimatname/genel/q/qutebrowser/talimat b/talimatname/genel/q/qutebrowser/talimat new file mode 100644 index 000000000..3287f788c --- /dev/null +++ b/talimatname/genel/q/qutebrowser/talimat @@ -0,0 +1,17 @@ +# Tanım: PyQt5 tabanlı klavyeye dayalı, vim benzeri bir tarayıcı +# URL: http://www.qutebrowser.org/ +# Paketçi: Cihan_Alkan +# Gerekler: pyattrs pyjinja pygments pypeg2 python3-qt5 python3-yaml qt5 asciidoc +# Grup: ağ + +isim=qutebrowser +surum=1.1.1 +devir=1 +kaynak=(https://github.com/qutebrowser/qutebrowser/releases/download/v$surum/qutebrowser-$surum.tar.gz) + +derle() { + cd $isim-$surum + a2x -f manpage doc/qutebrowser.1.asciidoc + python3 setup.py build + make -f misc/Makefile DESTDIR="$PKG" install +} diff --git a/talimatname/genel/q/quvi/talimat b/talimatname/genel/q/quvi/talimat new file mode 100644 index 000000000..1ee26fd30 --- /dev/null +++ b/talimatname/genel/q/quvi/talimat @@ -0,0 +1,18 @@ +# Tanım: Video indirme bağlantılarını ayrıştırmak için komut satırı aracı. +# URL: http://quvi.sourceforge.net/ +# Paketçi: Cihan_Alkan +# Gerekler: libquvi libxml2 json-glib +# Grup: medya + +isim=quvi +surum=0.9.5 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/${isim}/${isim}-${surum}.tar.xz) + +derle() { + cd "${isim}-${surum}" + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/r/rabbitmq/rabbitmq-env.conf b/talimatname/genel/r/rabbitmq/rabbitmq-env.conf new file mode 100644 index 000000000..6918e6c0f --- /dev/null +++ b/talimatname/genel/r/rabbitmq/rabbitmq-env.conf @@ -0,0 +1,6 @@ +NODENAME=rabbit +NODE_IP_ADDRESS=0.0.0.0 +NODE_PORT=5672 + +LOG_BASE=/var/log/rabbitmq +MNESIA_BASE=/var/lib/rabbitmq/mnesia diff --git a/talimatname/genel/r/rabbitmq/rabbitmq-script-wrapper b/talimatname/genel/r/rabbitmq/rabbitmq-script-wrapper new file mode 100644 index 000000000..0e1ee8e14 --- /dev/null +++ b/talimatname/genel/r/rabbitmq/rabbitmq-script-wrapper @@ -0,0 +1,48 @@ +#!/bin/sh +## The contents of this file are subject to the Mozilla Public License +## Version 1.1 (the "License"); you may not use this file except in +## compliance with the License. You may obtain a copy of the License +## at http://www.mozilla.org/MPL/ +## +## Software distributed under the License is distributed on an "AS IS" +## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +## the License for the specific language governing rights and +## limitations under the License. +## +## The Original Code is RabbitMQ. +## +## The Initial Developer of the Original Code is GoPivotal, Inc. +## Copyright (c) 2007-2014 GoPivotal, Inc. All rights reserved. +## + +# Escape spaces and quotes, because shell is revolting. +for arg in "$@" ; do + # Escape quotes in parameters, so that they're passed through cleanly. + arg=$(sed -e 's/"/\\"/g' <<-END + $arg + END + ) + CMDLINE="${CMDLINE} \"${arg}\"" +done + +SCRIPT="$(basename "$0")" + +if [ $(id -u) = $(id -u rabbitmq) ] && [ "$SCRIPT" = "rabbitmq-server" ]; then + cd /var/lib/rabbitmq + /usr/lib/rabbitmq/bin/rabbitmq-server "$@" > "/var/log/rabbitmq/startup_log" 2> "/var/log/rabbitmq/startup_err" +elif [ $(id -u) = $(id -u rabbitmq) ]; then + cd /var/lib/rabbitmq + if [ -f "${PWD}/.erlang.cookie" ] ; then + export HOME=. + fi + "/usr/lib/rabbitmq/bin/${SCRIPT}" "$@" +elif [ $(id -u) = 0 ] ; then + cd /var/lib/rabbitmq + su rabbitmq -s /bin/sh -c "/usr/lib/rabbitmq/bin/${SCRIPT} ${CMDLINE}" +else + "/usr/lib/rabbitmq/bin/${SCRIPT}" + echo + echo "Only root or rabbitmq should run ${SCRIPT}" + echo + exit 1 +fi diff --git a/talimatname/genel/r/rabbitmq/rabbitmq.logrotate b/talimatname/genel/r/rabbitmq/rabbitmq.logrotate new file mode 100644 index 000000000..9e347d72f --- /dev/null +++ b/talimatname/genel/r/rabbitmq/rabbitmq.logrotate @@ -0,0 +1,6 @@ +/var/log/rabbitmq/*.log { + missingok + notifempty + compress + create 640 rabbitmq rabbitmq +} diff --git a/talimatname/genel/r/rabbitmq/rabbitmq.sysusers b/talimatname/genel/r/rabbitmq/rabbitmq.sysusers new file mode 100644 index 000000000..6b51a776b --- /dev/null +++ b/talimatname/genel/r/rabbitmq/rabbitmq.sysusers @@ -0,0 +1 @@ +u rabbitmq 197 "RabbitMQ user" /var/lib/rabbitmq diff --git a/talimatname/genel/r/rabbitmq/rabbitmq.tmpfiles b/talimatname/genel/r/rabbitmq/rabbitmq.tmpfiles new file mode 100644 index 000000000..56e74d0a4 --- /dev/null +++ b/talimatname/genel/r/rabbitmq/rabbitmq.tmpfiles @@ -0,0 +1,2 @@ +d /var/lib/rabbitmq 0750 rabbitmq rabbitmq - - +d /var/log/rabbitmq 0750 rabbitmq rabbitmq - - diff --git a/talimatname/genel/r/rabbitmq/talimat b/talimatname/genel/r/rabbitmq/talimat new file mode 100644 index 000000000..254a60297 --- /dev/null +++ b/talimatname/genel/r/rabbitmq/talimat @@ -0,0 +1,40 @@ +# Tanım: Erlang/OTP'de yazılmış AMQP'nin güvenilir ve kurumsal kurumsal mesajlaşma uygulaması +# URL: https://rabbitmq.com +# Paketçi: Cihan_Alkan +# Gerekler: erlang python libxslt xmlto zip +# Grup: kütüphane + +isim=rabbitmq +surum=3.6.15 +devir=1 + +kaynak=(https://www.rabbitmq.com/releases/rabbitmq-server/v$surum/rabbitmq-server_$surum.orig.tar.xz + rabbitmq-env.conf + rabbitmq.sysusers + rabbitmq.tmpfiles + rabbitmq-script-wrapper + rabbitmq.logrotate) + +derle() { + + cd ${isim}-server-${surum} + sed -r 's|^(SYS_PREFIX=).*$|\1""|' -i deps/rabbit/scripts/rabbitmq-defaults + make + make DESTDIR="${PKG}" PREFIX=/usr RMQ_ROOTDIR=/usr/lib/rabbitmq \ + install install-man install-bin + + # using script wrapper for better bin handling + local libdir="${PKG}/usr/lib/rabbitmq/lib/rabbitmq_server-${surum}" + install -d "${PKG}/usr/bin" + install -Dm 755 scripts/rabbitmq-script-wrapper -t "${PKG}/usr/lib/rabbitmq/bin" + for script in "${libdir}"/sbin/rabbit*; do + ln -s /usr/lib/rabbitmq/bin/rabbitmq-script-wrapper "${PKG}/usr/bin/${script#${libdir}/sbin/}" + done + + install -Dm 644 "${SRC}/rabbitmq-env.conf" "${PKG}/etc/rabbitmq/rabbitmq-env.conf" + install -Dm 644 "${SRC}/rabbitmq.sysusers" "${PKG}/usr/lib/sysusers.d/rabbitmq.conf" + install -Dm 644 "${SRC}/rabbitmq.tmpfiles" "${PKG}/usr/lib/tmpfiles.d/rabbitmq.conf" + install -Dm 644 "${SRC}/rabbitmq.logrotate" "${PKG}/etc/logrotate.d/rabbitmq" + + chown -R 197:0 "${PKG}/etc/rabbitmq" +} diff --git a/talimatname/genel/r/racket/talimat b/talimatname/genel/r/racket/talimat new file mode 100644 index 000000000..513c1abb4 --- /dev/null +++ b/talimatname/genel/r/racket/talimat @@ -0,0 +1,34 @@ +# Tanım: LISP benzeri sağlam plt şema programlama dili +# Url: http://racket-lang.org +# Paketçi: milisarge +# Gerekler: gsfonts sqlite gtk3 +# Grup: geliştirme + +isim=racket +surum=6.12 +devir=1 +kaynak=(http://download.racket-lang.org/installers/${surum}/${isim}-${surum}-src.tgz) + +derle() { + cd "$SRC/${isim}-${surum}" + echo "Icon=drracket" >> share/pkgs/drracket/drracket/drracket.desktop + cd "$SRC/${isim}-${surum}/src" + export CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fPIC -Wall -pthread" + export "LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -pthread" + ./configure --prefix=/usr --sysconfdir=/etc --disable-strip + make + cd "$SRC/${isim}-${surum}/src" + make DESTDIR=${PKG} install + install -Dm644 COPYING-libscheme.txt "${PKG}/usr/share/licenses/${isim}/LICENSE" + + install -Dm644 ../share/pkgs/drracket/drracket/drracket.desktop "${PKG}/usr/share/applications/drracket.desktop" + install -d "${PKG}"/usr/share/icons/hicolor/{16x16,32x32,48x48,256x256}/apps + ln -s /usr/share/racket/pkgs/icons/plt-16x16.png "${PKG}/usr/share/icons/hicolor/16x16/apps/drracket.png" + ln -s /usr/share/racket/pkgs/icons/plt-32x32.png "${PKG}/usr/share/icons/hicolor/32x32/apps/drracket.png" + ln -s /usr/share/racket/pkgs/icons/plt-48x48.png "${PKG}/usr/share/icons/hicolor/48x48/apps/drracket.png" + ln -s /usr/share/racket/pkgs/icons/plt-logo-red-diffuse.png "${PKG}/usr/share/icons/hicolor/256x256/apps/drracket.png" + + # sloppy + find "${PKG}/usr/share/doc/" -delete +} + diff --git a/talimatname/genel/r/radare2/talimat b/talimatname/genel/r/radare2/talimat new file mode 100644 index 000000000..e9195de8e --- /dev/null +++ b/talimatname/genel/r/radare2/talimat @@ -0,0 +1,22 @@ +# Tanım: açık kaynak assembler çözücü,hata ayıklayıcı ve ikili okuyucu çatı uygulaması +# URL: https://radare.org +# Paketçi: milisarge +# Gerekler: capstone libzip + +isim=radare2 +surum=1.5.0 +devir=1 +kaynak=(https://github.com/radare/radare2/archive/$surum.tar.gz) + +derle() { + cd ${isim}-${surum} + + ./configure --prefix=/usr \ + --with-syscapstone \ + --with-syszip \ + --with-openssl + make + make DESTDIR="${PKG}" install + rm "${PKG}"/usr/bin/r2-{indent,docker} "${PKG}/usr/share/man/man1/r2-docker.1" + +} diff --git a/talimatname/genel/r/ragel/talimat b/talimatname/genel/r/ragel/talimat new file mode 100644 index 000000000..2f56c66bf --- /dev/null +++ b/talimatname/genel/r/ragel/talimat @@ -0,0 +1,18 @@ +# Tanım: Sonlu durum makinelerini düzenli dillerden çalıştırılabilir C, C ++, Objective-C veya D koduna derler. +# URL: http://www.complang.org/ragel/ +# Paketçi: Cihan Alkan +# Gerekler: + +isim=ragel +surum=6.10 +devir=1 + +kaynak=(https://www.colm.net/files/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr CXXFLAGS="$CXXFLAGS -std=gnu++98" + make + make DESTDIR=$PKG install + install -m0644 -D ragel.vim "$PKG"/usr/share/vim/vimfiles/syntax/ragel.vim +} diff --git a/talimatname/genel/r/ranger/ranger.okubeni b/talimatname/genel/r/ranger/ranger.okubeni new file mode 100644 index 000000000..9f9898875 --- /dev/null +++ b/talimatname/genel/r/ranger/ranger.okubeni @@ -0,0 +1,29 @@ +Here are the optionnal deps which you can choose to install or not: + +- file: for determining file types +- The python module chardet, in case of encoding detection problems +- "sudo" to use the "run as root"-feature +- w3m for previewing images in "true color". + +And, for enhanced file previews (with "scope.sh"): + +- img2txt (from caca-utils) for previewing images in ASCII-art +- highlight for syntax highlighting of code +- atool for previews of archives +- lynx, w3m or elinks for previews of html pages +- pdftotext for pdf previews +- transmission-show for viewing bit-torrent information +- mediainfo or exiftool for viewing information about media files + +Note: previewing images in "true color" is disabled by default. To enable it, +first make sure you have w3m installed, then check that your terminal supports it. +It was successfully tested with urxvt and xterm, while it did not work with +gnome-terminal and st. Currently it does not work with tmux but with screen. +Finally, add this line to your ~/.config/ranger/rc.conf and restart ranger: + +set preview_images true + +Note: to use custom file previews, you need ranger 1.3.1 or later, and a script +that creates previews. Use the default script by typing: + +ranger --copy-config=scope diff --git a/talimatname/genel/r/ranger/talimat b/talimatname/genel/r/ranger/talimat new file mode 100644 index 000000000..b97c834f7 --- /dev/null +++ b/talimatname/genel/r/ranger/talimat @@ -0,0 +1,16 @@ +# Tanım: Ranger, VI anahtar bağları olan bir dosya yöneticisidir. +# URL: http://ranger.nongnu.org/ +# Paketçi: milisarge +# Gerekler: python3 + +isim=ranger +surum=1.8.1 +devir=1 + +kaynak=(http://ranger.nongnu.org/$isim-$surum.tar.gz +) + +derle() { + cd $isim-$surum + python3 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/r/raptor/talimat b/talimatname/genel/r/raptor/talimat new file mode 100644 index 000000000..e32db33e5 --- /dev/null +++ b/talimatname/genel/r/raptor/talimat @@ -0,0 +1,18 @@ +# Tanım: RDF / XML / N-Üçlülerini RDF üçlülerine ayrıştıran bir C kitaplığı +# URL: http://download.librdf.org/source/ +# Paketçi: milisarge +# Gerekler: libxml2 icu + +isim=raptor +surum=2.0.15 +devir=2 + +kaynak=(http://librdf.org/dist/source/raptor2-$surum.tar.gz) +derle() { + cd raptor2-$surum + ./configure --prefix=/usr \ + --disable-static \ + --with-icu-config=/usr/bin/icu-config + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/rarian/talimat b/talimatname/genel/r/rarian/talimat new file mode 100644 index 000000000..5ca1e0dcc --- /dev/null +++ b/talimatname/genel/r/rarian/talimat @@ -0,0 +1,17 @@ +# Tanım: Scrollkeeper'ın yerini alacak şekilde tasarlanmış dokümantasyon meta veri kütüphanesi. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: libxslt + +isim=rarian +surum=0.8.1 +devir=1 + +kaynak=( http://ftp.gnome.org/pub/gnome/sources/rarian/${surum%.*}/$isim-$surum.tar.bz2) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/rasqal/talimat b/talimatname/genel/r/rasqal/talimat new file mode 100644 index 000000000..db3de1ca7 --- /dev/null +++ b/talimatname/genel/r/rasqal/talimat @@ -0,0 +1,18 @@ +# Tanım: Kaynak Tanımlama Çerçevesi (RDF) sorgu sözdizimini işleyen ücretsiz bir C kitaplığı +# URL: http://download.librdf.org/source/ +# Paketçi: milisarge +# Gerekler: libxslt raptor libgcrypt + +isim=rasqal +surum=0.9.33 +devir=1 + +kaynak=(http://download.librdf.org/source/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/ratpoison/ratpoison.desktop b/talimatname/genel/r/ratpoison/ratpoison.desktop new file mode 100644 index 000000000..8c3c445fb --- /dev/null +++ b/talimatname/genel/r/ratpoison/ratpoison.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=XSession +Name=Ratpoison +Comment=The ratpoison window manager +Exec=ratpoison +Type=Application diff --git a/talimatname/genel/r/ratpoison/ratpoison.okubeni b/talimatname/genel/r/ratpoison/ratpoison.okubeni new file mode 100644 index 000000000..6497ef1f4 --- /dev/null +++ b/talimatname/genel/r/ratpoison/ratpoison.okubeni @@ -0,0 +1,38 @@ +If you are not using a graphical display manager (gsm, lightdm, kdm, ...), +please consider adding this lines to your ~/.xinitrc + +#!/bin/sh + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/usr/lib/X11/xinit/.Xresources +sysmodmap=/usr/lib/X11/xinit/.Xmodmap + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f $userresources ]; then + xrdb -merge $userresources +fi + +if [ -f $usermodmap ]; then + xmodmap $usermodmap +fi + +# Start the window manager: +if [ -x /usr/bin/ck-launch-session ]; then + LAUNCH="ck-launch-session" +else + LAUNCH="" +fi +if [ -x /usr/bin/dbus-launch ]; then + LAUNCH="$LAUNCH dbus-launch --exit-with-session" +fi +exec $LAUNCH /usr/bin/ratpoison diff --git a/talimatname/genel/r/ratpoison/talimat b/talimatname/genel/r/ratpoison/talimat new file mode 100644 index 000000000..60fa1ef5e --- /dev/null +++ b/talimatname/genel/r/ratpoison/talimat @@ -0,0 +1,39 @@ +# Tanım: Ratpoison, kullanıcının fareyle uygulamayı yönetmesine izin veren C ile yazılmış bir döşeme penceresi yöneticisidir. Kullanıcı arabirimi, Screen'den esinlenmiştir. +# URL: http://www.nongnu.org/ratpoison/ +# Paketçi: milisarge +# Gerekler: texinfo xorg-libxft xorg-libxinerama xorg-libxtst + +isim=ratpoison +surum=1.4.7 +devir=2 + +kaynak=(http://savannah.nongnu.org/download/$isim/$isim-$surum.tar.xz +$isim.desktop +$isim.README) + +derle(){ + cd $isim-$surum + sed -i 's|PRINT_ERROR (("XGetWMName|PRINT_DEBUG (("XGetWMName|' src/manage.c + ./configure --prefix=/usr + make CFLAGS="$CFLAGS -DHAVE_GETLINE" + make DESTDIR=$PKG install + + # düzeltme izinleri + chmod +x $PKG/usr/share/ratpoison/{allwindows.sh,clickframe.pl,rpshowall.sh,rpws,split.sh} + + cd contrib + ./genrpbindings + install -dm755 $PKG/usr/share/ratpoison/bindings + install -m644 \ + {Ratpoison.pm,ratpoison-cmd.el,ratpoison.rb,ratpoison.lisp,ratpoison.py} \ + $PKG/usr/share/ratpoison/bindings/ + + install -Dm644 $SRC/$isim.desktop \ + $PKG/usr/share/xsessions/$isim.desktop + + mv $PKG/usr/share/doc/$isim $PKG/usr/share/doc/$isim-$surum + install -m644 $SRC/$isim.README \ + $PKG/usr/share/doc/$isim-$surum/$isim.README +} + + diff --git a/talimatname/genel/r/razor/razor-2.85-cosmetic-pv-fix.patch b/talimatname/genel/r/razor/razor-2.85-cosmetic-pv-fix.patch new file mode 100644 index 000000000..70bc1ea6a --- /dev/null +++ b/talimatname/genel/r/razor/razor-2.85-cosmetic-pv-fix.patch @@ -0,0 +1,23 @@ +--- a/lib/Razor2/Client/Version.pm 2007-05-10 22:32:10.000000000 +0200 ++++ b/lib/Razor2/Client/Version.pm 2010-03-25 11:11:36.911409707 +0100 +@@ -14,7 +14,7 @@ + + $PROTOCOL = 3; + +-$VERSION = '2.84'; ++$VERSION = '2.85'; + + 1; + +--- a/META.yml 2007-05-23 20:29:34.000000000 +0200 ++++ b/META.yml 2010-03-25 11:11:43.691408628 +0100 +@@ -1,7 +1,7 @@ + # http://module-build.sourceforge.net/META-spec.html + #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# + name: razor-agents +-version: 2.84 ++version: 2.85 + version_from: lib/Razor2/Client/Version.pm + installdirs: site + requires: + diff --git a/talimatname/genel/r/razor/talimat b/talimatname/genel/r/razor/talimat new file mode 100644 index 000000000..278517b62 --- /dev/null +++ b/talimatname/genel/r/razor/talimat @@ -0,0 +1,23 @@ +# Tanım: Dağıtılmış, ortak çalışan, spam tespit ve filtreleme ağı. +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: perl perl-net-dns perl-digest-sha1 perl-uri perl-digest-nilsimsa + +isim=razor +surum=2.85 +devir=1 + +kaynak=(http://sourceforge.net/projects/razor/files/razor-agents/$surum/razor-agents-$surum.tar.bz2 + razor-2.85-cosmetic-pv-fix.patch) + +derle() { +cd razor-agents-$surum +patch -p1 -i $SRC/razor-2.85-cosmetic-pv-fix.patch +perl Makefile.PL INSTALLDIRS=vendor +make +make DESTDIR=$PKG install +find $PKG \ + -name '*.bs' -or \ + -name '.packlist' -or \ + -name 'perllocal.pod' | xargs rm +} diff --git a/talimatname/genel/r/rdesktop/rdesktop-send_physical_buttons.diff b/talimatname/genel/r/rdesktop/rdesktop-send_physical_buttons.diff new file mode 100644 index 000000000..313cd8d50 --- /dev/null +++ b/talimatname/genel/r/rdesktop/rdesktop-send_physical_buttons.diff @@ -0,0 +1,71 @@ +? aclocal.m4 +Index: rdesktop.c +=================================================================== +RCS file: /cvsroot/rdesktop/rdesktop/rdesktop.c,v +retrieving revision 1.163 +diff -u -r1.163 rdesktop.c +--- rdesktop.c 5 Apr 2008 06:15:45 -0000 1.163 ++++ rdesktop.c 5 Aug 2008 11:46:04 -0000 +@@ -73,6 +73,7 @@ + int g_win_button_size = 0; /* If zero, disable single app mode */ + RD_BOOL g_bitmap_compression = True; + RD_BOOL g_sendmotion = True; ++RD_BOOL g_send_physical_buttons = True; + RD_BOOL g_bitmap_cache = True; + RD_BOOL g_bitmap_cache_persist_enable = False; + RD_BOOL g_bitmap_cache_precache = True; +@@ -152,6 +153,7 @@ + fprintf(stderr, " -B: use BackingStore of X-server (if available)\n"); + fprintf(stderr, " -e: disable encryption (French TS)\n"); + fprintf(stderr, " -E: disable encryption from client to server\n"); ++ fprintf(stderr, " -M: do not map logical mouse buttons to physical\n"); + fprintf(stderr, " -m: do not send motion events\n"); + fprintf(stderr, " -C: use private colour map\n"); + fprintf(stderr, " -D: hide window manager decorations\n"); +@@ -450,7 +452,7 @@ + #endif + + while ((c = getopt(argc, argv, +- VNCOPT "A:u:L:d:s:c:p:n:k:g:o:fbBeEitmzCDKS:T:NX:a:x:Pr:045h?")) != -1) ++ VNCOPT "A:u:L:d:s:c:p:n:k:g:o:fbBeEitMmzCDKS:T:NX:a:x:Pr:045h?")) != -1) + { + switch (c) + { +@@ -584,6 +586,9 @@ + case 'E': + g_packet_encryption = False; + break; ++ case 'M': ++ g_send_physical_buttons = False; ++ break; + case 'm': + g_sendmotion = False; + break; +Index: xwin.c +=================================================================== +RCS file: /cvsroot/rdesktop/rdesktop/xwin.c,v +retrieving revision 1.235 +diff -u -r1.235 xwin.c +--- xwin.c 11 Jul 2008 03:51:23 -0000 1.235 ++++ xwin.c 5 Aug 2008 11:46:06 -0000 +@@ -36,6 +36,7 @@ + extern int g_ypos; + extern int g_pos; + extern RD_BOOL g_sendmotion; ++extern RD_BOOL g_send_physical_buttons; + extern RD_BOOL g_fullscreen; + extern RD_BOOL g_grab_keyboard; + extern RD_BOOL g_hide_decorations; +@@ -2190,7 +2191,8 @@ + receive physical buttons (true in mstsc as well) and + logical button behavior depends on the remote desktop's own + mouse settings */ +- xevent.xbutton.button = g_pointer_log_to_phys_map[xevent.xbutton.button - 1]; ++ if (g_send_physical_buttons) ++ xevent.xbutton.button = g_pointer_log_to_phys_map[xevent.xbutton.button - 1]; + button = xkeymap_translate_button(xevent.xbutton.button); + if (button == 0) + return; + + + diff --git a/talimatname/genel/r/rdesktop/talimat b/talimatname/genel/r/rdesktop/talimat new file mode 100644 index 000000000..4b392934e --- /dev/null +++ b/talimatname/genel/r/rdesktop/talimat @@ -0,0 +1,24 @@ +# Tanım: Terminal pencerelerine erişime izin verir +# URL: http://www.rdesktop.org/ +# Paketçi: milisarge +# Gerekler: xorg-libx11 + +isim=rdesktop +surum=1.8.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz + rdesktop-send_physical_buttons.diff) + +derle() { + cd $isim-$surum + patch -i $SRC/rdesktop-send_physical_buttons.diff + + ./configure --prefix=/usr \ + --disable-credssp \ + --disable-smartcard + make + make DESTDIR=$PKG install + +} + diff --git a/talimatname/genel/r/re-alpine/talimat b/talimatname/genel/r/re-alpine/talimat new file mode 100644 index 000000000..38a8cfc6d --- /dev/null +++ b/talimatname/genel/r/re-alpine/talimat @@ -0,0 +1,24 @@ +# Desciription: Washington Üniversitesi tarafından geliştirilen Alpine, metin tabanlı e-posta istemcisinin devamı. +# URL: http://sourceforge.net/projects/re-alpine/files/re-alpine-2.03.tar.bz2 +# Paketçi: milisarge +# Gerekler: openssl aspell tcl pam + +isim=re-alpine +surum=2.03 +devir=1 +kaynak=(http://sourceforge.net/projects/re-alpine/files/$isim-$surum.tar.bz2) + +derle() { + +cd $isim-$surum + +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --without-ldap \ + --without-krb5 \ + --with-ssl-dir=/usr \ + --with-passfile=.pine-passfile +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/r/re2/talimat b/talimatname/genel/r/re2/talimat new file mode 100644 index 000000000..33c87cf35 --- /dev/null +++ b/talimatname/genel/r/re2/talimat @@ -0,0 +1,18 @@ +# Tanım: Hızlı, güvenli, thread dostu normal ifade motoru +# URL: https://github.com/google/re2 +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: kütüphane + +isim=re2 +surum=2018-01-01 +devir=1 + +kaynak=(https://github.com/google/re2/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make + make prefix=/usr DESTDIR="$PKG" install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/r/re2c/talimat b/talimatname/genel/r/re2c/talimat new file mode 100644 index 000000000..b014777f0 --- /dev/null +++ b/talimatname/genel/r/re2c/talimat @@ -0,0 +1,19 @@ +# Tanım: Normal ifadelerden C tabanlı tanıyıcılar üretmek için kullanılan bir araç +# URL: http://re2c.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=re2c +surum=1.0.2 +devir=1 + +kaynak=(https://github.com/skvadrik/re2c/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum/re2c + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/r/rebar3/talimat b/talimatname/genel/r/rebar3/talimat new file mode 100644 index 000000000..4d1b9784d --- /dev/null +++ b/talimatname/genel/r/rebar3/talimat @@ -0,0 +1,17 @@ +# Tanım: Otp esaslarına göre erlang derleme aracı +# URL: https://github.com/rebar/rebar3 +# Paketçi: milisarge +# Gerekler: erlang + +isim=rebar3 +surum=3.5.0 +devir=1 +kaynak=(https://github.com/rebar/rebar3/archive/${surum}.tar.gz::$isim-$surum.tar.gz) + +derle(){ + cd "$SRC/$isim-$surum" + ./bootstrap + install -Dm0755 "${isim}" "$PKG/usr/bin/${isim}" + install -Dm0644 "priv/shell-completion/bash/rebar3" "$PKG/usr/share/bash-completion/completions/rebar3" +} + diff --git a/talimatname/genel/r/recordmydesktop/talimat b/talimatname/genel/r/recordmydesktop/talimat new file mode 100644 index 000000000..3e9660596 --- /dev/null +++ b/talimatname/genel/r/recordmydesktop/talimat @@ -0,0 +1,17 @@ +# Tanım: Bir masaüstü oturumu kaydetmek için bir program +# URL: http://recordmydesktop.sourceforge.net/ +# Paketçi: milisarge@gmail.com +# Gerekler: libtheora xorg-libxdamage xorg-libxext + +isim=recordmydesktop +surum=0.3.8.1 +devir=1 +kaynak=(http://download.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/recoverjpeg/talimat b/talimatname/genel/r/recoverjpeg/talimat new file mode 100644 index 000000000..e366e67ff --- /dev/null +++ b/talimatname/genel/r/recoverjpeg/talimat @@ -0,0 +1,19 @@ +# Tanım: hardisk silinmiş jpeg-mov kurtarıcı +# Url: https://github.com/samueltardieu/recoverjpeg +# Paketçi: milisarge +# Gerekler: python + +isim=recoverjpeg +surum=2.6.1 +devir=1 +kaynak=(http://www.rfc1149.net/download/${isim}/${isim}-${surum}.tar.gz) + +derle() { + cd $isim-$surum + sed -i '1s,.*,#! /usr/bin/python2,' scripts/remove-duplicates + ./configure --prefix=/usr + make + make DESTDIR="${PKG}/" install + install -D -m 644 COPYING ${PKG}/usr/share/licenses/$isim/COPYING +} + diff --git a/talimatname/genel/r/redland/rpath.diff b/talimatname/genel/r/redland/rpath.diff new file mode 100644 index 000000000..831bc80ed --- /dev/null +++ b/talimatname/genel/r/redland/rpath.diff @@ -0,0 +1,11 @@ +--- libtool 2011-02-20 10:46:47.000000000 +0100 ++++ libtool.new 2011-02-20 10:52:58.285764909 +0100 +@@ -324,7 +324,7 @@ + + # Flag to hardcode $libdir into a binary during linking. + # This must work even if $libdir does not exist +-hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir" ++hardcode_libdir_flag_spec=" " + + # If ld is used when linking, flag to hardcode $libdir into a binary + # during linking. This must work even if $libdir does not exist. diff --git a/talimatname/genel/r/redland/talimat b/talimatname/genel/r/redland/talimat new file mode 100644 index 000000000..4e20d721f --- /dev/null +++ b/talimatname/genel/r/redland/talimat @@ -0,0 +1,27 @@ +# Tanım: RDF verilerine üst düzey bir arayüz sağlayan kütüphane +# URL: http://download.librdf.org/source/ +# Paketçi: milisarge +# Gerekler: rasqal raptor sqlite libiodbc pcre + +isim=redland +surum=1.0.17 +devir=4 + +kaynak=(http://download.librdf.org/source/$isim-$surum.tar.gz + rpath.diff) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --enable-release \ + --enable-silent-rules \ + --disable-static \ + --with-raptor=system \ + --with-rasqal=system \ + --with-sqlite=3 \ + --with-bdb=no +patch -Np0 -i "${SRC}/rpath.diff" +make -j1 +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/r/reflex/talimat b/talimatname/genel/r/reflex/talimat new file mode 100644 index 000000000..100744153 --- /dev/null +++ b/talimatname/genel/r/reflex/talimat @@ -0,0 +1,16 @@ +# Tanım: Bu, esnek, hızlı sözcüksel tarayıcının bir varyantı +# URL: http://invisible-island.net/reflex/reflex.html +# Paketçi: milisarge +# Gerekler: + +isim=reflex +surum=20100627 +devir=1 +kaynak=(ftp://invisible-island.net/${isim}/${isim}-${surum}.tgz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --mandir=/usr/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/reiserfsprogs/talimat b/talimatname/genel/r/reiserfsprogs/talimat new file mode 100644 index 000000000..ec9ee94ee --- /dev/null +++ b/talimatname/genel/r/reiserfsprogs/talimat @@ -0,0 +1,22 @@ +# Tanım: Utilities for use with the Reiser file system. +# URL: http://www.kernel.org/pub/linux/utils/fs/reiserfs/ +# Paketçi: milisarge +# Gerekler: + +isim=reiserfsprogs +surum=3.6.24 +devir=1 + +kaynak=(http://ftp.kernel.org/pub/linux/kernel/people/jeffm/reiserfsprogs/v${surum}/$isim-$surum.tar.xz) + + +derle() { + export CFLAGS="$CFLAGS -std=gnu90" + cd $isim-$surum + ./configure --prefix=/usr \ + --sbindir=/sbin + make + make DESTDIR=$PKG install + ln -sf reiserfsck $PKG/sbin/fsck.reiserfs + ln -sf mkreiserfs $PKG/sbin/mkfs.reiserfs +} diff --git a/talimatname/genel/r/remake/talimat b/talimatname/genel/r/remake/talimat new file mode 100644 index 000000000..c0d02823d --- /dev/null +++ b/talimatname/genel/r/remake/talimat @@ -0,0 +1,22 @@ +# Tanım: Geliştirilmiş GNU Make - tracing, hata raporlama, hata ayıklama, profil oluşturma ve daha fazlası +# URL: https://github.com/richfitz/remake +# Paketçi: Cihan_Alkan +# Gerekler: guile +# Grup: geliştirme + +isim=remake +surum=4.2.1 +devir=1 +kaynak=(https://sourceforge.net/projects/bashdb/files/remake/4.2%2Bdbg-1.1/remake-4.2.1%2Bdbg1.1.tar.bz2::$isim-$surum.tar.bz2) + + +derle() { +cd $isim-4.2.1+dbg1.1 + autoreconf -fi + + ./configure --prefix=/usr + make + + make DESTDIR=${PKG} install + mv "$PKG/usr/include/gnumake.h" "$PKG/usr/include/remake.h" +} diff --git a/talimatname/genel/r/remmina/talimat b/talimatname/genel/r/remmina/talimat new file mode 100644 index 000000000..74e4cf588 --- /dev/null +++ b/talimatname/genel/r/remmina/talimat @@ -0,0 +1,31 @@ +# Tanım: A remote desktop client written in GTK+ - git checkout +# URL: http://www.remmina.org/ +# Paketçi: milisarge +# Gerekler: intltool gtk3 cmake avahi xorg-libxkbfile freerdp telepathy-glib gtk2 libjpeg-turbo libssh libunique vte3 libgcrypt xorg-libxdmcp libgnome-keyring libvncserver libsecret webkitgtk2 + +isim=remmina +hesap=FreeRDP +_isim=Remmina +surum=1.2.0 +devir=1 +kaynak=() + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$_name ];then + git clone https://github.com/$hesap/$_name $DERLEME_KAYNAKDIZIN/$_name + else + cd $DERLEME_KAYNAKDIZIN/$_name + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$_name $SRC/ + cd $SRC/$_name + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DWITH_APPINDICATOR=OFF \ + -DWITH_AVAHI=OFF \ + . + make + make DESTDIR="${PKG}/" install +} diff --git a/talimatname/genel/r/reptyr/talimat b/talimatname/genel/r/reptyr/talimat new file mode 100644 index 000000000..0fc15b157 --- /dev/null +++ b/talimatname/genel/r/reptyr/talimat @@ -0,0 +1,17 @@ +# Tanım: çalışan bir süreci alıp yeni bir terminale yerleştirici uygulama +# URL: https://github.com/nelhage/reptyr +# Paketçi: milisarge +# Gerekler: +# Grup: sistem + +isim=reptyr +surum=0.6.2 +devir=1 +kaynak=(https://github.com/nelhage/reptyr/archive/reptyr-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$isim-$surum + make + make "DESTDIR=$PKG" "PREFIX=/usr" install + install -Dm644 COPYING $PKG/usr/share/licenses/reptyr/LICENSE +} diff --git a/talimatname/genel/r/restbed/strand.patch b/talimatname/genel/r/restbed/strand.patch new file mode 100644 index 000000000..1ef4c55c3 --- /dev/null +++ b/talimatname/genel/r/restbed/strand.patch @@ -0,0 +1,8 @@ +--- a/source/corvusoft/restbed/detail/socket_impl.hpp 2016-09-28 12:01:30.415787179 -0400 +--- a/source/corvusoft/restbed/detail/socket_impl.hpp 2016-09-28 12:01:33.329120391 -0400 +@@ -23,3 +23,3 @@ + #include +-#include ++#include + + diff --git a/talimatname/genel/r/restbed/talimat b/talimatname/genel/r/restbed/talimat new file mode 100644 index 000000000..8839c3d3f --- /dev/null +++ b/talimatname/genel/r/restbed/talimat @@ -0,0 +1,24 @@ +# Tanım: A framework for asynchronous RESTful functionality in C++11 applications +# URL: https://github.com/Corvusoft/restbed +# Paketçi: milisarge +# Gerekler: cmake asio kashmir + +isim=restbed +surum=4.6 +devir=1 +kaynak=(https://github.com/Corvusoft/restbed/archive/$surum.tar.gz::$isim-$surum.tar.gz + strand.patch) + +derle() { + cd "$SRC/$isim-$surum" + # Necessary to build against asio 1.10.X + patch -p1 < "$SRC"/strand.patch + mkdir -p build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_SHARED=on + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/r/retroshare/talimat b/talimatname/genel/r/retroshare/talimat new file mode 100644 index 000000000..acfd59752 --- /dev/null +++ b/talimatname/genel/r/retroshare/talimat @@ -0,0 +1,28 @@ +# Tanım: retroshare,osya paylaşımı,mesajlaşma vb. uygulamalar içeren f2f çatısı +# URL: http://retroshare.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libupnp sqlcipher qt5 libgnome-keyring libxslt ffmpeg opencv libmicrohttpd speexdsp + +isim=retroshare +surum=0.6.2 +devir=1 +kaynak=(https://github.com/RetroShare/RetroShare/archive/v$surum.tar.gz) + +derle() { + cd RetroShare-$surum + cd libretroshare/src + LANG=C ./version_detail.sh + cd ../.. + cd retroshare-gui/src + LANG=C ./version_detail.sh + cd ../.. + _optAutol='CONFIG+=rs_autologin' + qmake-qt5 CONFIG-=debug CONFIG+=release \ + CONFIG+=rs_nodeprecatedwarning \ + ${_optAutol} \ + QMAKE_CFLAGS_RELEASE="${CFLAGS}"\ + QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}"\ + RetroShare.pro + make + make INSTALL_ROOT="${PKG}" install +} diff --git a/talimatname/genel/r/rfkill/talimat b/talimatname/genel/r/rfkill/talimat new file mode 100644 index 000000000..87851b75e --- /dev/null +++ b/talimatname/genel/r/rfkill/talimat @@ -0,0 +1,15 @@ +# Tanım: Rfkill anahtarlarını sorgulamak ve değiştirmek için kullanıcı alanı aracı +# URL: http://wireless.kernel.org/en/users/Documentation/rfkill +# Paketçi: milisarge +# Gerekler: + +isim=rfkill +surum=0.5 +devir=2 +kaynak=(http://www.kernel.org/pub/software/network/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/rhash/talimat b/talimatname/genel/r/rhash/talimat new file mode 100644 index 000000000..7172249c7 --- /dev/null +++ b/talimatname/genel/r/rhash/talimat @@ -0,0 +1,27 @@ +# Tanım: Dosya karma değerlerini doğrulamak için yardımcı program +# URL: http://rhash.anz.ru/?l=en +# Paketçi: Cihan Alkan +# Gerekler: +# Grup: sistem + +isim=rhash +surum=1.3.5 +devir=1 +kaynak=(https://downloads.sourceforge.net/rhash/rhash-$surum-src.tar.gz) + +derle() { + cd RHash-$surum + export ADDCFLAGS="$CFLAGS" + export ADDLDFLAGS="$LDFLAGS" + make build-shared + make -C librhash + + # program + make PREFIX=/usr DESTDIR="$PKG" install-shared + + # library + make -C librhash PREFIX=/usr DESTDIR="$PKG" install-headers install-lib-shared install-so-link + + # license + install -Dm644 COPYING "$PKG"/usr/share/licenses/rhash/LICENSE +} diff --git a/talimatname/genel/r/rhino/talimat b/talimatname/genel/r/rhino/talimat new file mode 100644 index 000000000..7ba56dead --- /dev/null +++ b/talimatname/genel/r/rhino/talimat @@ -0,0 +1,20 @@ +# Tanım: JavaScript in java gerçeklemesi +# URL: https://github.com/mozilla/rhino +# Paketçi: milisarge +# Gerekler: apache-ant openjdk + +isim=rhino +surum=1.7.7.1 +devir=1 +kaynak=(https://github.com/mozilla/$isim/archive/Rhino${version//./_}_RELEASE.tar.gz + http://archive.apache.org/dist/xmlbeans/binaries/xmlbeans-2.6.0.tgz) + +derle() { + export JAVA_HOME=/opt/OpenJDK-8u60-bin + export PATH=$JAVA_HOME/bin:/opt/ant/bin:$PATH + cd $isim-Rhino${version//./_}_RELEASE + ant -Dxbean.jar=$SRC/xmlbeans-2.6.0/lib/xbean.jar \ + -Djsr173.jar=$SRC/xmlbeans-2.6.0/lib/jsr173_1.0_api.jar \ + jar javadoc + install -D -m 644 build/$isim$surum/js.jar $PKG/usr/share/java/$isim.jar +} diff --git a/talimatname/genel/r/rhythmbox/rhythmbox.kur-kos b/talimatname/genel/r/rhythmbox/rhythmbox.kur-kos new file mode 100644 index 000000000..e1a0850e4 --- /dev/null +++ b/talimatname/genel/r/rhythmbox/rhythmbox.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q +gtk-update-icon-cache -f -q -t /usr/share/icons/hicolor diff --git a/talimatname/genel/r/rhythmbox/talimat b/talimatname/genel/r/rhythmbox/talimat new file mode 100644 index 000000000..fd0a0f0f0 --- /dev/null +++ b/talimatname/genel/r/rhythmbox/talimat @@ -0,0 +1,29 @@ +# Tanım: iTunes benzeri müzik çalma ve yönetim uygulaması +# URL: http://www.rhythmbox.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache gobject-introspection intltool gtk3 gdk-pixbuf libsoup libpeas libxml2 tdb json-glib totem-pl-parser libmtp gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good webkit2gtk3 python python-gobject + +isim=rhythmbox +surum=3.4.1 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${version:0:3}/$isim-$surum.tar.xz) + +derle() { + + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-scrollkeeper \ + --enable-python=yes \ + --enable-vala \ + --enable-browser-plugin \ + --enable-musicbrainz \ + --with-gudev \ + --with-mtp \ + --with-gnome-keyring \ + --with-brasero \ + --with-webkit + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/ricin/talimat b/talimatname/genel/r/ricin/talimat new file mode 100644 index 000000000..a028ea355 --- /dev/null +++ b/talimatname/genel/r/ricin/talimat @@ -0,0 +1,21 @@ +# Tanım: Hafif vala tabanlı Tox istemcisi +# URL: https://github.com/RicinApp/Ricin +# Paketçi: milisarge +# Gerekler: toxcore meson gtk3 vala json-glib libsoup libnotify + +isim=ricin +_isim=Ricin +surum=0.0.7 +devir=1 +kaynak=(https://github.com/RicinApp/${_name}/archive/v${surum}.tar.gz) + +derle() { + cd ${_name}-${surum} + make autogen + make release + cd build + mesonconf.py -Dprefix=/usr + cd .. + make DESTDIR=$PKG install + install -Dm755 "build/${_name}" "$PKG/usr/bin/ricin" +} diff --git a/talimatname/genel/r/ring-daemon/talimat b/talimatname/genel/r/ring-daemon/talimat new file mode 100644 index 000000000..c1d4b494e --- /dev/null +++ b/talimatname/genel/r/ring-daemon/talimat @@ -0,0 +1,39 @@ +# Tanım: ring.cx sflphone olarak ta bilinen ücretsiz iletişim yazılımıdır. +# URL: https://ring.cx +# Paketçi: milisarge +# Gerekler: boost libsecp256k1 msgpack-c autoconf-archive opendht yaml-cpp alsa-lib pulseaudio jack jsoncpp libsamplerate libsndfile dbus-c++ ffmpeg xorg-libxtst gnutls gsm libupnp libnatpmp crypto++ libva boost libvdpau restbed +# Grup: ağ + +isim=ring-daemon +surum=git +devir=1 +kaynak=(https://github.com/savoirfairelinux/ring-daemon/archive/master.tar.gz::$isim-git-$devir.tar.gz) + +derle() { + cd "$SRC/$isim-master" + _pjprojectver=2.6 + wget -nc http://www.pjsip.org/release/${_pjprojectver}/pjproject-${_pjprojectver}.tar.bz2 -P $DERLEME_KAYNAKDIZIN + [ -f $DERLEME_KAYNAKDIZIN/pjproject-${_pjprojectver}.tar.bz2 ] && \ + cp $DERLEME_KAYNAKDIZIN/pjproject-${_pjprojectver}.tar.bz2 contrib/tarballs \ + || exit 1 + + mkdir contrib/native + autoreconf -fvi + cd "$SRC/$isim-master/contrib/native" + ../bootstrap \ + --disable-downloads \ + --disable-all \ + --enable-pjproject + make DEPS_pjproject= + + cd ../.. + ./configure \ + --prefix=/usr \ + --sbindir=/usr/bin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --enable-ipv6 + sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/r/ristretto/talimat b/talimatname/genel/r/ristretto/talimat new file mode 100644 index 000000000..46f02820e --- /dev/null +++ b/talimatname/genel/r/ristretto/talimat @@ -0,0 +1,18 @@ +# Tanım: Ristretto, Xfce masaüstü ortamı için hızlı ve hafif bir resim görüntüleme aracıdır. +# URL: http://goodies.xfce.org/projects/applications/ristretto +# Paketçi: milisarge +# Gerekler: xorg-libxinerama xorg-libxrandr xorg-libsm thunar libexif + +isim=ristretto +surum=0.8.0 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/rlog/rlog-section.patch b/talimatname/genel/r/rlog/rlog-section.patch new file mode 100644 index 000000000..b17478570 --- /dev/null +++ b/talimatname/genel/r/rlog/rlog-section.patch @@ -0,0 +1,75 @@ +diff -ruN rlog-1.4.orig/rlog/common.h rlog-1.4/rlog/common.h +--- rlog-1.4.orig/rlog/common.h 2008-06-15 07:49:52.000000000 +0200 ++++ rlog-1.4/rlog/common.h 2008-06-23 19:29:16.000000000 +0200 +@@ -52,7 +52,6 @@ + + # define PRINTF(FMT,X) __attribute__ (( __format__ ( __printf__, FMT, X))) + # define HAVE_PRINTF_ATTR 1 +-# define RLOG_SECTION __attribute__ (( section("RLOG_DATA") )) + + #if __GNUC__ >= 3 + # define expect(foo, bar) __builtin_expect((foo),bar) +@@ -77,7 +76,6 @@ + */ + # define PRINTF(FMT,X) + # define HAVE_PRINTF_ATTR 0 +-# define RLOG_SECTION + + /*! + */ +diff -ruN rlog-1.4.orig/rlog/common.h.in rlog-1.4/rlog/common.h.in +--- rlog-1.4.orig/rlog/common.h.in 2008-06-15 05:10:13.000000000 +0200 ++++ rlog-1.4/rlog/common.h.in 2008-06-23 19:28:28.000000000 +0200 +@@ -52,7 +52,6 @@ + + # define PRINTF(FMT,X) __attribute__ (( __format__ ( __printf__, FMT, X))) + # define HAVE_PRINTF_ATTR 1 +-# define RLOG_SECTION __attribute__ (( section("RLOG_DATA") )) + + #if __GNUC__ >= 3 + # define expect(foo, bar) __builtin_expect((foo),bar) +@@ -77,7 +76,6 @@ + */ + # define PRINTF(FMT,X) + # define HAVE_PRINTF_ATTR 0 +-# define RLOG_SECTION + + /*! + */ +diff -ruN rlog-1.4.orig/rlog/rlog-c99.h rlog-1.4/rlog/rlog-c99.h +--- rlog-1.4.orig/rlog/rlog-c99.h 2008-06-15 05:56:57.000000000 +0200 ++++ rlog-1.4/rlog/rlog-c99.h 2008-06-23 19:28:37.000000000 +0200 +@@ -22,7 +22,7 @@ + @internal + */ + #define _rMessageDef(ID, COMPONENT) \ +- static rlog::PublishLoc ID RLOG_SECTION = {& ID ## _enabled, \ ++ static rlog::PublishLoc ID = {& ID ## _enabled, \ + &rlog::RLog_Register, 0, STR(COMPONENT), __FILE__, \ + __FUNCTION__, __LINE__, 0}; + +diff -ruN rlog-1.4.orig/rlog/rlog-novariadic.h rlog-1.4/rlog/rlog-novariadic.h +--- rlog-1.4.orig/rlog/rlog-novariadic.h 2008-06-15 05:10:13.000000000 +0200 ++++ rlog-1.4/rlog/rlog-novariadic.h 2008-06-23 19:28:45.000000000 +0200 +@@ -35,7 +35,7 @@ + + #define _rMessageDef(ID, COMPONENT) \ + static bool ID ## _enabled = true; \ +- static rlog::PublishLoc ID RLOG_SECTION = {& ID ## _enabled, \ ++ static rlog::PublishLoc ID = {& ID ## _enabled, \ + &rlog::RLog_Register, 0, STR(COMPONENT), __FILE__, \ + __FUNCTION__, __LINE__, 0} + +diff -ruN rlog-1.4.orig/rlog/rlog-prec99.h rlog-1.4/rlog/rlog-prec99.h +--- rlog-1.4.orig/rlog/rlog-prec99.h 2008-06-15 05:59:05.000000000 +0200 ++++ rlog-1.4/rlog/rlog-prec99.h 2008-06-23 19:28:06.000000000 +0200 +@@ -18,7 +18,7 @@ + + #define _rMessageDef(ID, COMPONENT) \ + static bool ID ## _enabled = true; \ +- static rlog::PublishLoc ID RLOG_SECTION = {& ID ## _enabled, \ ++ static rlog::PublishLoc ID = {& ID ## _enabled, \ + &rlog::RLog_Register, 0, STR(COMPONENT), __FILE__, \ + __FUNCTION__, __LINE__, 0}; + + diff --git a/talimatname/genel/r/rlog/talimat b/talimatname/genel/r/rlog/talimat new file mode 100644 index 000000000..a9fe8729c --- /dev/null +++ b/talimatname/genel/r/rlog/talimat @@ -0,0 +1,19 @@ +# Tanım: C ++ programları ve kitaplıkları için esnek bir mesaj günlüğü tesisi +# URL: http://www.arg0.net/rlog +# Paketçi: milisarge +# Gerekler: + +isim=rlog +surum=1.4 +devir=1 + +kaynak=(http://rlog.googlecode.com/files/$isim-$surum.tar.gz + $isim-section.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../$isim-section.patch + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/r/rlwrap/talimat b/talimatname/genel/r/rlwrap/talimat new file mode 100644 index 000000000..3e7700349 --- /dev/null +++ b/talimatname/genel/r/rlwrap/talimat @@ -0,0 +1,18 @@ +# Tanım: Programlara readline tarzı düzenleme ve tarih ekler. +# URL: https://github.com/hanslub42/rlwrap +# Paketçi: Cihan_Alkan +# Gerekler: perl python +# Grup: sistem + +isim=rlwrap +surum=0.43 +devir=1 +kaynak=(https://github.com/hanslub42/rlwrap/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + autoreconf -vi + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/r/rofi/talimat b/talimatname/genel/r/rofi/talimat new file mode 100644 index 000000000..50f94296f --- /dev/null +++ b/talimatname/genel/r/rofi/talimat @@ -0,0 +1,41 @@ +# Tanım: Bir pencere değiştirici, uygulama başlatıcısı ve dmenu değiştirme +# URL: https://github.com/DaveDavenport/rofi/ +# Paketçi: Cihan_Alkan +# Gerekler: xorg-libx11 xorg-libxft freetype libxdg-basedir pango startup-notification libxcb libxkbcommon check xcb-util xcb-util-wm xcb-util-xrm librsvg meson +# Grup: + +isim=rofi +surum=1.5.0 +devir=1 + +kaynak=() + +derle() { + adres="https://github.com/DaveDavenport/rofi" + git_indir ${adres} ${isim} + adres1="https://github.com/sardemff7/libgwater" + git_indir ${adres1} ${isim} + adres2="https://github.com/sardemff7/libnkutils" + git_indir ${adres2} ${isim} + + cd rofi + for module in libgwater libnkutils; do + local submodule="subprojects/${module}" + git submodule init "${submodule}" + git config "submodule.${submodule}.url" "${SRC}/${module}" + git submodule update "${submodule}" + done + + autoreconf -i + ./configure --prefix=/usr --sysconfdir=/etc + make + + LC_ALL=C make + make install install-man DESTDIR="$PKG" + + install -Dm644 COPYING "$PKG/usr/share/licenses/rofi/COPYING" + install -dm755 "$PKG/usr/share/doc/rofi/examples" + install -Dm755 Examples/*.sh "$PKG/usr/share/doc/rofi/examples" + rm -rf ${PKG}/usr/share/doc + rm -rf ${PKG}/usr/share/man +} diff --git a/talimatname/genel/r/rosa-imagewriter/imagewriter-tr_TR.ts b/talimatname/genel/r/rosa-imagewriter/imagewriter-tr_TR.ts new file mode 100644 index 000000000..5274aa297 --- /dev/null +++ b/talimatname/genel/r/rosa-imagewriter/imagewriter-tr_TR.ts @@ -0,0 +1,214 @@ + + + + + MainDialog + + b + b + + + MB + MB + + + %v / %m MB + %v / %m MB + + + Open image file + Kalıp dosyası aç + + + &Write + &Yazdır + + + Failed to open the image file: + Kalıp dosyası açılamadı: + + + Clea&r + &Temizle + + + Disk Images + Disk Kalıpları + + + Image: + Kalıp: + + + Refresh the list + Listeyi yenile + + + Image size: + Kalıp boyutu: + + + &USB Device: + &USB Aygıt: + + + Warning! + Uyarı! + + + The image is larger than your selected device! + Görüntü seçilen cihazınızdan daha büyük! + + + Are you sure you wish to proceed? + Devam etmek istediğinizden emin misiniz? + + + &Cancel + &İptal + + + Delete partitions and make all space available for storing data + Bölümleri silin ve verileri depolamak için tüm alanı kullanılabilir yapın + + + Writing is in progress, abort it? + Yazma devam ediyor, iptal edilsin mi? + + + Disk size: + Disk boyutu: + + + All Files + Tüm Dosyalar + + + All existing data on the selected device will be lost! + Seçilen cihazdaki tüm mevcut veriler kaybolacak! + + + + QObject + + MB + MB + + + Unknown Device + Bilinmeyen Aygıt + + + Error code: + Hata kodu: + + + Error! + Hata! + + + Failed to restart with root privileges! (Error code: %1) + Root yetkileri ile yeniden başlatılamadı! (Hata kodu: %1) + + + ConnectServer failed. + ConnectServer başarısız oldu. + + + No appropriate su-application found! + Uygun SU başvurusu bulunamadı! + + + <unmounted> + <unmounted> + + + Failed to query list of partitions. + Bölümlerin listesini sorgulama işlemi başarısız oldu. + + + CoCreateInstance(WbemAdministrativeLocator) failed. + CoCreateInstance(WbemAdministrativeLocator) hata oldu. + + + Memory allocation for %1 failed. + %1 için bellek ayırma başarısız oldu. + + + Please, restart the program with root privileges. + Lütfen programı kök ayrıcalıklarıyla yeniden başlatınız. + + + Failed to query USB flash devices. + USB bellek aygıtları sorgulanamadı. + + + Failed to query list of logical disks. + Mantıksal disklerin listesini sorgulama işlemi başarısız oldu. + + + + ImageWriter + + Failed to write to the device: + Cihaza yazma başarısız oldu: + + + Failed to open the drive + Sürücü açılamadı + + + Failed to open the image file: + Kalıp dosyası açılamadı: + + + Failed to open the target device: + Hedef cihazı açamadı: + + + Now you need to format your device. + Şimdi cihazınızı biçimlendirmeniz gerekiyor. + + + The operation completed successfully. + İşlem başarıyla tamamlandı. + + + Failed to unmount the volume + Birimin kaldırılması başarısız oldu + + + Failed to read the image file: + Kalıp dosyasını okuma başarısız oldu: + + + Failed to unmount the drive + Sürücünün bağlantısı kesilemedi + + + The last block was not fully written (%1 of %2 bytes)! +Aborting. + Son blok tamamen yazılmadı (%2 de %1 bayt)! +Durduruluyor. + + + To be able to store data on this device again, please, use the button "Clear". + Bu cihaza tekrar veri depolamak için lütfen "Temizle" düğmesini kullanın. + + + Failed to allocate memory for buffer: + Arabellek için bellek ayırma başarısız: + + + Failed to allocate memory for buffer. + Arabellek için bellek ayıramadı. + + + + PhysicalDevice + + Could not acquire lock: + Kilit alınamadı: + + + diff --git a/talimatname/genel/r/rosa-imagewriter/logo-rosa.png b/talimatname/genel/r/rosa-imagewriter/logo-rosa.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1cd3581caf59526a344d0e90a2db7de8abb640 GIT binary patch literal 3530 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 Ef|9qkPyhe` literal 0 HcmV?d00001 diff --git a/talimatname/genel/r/rosa-imagewriter/talimat b/talimatname/genel/r/rosa-imagewriter/talimat new file mode 100644 index 000000000..895981f8a --- /dev/null +++ b/talimatname/genel/r/rosa-imagewriter/talimat @@ -0,0 +1,45 @@ +# Tanım: USB kurulum Belleği Hazırlama +# URL: http://wiki.rosalab.ru +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: sistem + +isim=rosa-imagewriter +surum=2.6.2.0 +devir=1 + +kaynak=(https://abf.io/soft/rosa-imagewriter/archive/${isim}-version-${surum}.tar.gz + logo-rosa.png + imagewriter-tr_TR.ts) + +derle() { + + cp -r $SRC/logo-rosa.png $SRC/${isim}-version-${surum}/res/ + cd $SRC/${isim}-version-${surum} + qmake-qt5 RosaImageWriter.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug + make + + mkdir -p $PKG/usr/bin + mkdir -p $PKG/usr/share/icons + mkdir -p $PKG/usr/share/RosaImageWriter/lang + cp -r $SRC/${isim}-version-${surum}/RosaImageWriter $PKG/usr/share/RosaImageWriter/ + cp -r $SRC/${isim}-version-${surum}/res/icon-rosa.svg $PKG/usr/share/icons/ + ln -s /usr/share/RosaImageWriter/RosaImageWriter $PKG/usr/bin/RosaImageWriter +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Version=1.0 +Type=Application +Terminal=false +Icon=/usr/share/icons/icon-rosa.svg +Exec=/usr/share/RosaImageWriter/RosaImageWriter +Categories=GNOME;GTK;Utility; +Name=USB Kalıp Yazıcı +Comment=Boot edebilir USB bellek hazırla +EOF + +/usr/lib/qt5/bin/lrelease ../imagewriter-tr_TR.ts -qm $PKG/usr/share/RosaImageWriter/lang/tr_TR.qm + +} + diff --git a/talimatname/genel/r/rox-filer/talimat b/talimatname/genel/r/rox-filer/talimat new file mode 100644 index 000000000..079450f1c --- /dev/null +++ b/talimatname/genel/r/rox-filer/talimat @@ -0,0 +1,62 @@ +# Tanım: İsteğe bağlı olarak masaüstü arka planını ve panellerini yönetebilen küçük ve hızlı dosya yöneticisi +# URL: http://roscidus.com/desktop/ROX-Filer +# Paketçi: milisarge +# Gerekler: xorg-libsm libglade shared-mime-info + +isim=rox-filer +surum=2.11 +devir=3 + +kaynak=(http://downloads.sourceforge.net/rox/rox-filer-2.11.tar.bz2) + +derle() { +cd $isim-$surum/ROX-Filer +sed -i 's:g_strdup(getenv("APP_DIR")):"/usr/share/rox":' src/main.c +mkdir build +pushd build +../src/configure LIBS="-lm -ldl" +make +popd + +mkdir -p $PKG/usr/{bin,share/{applications,pixmaps,rox,man/man1}} + +cp -av Help Messages Options.xml ROX images style.css .DirIcon \ +$PKG/usr/share/rox + +cp -av ../rox.1 \ +$PKG/usr/share/man/man1 + +cp -v ROX-Filer $PKG/usr/bin/rox + +chown -Rv root:root $PKG/ + +cd $PKG/usr/share/rox/ROX/MIME + +ln -sv text-x-{diff,patch}.png +ln -sv application-x-font-{afm,type1}.png +ln -sv application-xml{,-dtd}.png +ln -sv application-xml{,-external-parsed-entity}.png +ln -sv application-{,rdf+}xml.png +ln -sv application-x{ml,-xbel}.png +ln -sv application-{x-shell,java}script.png +ln -sv application-x-{bzip,xz}-compressed-tar.png +ln -sv application-x-{bzip,lzma}-compressed-tar.png +ln -sv application-x-{bzip-compressed-tar,lzo}.png +ln -sv application-x-{bzip,xz}.png +ln -sv application-x-{gzip,lzma}.png +ln -sv application-{msword,rtf}.png +ln -s ../rox/.DirIcon $PKG/usr/share/pixmaps/rox.png + +cat > $PKG/usr/share/applications/rox.desktop << "HERE_DOC" +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Name=Rox +Comment=The Rox File Manager +Icon=rox +Exec=rox +Categories=GTK;Utility;Application;System;Core; +StartupNotify=true +Terminal=false +HERE_DOC +} diff --git a/talimatname/genel/r/roxterm/talimat b/talimatname/genel/r/roxterm/talimat new file mode 100644 index 000000000..e06e0a912 --- /dev/null +++ b/talimatname/genel/r/roxterm/talimat @@ -0,0 +1,17 @@ +# Tanım: ROXTerm, VTE kütüphanesine dayanan bir terminal emülatörüdür. +# URL: http://roxterm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: dbus-glib vte3 hicolor-icon-theme xorg-libsm lockfile + +isim=roxterm +surum=3.3.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/roxterm/roxterm-$surum.tar.xz) + +derle() { + cd "${SRC}/${isim}-${surum}" + python2 mscript.py configure --prefix='/usr' + python2 mscript.py build + python2 mscript.py install --destdir="${PKG}" +} diff --git a/talimatname/genel/r/rpcbind/talimat b/talimatname/genel/r/rpcbind/talimat new file mode 100644 index 000000000..df9cb3a0e --- /dev/null +++ b/talimatname/genel/r/rpcbind/talimat @@ -0,0 +1,34 @@ +# Tanım: portmap replacement which supports RPC over various protocols +# URL: http://rpcbind.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libtirpc + +isim=rpcbind +surum=0.2.3 +devir=1 + +kaynak=(http://downloads.sourceforge.net/rpcbind/rpcbind-$surum.tar.bz2 ) + +derle() { + source /etc/blfs-bootscripts + + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + + cd rpcbind-$surum + sed -i "/servname/s:rpcbind:sunrpc:" src/rpcbind.c + + ./configure --prefix=/usr \ + --bindir=/sbin \ + --with-rpcuser=root \ + --without-systemdsystemunitdir + make + make DESTDIR=$PKG install + + cd ../$scripts-$scriptsversion + make DESTDIR=$PKG install-rpcbind + make DESTDIR=$PKG install-netfs + + # cut is in /bin + sed -i "s,usr/bin/cut,bin/cut," $PKG/etc/rc.d/init.d/netfs +} diff --git a/talimatname/genel/r/rsound/talimat b/talimatname/genel/r/rsound/talimat new file mode 100644 index 000000000..1de2305f9 --- /dev/null +++ b/talimatname/genel/r/rsound/talimat @@ -0,0 +1,16 @@ +# Tanım: Simple solution for streaming PCM data from client to server in real time. +# URL: http://github.com/Themaister/RSound +# Paketçi: milisarge +# Gerekler: + +isim=rsound +surum=1.1 +devir=1 +kaynak=(http://cloud.github.com/downloads/Themaister/RSound/$isim-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${isim}-${surum}" + ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/r/rssguard/talimat b/talimatname/genel/r/rssguard/talimat new file mode 100644 index 000000000..d5c3ec75e --- /dev/null +++ b/talimatname/genel/r/rssguard/talimat @@ -0,0 +1,23 @@ +# Tanım: RSS / RDF ve ATOM da dahil olmak üzere en bilinen besleme formatlarını elde edebilen besleme okuyucu +# URL: https://bitbucket.org/skunkos/rssguard/wiki/Home +# Paketçi: milisarge +# Gerekler: cmake qt5 + +isim=rssguard +surum=3.0.1 +devir=1 + +kaynak=("https://bitbucket.org/skunkos/rssguard/get/$surum.tar.bz2") + +derle() { + mkdir -p build + cd build + + cmake ../skunkos* \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=release \ + -DUSE_QT_5=ON + make + + make DESTDIR=$PKG/ install +} diff --git a/talimatname/genel/r/rtmpdump/talimat b/talimatname/genel/r/rtmpdump/talimat new file mode 100644 index 000000000..3bd271124 --- /dev/null +++ b/talimatname/genel/r/rtmpdump/talimat @@ -0,0 +1,20 @@ +# Tanım: Rtmp akışlarını indirmek için kullanılan araç +# URL: https://rtmpdump.mplayerhq.hu/ +# Paketçi: Cihan_Alkan +# Gerekler: gnutls +# Grup: medya + +isim=rtmpdump +surum=2.4 +devir=1 +kaynak=(https://git.ffmpeg.org/gitweb/rtmpdump.git/snapshot/fa8646daeb19dfd12c181f7d19de708d623704c0.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd rtmpdump-fa8646d + sed -e 's/^CRYPTO=OPENSSL/#CRYPTO=OPENSSL/' -e 's/#CRYPTO=GNUTLS/CRYPTO=GNUTLS/' -i Makefile -i librtmp/Makefile + make \ + OPT="$CFLAGS" \ + XLDFLAGS="$LDFLAGS" + mkdir -p $PKG/usr/lib + make prefix=/usr sbindir=/usr/bin mandir=/usr/share/man DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/r/ruby-bundler/talimat b/talimatname/genel/r/ruby-bundler/talimat new file mode 100644 index 000000000..d350a0e18 --- /dev/null +++ b/talimatname/genel/r/ruby-bundler/talimat @@ -0,0 +1,18 @@ +# Tanım: Ruby uygulama-paket yöneticisi +# URL: http://www.ruby-lang.org +# Paketçi: milisarge +# Gerekler: ruby + +isim=ruby-bundler +surum=1.15.1 +devir=1 +kaynak=(https://rubygems.org/downloads/${name#ruby-}-$surum.gem) + +derle() { + cd "$SRC" + local _gemdir="$(ruby -e'puts Gem.default_dir')" + HOME="/tmp" GEM_HOME="$_gemdir" + GEM_PATH="$_gemdir" + gem install --no-user-install --ignore-dependencies -i "$PKG/$_gemdir" -n "$PKG/usr/bin" "${name#ruby-}-$surum.gem" + rm "$PKG/$_gemdir/cache/${name#ruby-}-$surum.gem" +} diff --git a/talimatname/genel/r/ruby/gemrc b/talimatname/genel/r/ruby/gemrc new file mode 100644 index 000000000..65163119a --- /dev/null +++ b/talimatname/genel/r/ruby/gemrc @@ -0,0 +1,5 @@ +# Read about the gemrc format at http://guides.rubygems.org/command-reference/#gem-environment + +# --user-install is used to install to $HOME/.gem/ by default since we want to separate +# pacman installed gems and gem installed gems +gem: --user-install diff --git a/talimatname/genel/r/ruby/talimat b/talimatname/genel/r/ruby/talimat new file mode 100644 index 000000000..86a5ce9d6 --- /dev/null +++ b/talimatname/genel/r/ruby/talimat @@ -0,0 +1,30 @@ +# Tanım: Ruby yorumlayıcı +# URL: http://www.ruby-lang.org +# Paketçi: milisarge +# Gerekler: libffi yaml + +isim=ruby +surum=2.4.1 +devir=1 +kaynak=(http://cache.ruby-lang.org/pub/$isim/${surum%.*}/$isim-$surum.tar.xz + gemrc) + +derle() { + cd $isim-$surum + + PKG_CONFIG=/usr/bin/pkg-config ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --sharedstatedir=/var/lib \ + --libexecdir=/usr/lib/ruby \ + --enable-shared \ + --disable-rpath \ + --disable-install-doc \ + --with-dbm-type=gdbm_compat + + make + make DESTDIR="${PKG}" install-nodoc + + install -D -m644 ${SRC}/gemrc "${PKG}/etc/gemrc" +} diff --git a/talimatname/genel/r/ruby23-bundler/talimat b/talimatname/genel/r/ruby23-bundler/talimat new file mode 100644 index 000000000..11f70c96d --- /dev/null +++ b/talimatname/genel/r/ruby23-bundler/talimat @@ -0,0 +1,25 @@ +# Tanım: Ruby2.3 uygulama-paket yöneticisi +# URL: http://www.ruby-lang.org +# Paketçi: milisarge +# Gerekler: ruby23 + +isim=ruby23-bundler +_rubyver=2.3 +_gemisim=bundler +pkgisim=ruby${_rubyver}-${_gemname} +surum=1.15.1 +devir=1 +kaynak=(https://rubygems.org/downloads/$_gemname-$surum.gem) + +derle() { + cd "$srcdir" + + local _gemdir="$(ruby-${_rubyver} -rubygems -e'puts Gem.default_dir')" + HOME="/tmp" GEM_HOME="$_gemdir" GEM_PATH="$_gemdir" gem-${_rubyver} install --no-user-install --ignore-dependencies \ + --no-ri --no-rdoc -i "$PKG/$_gemdir" "$_gemname-$surum.gem" + rm "$PKG/$_gemdir/cache/$_gemname-$surum.gem" + install -D -m644 "$PKG/$_gemdir/gems/$_gemname-$surum/LICENSE.md" "$PKG/usr/share/licenses/$pkgname/LICENSE.md" + + install -d "$PKG/usr/bin/" + ln -s "$_gemdir/bin/bundle" "$PKG/usr/bin/bundle-${_rubyver}" +} diff --git a/talimatname/genel/r/ruby23/gemrc b/talimatname/genel/r/ruby23/gemrc new file mode 100644 index 000000000..65163119a --- /dev/null +++ b/talimatname/genel/r/ruby23/gemrc @@ -0,0 +1,5 @@ +# Read about the gemrc format at http://guides.rubygems.org/command-reference/#gem-environment + +# --user-install is used to install to $HOME/.gem/ by default since we want to separate +# pacman installed gems and gem installed gems +gem: --user-install diff --git a/talimatname/genel/r/ruby23/talimat b/talimatname/genel/r/ruby23/talimat new file mode 100644 index 000000000..c46f7d91c --- /dev/null +++ b/talimatname/genel/r/ruby23/talimat @@ -0,0 +1,43 @@ +# Tanım: Ruby2.3 yorumlayıcı +# URL: http://www.ruby-lang.org +# Paketçi: milisarge +# Gerekler: libffi yaml + +isim=ruby23 +_isim=ruby +_rubyver=2.3 +surum=2.3.4 +devir=1 +kaynak=(http://cache.ruby-lang.org/pub/$_name/${surum%.*}/$_name-$surum.tar.xz) + +derle() { + cd $_name-$surum + + PKG_CONFIG=/usr/bin/pkg-config ./configure \ + --prefix=/opt/ruby${_rubyver} \ + --program-suffix=-${_rubyver} \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --sharedstatedir=/var/lib \ + --libexecdir=/usr/lib/ruby \ + --enable-shared \ + --disable-rpath \ + --with-dbm-type=gdbm_compat + + make ruby + make test + make DESTDIR="${PKG}" install-nodoc + + install -dm755 $PKG//usr/bin + install -dm755 $PKG//usr/lib + + for i in erb irb rdoc ri ruby testrb rake gem; do + ln -s /opt/ruby${_rubyver}/bin/$i-${_rubyver} $PKG/usr/bin/$i-${_rubyver} + ln -s /opt/ruby${_rubyver}/bin/$i-${_rubyver} $PKG/opt/ruby${_rubyver}/bin/$i + done + + ln -s /opt/$_name$_rubyver/lib/libruby.so.${_rubyver} $PKG/usr/lib/libruby.so.${_rubyver} + + install -D -m644 COPYING "${PKG}/usr/share/licenses/ruby${_rubyver}/LICENSE" + install -D -m644 BSDL "${PKG}/usr/share/licenses/ruby${_rubyver}/BSDL" +} diff --git a/talimatname/genel/r/rust/0001-librustc_llvm-build-Force-link-against-libffi.patch b/talimatname/genel/r/rust/0001-librustc_llvm-build-Force-link-against-libffi.patch new file mode 100644 index 000000000..02d25e4e4 --- /dev/null +++ b/talimatname/genel/r/rust/0001-librustc_llvm-build-Force-link-against-libffi.patch @@ -0,0 +1,32 @@ +From 5dbc650a60ddb230f59e5a18ffd298b033566945 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Johannes=20L=C3=B6thberg?= +Date: Thu, 20 Jul 2017 23:07:01 +0200 +Subject: [PATCH] librustc_llvm/build: Force link against libffi +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +`llvm-config --libs` doesn't output libffi in many cases. Fixing it +turned out to take quite a bit of effort, so force libffi linking in +here for now. + +Signed-off-by: Johannes Löthberg +--- + src/librustc_llvm/build.rs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs +index 3f0f536960..7dc0c40c9d 100644 +--- a/src/librustc_llvm/build.rs ++++ b/src/librustc_llvm/build.rs +@@ -220,6 +220,7 @@ fn main() { + }; + println!("cargo:rustc-link-lib={}={}", kind, name); + } ++ println!("cargo:rustc-link-lib=dylib=ffi"); + + // LLVM ldflags + // +-- +2.13.3 + diff --git a/talimatname/genel/r/rust/bootstrap-config.toml b/talimatname/genel/r/rust/bootstrap-config.toml new file mode 100644 index 000000000..0cbc5805b --- /dev/null +++ b/talimatname/genel/r/rust/bootstrap-config.toml @@ -0,0 +1,5 @@ +[install] +prefix = "/usr" + +[rust] +channel = "stable" diff --git a/talimatname/genel/r/rust/talimat b/talimatname/genel/r/rust/talimat new file mode 100644 index 000000000..8c9367e88 --- /dev/null +++ b/talimatname/genel/r/rust/talimat @@ -0,0 +1,25 @@ +# Tanım: Mozilla tarafından güvenli, eşzamanlı, pratik bir dil. +# URL: http://www.rust-lang.org/ +# Paketçi: milisarge +# Gerekler: libffi python jemalloc cmake ccache +# Grup: geliştirme + +isim=rust +surum=1.25.0 +devir=1 +kaynak=(http://static.rust-lang.org/dist/rustc-$surum-src.tar.gz + 0001-librustc_llvm-build-Force-link-against-libffi.patch + bootstrap-config.toml) + +derle() { + cd ${isim}c-$surum-src + + patch -p1 -i $SRC/0001-librustc_llvm-build-Force-link-against-libffi.patch + cp $SRC/bootstrap-config.toml config.toml + + /usr/bin/python ./x.py build --verbose + DESTDIR=$PKG /usr/bin/python ./x.py install + + rm -r $PKG/usr/lib/rustlib/{components,manifest-rustc,rust-installer-version} + rm -r $PKG/usr/share/doc +} diff --git a/talimatname/genel/r/rxvt-unicode/rxvt-unicode.desktop b/talimatname/genel/r/rxvt-unicode/rxvt-unicode.desktop new file mode 100644 index 000000000..2b248bc8b --- /dev/null +++ b/talimatname/genel/r/rxvt-unicode/rxvt-unicode.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Name=urxvt +Comment=An unicode capable rxvt clone +Exec=urxvt +Icon=urxvt-unicode +Terminal=false +Type=Application +Categories=System;TerminalEmulator; diff --git a/talimatname/genel/r/rxvt-unicode/rxvt-unicode.svg b/talimatname/genel/r/rxvt-unicode/rxvt-unicode.svg new file mode 100644 index 000000000..7459c09cc --- /dev/null +++ b/talimatname/genel/r/rxvt-unicode/rxvt-unicode.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + >_ + + + >_ + + + + + + image/svg+xml + + + + + Openclipart + + + Command line + 2013-02-04T14:03:30 + A simple command line icon. + https://openclipart.org/detail/174814/command-line-by-rendon-174814 + + + rendon + + + + + Command line + bash + terminal + + + + + + + + + + + diff --git a/talimatname/genel/r/rxvt-unicode/talimat b/talimatname/genel/r/rxvt-unicode/talimat new file mode 100644 index 000000000..a973900aa --- /dev/null +++ b/talimatname/genel/r/rxvt-unicode/talimat @@ -0,0 +1,55 @@ +# Tanım: Rxvt terminal emülatörünün geliştirilmiş bir unicode özellikli sürümü. +# URL: http://software.schmorp.de/pkg/rxvt-unicode.html +# Paketçi: milisarge +# Gerekler: gdk-pixbuf xorg-libxft startup-notification + +isim=rxvt-unicode +surum=9.20 +devir=2 + +kaynak=( +http://dist.schmorp.de/rxvt-unicode/Attic/$isim-$surum.tar.bz2 +$isim.desktop +$isim.svg) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-everything \ + --enable-unicode3 \ + --enable-combining \ + --enable-xft \ + --enable-font-styles \ + --enable-transparency \ + --enable-fading \ + --enable-frills \ + --enable-pixbuf \ + --enable-rxvt-scroll \ + --enable-next-scroll \ + --enable-xterm-scroll \ + --enable-perl \ + --enable-xim \ + --enable-iso14755 \ + --enable-keepscrolling \ + --enable-selectionscrolling \ + --enable-mousewheel \ + --enable-slipwheeling \ + --enable-smart-resize \ + --enable-text-blink \ + --enable-pointer-blank \ + --enable-utmp \ + --enable-wtmp \ + --enable-lastlog \ + --enable-256-color + + mkdir -p $PKG/usr/share/terminfo + TERMINFO=$PKG/usr/share/terminfo make install DESTDIR=$PKG + + # Openclipart simgesiyle masaüstü bütünleşmesi + install -Dm 644 $SRC/$isim.desktop \ + $PKG/usr/share/applications/$isim.desktop + install -Dm 644 $SRC/$isim.svg \ + $PKG/usr/share/icons/hicolor/scalable/apps/$isim.svg +} diff --git a/talimatname/genel/s/samba/samba.conf b/talimatname/genel/s/samba/samba.conf new file mode 100644 index 000000000..c221cdbff --- /dev/null +++ b/talimatname/genel/s/samba/samba.conf @@ -0,0 +1 @@ +/usr/lib/samba diff --git a/talimatname/genel/s/samba/talimat b/talimatname/genel/s/samba/talimat new file mode 100644 index 000000000..f9443abe8 --- /dev/null +++ b/talimatname/genel/s/samba/talimat @@ -0,0 +1,60 @@ +# Tanım: SMB Dosya sunucusu ve AD Etki Alanı sunucusu +# URL: http://www.samba.org +# Paketçi: milisarge +# Gerekler: talloc tevent avahi gnutls libgpg-error popt python cups kerberos libcap tdb openldap libxslt +# Grup: ağ + +isim=samba +surum=4.6.7 +devir=1 +kaynak=(https://www.samba.org/samba/ftp/stable/$isim-$surum.tar.gz + samba.conf) + +derle() { + +cd $isim-$surum + + +./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --with-piddir=/run/samba \ + --with-pammodulesdir=/lib/security \ + --without-ad-dc \ + --enable-fhs \ + --without-systemd \ + --bundled-libraries=!tdb,!talloc,!pytalloc-util,!tevent,!popt,!ldb + +make + +sed -i "/samba3.blackbox.failure.failure/i \^samba3.raw.eas" selftest/knownfail + +make DESTDIR=$PKG install + +install -v -m644 examples/smb.conf.default $PKG/etc/samba/smb.conf.default + +mkdir -pv $PKG/etc/openldap/schema +install -v -m644 examples/LDAP/README $PKG/etc/openldap/schema/README.LDAP + +install -v -m644 examples/LDAP/samba* $PKG/etc/openldap/schema + +install -v -m755 examples/LDAP/{get*,ol*} $PKG/etc/openldap/schema + +#ld.conf +mkdir -pv $PKG/etc/ld.so.conf.d +cp -f $SRC/samba.conf $PKG/etc/ld.so.conf.d/ + +# cups +cd $PKG/usr/lib/ +install -d cups/backend +ln -v -sf $PKG/usr/bin/smbspool $PKG/usr/lib/cups/backend/smb + +# servis +cd /sources/milis.git/ayarlar/servisler +make DESTDIR=$PKG kur-samba +make DESTDIR=$PKG kur-winbindd + +# Doublon +rm -f $PKG/usr/lib/python2.7/site-packages/talloc.so +} diff --git a/talimatname/genel/s/samsung-printer/talimat b/talimatname/genel/s/samsung-printer/talimat new file mode 100644 index 000000000..d59de2a61 --- /dev/null +++ b/talimatname/genel/s/samsung-printer/talimat @@ -0,0 +1,69 @@ +# Tanım: Samsung yazıcılar ve tarayıcılar için Birleşik Linux Sürücüsü +# URL: http://www.samsung.com +# Paketçi: Cihan_Alkan +# Gerekler: libxml2 libusb-compat cups sane ghostscript +# Grup: sürücü + +isim=samsung-printer +surum=1.00.39 +devir=1 + +kaynak=(http://downloadcenter.samsung.com/content/DR/201704/20170407143829533/uld_V${surum}_01.17.tar.gz + xerox_mfp-smfp.conf) + +derle() { + mkdir -p "$PKG"/usr/share/licenses/samsung-unified-driver + cp "$SRC"/uld/noarch/license/eula.txt "$PKG"/usr/share/licenses/samsung-unified-driver/LICENSE + cp "$SRC"/uld/noarch/license/eula-fr.txt "$PKG"/usr/share/licenses/samsung-unified-driver + + mkdir -p "$PKG"/usr/lib + cp "$SRC"/uld/x86_64/libscmssc.so "$PKG"/usr/lib + + mkdir -p "$PKG"/usr/lib/cups/backend + cp "$SRC"/uld/x86_64/smfpnetdiscovery "$PKG"/usr/lib/cups/backend + + mkdir -p "$PKG"/usr/lib/cups/filter + cp "$SRC"/uld/x86_64/pstosecps "$PKG"/usr/lib/cups/filter + cp "$SRC"/uld/x86_64/rastertospl "$PKG"/usr/lib/cups/filter + + mkdir -p "$PKG"/usr/share/ppd/suld + for ppd in "$SRC"/uld/noarch/share/ppd/*.ppd; do + gzip < "$ppd" > "$PKG"/usr/share/ppd/suld/"${ppd##*/}".gz + done + + mkdir -p "$PKG"/usr/share/ppd/suld/cms + for cts in "$SRC"/uld/noarch/share/ppd/cms/*.cts; do + cp "$cts" "$PKG"/usr/share/ppd/suld/cms + done + + mkdir -p "$PKG"/usr/share + cp -r "$SRC"/uld/noarch/share/locale "$PKG"/usr/share + rm -f "$PKG"/usr/share/locale/fr/LC_MESSAGES/install.mo + + mkdir -p "$PKG"/etc/sane.d + cp "$SRC"/uld/noarch/etc/smfp.conf "$PKG"/etc/sane.d + cp "$SRC"/xerox_mfp-smfp.conf "$PKG"/etc/sane.d + + mkdir -p "$PKG"/etc/sane.d/dll.d + echo smfp > "$PKG"/etc/sane.d/dll.d/smfp-scanner + echo xerox_mfp-smfp > "$PKG"/etc/sane.d/dll.d/smfp-scanner-fix + + mkdir -p "$PKG"/usr/lib/sane + cp "$SRC"/uld/x86_64/libsane-smfp.so.1.0.1 "$PKG"/usr/lib/sane + ln -s libsane-smfp.so.1.0.1 "$PKG"/usr/lib/sane/libsane-smfp.so.1 + ln -s libsane-smfp.so.1 "$PKG"/usr/lib/sane/libsane-smfp.so + + mkdir -p "$PKG"/usr/lib/udev/rules.d + ( + OEM_FILE="$SRC"/uld/noarch/oem.conf + INSTALL_LOG_FILE=/dev/null + source "$SRC"/uld/noarch/scripting_utils + source "$SRC"/uld/noarch/package_utils + source "$SRC"/uld/noarch/scanner-script.pkg + fill_full_template "$SRC"/uld/noarch/etc/smfp.rules.in "$PKG"/usr/lib/udev/rules.d/60_smfp_samsung.rules + + mkdir -p "$PKG"/opt/samsung/scanner/share + cp "$OEM_FILE" "$PKG"/opt/samsung/scanner/share + ) +} + diff --git a/talimatname/genel/s/samsung-printer/xerox_mfp-smfp.conf b/talimatname/genel/s/samsung-printer/xerox_mfp-smfp.conf new file mode 100644 index 000000000..a16f7184a --- /dev/null +++ b/talimatname/genel/s/samsung-printer/xerox_mfp-smfp.conf @@ -0,0 +1,67 @@ +#xerox_mfp-smfp.conf + +# Samsung CLX-2160 +usb 0x04e8 0x3425 + +# Samsung CLX-3170FN & CLX-3175FW +usb 0x04e8 0x342a + +# Samsung CLX-3185 +usb 0x04e8 0x343d + +# Samsung CLX-3300 +usb 0x04e8 0x3456 + +# Samsung M2070 +usb 0x04e8 0x3469 + +# Samsung SCX-3200 & SCX-3205W +usb 0x04e8 0x3441 + +# Samsung SCX-3405W +usb 0x04e8 0x344f + +# Samsung SCX-4100 +usb 0x04e8 0x3413 + +# Samsung SCX-4200 +usb 0x04e8 0x341b + +# Samsung SCX-4216F +usb 0x04e8 0x3409 + +# Samsung SCX-4300 +usb 0x04e8 0x342e + +# Samsung SCX-4500 +usb 0x04e8 0x3426 + +# Samsung SCX-4500W +usb 0x04e8 0x342b + +# Samsung SCX-4521F +usb 0x04e8 0x3419 + +# Samsung SCX-4600 +usb 0x04e8 0x3433 + +# Samsung SCX-4623 +usb 0x04e8 0x3434 + +# Samsung SCX-4623FW +usb 0x04e8 0x3440 + +# Samsung SCX-4725FN +usb 0x04e8 0x341f + +# Samsung SCX-4824 +usb 0x04e8 0x342c + +# Samsung SCX-4825FN +usb 0x04e8 0x343c + +# Samsung SCX-4828FN (4x28 Series) +usb 0x04e8 0x342d + +# Samsung SCX-4833FD +usb 0x04e8 0x344b \ No newline at end of file diff --git a/talimatname/genel/s/sane/sane.kur-kos b/talimatname/genel/s/sane/sane.kur-kos new file mode 100644 index 000000000..29ca90b81 --- /dev/null +++ b/talimatname/genel/s/sane/sane.kur-kos @@ -0,0 +1,4 @@ +if ( ! grep sane /etc/sysconfig/createfiles > /dev/null );then + echo "/var/lock/sane dir 775 root scanner" >> /etc/sysconfig/createfiles +fi + diff --git a/talimatname/genel/s/sane/talimat b/talimatname/genel/s/sane/talimat new file mode 100644 index 000000000..58501a2ab --- /dev/null +++ b/talimatname/genel/s/sane/talimat @@ -0,0 +1,37 @@ +# Tanım: SANE, "Tarayıcı Erişimi Şimdi Kolay" anlamına gelir ve herhangi bir raster görüntü tarayıcı donanımına standartlaştırılmış erişim sağlayan bir uygulama programlama arabirimi (API). +# URL: http://www.sane-project.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libusb-compat libjpeg-turbo libtiff gtk2 libexif cups + +isim=sane +surum=1.0.25 +devir=1 + +kaynak=(http://fossies.org/linux/misc//sane-backends-$surum.tar.gz) + +derle() { + cd $isim-backends-$surum + + ./configure --prefix=/usr \ + --localstatedir=/var \ + --sysconfdir=/etc \ + --with-docdir=/usr/share/doc/sane-backend-$surum \ + --enable-libusb_1_0 \ + --enable-pthread \ + --disable-rpath \ + --disable-locking \ + --with-group=scanner + make + make DESTDIR=$PKG install + + install -d $PKG/etc/udev/rules.d + install -m 644 -v tools/udev/libsane.rules \ + $PKG/etc/udev/rules.d/65-scanner.rules + + install -v -m644 doc/sane.png doc/sane-logo.png \ + $PKG/usr/share/sane + + mkdir -p $PKG/var/lock/sane + chmod 775 $PKG/var/lock/sane + chgrp scanner $PKG/var/lock/sane +} diff --git a/talimatname/genel/s/sayonara-player/talimat b/talimatname/genel/s/sayonara-player/talimat new file mode 100644 index 000000000..0b2cce9ab --- /dev/null +++ b/talimatname/genel/s/sayonara-player/talimat @@ -0,0 +1,19 @@ +# Tanım: Linux için Qt çerçevesinde desteklenen, C ++ ile yazılmış küçük, net ve hızlı bir ses çalar +# URL: http://sayonara-player.com +# Paketçi: Cihan_Alkan +# Gerekler: qt5 taglib gstreamer-plugins-base gstreamer-plugins-good gstreamer-plugins-bad libmtp zlib cmake +# Grup: medya + +isim=sayonara-player +surum=20171231 +devir=1 +kaynak=(http://sayonara-player.com/sw/sayonara-player-1.0.0-git1-$surum.tar.gz) + +derle() { + cd $SRC/$isim + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE="Release" + make + make DESTDIR="$PKG/" install +} diff --git a/talimatname/genel/s/sbc/talimat b/talimatname/genel/s/sbc/talimat new file mode 100644 index 000000000..8471ba9f8 --- /dev/null +++ b/talimatname/genel/s/sbc/talimat @@ -0,0 +1,19 @@ +# Tanım: Verileri Bluetooth ses çıkış cihazlarına aktarmak için kullanılan dijital ses kodlayıcı ve kod çözücü. +# URL: https://fr.wikipedia.org/wiki/SBC_%28codec%29 +# Paketçi: milisarge +# Gerekler: + +isim=sbc +surum=1.3 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/bluetooth/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-static \ + --disable-tester + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sbcl/arch-fixes.lisp b/talimatname/genel/s/sbcl/arch-fixes.lisp new file mode 100644 index 000000000..bdc631331 --- /dev/null +++ b/talimatname/genel/s/sbcl/arch-fixes.lisp @@ -0,0 +1,21 @@ +(in-package "COMMON-LISP-USER") + +(let* ((parent (make-pathname :directory '(:absolute "usr" "share" "sbcl-source"))) + (src + (merge-pathnames + (make-pathname :directory '(:relative "src" :wild-inferiors) + :name :wild :type :wild) + parent)) + (contrib + (merge-pathnames + (make-pathname :directory '(:relative "contrib" :wild-inferiors) + :name :wild :type :wild) + parent))) + (setf (logical-pathname-translations "SYS") + `(("SYS:SRC;**;*.*.*" ,src) + ("SYS:CONTRIB;**;*.*.*" ,contrib)))) + +(ignore-errors + (sb-ext:gc :full t) + (sb-ext:enable-debugger) + (sb-ext:save-lisp-and-die "sbcl-new.core")) diff --git a/talimatname/genel/s/sbcl/customize-target-features.lisp b/talimatname/genel/s/sbcl/customize-target-features.lisp new file mode 100644 index 000000000..f25e9bb06 --- /dev/null +++ b/talimatname/genel/s/sbcl/customize-target-features.lisp @@ -0,0 +1,6 @@ +(lambda (features) + (flet ((enable (x) (pushnew x features)) + (disable (x) (setf features (remove x features)))) + (enable :sb-thread) + (enable :sb-core-compression) + (${enable_disable_largefile} :largefile))) diff --git a/talimatname/genel/s/sbcl/talimat b/talimatname/genel/s/sbcl/talimat new file mode 100644 index 000000000..e028e0b4f --- /dev/null +++ b/talimatname/genel/s/sbcl/talimat @@ -0,0 +1,52 @@ +# Tanım: Steel Bank Common Lisp +# URL: http://www.sbcl.org/ +# Paketçi: milisarge +# Gerekler: clisp + +isim=sbcl +surum=1.3.17 +devir=1 +kaynak=(https://downloads.sourceforge.net/project/sbcl/sbcl/1.3.17/sbcl-$surum-source.tar.bz2 + arch-fixes.lisp + customize-target-features.lisp) + +derle() { + cd "$SRC/$isim-$surum" + export CFLAGS+=" -D_GNU_SOURCE -fno-omit-frame-pointer -DSBCL_HOME=/usr/lib/sbcl" + export GNUMAKE="make" + # build system uses LINKFLAGS and OS_LIBS to build LDFLAGS + export LINKFLAGS="$LDFLAGS" + unset LDFLAGS + unset MAKEFLAGS + enable_disable_largefile=enable + # Make a multi-threaded SBCL, disable LARGEFILE + #cp $SRC/customize-target-features.lisp . + bash make.sh clisp --prefix=/usr --fancy + + # cannot have both SBCL_HOME and INSTALL_ROOT + + SBCL_HOME="" INSTALL_ROOT="$PKG/usr" sh install.sh + + src/runtime/sbcl --core output/sbcl.core --script "${SRC}/arch-fixes.lisp" + + mv sbcl-new.core "${PKG}/usr/lib/sbcl/sbcl.core" + + # sources + + mkdir -p "$PKG/usr/share/sbcl-source" + + cp -R -t "$PKG/usr/share/sbcl-source" "$SRC/$isim-$surum/"{src,contrib} + + # license + + install -D -m644 "$SRC/$isim-$surum/COPYING" "$PKG/usr/share/licenses/$isim/license.txt" + + # drop unwanted files + + find "$PKG" \( -name Makefile -o -name .cvsignore \) -delete + + find "$PKG/usr/share/sbcl-source" -type f \( -name \*.fasl -o -name \*.o -o -name \*.log -o -name \*.so -o -name a.out \) -delete + + rm "$PKG/usr/share/sbcl-source/src/runtime/sbcl"{,.nm} + +} diff --git a/talimatname/genel/s/scons/talimat b/talimatname/genel/s/scons/talimat new file mode 100644 index 000000000..dcf6e6ce4 --- /dev/null +++ b/talimatname/genel/s/scons/talimat @@ -0,0 +1,16 @@ +# Tanım: SCons, Açık Kaynaklı bir yazılım geliştirme aracı, yani yeni nesil bir yapı aracıdır. +# URL: http://scons.org +# Paketçi: milisarge +# Gerekler: python + +isim=scons +surum=2.4.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) +derle() +{ +cd $isim-$surum +python2 setup.py install --standard-lib --prefix=/usr --install-data=/usr/share --root=$PKG --optimize=1; +install -D -m644 LICENSE.txt $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/s/scratch/scratch.desktop b/talimatname/genel/s/scratch/scratch.desktop new file mode 100644 index 000000000..6e503af5d --- /dev/null +++ b/talimatname/genel/s/scratch/scratch.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Scratch +Comment= Programlama sistemi ve içerik geliştirme aracı +Exec=scratch +Terminal=false +Type=Application +Icon=scratch +Categories=Development; +MimeType=application/x-scratch-project diff --git a/talimatname/genel/s/scratch/talimat b/talimatname/genel/s/scratch/talimat new file mode 100644 index 000000000..2698166d4 --- /dev/null +++ b/talimatname/genel/s/scratch/talimat @@ -0,0 +1,35 @@ +# Tanım: Kendi etkileşimli hikayelerinizi, oyunlarınızı, müzik ve sanatınızı oluşturun ve paylaşın +# URL: http://scratch.mit.edu +# Paketçi: Cihan Alkan +# Gerekler: squeak-vm shared-mime-info desktop-file-utils pango gtk-update-icon-cache +# Grup: geliştirme + +isim=scratch +surum=1.4.0.7 +devir=1 +kaynak=(http://download.scratch.mit.edu/$isim-$surum.src.tar.gz + $isim.desktop) + +derle() { + cd $isim-$surum.src + sed -i 's/-xshm //' src/$isim + make build + + install -Dm755 src/$isim "$PKG"/usr/bin/$isim + install -Dm644 Scratch.image "$PKG"/usr/lib/$isim/Scratch.image + install -m644 Scratch.ini "$PKG"/usr/lib/$isim/Scratch.ini + install -Dm644 src/$isim.desktop "$PKG"/usr/share/applications/$isim.desktop + install -Dm644 src/man/$isim.1.gz "$PKG"/usr/share/man/man1/$isim.1.gz + install -Dm644 src/$isim.xml "$PKG"/usr/share/mime/packages/$isim.xml + install -dm755 "$PKG"/usr/share/{$isim,icons/hicolor} + + cp -rp Help locale Media Projects README "$PKG"/usr/share/$isim/ + cp -rp Plugins "$PKG"/usr/lib/$isim/ + chmod 755 "$PKG"/usr/share/scratch/locale + cp -r $SRC/$isim.desktop "$PKG"/usr/share/applications/$isim.desktop + + for res in 32 48 128; do + install -D -m644 src/icons/${res}x${res}/$isim.png \ + "$PKG"/usr/share/icons/hicolor/${res}x${res}/apps/$isim.png + done +} diff --git a/talimatname/genel/s/screen/talimat b/talimatname/genel/s/screen/talimat new file mode 100644 index 000000000..74fa94bbc --- /dev/null +++ b/talimatname/genel/s/screen/talimat @@ -0,0 +1,28 @@ +# Tanım: Screen, fiziksel bir terminali birkaç işlem arasında, genellikle etkileşimli kabuklarla çoğaltılan tam ekran bir pencere yöneticisidir +# URL: http://www.gnu.org/software/screen/screen.html +# Paketçi: milisarge +# Gerekler: + +isim=screen +surum=4.3.1 +devir=1 + +kaynak=(ftp://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --infodir=/usr/share/info \ + --mandir=/usr/share/man \ + --with-socket-dir=/run/screen \ + --with-pty-group=5 \ + --with-sys-screenrc=/etc/screenrc && + +sed -i -e "s%/usr/local/etc/screenrc%/etc/screenrc%" {etc,doc}/* && +make +make DESTDIR=$PKG install +rm $PKG/usr/share/info/dir +mkdir $PKG/etc +install -m 644 etc/etcscreenrc \ +$PKG/etc/screenrc +} diff --git a/talimatname/genel/s/scribus/talimat b/talimatname/genel/s/scribus/talimat new file mode 100644 index 000000000..0ef5afffd --- /dev/null +++ b/talimatname/genel/s/scribus/talimat @@ -0,0 +1,31 @@ +# Tanım: Masaüstü yayıncılık yazılımı +# URL: http://www.scribus.net +# Paketçi: milisarge +# Gerekler: cmake boost aspell cups qt4 gnutls kerberos boost ghostscript lcms libxml2 cairo desktop-file-utils shared-mime-info + +isim=scribus +surum=1.4.5 +devir=2 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2) + +derle() { + unset MAKEFLAGS + cd $SRC* + + sed -i -e 's|#!/usr/bin/python|#!/usr/bin/python2|' \ + -e 's|#!/usr/bin/env python|#!/usr/bin/env python2|' \ + scribus-$surum/scribus/plugins/scriptplugin/{samples,scripts}/* + + cd $isim-$surum + mkdir build + cd build + cmake ../ -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_SKIP_RPATH=ON \ + -DWANT_CAIRO=1 \ + -DLIB_SUFFIX="" + make + make DESTDIR=$PKG install + install -Dm644 $SRC/$isim-$surum/scribus.desktop \ + $PKG/usr/share/applications/scribus.desktop +} diff --git a/talimatname/genel/s/scrot/talimat b/talimatname/genel/s/scrot/talimat new file mode 100644 index 000000000..dc2cf1256 --- /dev/null +++ b/talimatname/genel/s/scrot/talimat @@ -0,0 +1,19 @@ +# Tanım: X için basit bir komut satırı ekran görüntüsü programı +# URL: http://scrot.sourcearchive.com/ +# Paketçi: milisarge +# Gerekler: giblib + +isim=scrot +surum=0.8.17 +devir=1 + +kaynak=("http://scrot.sourcearchive.com/downloads/0.8-17/scrot_0.8.orig.tar.gz") + +derle() { + cd $SRC/$isim-0.8 + ./configure --prefix=/usr \ + --mandir=/usr/share/man + make + + make DESTDIR=$PKG docsdir=/usr/share/doc/scrot install +} diff --git a/talimatname/genel/s/sddm/10-backlight.rules b/talimatname/genel/s/sddm/10-backlight.rules new file mode 100644 index 000000000..68e50bb2a --- /dev/null +++ b/talimatname/genel/s/sddm/10-backlight.rules @@ -0,0 +1,12 @@ +polkit.addRule(function(action, subject) { + + if (action.id.indexOf("org.kde.powerdevil.backlighthelper.") == 0 && + + subject.isInGroup("users")) { + + return polkit.Result.YES; + + } + +}); + diff --git a/talimatname/genel/s/sddm/ecb903e4.patch b/talimatname/genel/s/sddm/ecb903e4.patch new file mode 100644 index 000000000..7dce56752 --- /dev/null +++ b/talimatname/genel/s/sddm/ecb903e4.patch @@ -0,0 +1,33 @@ +From ecb903e48822bd90650bdd64fe80754e3e9664cb Mon Sep 17 00:00:00 2001 +From: Bastian Beischer +Date: Fri, 2 Sep 2016 13:05:18 +0200 +Subject: [PATCH] Fix display of user avatars. (#684) + +QFile::exists("...") does not understand file:// URLs, at least in Qt +5.7.0 and Qt 4.8.7. +--- + src/greeter/UserModel.cpp | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/greeter/UserModel.cpp b/src/greeter/UserModel.cpp +index 41a9f10..94c492d 100644 +--- a/src/greeter/UserModel.cpp ++++ b/src/greeter/UserModel.cpp +@@ -107,13 +107,13 @@ namespace SDDM { + d->lastIndex = i; + + if (avatarsEnabled) { +- const QString userFace = QStringLiteral("file://%1/.face.icon").arg(user->homeDir); +- const QString systemFace = QStringLiteral("file://%1/%2.face.icon").arg(facesDir).arg(user->name); ++ const QString userFace = QStringLiteral("%1/.face.icon").arg(user->homeDir); ++ const QString systemFace = QStringLiteral("%1/%2.face.icon").arg(facesDir).arg(user->name); + + if (QFile::exists(userFace)) +- user->icon = userFace; ++ user->icon = QStringLiteral("file://%1").arg(userFace); + else if (QFile::exists(systemFace)) +- user->icon = systemFace; ++ user->icon = QStringLiteral("file://%1").arg(systemFace); + } + } + } diff --git a/talimatname/genel/s/sddm/sddm-0.14.0-consolekit.patch b/talimatname/genel/s/sddm/sddm-0.14.0-consolekit.patch new file mode 100644 index 000000000..64ea06482 --- /dev/null +++ b/talimatname/genel/s/sddm/sddm-0.14.0-consolekit.patch @@ -0,0 +1,9 @@ +--- a/data/scripts/Xsession 2016-08-28 14:52:04.910181422 +0200 ++++ b/data/scripts/Xsession 2016-08-28 14:53:07.157184480 +0200 +@@ -91,5 +91,5 @@ + if [ -z "$@" ]; then + exec xmessage -center -buttons OK:0 -default OK "Sorry, $DESKTOP_SESSION is no valid session." + else +- exec $@ ++ exec ck-launch-session $@ + fi diff --git a/talimatname/genel/s/sddm/sddm.conf b/talimatname/genel/s/sddm/sddm.conf new file mode 100644 index 000000000..22a6a54a9 --- /dev/null +++ b/talimatname/genel/s/sddm/sddm.conf @@ -0,0 +1,100 @@ +[Autologin] +# Autologin again on session exit +Relogin=false + +# Autologin session +Session=plasma.desktop + +# Autologin user +User= + + +[General] +# Halt command +HaltCommand=/sbin/shutdown -h -P now + +# Initial NumLock state +# Valid values: on|off|none +# If property is set to none, numlock won't be changed +Numlock=on + +# Reboot command +RebootCommand=/sbin/shutdown -r now + + +[Theme] +# Current theme name +Current=breeze + +# Cursor theme +CursorTheme=breeze_cursors + +# Face icon directory +# The files should be in username.face.icon format +FacesDir=/usr/share/sddm/faces + +# Theme directory path +ThemeDir=/usr/share/sddm/themes + + +[Users] +# Default $PATH +DefaultPath=/bin:/usr/bin:/usr/sbin:/usr/local/bin + +# Hidden shells +# Users with these shells as their default won't be listed +HideShells= + +# Hidden users +HideUsers= + +# Maximum user id for displayed users +MaximumUid=65000 + +# Minimum user id for displayed users +MinimumUid=1000 + +# Remember the session of the last successfully logged in user +RememberLastSession=true + +# Remember the last successfully logged in user +RememberLastUser=true + + +[WaylandDisplay] +# Wayland session script path +# A script to execute when starting the desktop session +SessionCommand=/usr/share/sddm/scripts/wayland-session + +# Session description directory +SessionDir=/usr/share/wayland-sessions + + +[XDisplay] +# Xsetup script path +# A script to execute when starting the display server +DisplayCommand=/usr/share/sddm/scripts/Xsetup + +# Xstop script path +# A script to execute when stopping the display server +DisplayStopCommand=/usr/share/sddm/scripts/Xstop + +# Minimum VT +# The lowest virtual terminal number that will be used. +MinimumVT=7 + +# X server path +ServerPath=/usr/bin/X + +# Xsession script path +# A script to execute when starting the desktop session +SessionCommand=/usr/share/sddm/scripts/Xsession + +# Session description directory +SessionDir=/usr/share/xsessions + +# Xauth path +XauthPath=/usr/bin/xauth + +# Xephyr path +XephyrPath=/usr/bin/Xephyr diff --git a/talimatname/genel/s/sddm/sddm.kos-kur b/talimatname/genel/s/sddm/sddm.kos-kur new file mode 100644 index 000000000..71409313f --- /dev/null +++ b/talimatname/genel/s/sddm/sddm.kos-kur @@ -0,0 +1,18 @@ +echo "Lxdm sistemden kaldırılıyor." + +mps -s lxdm + +if ! getent group sddm > /dev/null; then + groupadd -g 64 sddm +fi +if ! getent passwd sddm > /dev/null; then + useradd -c "Simple Desktop Display Manager" \ + -d /var/lib/sddm \ + -u 64 -g sddm \ + -s /bin/false sddm + + passwd -l sddm > /dev/null +fi + +mkdir -p /var/lib/sddm +chown -R sddm:sddm /var/lib/sddm > /dev/null diff --git a/talimatname/genel/s/sddm/sddm.kur-kos b/talimatname/genel/s/sddm/sddm.kur-kos new file mode 100644 index 000000000..d944fb0ce --- /dev/null +++ b/talimatname/genel/s/sddm/sddm.kur-kos @@ -0,0 +1,3 @@ +. /lib/lsb/init-functions +sed -i "s/^id:[3-5]/id:5/" /etc/inittab +echo "Init default set to 5 in the /etc/inittab file" diff --git a/talimatname/genel/s/sddm/talimat b/talimatname/genel/s/sddm/talimat new file mode 100644 index 000000000..17a21b4db --- /dev/null +++ b/talimatname/genel/s/sddm/talimat @@ -0,0 +1,96 @@ +# Tanım: SDDM paketi, Qt ve QML'de yazılmış hafif bir ekran yöneticisi içerir. +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake kf5-extra-cmake-modules qt5 upower consolekit2 xorg-libxkbfile libxcb + +isim=sddm +devir=1 +surum=0.14.0 + +kaynak=( https://github.com/sddm/sddm/releases/download/v$surum/${isim}-$surum.tar.xz + sddm.conf + 10-backlight.rules + sddm-0.14.0-consolekit.patch + ecb903e4.patch) + +derle() { +wget http://anduin.linuxfromscratch.org/BLFS/blfs-bootscripts/blfs-bootscripts-20160902.tar.xz +tar xvf blfs-bootscripts-20160902.tar.xz + +cd ${isim}-$surum +sed -e '/UPOWER_SERVICE)/ s:^://:' \ + -i src/daemon/PowerManager.cpp +mkdir build +patch -p1 -i ../sddm-0.14.0-consolekit.patch +patch -p1 -i ../ecb903e4.patch +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_JOURNALD=OFF \ + -DDBUS_CONFIG_FILENAME=sddm_org.freedesktop.DisplayManager.conf \ + -Wno-dev .. +make +make DESTDIR=$PKG install + +install -m 644 -p $SRC/sddm.conf $PKG/etc/ +mkdir -p $PKG/etc/polkit-1/ +mkdir -p $PKG/etc/polkit-1/rules.d +install -m 644 -p $SRC/10-backlight.rules $PKG/etc/polkit-1/rules.d/ +install -v -dm755 -o sddm -g sddm /var/lib/sddm + +cat > $PKG/etc/pam.d/sddm << "EOF" +# Begin /etc/pam.d/sddm + +auth requisite pam_nologin.so +auth required pam_env.so + +auth required pam_succeed_if.so uid >= 0 quiet +#auth sufficient pam_succeed_if.so user ingroup nopasswdlogin +auth include system-auth + +account include system-account +password include system-password + +session required pam_limits.so +session include system-session + +# End /etc/pam.d/sddm +EOF + +cat > $PKG/etc/pam.d/sddm-autologin << "EOF" +# Begin /etc/pam.d/sddm-autologin + +auth requisite pam_nologin.so +auth required pam_env.so + +auth required pam_succeed_if.so uid >= 0 quiet +#auth sufficient pam_succeed_if.so user ingroup nopasswdlogin +auth required pam_permit.so + +account include system-account + +password required pam_deny.so + +session required pam_limits.so +session include system-session + +# End /etc/pam.d/sddm-autologin +EOF + +cat > $PKG/etc/pam.d/sddm-greeter << "EOF" +# Begin /etc/pam.d/sddm-greeter + +auth required pam_env.so +auth required pam_permit.so + +account required pam_permit.so +password required pam_deny.so +session required pam_unix.so +-session optional pam_systemd.so + +# End /etc/pam.d/sddm-greeter +EOF +# service +cd $SRC/blfs-bootscripts-20160902 +make DESTDIR=$PKG install-sddm +} diff --git a/talimatname/genel/s/sdl-image/talimat b/talimatname/genel/s/sdl-image/talimat new file mode 100644 index 000000000..da943b588 --- /dev/null +++ b/talimatname/genel/s/sdl-image/talimat @@ -0,0 +1,22 @@ +# Tanım: SDL_image, çeşitli biçimlerin SDL yüzeyleri gibi resimlerini yüklemek için kullanılan basit bir kütüphanedir. +# URL: http://www.libsdl.org/projects/SDL_image +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: sdl libjpeg-turbo libpng libtiff libwebp + +isim=sdl-image +surum=1.2.12 +devir=1 + +kaynak=(http://www.libsdl.org/projects/SDL_image/release/SDL_image-$surum.tar.gz) + +derle() { + +cd SDL_image-$surum + +./configure --prefix=/usr \ + + +make +make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/s/sdl-mixer/talimat b/talimatname/genel/s/sdl-mixer/talimat new file mode 100644 index 000000000..491820833 --- /dev/null +++ b/talimatname/genel/s/sdl-mixer/talimat @@ -0,0 +1,17 @@ +# Tanım: Örnek bir çok kanallı ses karıştırıcı kitaplığı. +# URL: http://www.libsdl.org/projects/SDL_mixer +# Paketçi: milisarge +# Gerekler: libvorbis smpeg libmikmod flac + +isim=sdl-mixer +surum=1.2.12 +devir=2 +kaynak=(http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-$surum.tar.gz) + +derle() { + cd SDL_mixer-$surum + sed -i -e 's|/usr/local/lib/timidity|/usr/share/timidity|g' timidity/config.h + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sdl-net/talimat b/talimatname/genel/s/sdl-net/talimat new file mode 100644 index 000000000..c5dcaca17 --- /dev/null +++ b/talimatname/genel/s/sdl-net/talimat @@ -0,0 +1,17 @@ +# Tanım: SDL için çapraz platform bir ağ kitaplığı. +# URL: http://www.libsdl.org/projects/SDL_net +# Paketçi: milisarge +# Gerekler: sdl + +isim=sdl-net +surum=1.2.8 +devir=1 +kaynak=(http://www.libsdl.org/projects/SDL_net/release/SDL_net-$surum.tar.gz) + +derle() { + cd SDL_net-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/s/sdl-pango/SDL_Pango-0.1.2-API-adds.patch b/talimatname/genel/s/sdl-pango/SDL_Pango-0.1.2-API-adds.patch new file mode 100644 index 000000000..1535a5673 --- /dev/null +++ b/talimatname/genel/s/sdl-pango/SDL_Pango-0.1.2-API-adds.patch @@ -0,0 +1,116 @@ +--- src/SDL_Pango.c 2004-12-10 10:06:33.000000000 +0100 ++++ src/SDL_Pango.c 2006-09-24 22:46:24.000000000 +0200 +@@ -723,13 +723,8 @@ + SDL_UnlockSurface(surface); + } + +-/*! +- Create a context which contains Pango objects. +- +- @return A pointer to the context as a SDLPango_Context*. +-*/ + SDLPango_Context* +-SDLPango_CreateContext() ++SDLPango_CreateContext_GivenFontDesc(const char* font_desc) + { + SDLPango_Context *context = g_malloc(sizeof(SDLPango_Context)); + G_CONST_RETURN char *charset; +@@ -743,8 +738,7 @@ + pango_context_set_language (context->context, pango_language_from_string (charset)); + pango_context_set_base_dir (context->context, PANGO_DIRECTION_LTR); + +- context->font_desc = pango_font_description_from_string( +- MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE)); ++ context->font_desc = pango_font_description_from_string(font_desc); + + context->layout = pango_layout_new (context->context); + +@@ -762,6 +756,17 @@ + } + + /*! ++ Create a context which contains Pango objects. ++ ++ @return A pointer to the context as a SDLPango_Context*. ++*/ ++SDLPango_Context* ++SDLPango_CreateContext() ++{ ++ SDLPango_CreateContext_GivenFontDesc(MAKE_FONT_NAME(DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE)); ++} ++ ++/*! + Free a context. + + @param *context [i/o] Context to be free +@@ -1053,6 +1058,20 @@ + pango_layout_set_font_description (context->layout, context->font_desc); + } + ++void ++SDLPango_SetText_GivenAlignment( ++ SDLPango_Context *context, ++ const char *text, ++ int length, ++ SDLPango_Alignment alignment) ++{ ++ pango_layout_set_attributes(context->layout, NULL); ++ pango_layout_set_text (context->layout, text, length); ++ pango_layout_set_auto_dir (context->layout, TRUE); ++ pango_layout_set_alignment (context->layout, alignment); ++ pango_layout_set_font_description (context->layout, context->font_desc); ++} ++ + /*! + Set plain text to context. + Text must be utf-8. +@@ -1067,11 +1086,7 @@ + const char *text, + int length) + { +- pango_layout_set_attributes(context->layout, NULL); +- pango_layout_set_text (context->layout, text, length); +- pango_layout_set_auto_dir (context->layout, TRUE); +- pango_layout_set_alignment (context->layout, PANGO_ALIGN_LEFT); +- pango_layout_set_font_description (context->layout, context->font_desc); ++ SDLPango_SetText_GivenAlignment(context, text, length, SDLPANGO_ALIGN_LEFT); + } + + /*! +--- src/SDL_Pango.h 2004-12-10 10:06:33.000000000 +0100 ++++ src/SDL_Pango.h 2006-09-24 22:46:01.000000000 +0200 +@@ -109,12 +109,20 @@ + SDLPANGO_DIRECTION_NEUTRAL /*! Neutral */ + } SDLPango_Direction; + +- ++/*! ++ Specifies alignment of text. See Pango reference for detail ++*/ ++typedef enum { ++ SDLPANGO_ALIGN_LEFT, ++ SDLPANGO_ALIGN_CENTER, ++ SDLPANGO_ALIGN_RIGHT ++} SDLPango_Alignment; + + extern DECLSPEC int SDLCALL SDLPango_Init(); + + extern DECLSPEC int SDLCALL SDLPango_WasInit(); + ++extern DECLSPEC SDLPango_Context* SDLCALL SDLPango_CreateContext_GivenFontDesc(const char* font_desc); + extern DECLSPEC SDLPango_Context* SDLCALL SDLPango_CreateContext(); + + extern DECLSPEC void SDLCALL SDLPango_FreeContext( +@@ -157,6 +165,12 @@ + const char *markup, + int length); + ++extern DECLSPEC void SDLCALL SDLPango_SetText_GivenAlignment( ++ SDLPango_Context *context, ++ const char *text, ++ int length, ++ SDLPango_Alignment alignment); ++ + extern DECLSPEC void SDLCALL SDLPango_SetText( + SDLPango_Context *context, + const char *markup, diff --git a/talimatname/genel/s/sdl-pango/matrix_declarations.patch b/talimatname/genel/s/sdl-pango/matrix_declarations.patch new file mode 100644 index 000000000..c35d0a708 --- /dev/null +++ b/talimatname/genel/s/sdl-pango/matrix_declarations.patch @@ -0,0 +1,131 @@ +Index: SDL_Pango-0.1.2/src/SDL_Pango.c +=================================================================== +--- SDL_Pango-0.1.2.orig/src/SDL_Pango.c 2007-09-18 15:03:10.732910311 +0200 ++++ SDL_Pango-0.1.2/src/SDL_Pango.c 2007-09-18 15:04:41.970109622 +0200 +@@ -286,6 +286,59 @@ + } contextImpl; + + ++const SDLPango_Matrix _MATRIX_WHITE_BACK ++ = {255, 0, 0, 0, ++ 255, 0, 0, 0, ++ 255, 0, 0, 0, ++ 255, 255, 0, 0,}; ++ ++/*! ++ Specifies white back and black letter. ++*/ ++const SDLPango_Matrix *MATRIX_WHITE_BACK = &_MATRIX_WHITE_BACK; ++ ++const SDLPango_Matrix _MATRIX_BLACK_BACK ++ = {0, 255, 0, 0, ++ 0, 255, 0, 0, ++ 0, 255, 0, 0, ++ 255, 255, 0, 0,}; ++/*! ++ Specifies black back and white letter. ++*/ ++const SDLPango_Matrix *MATRIX_BLACK_BACK = &_MATRIX_BLACK_BACK; ++ ++const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_BLACK_LETTER ++ = {0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 0, 0, 0, ++ 0, 255, 0, 0,}; ++/*! ++ Specifies transparent back and black letter. ++*/ ++const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_BLACK_LETTER = &_MATRIX_TRANSPARENT_BACK_BLACK_LETTER; ++ ++const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_WHITE_LETTER ++ = {255, 255, 0, 0, ++ 255, 255, 0, 0, ++ 255, 255, 0, 0, ++ 0, 255, 0, 0,}; ++/*! ++ Specifies transparent back and white letter. ++*/ ++const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_WHITE_LETTER = &_MATRIX_TRANSPARENT_BACK_WHITE_LETTER; ++ ++const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER ++ = {255, 255, 0, 0, ++ 255, 255, 0, 0, ++ 255, 255, 0, 0, ++ 0, 0, 0, 0,}; ++/*! ++ Specifies transparent back and transparent letter. ++ This is useful for KARAOKE like rendering. ++*/ ++const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER = &_MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER; ++ ++ + /*! + Initialize the Glib and Pango API. + This must be called before using other functions in this library, +Index: SDL_Pango-0.1.2/src/SDL_Pango.h +=================================================================== +--- SDL_Pango-0.1.2.orig/src/SDL_Pango.h 2007-09-18 15:03:10.732910311 +0200 ++++ SDL_Pango-0.1.2/src/SDL_Pango.h 2007-09-18 15:06:24.919976401 +0200 +@@ -47,57 +47,27 @@ + Uint8 m[4][4]; /*! Matrix variables */ + } SDLPango_Matrix; + +-const SDLPango_Matrix _MATRIX_WHITE_BACK +- = {255, 0, 0, 0, +- 255, 0, 0, 0, +- 255, 0, 0, 0, +- 255, 255, 0, 0,}; +- + /*! + Specifies white back and black letter. + */ +-const SDLPango_Matrix *MATRIX_WHITE_BACK = &_MATRIX_WHITE_BACK; +- +-const SDLPango_Matrix _MATRIX_BLACK_BACK +- = {0, 255, 0, 0, +- 0, 255, 0, 0, +- 0, 255, 0, 0, +- 255, 255, 0, 0,}; ++extern const SDLPango_Matrix *MATRIX_WHITE_BACK; + /*! + Specifies black back and white letter. + */ +-const SDLPango_Matrix *MATRIX_BLACK_BACK = &_MATRIX_BLACK_BACK; +- +-const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_BLACK_LETTER +- = {0, 0, 0, 0, +- 0, 0, 0, 0, +- 0, 0, 0, 0, +- 0, 255, 0, 0,}; ++extern const SDLPango_Matrix *MATRIX_BLACK_BACK; + /*! + Specifies transparent back and black letter. + */ +-const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_BLACK_LETTER = &_MATRIX_TRANSPARENT_BACK_BLACK_LETTER; +- +-const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_WHITE_LETTER +- = {255, 255, 0, 0, +- 255, 255, 0, 0, +- 255, 255, 0, 0, +- 0, 255, 0, 0,}; ++extern const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_BLACK_LETTER; + /*! + Specifies transparent back and white letter. + */ +-const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_WHITE_LETTER = &_MATRIX_TRANSPARENT_BACK_WHITE_LETTER; +- +-const SDLPango_Matrix _MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER +- = {255, 255, 0, 0, +- 255, 255, 0, 0, +- 255, 255, 0, 0, +- 0, 0, 0, 0,}; ++extern const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_WHITE_LETTER; + /*! + Specifies transparent back and transparent letter. + This is useful for KARAOKE like rendering. + */ +-const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER = &_MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER; ++extern const SDLPango_Matrix *MATRIX_TRANSPARENT_BACK_TRANSPARENT_LETTER; + + /*! + Specifies direction of text. See Pango reference for detail diff --git a/talimatname/genel/s/sdl-pango/talimat b/talimatname/genel/s/sdl-pango/talimat new file mode 100644 index 000000000..b13b4aaac --- /dev/null +++ b/talimatname/genel/s/sdl-pango/talimat @@ -0,0 +1,22 @@ +# Tanım: Pango SDL ciltlemesi +# URL: http://sdlpango.sourceforge.net/ +# Paketçi: Cihan Alkan +# Gerekler: pango sdl + +isim=sdl-pango +surum=0.1.2 +devir=1 + +kaynak=(https://downloads.sourceforge.net/sourceforge/sdlpango/SDL_Pango-$surum.tar.gz + SDL_Pango-$surum-API-adds.patch + matrix_declarations.patch) + + +derle() { + cd SDL_Pango-$surum + patch -Np0 -i $SRC/SDL_Pango-$surum-API-adds.patch + patch -Np1 -i $SRC/matrix_declarations.patch + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sdl-ttf/talimat b/talimatname/genel/s/sdl-ttf/talimat new file mode 100644 index 000000000..03166c3ba --- /dev/null +++ b/talimatname/genel/s/sdl-ttf/talimat @@ -0,0 +1,20 @@ +# Tanım: Libsdl için TrueType kitaplığı. +# URL: http://www.libsdl.org/projects/SDL_ttf/ +# Paketçi: milisarge +# Gerekler: freetype sdl + +isim=sdl-ttf +surum=2.0.11 +devir=1 +kaynak=(http://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-$surum.tar.gz) + +derle() { + cd SDL_ttf-$surum + + ./configure \ + --prefix=/usr \ + --disable-dependency-tracking + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sdl/talimat b/talimatname/genel/s/sdl/talimat new file mode 100644 index 000000000..a17578861 --- /dev/null +++ b/talimatname/genel/s/sdl/talimat @@ -0,0 +1,18 @@ +# Tanım: Basit Directmedia Layer, bir kitaplık çoklu biçimi +# URL: http://www.libsdl.org +# Paketçi: milisarge +# Gerekler: alsa-lib nasm libusb pulseaudio xorg-libx11 xorg-libxext +# Grup: grafik_tasarım + +isim=sdl +surum=1.2.15 +devir=1 + +kaynak=(http://www.libsdl.org/release/SDL-$surum.tar.gz) +derle() { +cd SDL-$surum +sed -i '/_XData32/s:register long:register _Xconst long:' src/video/x11/SDL_x11sym.h +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sdl2-image/talimat b/talimatname/genel/s/sdl2-image/talimat new file mode 100644 index 000000000..88669ec92 --- /dev/null +++ b/talimatname/genel/s/sdl2-image/talimat @@ -0,0 +1,19 @@ +# Tanım: SDL yüzeyleri (Version 2) olarak çeşitli biçimlerin görüntülerini yüklemek için basit bir kütüphane +# URL: http://www.libsdl.org/projects/SDL_image +# Paketçi: yasarciv67@gmail.com +# Gerekler: sdl2 libpng libtiff libjpeg-turbo libwebp cmake + +isim=sdl2-image +surum=2.0.1 +devir=1 +kaynak=(https://www.libsdl.org/projects/SDL_image/release/SDL2_image-$surum.tar.gz) + +derle() { + cd SDL2_image-$surum + ./configure --disable-static --prefix=/usr + + make + make DESTDIR=$PKG install +install -Dm644 COPYING.txt "$PKG/usr/share/licenses/$isim/LICENSE" +} + diff --git a/talimatname/genel/s/sdl2-mixer/talimat b/talimatname/genel/s/sdl2-mixer/talimat new file mode 100644 index 000000000..0dfe01da1 --- /dev/null +++ b/talimatname/genel/s/sdl2-mixer/talimat @@ -0,0 +1,20 @@ +# Tanım: A simple multi-channel audio mixer (Version 2) +# URL: http://www.libsdl.org/projects/SDL_mixer +# Paketçi: milisarge +# Gerekler: fluidsynth sdl2 libvorbis libmodplug smpeg2 flac + +isim=sdl2-mixer +surum=2.0.1 +devir=1 +kaynak=(https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-$surum.tar.gz) + +derle() { + cd "${SRC}/SDL2_mixer-${surum}/" + sed -i "s|/etc/timidity|/etc/timidity++|g" timidity/config.h + sed -i "s|/etc/timidity++.cfg|/etc/timidity++/timidity.cfg|g" timidity/config.h + export CFLAGS+=" ${CFLAGS} -I/usr/include/libmodplug" + ./configure --disable-static --prefix=/usr + make + make DESTDIR="${PKG}" install + install -Dm644 COPYING.txt "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/s/sdl2-ttf/talimat b/talimatname/genel/s/sdl2-ttf/talimat new file mode 100644 index 000000000..8fed4cdce --- /dev/null +++ b/talimatname/genel/s/sdl2-ttf/talimat @@ -0,0 +1,21 @@ +# Tanım: SDL2 uygulamalarınızda TrueType fontları kullanmanıza izin veren bir kütüphane +# URL: http://www.libsdl.org/projects/SDL_ttf +# Paketçi: Cihan_Alkan +# Gerekler: sdl2 freetype cmake +# Grup: kütüphane + +isim=sdl2-ttf +surum=2.0.14 +devir=1 +kaynak=(https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-${surum}.tar.gz) + +derle() { + + cd "${SRC}/SDL2_ttf-${surum}/" + + ./configure --disable-static --prefix=/usr + make + + make DESTDIR="${PKG}/" install + install -Dm644 COPYING.txt "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/s/sdl2/talimat b/talimatname/genel/s/sdl2/talimat new file mode 100644 index 000000000..80c42e3cc --- /dev/null +++ b/talimatname/genel/s/sdl2/talimat @@ -0,0 +1,24 @@ +# Tanım: Bir video çerçeve arabelleği, ses çıkışı, fare ve klavyeye taşınabilir düşük seviye erişimi için bir kütüphane +# URL: http://www.libsdl.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg-libxext xorg-libxrender xorg-libx11 xorg-libxcursor alsa-lib xorg-mesa pulseaudio xorg-libxrandr xorg-libxinerama libxkbcommon wayland + +isim=sdl2 +surum=2.0.4 +devir=1 + +kaynak=(http://www.libsdl.org/release/SDL2-$surum.tar.gz) + +derle() { + mkdir build + cd build + ../SDL2-$surum/configure --prefix=/usr \ + --enable-sdl-dlopen \ + --disable-arts --disable-esd --disable-nas \ + --enable-alsa --enable-pulseaudio-shared \ + --disable-video-wayland \ + --disable-rpath + make + make DESTDIR=$PKG install + install -Dm644 ../SDL2-$surum/COPYING.txt $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/s/sdl2_gfx/talimat b/talimatname/genel/s/sdl2_gfx/talimat new file mode 100644 index 000000000..d64668c2a --- /dev/null +++ b/talimatname/genel/s/sdl2_gfx/talimat @@ -0,0 +1,17 @@ +# Tanım: SDL graphics drawing primitives and other support functions (Version 2) +# URL: http://www.ferzkopp.net/wordpress/2016/01/02/sdl_gfx-sdl2_gfx/ +# Paketçi: milisarge +# Gerekler: sdl2 + +isim=sdl2_gfx +surum=1.0.3 +devir=1 +kaynak=(http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-$surum.tar.gz) + +derle() { + cd SDL2_gfx-$surum + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + install -Dm644 COPYING "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/s/sdl2_net/talimat b/talimatname/genel/s/sdl2_net/talimat new file mode 100644 index 000000000..cf2954211 --- /dev/null +++ b/talimatname/genel/s/sdl2_net/talimat @@ -0,0 +1,17 @@ +# Tanım: SDL-2 için çapraz platform bir ağ kitaplığı. +# URL: http://www.libsdl.org/projects/SDL_net +# Paketçi: milisarge +# Gerekler: sdl2 + +isim=sdl2_net +surum=2.0.1 +devir=1 +kaynak=(https://www.libsdl.org/projects/SDL_net/release/SDL2_net-$surum.tar.gz) + +derle() { + cd SDL2_net-$surum + ./configure --disable-static --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/s/sdl_gfx/talimat b/talimatname/genel/s/sdl_gfx/talimat new file mode 100644 index 000000000..8ad6ff103 --- /dev/null +++ b/talimatname/genel/s/sdl_gfx/talimat @@ -0,0 +1,17 @@ +# Tanım: SDL grafik çizim ilkelleri ve diğer destek fonksiyonları. +# URL: http://www.ferzkopp.net/joomla/software-mainmenu-14/4-ferzkopps-linux-software/19-sdlgfx +# Paketçi: milisarge +# Gerekler: sdl + +isim=sdl_gfx +surum=2.0.23 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/sdlgfx/SDL_gfx-$surum.tar.gz) + +derle() { + cd SDL_gfx-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/s/seahorse-nautilus/seahorse-nautilus.kur-kos b/talimatname/genel/s/seahorse-nautilus/seahorse-nautilus.kur-kos new file mode 100644 index 000000000..7b04491d7 --- /dev/null +++ b/talimatname/genel/s/seahorse-nautilus/seahorse-nautilus.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q diff --git a/talimatname/genel/s/seahorse-nautilus/talimat b/talimatname/genel/s/seahorse-nautilus/talimat new file mode 100644 index 000000000..ec0e1c249 --- /dev/null +++ b/talimatname/genel/s/seahorse-nautilus/talimat @@ -0,0 +1,18 @@ +# Tanım: Nautilus için PGP şifreleme ve imzalama. +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache gtk3 libcryptui dbus-glib gnome-keyring gconf gnupg gpgme nautilus libnotify seahorse + +isim=seahorse-nautilus +surum=3.11.92 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i "s@1.2 1.4 2.0@1.2 1.4 2.0 2.1@" configure + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/seahorse/seahorse.kur-kos b/talimatname/genel/s/seahorse/seahorse.kur-kos new file mode 100644 index 000000000..51b045731 --- /dev/null +++ b/talimatname/genel/s/seahorse/seahorse.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/s/seahorse/talimat b/talimatname/genel/s/seahorse/talimat new file mode 100644 index 000000000..51e958c24 --- /dev/null +++ b/talimatname/genel/s/seahorse/talimat @@ -0,0 +1,17 @@ +# Tanım: PGP anahtarlarını yönetmek için GNOME uygulaması. +# URL: http://www.gnome.org/" +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache gtk3 gcr libsecret desktop-file-utils dconf gpgme openldap intltool yelp-tools gobject-introspection xorg-libsm vala + +isim=seahorse +surum=3.20.0 +devir=2 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sendmail/sendmail.kos-kur b/talimatname/genel/s/sendmail/sendmail.kos-kur new file mode 100644 index 000000000..763d9ac28 --- /dev/null +++ b/talimatname/genel/s/sendmail/sendmail.kos-kur @@ -0,0 +1,5 @@ +groupadd -g 26 smmsp +useradd -c "Sendmail Daemon" -g smmsp -d /dev/null \ + -s /bin/false -u 26 smmsp +chmod -v 1777 /var/mail +install -v -m700 -d /var/spool/mqueue diff --git a/talimatname/genel/s/sendmail/sendmail.sil-kos b/talimatname/genel/s/sendmail/sendmail.sil-kos new file mode 100644 index 000000000..3355681bd --- /dev/null +++ b/talimatname/genel/s/sendmail/sendmail.sil-kos @@ -0,0 +1,3 @@ +userdel smmsp +groupdel smmsp + diff --git a/talimatname/genel/s/sendmail/site.config.m4 b/talimatname/genel/s/sendmail/site.config.m4 new file mode 100644 index 000000000..302bea330 --- /dev/null +++ b/talimatname/genel/s/sendmail/site.config.m4 @@ -0,0 +1,5 @@ +define(`confMANGRP',`root') +define(`confMANOWN',`root') +define(`confSBINGRP',`root') +define(`confUBINGRP',`root') +define(`confUBINOWN',`root') diff --git a/talimatname/genel/s/sendmail/talimat b/talimatname/genel/s/sendmail/talimat new file mode 100644 index 000000000..d0f5c8e84 --- /dev/null +++ b/talimatname/genel/s/sendmail/talimat @@ -0,0 +1,74 @@ +# Tanım: The sendmail package contains a Mail Transport Agent (MTA). +# URL: ftp://ftp.sendmail.org/pub/sendmail/ +# Paketçi: milisarge +# Gerekler: ghostscript cyrus-sasl openssl procmail openldap + +isim=sendmail +surum=8.15.2 +devir=1 + +kaynak=(ftp://ftp.sendmail.org/pub/$isim/$isim.$surum.tar.gz + site.config.m4) + +derle() { + + cd $isim-$surum + + source /etc/blfs-bootscripts + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + + cp -v $SRC/site.config.m4 devtools/Site + + sed -i 's|/usr/man/man|/usr/share/man/man|' \ + devtools/OS/Linux + cd sendmail + sh Build + cd ../cf/cf + cp generic-linux.mc sendmail.mc + sh Build sendmail.cf + + install -v -d -m755 $PKG/etc/mail + install -c -o root -g bin -m 0444 sendmail.cf $PKG/etc/mail/sendmail.cf + install -c -o root -g bin -m 0444 submit.cf $PKG/etc/mail/submit.cf + + + cd ../.. + sh Build install + + install -v -m644 cf/cf/{submit,sendmail}.mc $PKG/etc/mail + cp -v -R cf/* $PKG/etc/mail + + install -v -m755 -d $PKG/usr/share/doc/sendmail-8.15.2/{cf,sendmail} + + install -v -m644 CACerts FAQ KNOWNBUGS LICENSE PGPKEYS README RELEASE_NOTES \ + $PKG/usr/share/doc/sendmail-8.15.2 + + install -v -m644 sendmail/{README,SECURITY,TRACEFLAGS,TUNING} \ + $PKG/usr/share/doc/sendmail-8.15.2/sendmail + + install -v -m644 cf/README $PKG/usr/share/doc/sendmail-8.15.2/cf + + install -v -d -m755 $PKG/usr/share/man/man8 + for manpage in sendmail editmap mailstats makemap praliases smrsh + do + install -v -m644 $manpage/$manpage.8 $PKG/usr/share/man/man8 + done && + + install -v -m644 sendmail/aliases.5 $PKG/usr/share/man/man5 + install -v -m644 sendmail/mailq.1 $PKG/usr/share/man/man1 + install -v -m644 sendmail/newaliases.1 $PKG/usr/share/man/man1 + install -v -m644 vacation/vacation.1 $PKG/usr/share/man/man1 + + cd doc/op + sed -i 's/groff/GROFF_NO_SGR=1 groff/' Makefile + make op.txt op.pdf + + install -v -d -m755 $PKG/usr/share/doc/sendmail-8.15.2 + install -v -m644 op.ps op.txt op.pdf $PKG/usr/share/doc/sendmail-8.15.2 + cd ../.. + + cd $scripts-$scriptsversion + make DESTDIR=$PKG install-sendmail + +} diff --git a/talimatname/genel/s/serf/talimat b/talimatname/genel/s/serf/talimat new file mode 100644 index 000000000..120df1b93 --- /dev/null +++ b/talimatname/genel/s/serf/talimat @@ -0,0 +1,22 @@ +# Tanım: C tabanlı HTTP istemci kütüphanesi Apache Portable Runtime (APR) kütüphanesi üzerine inşa edilmiştir. +# URL: https://code.google.com/p/serf/ +# Paketçi: milisarge +# Gerekler: apr-util openssl scons kerberos + +isim=serf +surum=1.3.8 +devir=1 +kaynak=(https://archive.apache.org/dist/$isim/$isim-$surum.tar.bz2) + +derle() { + +cd $isim-$surum + +sed -i "/Append/s:RPATH=libdir,::" SConstruct +sed -i "/Default/s:lib_static,::" SConstruct +sed -i "/Alias/s:install_static,::" SConstruct +scons PREFIX=/usr + +scons PREFIX=$PKG/usr install + +} diff --git a/talimatname/genel/s/setconf/talimat b/talimatname/genel/s/setconf/talimat new file mode 100644 index 000000000..2fa5c100b --- /dev/null +++ b/talimatname/genel/s/setconf/talimat @@ -0,0 +1,15 @@ +# Tanım: Ayar dosyalarındaki ayarları kolayca değiştirme aracı +# URL: http://setconf.roboticoverlords.org/ +# Paketçi: milisarge +# Gerekler: python + +isim=setconf +surum=0.7.4 +devir=1 +kaynak=(http://setconf.roboticoverlords.org/$isim-$surum.tar.xz) + +derle() { + cd "$isim-$surum" + + install -Dm755 "$isim.py" "$PKG/usr/bin/$isim" +} diff --git a/talimatname/genel/s/seyhan/seyhan-logo.png b/talimatname/genel/s/seyhan/seyhan-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d9eab67ad371dc4494281ab2c6ae18a3cc1f7964 GIT binary patch literal 4024 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 R{7*pxriSJQm3nS*{{z*ROML(U literal 0 HcmV?d00001 diff --git a/talimatname/genel/s/seyhan/talimat b/talimatname/genel/s/seyhan/talimat new file mode 100644 index 000000000..1dfbc45e1 --- /dev/null +++ b/talimatname/genel/s/seyhan/talimat @@ -0,0 +1,42 @@ +# Tanım: Açık kaynak kodlu ön muhasebe programı +# URL: http://www.seyhanproject.com +# Paketçi: Cihan_Alkan +# Gerekler: openjdk unzip +# Grup: ofis_düzenleyici + +isim=seyhan +surum=1.0.19 +devir=1 + +kaynak=(seyhan-logo.png) + +derle() { +if [ ! -f $DERLEME_KAYNAKDIZIN/seyhan-$surum.zip ];then + wget http://www.seyhanproject.com/downloads/seyhan-$surum.zip \ + --user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \ + (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" \ + -O $DERLEME_KAYNAKDIZIN/seyhan-$surum.zip +fi +unzip $DERLEME_KAYNAKDIZIN/seyhan-$surum.zip -d $SRC/ +mkdir -pv $PKG/opt/seyhan +mv $SRC/$isim-$surum/* $PKG/opt/seyhan/ + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/seyhan.desktop << "EOF" && +[Desktop Entry] +Encoding=UTF-8 +Type=Application +Name=Seyhan Ön Muhasebe +Comment=Açık kaynak kodlu ön muhasebe programı +Icon=seyhan +Exec=firefox http://localhost:9000 +Categories=Network;GTK;Application;Browser;WebBrowser; +StartupNotify=true +Terminal=false +EOF + +mkdir -pv $PKG/usr/share/pixmaps +cp -r $SRC/seyhan-logo.png $PKG/usr/share/pixmaps/seyhan.png +echo "Kullanıcı Adı: super , Şifre: 1234" +} diff --git a/talimatname/genel/s/sfml-python/talimat b/talimatname/genel/s/sfml-python/talimat new file mode 100644 index 000000000..9b7daffeb --- /dev/null +++ b/talimatname/genel/s/sfml-python/talimat @@ -0,0 +1,19 @@ +# Tanım: SFML için gayriresmi Python bağlaması +# URL: http://python-sfml.org +# Paketçi: Cihan_Alkan +# Gerekler: cython sfml python python3 +# Grup: kütüphane + +isim=sfml-python +surum=git +devir=1 + +kaynak=(https://github.com/Sonkun/python-sfml/archive/master.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $SRC/python-sfml-master + python2 setup.py build_ext + python2 setup.py install --root="${PKG}" --prefix=/usr + python3 setup.py build_ext + python3 setup.py install --root="${PKG}" --prefix=/usr +} diff --git a/talimatname/genel/s/sfml/talimat b/talimatname/genel/s/sfml/talimat new file mode 100644 index 000000000..54bef17f4 --- /dev/null +++ b/talimatname/genel/s/sfml/talimat @@ -0,0 +1,32 @@ +# Tanım: Sade,hızlı,çoğl platform destekli multimedya kütüphanesi +# URL: http://www.sfml-dev.org/ +# Paketçi: milisarge +# Gerekler: flac freetype libjpeg-turbo libvorbis xorg-mesa openal util-linux xorg-libsm xorg-libxrandr xcb-util-image + +isim=sfml +surum=2.4.2 +devir=1 +kaynak=(https://www.sfml-dev.org/files/SFML-$surum-sources.zip) + +derle() { + cd SFML-$surum + cmake_surum=3.4 + install -d build + cd build + + cmake .. \ + -DCMAKE_BUILD_TYPE='Release' \ + -DCMAKE_INSTALL_PREFIX='/usr' \ + -DSFML_INSTALL_PKGCONFIG_FILES=1 \ + -DSFML_BUILD_EXAMPLES=0 \ + -DSFML_BUILD_DOC=0 \ + + + make + make DESTDIR=$PKG install + + install -D -m 0644 $PKG/usr/share/SFML/cmake/Modules/FindSFML.cmake \ + $PKG/usr/share/cmake-$cmake_surum/Modules/FindSFML.cmake + + rm -r $PKG/usr/share/SFML/{license,readme}.txt +} diff --git a/talimatname/genel/s/sg3-utils/talimat b/talimatname/genel/s/sg3-utils/talimat new file mode 100644 index 000000000..dc4582150 --- /dev/null +++ b/talimatname/genel/s/sg3-utils/talimat @@ -0,0 +1,16 @@ +# Tanım: Genel SCSI yardımcı programları +# URL: http://sg.danny.cz/sg/sg3_utils.html +# Paketçi: milisarge +# Gerekler: + +isim=sg3-utils +surum=1.41 +devir=1 + +kaynak=(http://sg.danny.cz/sg/p/sg3_utils-$surum.tar.xz) +derle() { +cd sg3_utils-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sgml-common/talimat b/talimatname/genel/s/sgml-common/talimat new file mode 100644 index 000000000..cd7eaf699 --- /dev/null +++ b/talimatname/genel/s/sgml-common/talimat @@ -0,0 +1,25 @@ +# Tanım: Merkezi SGML kataloglarını koruma araçları. +# URL: http://www.docbook.org/xml/ +# Paketçi: milisarge +# Gerekler: + +isim=sgml-common +surum=0.6.3 +devir=1 + +kaynak=( +ftp://sources.redhat.com/pub/docbook-tools/new-trials/SOURCES/sgml-common-$surum.tgz +http://www.linuxfromscratch.org/patches/blfs/7.5/sgml-common-$surum-manpage-1.patch) + +derle(){ + cd $isim-$surum + patch -Np1 -i ../sgml-common-$surum-manpage-1.patch && + autoreconf -f -i + ./configure --prefix=/usr \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install + + # Doc dizinini düzelt + mv $PKG/usr/doc $PKG/usr/share/doc +} diff --git a/talimatname/genel/s/shared-color-targets/talimat b/talimatname/genel/s/shared-color-targets/talimat new file mode 100644 index 000000000..b2f12a155 --- /dev/null +++ b/talimatname/genel/s/shared-color-targets/talimat @@ -0,0 +1,16 @@ +# Tanım: Renk profilleri oluşturmak için paylaşılan renk hedefleri. +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: + +isim=shared-color-targets +surum=0.1.7 +devir=1 +kaynak=(http://people.freedesktop.org/~hughsient/releases/$isim-$surum.tar.xz) + +derle(){ + cd $isim-$surum +./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/shared-mime-info/shared-mime-info.kur-kos b/talimatname/genel/s/shared-mime-info/shared-mime-info.kur-kos new file mode 100644 index 000000000..e4b7536a2 --- /dev/null +++ b/talimatname/genel/s/shared-mime-info/shared-mime-info.kur-kos @@ -0,0 +1 @@ +update-mime-database usr/share/mime > /dev/null 2>&1 diff --git a/talimatname/genel/s/shared-mime-info/talimat b/talimatname/genel/s/shared-mime-info/talimat new file mode 100644 index 000000000..accfde425 --- /dev/null +++ b/talimatname/genel/s/shared-mime-info/talimat @@ -0,0 +1,18 @@ +# Tanım: Destekleyen tüm uygulamalar için MIME bilgilerini merkezi olarak güncellemenizi sağlar. +# URL: http://freedesktop.org/ +# Paketçi: milisarge +# Gerekler: libxml2 intltool glib + +isim=shared-mime-info +surum=1.5 +devir=1 + +kaynak=( http://freedesktop.org/~hadess/$isim-$surum.tar.xz) + +derle() { +unset MAKEFLAGS +cd $isim-$surum +./configure --prefix=/usr --disable-update-mimedb +make -j1 +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sharutils/talimat b/talimatname/genel/s/sharutils/talimat new file mode 100644 index 000000000..b391c1559 --- /dev/null +++ b/talimatname/genel/s/sharutils/talimat @@ -0,0 +1,17 @@ +# Tanım: 'Kabuk' arşivleri oluşturabilen araçlar içerir. +# URL: https://www.gnu.org/software/sharutils/ +# Paketçi: milisarge +# Gerekler: + +isim=sharutils +surum=4.15.2 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/shashlik/shashlik-gui.sh b/talimatname/genel/s/shashlik/shashlik-gui.sh new file mode 100644 index 000000000..8d3ab879b --- /dev/null +++ b/talimatname/genel/s/shashlik/shashlik-gui.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# shashlik-gui 1.0 +# +# Copyright (c) 2017 Elias Ojala +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# https://github.com/theel0ja/shashlik-gui + +FILE=`zenity --file-selection --title="Yüklemek istediğiniz bir .apk dosyası seçin"` +case $? in + 0) + case "${FILE##*.}" in + apk) + zenity --question --text="$FILE dosyasını yüklemek istiyor musunuz?" + case $? in + 0) + /opt/shashlik/bin/shashlik-install $FILE + ;; + 1) + zenity --warning --text="Uygulama yüklenemedi.";; + -1) + zenity --error --text="Beklenmeyen bir hata oluştu.";; + esac + ;; + *) + zenity --error --text="Geçersiz dosya türü.";; + esac + ;; + 1) + zenity --error --text="Dosya seçilmedi.";; + -1) + zenity --error --text="Beklenmeyen bir hata oluştu.";; +esac diff --git a/talimatname/genel/s/shashlik/shashlik.desktop b/talimatname/genel/s/shashlik/shashlik.desktop new file mode 100644 index 000000000..9aa0bd073 --- /dev/null +++ b/talimatname/genel/s/shashlik/shashlik.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=1.0 +Name=Android Apk Kur +CommentAndroid uygulamaları çalıştır +Icon=multimedia-volume-control +Exec=/bin/shashlik-gui.sh +Type=Application +Icon=/opt/shashlik/data/shashlik.png +StartupNotify=true +Terminal=false +Categories=X-XFCE;Utility; diff --git a/talimatname/genel/s/shashlik/talimat b/talimatname/genel/s/shashlik/talimat new file mode 100644 index 000000000..617a059e4 --- /dev/null +++ b/talimatname/genel/s/shashlik/talimat @@ -0,0 +1,22 @@ +# Tanım: Standart Linux masaüstü üzerinde Android uygulamaları çalıştır +# URL: http://www.shashlik.io +# Paketçi: Cihan Alkan +# Gerekler: python3 kdialog zenity + +isim=shashlik +surum=0.9.3 +devir=1 +kaynak=(http://static.davidedmundson.co.uk/shashlik/shashlik_$surum.deb +shashlik.desktop +shashlik-gui.sh) + +derle() { + ar x ${SRC}/shashlik_$surum.deb + tar -xJC $PKG -f data.tar.xz + install -dm755 $PKG/usr/bin + ln -s /opt/shashlik/bin/shashlik-run $PKG/usr/bin/ + ln -s /opt/shashlik/bin/shashlik-install $PKG/usr/bin/ + cp -f /$SRC/shashlik.desktop /usr/share/applications/shashlik.desktop + cp -f /$SRC/shashlik-gui.sh /bin/ + +} diff --git a/talimatname/genel/s/shotcut/talimat b/talimatname/genel/s/shotcut/talimat new file mode 100644 index 000000000..f4189b67e --- /dev/null +++ b/talimatname/genel/s/shotcut/talimat @@ -0,0 +1,37 @@ +# Tanım: Video düzenleyici +# URL: https://www.shotcut.org/ +# Paketçi: Cihan_Alkan +# Gerekler: qt5 mlt movit ffmpeg x264 lame frei0r-plugins ladspa +# Grup: medya + +isim=shotcut +surum=18.05 +devir=1 + +kaynak=(https://github.com/mltframework/shotcut/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd $SRC/$isim-$surum + qmake-qt5 PREFIX='/usr' \ + QMAKE_CFLAGS_RELEASE="${CFLAGS}" \ + QMAKE_CXXFLAGS_RELEASE="${CXXFLAGS}" + make + + make INSTALL_ROOT="${PKG}" install +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Type=Application +Name=Shotcut +GenericName=Video Düzenleyici +Comment=Video düzenleyici +Exec=shotcut +Icon=applications-multimedia +Terminal=false +Categories=AudioVideo;Video;AudioVideoEditing; +EOF +cd /$SRC/ + +} diff --git a/talimatname/genel/s/shotwell/shotwell.kur-kos b/talimatname/genel/s/shotwell/shotwell.kur-kos new file mode 100644 index 000000000..0a5783124 --- /dev/null +++ b/talimatname/genel/s/shotwell/shotwell.kur-kos @@ -0,0 +1,4 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +update-desktop-database -q + diff --git a/talimatname/genel/s/shotwell/talimat b/talimatname/genel/s/shotwell/talimat new file mode 100644 index 000000000..a18a1db4e --- /dev/null +++ b/talimatname/genel/s/shotwell/talimat @@ -0,0 +1,19 @@ +# Tanım: GNOME masaüstü ortamı için tasarlanmış bir dijital fotoğraf düzenleyicisi. +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: dconf desktop-file-utils hicolor-icon-theme gnome-doc-utils json-glib libgphoto2 libgee libgexiv2 gtk3 libgudev libraw libsoup libxml2 librest gstreamer1-plugins-base webkit2gtk3 + +isim=shotwell +surum=0.23.7 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-schemas-compile \ + --disable-desktop-update \ + --disable-icon-update +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/siege/talimat b/talimatname/genel/s/siege/talimat new file mode 100644 index 000000000..60dd890f1 --- /dev/null +++ b/talimatname/genel/s/siege/talimat @@ -0,0 +1,19 @@ +# Tanım: http stres test performans ölçüm uygulaması +# URL: https://www.joedog.org/siege-home/ +# Paketçi: milisarge +# Gerekler: + +isim=siege +surum=4.0.4 +devir=1 +kaynak=(http://download.joedog.org/siege/siege-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/$isim-$surum" + ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man + make + install -d -m755 "$PKG/etc" + install -d -m755 "$PKG/usr/share" + make DESTDIR="$PKG" install + sed -i 's/^# file =$/file = \/etc\/urls.txt/' "$PKG/etc/siegerc" +} diff --git a/talimatname/genel/s/sielo-navigateur/talimat b/talimatname/genel/s/sielo-navigateur/talimat new file mode 100644 index 000000000..34696f975 --- /dev/null +++ b/talimatname/genel/s/sielo-navigateur/talimat @@ -0,0 +1,28 @@ +# Tanım: C++14 ve Qt5 ile yapılan hızlı bir web tarayıcısı +# URL: https://feldrise.com/Sielo +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: ağ + +isim=sielo-navigateur +surum=0.4.0 +devir=1 +kaynak=(http://feldrise.com/Sielo/Linux/$isim-v$surum.tar.gz) + +derle() { + cd $SRC/$isim-v$surum/build/release + qmake-qt5 -spec linux-g++ -o Makefile ../../SieloNavigateur.pro || return 1 + cd $SRC/$isim-v$surum + mkdir -p $PKG/usr/bin/ + mkdir -p $PKG/usr/share/applications/ + mkdir -p $PKG/usr/share/pixmaps/ + cp build/release/SieloDataSoftware/SieloDataSoftware $PKG/usr/bin/ + cp build/release/SNThemeEditor/SNThemeEditor $PKG/usr/bin/ + cp build/release/SieloNavigateur/SieloNavigateur $PKG/usr/bin/ + cp share/applications/Sielo.desktop $PKG/usr/share/applications/ + cp share/pixmaps/SNIcon.png $PKG/usr/share/pixmaps + chmod +x $PKG/usr/bin/SieloDataSoftware + chmod +x $PKG/usr/bin/SNThemeEditor + chmod +x $PKG/usr/bin/SieloNavigateur +} + diff --git a/talimatname/genel/s/signon-kwallet-extension/talimat b/talimatname/genel/s/signon-kwallet-extension/talimat new file mode 100644 index 000000000..f4273d859 --- /dev/null +++ b/talimatname/genel/s/signon-kwallet-extension/talimat @@ -0,0 +1,22 @@ +# Tanım: KWallet oturum açma uzantısı +# URL: http://kde.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules signond kf5-kwallet +# Grup: kde + +isim=signon-kwallet-extension +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DKDE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/signon-plugin-oauth2/talimat b/talimatname/genel/s/signon-plugin-oauth2/talimat new file mode 100644 index 000000000..392ad704c --- /dev/null +++ b/talimatname/genel/s/signon-plugin-oauth2/talimat @@ -0,0 +1,23 @@ +# Tanım: Oturum açma için OAuth 2 eklentisi +# URL: https://gitlab.com/accounts-sso/signon-plugin-oauth2 +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: signond qt5 + +isim=signon-plugin-oauth2 +surum=0.23 +devir=1 + +kaynak=(https://gitlab.com/accounts-sso/signon-plugin-oauth2/repository/archive.tar.gz) + +derle() { +cd signon-plugin-oauth2* +sed -i '/-Werror/d' common-project-config.pri + +# Do not install tests and example +echo 'INSTALLS =' >>tests/tests.pro +echo 'INSTALLS =' >>example/example.pro + +qmake-qt5 PREFIX=/usr LIBDIR=/usr/lib +make +make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/s/signon-ui/talimat b/talimatname/genel/s/signon-ui/talimat new file mode 100644 index 000000000..6a42074b9 --- /dev/null +++ b/talimatname/genel/s/signon-ui/talimat @@ -0,0 +1,20 @@ +# Tanım: Bir çevrimiçi hesabın oturum açma işlemi sırasında kullanıcı etkileşimlerini işleme tabi tutmaktan sorumlu UI bileşeni +# URL : https://launchpad.net/online-accounts-signon-ui +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 libaccounts-qt5 qt5-webkit signond libnotify + +isim=signon-ui +surum=0.17+15.10.20150810 +devir=1 + +kaynak=(http://archive.ubuntu.com/ubuntu/pool/main/s/$isim/${isim}_$surum.orig.tar.gz) + +derle() { +cd $isim-$surum +echo 'INSTALLS =' >>tests/unit/tst_inactivity_timer.pro +echo 'INSTALLS =' >>tests/unit/tst_signon_ui.pro + +qmake-qt5 PREFIX=/usr LIBDIR=/usr/lib +make +make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/s/signond/talimat b/talimatname/genel/s/signond/talimat new file mode 100644 index 000000000..a08f194e1 --- /dev/null +++ b/talimatname/genel/s/signond/talimat @@ -0,0 +1,20 @@ +# Tanım: İstemci adına kullanıcı kimlik doğrulamasını yapan bir D-Bus servisi +# URL : https://gitlab.com/accounts-sso/signond/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: qt5 libproxy doxygen dejavu-ttf freefont-ttf ttf-liberation noto-fonts + +isim=signond +surum=8.58 +devir=1 + +kaynak=(https://gitlab.com/accounts-sso/signond/repository/archive.tar.bz2) + +derle() { +cd $isim* + +sed -i 's/qdbusxml2cpp/qdbusxml2cpp-qt5/' src/signond/signond.pro + +qmake-qt5 CONFIG+=coverage PREFIX=/usr LIBDIR=/usr/lib +make +make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/s/simple-mtpfs/talimat b/talimatname/genel/s/simple-mtpfs/talimat new file mode 100644 index 000000000..8c00c32e5 --- /dev/null +++ b/talimatname/genel/s/simple-mtpfs/talimat @@ -0,0 +1,22 @@ +# Tanım: MTP cihazları için yazma/okuma yapabilen fuse dosya sistemi +# URL: https://github.com/phatina/simple-mtpfs/ +# Paketçi: milisarge +# Gerekler: libmtp fuse + +isim=simple-mtpfs +surum=0.3.0 +devir=1 + +kaynak=(https://github.com/phatina/simple-mtpfs/archive/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$isim-$surum + if [[ ! -e "./configure" ]]; then + ./autogen.sh + ./configure --prefix=/usr + else + ./config.status + fi + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/simple-scan/simple-scan.kur-kos b/talimatname/genel/s/simple-scan/simple-scan.kur-kos new file mode 100644 index 000000000..44076814b --- /dev/null +++ b/talimatname/genel/s/simple-scan/simple-scan.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas > /dev/null 2>&1 +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/s/simple-scan/talimat b/talimatname/genel/s/simple-scan/talimat new file mode 100644 index 000000000..adfaa4aab --- /dev/null +++ b/talimatname/genel/s/simple-scan/talimat @@ -0,0 +1,18 @@ +# Tanım: Basit tarama arayüzü programı +# URL: https://launchpad.net/simple-scan/ +# Paketçi: milisarge +# Gerekler: gtk3 colord itstool sane dconf intltool xorg-libxcursor xorg-libxdamage xorg-libxrandr xorg-libxinerama v4l-utils libgphoto2 + +isim=simple-scan +surum=3.12.2 +devir=1 + +kaynak=(https://launchpad.net/$isim/${surum%.*}/$surum/+download/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-schemas-compile + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/simplescreenrecorder/simplescreenrecorder.desktop b/talimatname/genel/s/simplescreenrecorder/simplescreenrecorder.desktop new file mode 100644 index 000000000..7892a0087 --- /dev/null +++ b/talimatname/genel/s/simplescreenrecorder/simplescreenrecorder.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=Basit Ekran Kaydedici +Comment=A feature-rich screen recorder that supports X11 and OpenGL +Comment[tr]=X11 ve OpenGL'i destekli zengin özelliklere sahip ekran kaydedici. +Icon=simplescreenrecorder +Exec=simplescreenrecorder --logfile +Terminal=false +Categories=AudioVideo;Video;Recorder;Qt; +Keywords=screen recorder;screencast;live streaming; diff --git a/talimatname/genel/s/simplescreenrecorder/simplescreenrecorder_tr.qm b/talimatname/genel/s/simplescreenrecorder/simplescreenrecorder_tr.qm new file mode 100644 index 0000000000000000000000000000000000000000..95a339350c9a5a0e591bdd91724acb99caaabda7 GIT binary patch literal 78294 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/s/simplescreenrecorder/talimat b/talimatname/genel/s/simplescreenrecorder/talimat new file mode 100644 index 000000000..94b6166a7 --- /dev/null +++ b/talimatname/genel/s/simplescreenrecorder/talimat @@ -0,0 +1,33 @@ +# Tanım: X11 ve OpenGL'i destekleyen, zengin özelliklere sahip bir ekran kaydedici. +# URL: http://www.maartenbaert.be/simplescreenrecorder/ +# Paketçi: Cihan Alkan +# Gerekler: qt4 ffmpeg jack xorg-glu xorg-libx11 xorg-libxi xorg-libxext xorg-libxfixes + +isim=simplescreenrecorder +surum=0.3.8 +devir=1 + +kaynak=(simplescreenrecorder_tr.qm + simplescreenrecorder.desktop) + + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/MaartenBaert/ssr.git $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + + + cd $isim + ./configure --prefix=/usr --disable-assert + make + rm $SRC/$isim/data/$isim.desktop + cp $SRC/$isim.desktop $SRC/$isim/data/ + make DESTDIR=$PKG install + mkdir -p /usr/share/$isim/translations + cp $SRC/simplescreenrecorder_tr.qm /usr/share/$isim/translations/ +} diff --git a/talimatname/genel/s/slack/slack.desktop b/talimatname/genel/s/slack/slack.desktop new file mode 100644 index 000000000..90fcfb09a --- /dev/null +++ b/talimatname/genel/s/slack/slack.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=Slack +Comment=Slack Desktop +Comment[tr]=Slack Masaüstü +GenericName=Slack Client for Linux +GenericName[tr]=Linux için Slack istemcisi +Exec=slack --disable-gpu %U +Icon=slack +Type=Application +StartupNotify=true +Categories=Network;InstantMessaging; +MimeType=x-scheme-handler/slack; diff --git a/talimatname/genel/s/slack/talimat b/talimatname/genel/s/slack/talimat new file mode 100644 index 000000000..1379a2cf0 --- /dev/null +++ b/talimatname/genel/s/slack/talimat @@ -0,0 +1,20 @@ +# Tanım: Linux için Slack masaüstü uygulaması +# URL: https://slack.com/apps +# Paketçi: yasarciv67@gmail.com +# Gerekler: gconf gtk2 expat hunspell libgcrypt nss xorg-libxtst libnotify xdg-utils xorg-libxscrnsaver alsa-lib libgnome-keyring + +isim=slack +surum=2.7.1 +devir=1 +kaynak=(https://slack-ssb-updates.global.ssl.fastly.net/linux_releases/slack-desktop-$surum-amd64.deb +$isim.desktop) + +derle() { + bsdtar -xf $isim-desktop-$surum-amd64.deb + bsdtar -xf data.tar.xz + mkdir -p $PKG/opt/$isim $PKG/usr/bin + cp -R usr/lib/$isim/* $PKG/opt/$isim + install -Dm644 $isim.desktop $PKG/usr/share/applications/$isim.desktop + install -Dm644 usr/share/pixmaps/$isim.png $PKG/usr/share/icons/hicolor/512x512/apps/$isim.png + ln -s /opt/$isim/$isim $PKG/usr/bin/$isim +} diff --git a/talimatname/genel/s/slang/talimat b/talimatname/genel/s/slang/talimat new file mode 100644 index 000000000..093cb58b3 --- /dev/null +++ b/talimatname/genel/s/slang/talimat @@ -0,0 +1,23 @@ +# Tanım: S-Lang güçlü bir yorumlanmış dil +# URL: http://gd.tuwien.ac.at/editors/davis/slang +# Paketçi: milisarge +# Gerekler: + +isim=slang +surum=2.2.4 +devir=2 + +kaynak=( ftp://space.mit.edu/pub/davis/$isim/v2.2/$isim-$surum.tar.bz2) + +derle() { + unset MAKEFLAGS + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install + chmod -v 755 $PKG/usr/lib/libslang.so.$surum \ + $PKG/usr/lib/slang/v2/modules/*.so +} diff --git a/talimatname/genel/s/slim/CMakeLists.txt.patch b/talimatname/genel/s/slim/CMakeLists.txt.patch new file mode 100644 index 000000000..9a29e6c2d --- /dev/null +++ b/talimatname/genel/s/slim/CMakeLists.txt.patch @@ -0,0 +1,14 @@ +--- CMakeLists.txt.orig 2014-08-08 07:24:01.864876514 -0700 ++++ CMakeLists.txt 2014-08-08 07:24:51.980873088 -0700 +@@ -221,7 +221,10 @@ + ####### install + # slim + install(TARGETS slim RUNTIME DESTINATION bin) +-install(TARGETS slimlock RUNTIME DESTINATION bin) ++## we have to comment this out or else ++## build will fail on slackware as pam ++## is required for slimlock ++#install(TARGETS slimlock RUNTIME DESTINATION bin) + + if (BUILD_SHARED_LIBS) + set_target_properties(libslim PROPERTIES diff --git a/talimatname/genel/s/slim/background.png b/talimatname/genel/s/slim/background.png new file mode 120000 index 000000000..3d906dffb --- /dev/null +++ b/talimatname/genel/s/slim/background.png @@ -0,0 +1 @@ +/sources/milis.git/ayarlar/milis-linux-arkaplan.png \ No newline at end of file diff --git a/talimatname/genel/s/slim/panel.png b/talimatname/genel/s/slim/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6724d92f2c6d0ac79cb192ad5e48cef7c953f4 GIT binary patch literal 1687 zcmeAS@N?(olHy`uVBq!ia0y~yV4MZSN*ruJkpuHZs(~EUOlRi+PiJR^f};Gi%$!sP z291fy2?<68C51()LJ0{c&T4CN6_p2dbo2xz*q=Xe?7$fYw$77BS^F3n?G(!5>f*GR zwGvView6XL7#YM|W1V@_LF$2*o`x3VrTT^&8me0@Br}#UPM8}T7sMcvK8HD_TP3ym zrnJMGMH3X#6@GI}I6Iv$F`jYbWQ8~C3T1*9gdM(#Pxw`0FuRjEhp$DKIcfTmu!c9O z1?Tiv=$!I7uMudlWy_Y30-uxqUZEW8bo4yW>V|zd<9$wF>x90Sj;AlV_ zj*80|uVgIrT(qB)DZs`dVm|Z1ho?2l*c96sPA+v#4Ny~_Y?x?wsK-)>hv%QSq(sC& zg(E&yk`iJs3=BT_yLPOUG&10LVQlbbHZ#Ma&Hn#Z{5P}&h8tUwx4R3&e-K=-cll(X z2xoyuWHAE+w=f7ZGR&GI0Tg5}@$_|Nf5^omX22um>XFUB!1CGC#WAGf*4taQ*&=}= z4G)Vq8+-C(z7gT(e%+w3<|>Rea!S=!q%WuyC>_d z@Z&f$wWFfw>&MSa&)e6zNj;mnbAQEI0kso*cZRnaINGg^F>5h4sV%fK`kd-=M{jA3 zq?O6c%EWgMFZaH!vrg?{kV$`kJ8aGU$T+Rid}ZV3-kP`D*Go!FnteWQO&1Tt;Zw`z z{@So-lhupOjfRz*H||WxVdzPE{rGz8LT6@%|ECVr&rMx+{~x1-t=3Wze-nl|S_>H+ zG8hD;K&XX{VIdhm&jKS^)l3g?K#v~+#K2Kfvd*($G z-!H#&m%Nv?NLE!^wMx7+_IQZq-1ygmGjFckyyO11jhlC;r!xy@mZe#(id!!osOi4? z=Fjl--!qk%eYVWKyZ6TVcl)wm)@00Dwy~Qred>iC|NZxG9cfUGUQxb zveOuNR@!D9FIcF#bdTLTHU^0=4MAR&)*Cd{?@pb$UFlJti;mk7)nb+h=CcJiiV61f h$pt{lBOv)e|1VRTdjH8qe*B+7f}XB^F6*2UngC!Q5uN}5 literal 0 HcmV?d00001 diff --git a/talimatname/genel/s/slim/slim-1.3.6_freetype-2.5.1.diff b/talimatname/genel/s/slim/slim-1.3.6_freetype-2.5.1.diff new file mode 100644 index 000000000..7f4f48a9f --- /dev/null +++ b/talimatname/genel/s/slim/slim-1.3.6_freetype-2.5.1.diff @@ -0,0 +1,22 @@ +From 98822d549689f09bd454b1cf462aae231931f64d Mon Sep 17 00:00:00 2001 +From: mancha +Date: Sat, 14 Feb 2015 +Subject: Fix compile with FreeType 2.5.1+ + +FREETYPE_INCLUDE_DIR_freetype2 & FREETYPE_INCLUDE_DIR_ft2build +might differ. Include both. + +--- + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -171,6 +171,7 @@ include_directories( + ${X11_Xrender_INCLUDE_PATH} + ${X11_Xrandr_INCLUDE_PATH} + ${FREETYPE_INCLUDE_DIR_freetype2} ++ ${FREETYPE_INCLUDE_DIR_ft2build} + ${X11_Xmu_INCLUDE_PATH} + ${ZLIB_INCLUDE_DIR} + ${JPEG_INCLUDE_DIR} diff --git a/talimatname/genel/s/slim/slim.conf b/talimatname/genel/s/slim/slim.conf new file mode 100644 index 000000000..862e81921 --- /dev/null +++ b/talimatname/genel/s/slim/slim.conf @@ -0,0 +1,95 @@ +# Path, X server and arguments (if needed) +# Note: -xauth $authfile is automatically appended +default_path /bin:/usr/bin:/usr/local/bin +default_xserver /usr/bin/X +#xserver_arguments -dpi 75 + +# Commands for halt, login, etc. +halt_cmd /sbin/shutdown -h now +reboot_cmd /sbin/shutdown -r now +console_cmd /usr/bin/xterm -C -fg white -bg black +sb -T "Console login" -e /bin/sh -c "/bin/cat /etc/issue; exec /bin/login" +#suspend_cmd /usr/sbin/suspend +suspend_cmd /usr/sbin/pm-suspend +# Full path to the xauth binary +xauth_path /usr/bin/xauth + +# Xauth file for server +authfile /var/run/slim.auth + + +# Activate numlock when slim starts. Valid values: on|off +numlock on + +# Hide the mouse cursor (note: does not work with some WMs). +# Valid values: true|false +# hidecursor false + +# This command is executed after a succesful login. +# you can place the %session and %theme variables +# to handle launching of specific commands in .xinitrc +# depending of chosen session and slim theme +# +# NOTE: if your system does not have bash you need +# to adjust the command according to your preferred shell, +# i.e. for freebsd use: +# login_cmd exec /bin/sh - ~/.xinitrc %session +login_cmd exec /usr/bin/ck-launch-session /bin/bash -login ~/.xinitrc %session + +# Commands executed when starting and exiting a session. +# They can be used for registering a X11 session with +# sessreg. You can use the %user variable +# +# sessionstart_cmd some command +# sessionstop_cmd some command + +# Start in daemon mode. Valid values: yes | no +# Note that this can be overriden by the command line +# options "-d" and "-nodaemon" +# daemon yes + +# Available sessions (first one is the default). +# The current chosen session name is replaced in the login_cmd +# above, so your login command can handle different sessions. +# see the xinitrc.sample file shipped with slim sources +sessiondir /usr/share/xsessions/ + +# Executed when pressing F11 (requires imagemagick) +screenshot_cmd import -window root /tmp/slim.png + +# welcome message. Available variables: %host, %domain +welcome_msg Hoşgeldiniz %host + +# Session message. Prepended to the session name when pressing F1 +# session_msg Session: +hints_msg "F1 masaüstü seçimi" + +# Prepended to the themes session name when pressing F1 +session_msg [F1] xsession: + +# shutdown / reboot messages +shutdown_msg sistem kapanıyor... +reboot_msg sistem yeniden başlatılıyor... + +# default user, leave blank or remove this line +# for avoid pre-loading the username. +#default_user simone + +# Focus the password field on start when default_user is set +# Set to "yes" to enable this feature +#focus_password no + +# Automatically login the default user (without entering +# the password. Set to "yes" to enable this feature +#auto_login no + + +# current theme, use comma separated list to specify a set to +# randomly choose from +current_theme milis + +# Lock file +lockfile /var/run/slim.lock + +# Log file +logfile /var/log/slim.log + diff --git a/talimatname/genel/s/slim/slim.kur-kos b/talimatname/genel/s/slim/slim.kur-kos new file mode 100644 index 000000000..415f85a5c --- /dev/null +++ b/talimatname/genel/s/slim/slim.kur-kos @@ -0,0 +1 @@ +sed -i "s/^id:[3-5]/id:5/" /etc/inittab diff --git a/talimatname/genel/s/slim/slim.logrotate b/talimatname/genel/s/slim/slim.logrotate new file mode 100644 index 000000000..3d237a2d1 --- /dev/null +++ b/talimatname/genel/s/slim/slim.logrotate @@ -0,0 +1,9 @@ +/var/log/slim.log { + compress + rotate 4 + size=1M + notifempty + missingok + copytruncate + noolddir +} diff --git a/talimatname/genel/s/slim/slim.theme b/talimatname/genel/s/slim/slim.theme new file mode 100644 index 000000000..d32727d49 --- /dev/null +++ b/talimatname/genel/s/slim/slim.theme @@ -0,0 +1,46 @@ + +background_style stretch +background_color #000000 + +input_panel_x 50% +input_panel_y 50% + +input_font DejaVu Sans Light:ExtraLight:size=10.5:dpi=96 +input_fgcolor #000000 +input_color #000000 + +username_font DejaVu Sans Light:ExtraLight:size=16:dpi=96 +username_color #000000 +username_x 50% +username_y 50% +password_x 50% +password_y 50% + +username_msg KULLANICI ADINIZ +password_msg ŞİFRENİZ + + +input_name_x 65 +input_name_y 200 +input_pass_x 65 +input_pass_y 200 + + +msg_color #000000 +msg_font fixed:size=13:dpi=75 +msg_x 50% +msg_y 40% +msg_shadow_xoffset 1 +msg_shadow_yoffset 1 + +session_msg Oturumlar: +session_font DejaVu Sans Light:ExtraLight:size=14:dpi=96 +session_x 50% +session_y 75% +session_color #000000 + +hints_msg [F1]=oturum seçimi - reboot=yeniden başlat - console=uçbirim +hints_x 50% +hints_y 90% +hints_font DejaVu Sans Light:ExtraLight:size=12:dpi=96 +hints_color #000000 diff --git a/talimatname/genel/s/slim/talimat b/talimatname/genel/s/slim/talimat new file mode 100644 index 000000000..9475715af --- /dev/null +++ b/talimatname/genel/s/slim/talimat @@ -0,0 +1,67 @@ +# Tanım: Grafiksel oturum açma yardımcı programı +# URL: http://sourceforge.net/projects/slim.berlios +# Paketçi: milisarge +# Gerekler: xorg-xauth libjpeg-turbo libpng cmake xorg-libxft + +isim=slim +surum=2.0 +devir=3 +kaynak=(http://kaynaklar.milislinux.org/slim-$surum.tar.gz + panel.png + https://raw.githubusercontent.com/yakar/milis-linux-wallpapers/master/milis-linux-tree.png + slim.conf + CMakeLists.txt.patch + slim-1.3.6_freetype-2.5.1.diff + slim.logrotate + slim.theme) + +derle() { +cd $isim-$surum + +patch -p0 < $SRC/CMakeLists.txt.patch +patch -p1 < $SRC/slim-1.3.6_freetype-2.5.1.diff + +# Fix location of man-pages +sed "s/share\/man/man/" -i CMakeLists.txt +sed -i "s/DESTINATION lib/DESTINATION lib64/" CMakeLists.txt + +mkdir -p build + + +cd build + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DUSE_CONSOLEKIT=no \ + -DCMAKE_BUILD_TYPE=Release .. + make + make install DESTDIR=$PKG +cd .. + +mv $SRC/slim.conf $PKG/etc/slim.conf + +mkdir -p $PKG/etc/logrotate.d +cat $SRC/slim.logrotate > $PKG/etc/logrotate.d/slim + +# Kill the incorrectly-placed (and useless anyway) systemd stuff +rm -rf $PKG/usr/usr +# Kill systemd stuff +rm -rf $PKG/lib + +find $PKG/usr/man -type f -exec gzip -9 {} \; +for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done + +# Remove slimlock as we don't build it +rm $PKG/usr/man/man1/slimlock.1.gz +rm $PKG/etc/init.d/slim.init +rm -rf $PKG/usr/share/slim/themes/xamplar +rm -rf $PKG/usr/man/ + +install -d $PKG/usr/share/slim/themes/milis +cp $SRC/panel.png $PKG/usr/share/slim/themes/milis/ +cp $SRC/milis-linux-tree.png $PKG/usr/share/slim/themes/milis/background.png +cp $SRC/slim.theme $PKG/usr/share/slim/themes/milis/ +chmod 0644 $PKG/usr/share/slim/themes/milis/* + +cd /sources/milis.git/ayarlar/servisler +make DESTDIR=$PKG kur-slim +} diff --git a/talimatname/genel/s/slop/talimat b/talimatname/genel/s/slop/talimat new file mode 100644 index 000000000..8d8247edc --- /dev/null +++ b/talimatname/genel/s/slop/talimat @@ -0,0 +1,16 @@ +# Tanım: Kullanıcının seçtiği bölgeyi stdout a veren uygulama +# URL: https://github.com/naelstrof/slop +# Paketçi: milisarge +# Gerekler: cmake xorg-libxext glm xorg-mesa + +isim=slop +surum=5.3.37 +devir=1 +kaynak=(https://github.com/naelstrof/$isim/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/slowloris/talimat b/talimatname/genel/s/slowloris/talimat new file mode 100644 index 000000000..190b40c6d --- /dev/null +++ b/talimatname/genel/s/slowloris/talimat @@ -0,0 +1,14 @@ +# Tanım: Web sunucu güvenliğini artırabilmek, bağlantı hizmet aksatma (DoS) saldırıları, http sunucusu güvenlik açıklarını test etmek için perl'de yazılmış bir araç. +# URL: http://ha.ckers.org/slowloris/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: perl-io-socket-ssl + +isim=slowloris +surum=0.7 +devir=1 +kaynak=(https://raw.githubusercontent.com/llaera/slowloris.pl/master/slowloris.pl) + +derle() { + cd "$SRC" + install -Dm755 "$SRC/slowloris.pl" "$PKG/usr/bin/slowloris" +} diff --git a/talimatname/genel/s/smartmontools/talimat b/talimatname/genel/s/smartmontools/talimat new file mode 100644 index 000000000..c306de764 --- /dev/null +++ b/talimatname/genel/s/smartmontools/talimat @@ -0,0 +1,23 @@ +# Tanım: S.M.A.R.T.'yi kontrol edin ve izleyin. Etkin ATA ve SCSI Sabit Diskler +# URL: http://smartmontools.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=smartmontools +surum=6.6 +devir=1 + +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim-$surum.tar.gz ) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --with-initscriptdir=/etc/rc.d/init.d \ + --localstatedir=/var \ + --with-savestates \ + --with-attributelog + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/smpeg/smpeg-0.4.4_m4.patch b/talimatname/genel/s/smpeg/smpeg-0.4.4_m4.patch new file mode 100644 index 000000000..adbfb90c6 --- /dev/null +++ b/talimatname/genel/s/smpeg/smpeg-0.4.4_m4.patch @@ -0,0 +1,12 @@ +diff -pruN smpeg-0.4.4.orig/smpeg.m4 smpeg-0.4.4/smpeg.m4 +--- smpeg-0.4.4.orig/smpeg.m4 2008-08-07 22:45:31.086141377 +1000 ++++ smpeg-0.4.4/smpeg.m4 2008-08-07 22:49:53.350144919 +1000 +@@ -10,7 +10,7 @@ dnl AM_PATH_SMPEG([MINIMUM-VERSION, [ACT + ACTION-IF-NOT-FOUND]]]) + dnl Test for SMPEG, and define SMPEG_CFLAGS and SMPEG_LIBS + dnl +-AC_DEFUN(AM_PATH_SMPEG, ++AC_DEFUN([AM_PATH_SMPEG], + [dnl + dnl Get the cflags and libraries from the smpeg-config script + dnl diff --git a/talimatname/genel/s/smpeg/smpeg-mpegaudiosdl.patch b/talimatname/genel/s/smpeg/smpeg-mpegaudiosdl.patch new file mode 100644 index 000000000..af76807f5 --- /dev/null +++ b/talimatname/genel/s/smpeg/smpeg-mpegaudiosdl.patch @@ -0,0 +1,14 @@ +--- smpeg-0.4.4/MPEGaudio.h.orig 2006-01-15 16:17:56.356444000 +0100 ++++ smpeg-0.4.4/MPEGaudio.h 2006-01-15 16:18:36.686965250 +0100 +@@ -148,6 +148,11 @@ + char buffer[2*WINDOWSIZE]; + }; + ++void Play_MPEGaudioSDL(void *udata, Uint8 *stream, int len); ++#ifdef THREADED_AUDIO ++int Decode_MPEGaudio(void *udata); ++#endif ++ + /* The actual MPEG audio class */ + class MPEGaudio : public MPEGerror, public MPEGaudioaction { + diff --git a/talimatname/genel/s/smpeg/talimat b/talimatname/genel/s/smpeg/talimat new file mode 100644 index 000000000..4a8fd77ee --- /dev/null +++ b/talimatname/genel/s/smpeg/talimat @@ -0,0 +1,25 @@ +# Tanım: SDL MPEG oynatıcı kitaplığı. +# URL: http://www.lokigames.com/development/smpeg.php3 +# Paketçi: milisarge +# Gerekler: sdl + +isim=smpeg +surum=0.4.5 +devir=2 +kaynak=(http://ftp.slackware.com/pub/vectorlinux/VL64-7.0/source/sourceVL/smpeg/0.4.5/src/smpeg-0.4.5.tar.gz + smpeg-mpegaudiosdl.patch + smpeg-0.4.4_m4.patch) + +derle() { + cd smpeg-$surum + ./configure \ + --prefix=/usr \ + --mandir=/usr/share/man \ + --disable-static \ + --enable-gtk-player=no +# sed -i -e 's|\(libsmpeg_la_LDFLAGS = .*\)|\1 -lstdc++|' Makefile + make + make install DESTDIR=$PKG +# rm $PKG/usr/man/man1/gtv.1 +} + diff --git a/talimatname/genel/s/smpeg2/talimat b/talimatname/genel/s/smpeg2/talimat new file mode 100644 index 000000000..4b21403ca --- /dev/null +++ b/talimatname/genel/s/smpeg2/talimat @@ -0,0 +1,19 @@ +# Tanım: SDL2 MPEG Player Library +# URL: http://icculus.org/smpeg/ +# Paketçi: milisarge +# Gerekler: sdl2 + +isim=smpeg2 +surum=2.0.0 +devir=1 +kaynak=(http://kaynaklar.milislinux.org//smpeg2.tar.gz) + +derle() { + cd $SRC/release_2_0_0 + ./autogen.sh + ./configure --prefix=/usr --mandir=/usr/share/man --disable-static + make + make DESTDIR=${PKG} install + rm ${PKG}/usr/bin/plaympeg + rm -r ${PKG}/usr/share/man +} diff --git a/talimatname/genel/s/smplayer/talimat b/talimatname/genel/s/smplayer/talimat new file mode 100644 index 000000000..c664c7b48 --- /dev/null +++ b/talimatname/genel/s/smplayer/talimat @@ -0,0 +1,24 @@ +# Tanım: SMPlayer kurulu kodekleriyle tüm ses ve video türlerini oynatabilen Linux için ücretsiz bir medya oynatıcısıdır. +# URL: http://smplayer.sf.net/ +# Paketçi: milisarge +# Gerekler: mplayer qt4 + +isim=smplayer +surum=16.4.0 +devir=1 +kaynak=(http://prdownloads.sf.net/$isim/$isim-$surum.tar.bz2) + +derle() { + tamir_qt4path + cd $isim-$surum + sed -i -e 's|kde-config|kde4-config|g' Makefile + + # Çoğu hata ayıklama mesajını kaldır + find src -type f -name '*.cpp' -print0 | xargs -0 sed -i -e 's|qDebug(.*);|{}|g' + + # Kdelibs'in yüklü olup olmadığını kontrol edin, çünkü otomatik olarak algılanmadı. + [ -x /usr/bin/kde4-config ] && kde=KDE_SUPPORT=1 + + make DESTDIR=$PKG PREFIX=/usr $kde install + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/s/snappy-player/0001-Set-windowing-backend-to-X11.patch b/talimatname/genel/s/snappy-player/0001-Set-windowing-backend-to-X11.patch new file mode 100644 index 000000000..9b15f85a8 --- /dev/null +++ b/talimatname/genel/s/snappy-player/0001-Set-windowing-backend-to-X11.patch @@ -0,0 +1,25 @@ +From 7ccb21a78cb85cf0d12232ec2c82ca194956dd44 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= +Date: Wed, 15 Apr 2015 15:46:14 +0200 +Subject: [PATCH] Set windowing backend to X11 + +This required to work with Clutter 1.22. +--- + src/snappy.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/snappy.c b/src/snappy.c +index 6054c88..c2bb2d0 100644 +--- a/src/snappy.c ++++ b/src/snappy.c +@@ -179,6 +179,7 @@ main (int argc, char *argv[]) + + context = g_option_context_new (" - Play movie files"); + ++ clutter_set_windowing_backend (CLUTTER_WINDOWING_X11); + ci_err = gtk_clutter_init (&argc, &argv); + if (ci_err != CLUTTER_INIT_SUCCESS) + goto quit; +-- +2.3.5 + diff --git a/talimatname/genel/s/snappy-player/clutter-gst3.patch b/talimatname/genel/s/snappy-player/clutter-gst3.patch new file mode 100644 index 000000000..8f6a56360 --- /dev/null +++ b/talimatname/genel/s/snappy-player/clutter-gst3.patch @@ -0,0 +1,164 @@ +From 872fc2ed3d0339559e4023523fa0935f168f631a Mon Sep 17 00:00:00 2001 +From: Luis de Bethencourt +Date: Tue, 28 Jul 2015 12:06:16 +0100 +Subject: clutter: upgrade to clutter-gst-3.0 + +--- + configure.ac | 4 ++-- + src/gst_engine.c | 2 +- + src/gst_engine.h | 5 +++-- + src/snappy.c | 7 ++----- + src/user_interface.h | 4 ++++ + 5 files changed, 12 insertions(+), 10 deletions(-) + +diff --git a/configure.ac b/configure.ac +index b2986c6..75ffb8d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -35,7 +35,7 @@ AC_CANONICAL_HOST + # keep one single GST_REQ, core/base should be same versions anyway + GST_REQ=1.0.0 + CLUTTER_REQS=1.12.0 +-CLUTTER_GST_REQS=2.0.0 ++CLUTTER_GST_REQS=2.99.2 + CLUTTER_GTK_REQS=1.0.2 + GTK_REQS=3.5.0 + GIO_REQ=2.32 +@@ -55,7 +55,7 @@ PKG_CHECK_MODULES([CLUTTER], + AC_SUBST(CLUTTER_CFLAGS) + AC_SUBST(CLUTTER_LIBS) + +-PKG_CHECK_MODULES([CLUTTER_GST], [clutter-gst-2.0 >= $CLUTTER_GST_REQS]) ++PKG_CHECK_MODULES([CLUTTER_GST], [clutter-gst-3.0 >= $CLUTTER_GST_REQS]) + AC_SUBST(CLUTTER_GST_CFLAGS) + AC_SUBST(CLUTTER_GST_LIBS) + +diff --git a/src/gst_engine.c b/src/gst_engine.c +index 8fc16d4..431d77c 100644 +--- a/src/gst_engine.c ++++ b/src/gst_engine.c +@@ -724,7 +724,7 @@ cycle_streams (GstEngine * engine, guint streamid) + + /* Init GstEngine variables */ + gboolean +-engine_init (GstEngine * engine, GstElement * sink) ++engine_init (GstEngine * engine, ClutterGstVideoSink * sink) + { + engine->playing = FALSE; + engine->direction_foward = TRUE; +diff --git a/src/gst_engine.h b/src/gst_engine.h +index 70dce63..1c044eb 100644 +--- a/src/gst_engine.h ++++ b/src/gst_engine.h +@@ -24,6 +24,7 @@ + #define __GST_ENGINE_H__ + + #include ++#include + + /* GStreamer Interfaces */ + #include +@@ -50,7 +51,7 @@ struct _GstEngine + gchar *uri; + + GstElement *player; +- GstElement *sink; ++ ClutterGstVideoSink *sink; + + GstBus *bus; + +@@ -64,7 +65,7 @@ gboolean bus_call (GstBus * bus, GstMessage * msg, gpointer data); + gboolean change_state (GstEngine * engine, gchar * state); + gboolean check_missing_plugins_error (GstEngine * engine, GstMessage * msg); + gboolean cycle_streams (GstEngine * engine, guint streamid); +-gboolean engine_init (GstEngine * engine, GstElement * sink); ++gboolean engine_init (GstEngine * engine, ClutterGstVideoSink * sink); + gboolean engine_change_offset (GstEngine * engine, gint64 av_offest); + gboolean engine_change_speed (GstEngine * engine, gdouble rate); + void engine_load_uri (GstEngine * engine, gchar * uri); +diff --git a/src/snappy.c b/src/snappy.c +index c2bb2d0..c06fd10 100644 +--- a/src/snappy.c ++++ b/src/snappy.c +@@ -29,9 +29,6 @@ + #include + #include + #include +-#include +-#include +-#include + + #include "user_interface.h" + +@@ -160,7 +157,7 @@ main (int argc, char *argv[]) + UserInterface *ui = NULL; + GstEngine *engine = NULL; + ClutterActor *video_texture; +- GstElement *sink; ++ ClutterGstVideoSink *sink; + + gboolean ok, blind = FALSE, fullscreen = FALSE, hide = FALSE, loop = FALSE; + gboolean secret = FALSE, tags = FALSE; +@@ -230,7 +227,7 @@ main (int argc, char *argv[]) + + /* Gstreamer engine */ + engine = g_new (GstEngine, 1); +- sink = gst_element_factory_make ("cluttersink", "video-sink"); ++ sink = clutter_gst_video_sink_new (); + if (sink == NULL) { + g_print ("ERROR: Failed to create clutter-gst sink element\n"); + return FALSE; +diff --git a/src/user_interface.h b/src/user_interface.h +index 6fe43c5..b011da0 100644 +--- a/src/user_interface.h ++++ b/src/user_interface.h +@@ -23,6 +23,10 @@ + #ifndef __USER_INTERFACE_H__ + #define __USER_INTERFACE_H__ + ++#include ++#include ++#include ++ + #include + + #include "gst_engine.h" +-- +cgit v0.11.2 + +From f33f7a5e9424544884a37b264bf88ee1866a56ac Mon Sep 17 00:00:00 2001 +From: Luis de Bethencourt +Date: Tue, 28 Jul 2015 14:02:44 +0100 +Subject: clutter: update method to create video texture + +--- + src/snappy.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/snappy.c b/src/snappy.c +index c06fd10..94b6e5b 100644 +--- a/src/snappy.c ++++ b/src/snappy.c +@@ -222,8 +222,6 @@ main (int argc, char *argv[]) + ui->tags = tags; + ui->data_dir = data_dir; + interface_init (ui); +- video_texture = g_object_new (CLUTTER_TYPE_TEXTURE, "disable-slicing", TRUE, +- NULL); + + /* Gstreamer engine */ + engine = g_new (GstEngine, 1); +@@ -232,7 +230,9 @@ main (int argc, char *argv[]) + g_print ("ERROR: Failed to create clutter-gst sink element\n"); + return FALSE; + } +- g_object_set (G_OBJECT (sink), "texture", video_texture, NULL); ++ video_texture = g_object_new (CLUTTER_TYPE_ACTOR, "content", ++ g_object_new (CLUTTER_GST_TYPE_CONTENT, "sink", sink, NULL), ++ "name", "texture", NULL); + + ok = engine_init (engine, sink); + if (!ok) +-- +cgit v0.11.2 + diff --git a/talimatname/genel/s/snappy-player/talimat b/talimatname/genel/s/snappy-player/talimat new file mode 100644 index 000000000..b1e1e58a9 --- /dev/null +++ b/talimatname/genel/s/snappy-player/talimat @@ -0,0 +1,27 @@ +# Tanım: Minimalist bir arayüzü olan güçlü medya oynatıcı +# URL: https://wiki.gnome.org/Apps/Snappy +# Paketçi: Cihan_Alkan +# Gerekler: gstreamer-plugins-base clutter-gst clutter-gtk +# Grup: medya + +isim=snappy-player +surum=1.0 +devir=1 + +kaynak=(https://download.gnome.org/sources/snappy/$surum/snappy-$surum.tar.xz + 0001-Set-windowing-backend-to-X11.patch + clutter-gst3.patch) + +derle() { + cd snappy-$surum + # Fix compatibility with Clutter 1.22 + patch -Np1 -i ../0001-Set-windowing-backend-to-X11.patch + + # Port to clutter-gst 3.0 + patch -Np1 -i ../clutter-gst3.patch + autoreconf -fi + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/s/snappy/talimat b/talimatname/genel/s/snappy/talimat new file mode 100644 index 000000000..bdee18735 --- /dev/null +++ b/talimatname/genel/s/snappy/talimat @@ -0,0 +1,18 @@ +# Tanım: Snappy bir sıkıştırma / açma kütüphanesi. +# URL: http://code.google.com/p/snappy/ +# Paketçi: milisarge +# Gerekler: + +isim=snappy +surum=1.1.1 +devir=1 + +kaynak=(http://snappy.googlecode.com/files/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +CXXFLAGS+=\ -DNDEBUG +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sndio/talimat b/talimatname/genel/s/sndio/talimat new file mode 100644 index 000000000..244b8cc6c --- /dev/null +++ b/talimatname/genel/s/sndio/talimat @@ -0,0 +1,16 @@ +# Tanım: Small audio and MIDI framework part of the OpenBSD project. +# URL: http://www.sndio.org/ +# Paketçi: milisarge +# Gerekler: alsa-lib + +isim=sndio +surum=1.2.0 +devir=1 +kaynak=(http://www.sndio.org/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sni-qt/sni-qt.conf b/talimatname/genel/s/sni-qt/sni-qt.conf new file mode 100644 index 000000000..421dcad0e --- /dev/null +++ b/talimatname/genel/s/sni-qt/sni-qt.conf @@ -0,0 +1,6 @@ +[need-activate-action] +clementine=1 +mumble=1 +skype=1 +speedcrunch=1 +keepassx=1 diff --git a/talimatname/genel/s/sni-qt/talimat b/talimatname/genel/s/sni-qt/talimat new file mode 100644 index 000000000..90558d477 --- /dev/null +++ b/talimatname/genel/s/sni-qt/talimat @@ -0,0 +1,26 @@ +# Tanım: QT4 eklentisi, tüm QSystemTrayIcon'u StatusNotifierItems'e dönüştürür (appindicators) +# URL: https://launchpad.net/sni-qt +# Paketçi: milisarge +# Gerekler: cmake libdbusmenu-qt + +isim=sni-qt +surum=0.2.6 +devir=1 + +kaynak=(http://launchpad.net/sni-qt/trunk/$surum/+download/sni-qt-$surum.tar.bz2 + sni-qt.conf) + +derle() { +mkdir build + +sed -i '/tests/ d' sni-qt-$surum/CMakeLists.txt + +cd build +cmake ../sni-qt-$surum \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release +make +make DESTDIR=$PKG install + +install -Dm644 $SRC/sni-qt.conf $PKG/etc/sni-qt.conf +} diff --git a/talimatname/genel/s/snownews/talimat b/talimatname/genel/s/snownews/talimat new file mode 100644 index 000000000..14591b408 --- /dev/null +++ b/talimatname/genel/s/snownews/talimat @@ -0,0 +1,18 @@ +# Tanım: Linux ve Unix için metin modu RSS haber okuyucu. +# URL: http://kiza.kcore.de/software/snownews/ +# Paketçi: milisarge +# Gerekler: libxml2 gettext perl + +isim=snownews +surum=1.5.12 +devir=1 +kaynak=(http://kiza.kcore.de/software/$isim/download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --disable-nls + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/socat/libressl.patch b/talimatname/genel/s/socat/libressl.patch new file mode 100644 index 000000000..cf6603358 --- /dev/null +++ b/talimatname/genel/s/socat/libressl.patch @@ -0,0 +1,173 @@ +Patch from OpenBSD +--- a/sslcls.c Sat Jan 24 03:15:22 2015 ++++ b/sslcls.c Sat Jul 18 20:01:59 2015 +@@ -55,6 +55,7 @@ const SSL_METHOD *sycSSLv2_server_method(void) { + } + #endif + ++#ifdef HAVE_SSLv3_client_method + const SSL_METHOD *sycSSLv3_client_method(void) { + const SSL_METHOD *result; + Debug("SSLv3_client_method()"); +@@ -62,7 +63,9 @@ const SSL_METHOD *sycSSLv3_client_method(void) { + Debug1("SSLv3_client_method() -> %p", result); + return result; + } ++#endif + ++#ifdef HAVE_SSLv3_server_method + const SSL_METHOD *sycSSLv3_server_method(void) { + const SSL_METHOD *result; + Debug("SSLv3_server_method()"); +@@ -70,6 +73,7 @@ const SSL_METHOD *sycSSLv3_server_method(void) { + Debug1("SSLv3_server_method() -> %p", result); + return result; + } ++#endif + + const SSL_METHOD *sycSSLv23_client_method(void) { + const SSL_METHOD *result; +@@ -331,14 +335,6 @@ void sycSSL_free(SSL *ssl) { + return; + } + +-int sycRAND_egd(const char *path) { +- int result; +- Debug1("RAND_egd(\"%s\")", path); +- result = RAND_egd(path); +- Debug1("RAND_egd() -> %d", result); +- return result; +-} +- + DH *sycPEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u) { + DH *result; + Debug4("PEM_read_bio_DHparams(%p, %p, %p, %p)", +@@ -375,7 +371,7 @@ int sycFIPS_mode_set(int onoff) { + } + #endif /* WITH_FIPS */ + +-#if OPENSSL_VERSION_NUMBER >= 0x00908000L ++#if (OPENSSL_VERSION_NUMBER >= 0x00908000L) && !defined(OPENSSL_NO_COMP) + const COMP_METHOD *sycSSL_get_current_compression(SSL *ssl) { + const COMP_METHOD *result; + Debug1("SSL_get_current_compression(%p)", ssl); +--- a/sslcls.h Sat Jan 24 11:15:22 2015 ++++ b/sslcls.h Mon Apr 13 15:06:25 2015 +@@ -47,7 +47,6 @@ X509 *sycSSL_get_peer_certificate(SSL *ssl); + int sycSSL_shutdown(SSL *ssl); + void sycSSL_CTX_free(SSL_CTX *ctx); + void sycSSL_free(SSL *ssl); +-int sycRAND_egd(const char *path); + + DH *sycPEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u); + +@@ -55,7 +54,7 @@ BIO *sycBIO_new_file(const char *filename, const char + + int sycFIPS_mode_set(int onoff); + +-#if OPENSSL_VERSION_NUMBER >= 0x00908000L ++#if (OPENSSL_VERSION_NUMBER >= 0x00908000L) && !defined(OPENSSL_NO_COMP) + const COMP_METHOD *sycSSL_get_current_compression(SSL *ssl); + const COMP_METHOD *sycSSL_get_current_expansion(SSL *ssl); + const char *sycSSL_COMP_get_name(const COMP_METHOD *comp); +@@ -98,7 +97,6 @@ const char *sycSSL_COMP_get_name(const COMP_METHOD *co + #define sycSSL_shutdown(s) SSL_shutdown(s) + #define sycSSL_CTX_free(c) SSL_CTX_free(c) + #define sycSSL_free(s) SSL_free(s) +-#define sycRAND_egd(p) RAND_egd(p) + + #define sycPEM_read_bio_DHparams(b,x,p,u) PEM_read_bio_DHparams(b,x,p,u) + +--- a/xio-openssl.c Sat Jan 24 15:33:42 2015 ++++ b/xio-openssl.c Mon Apr 13 14:59:12 2015 +@@ -108,7 +108,6 @@ const struct optdesc opt_openssl_key = { "open + const struct optdesc opt_openssl_dhparam = { "openssl-dhparam", "dh", OPT_OPENSSL_DHPARAM, GROUP_OPENSSL, PH_SPEC, TYPE_FILENAME, OFUNC_SPEC }; + const struct optdesc opt_openssl_cafile = { "openssl-cafile", "cafile", OPT_OPENSSL_CAFILE, GROUP_OPENSSL, PH_SPEC, TYPE_FILENAME, OFUNC_SPEC }; + const struct optdesc opt_openssl_capath = { "openssl-capath", "capath", OPT_OPENSSL_CAPATH, GROUP_OPENSSL, PH_SPEC, TYPE_FILENAME, OFUNC_SPEC }; +-const struct optdesc opt_openssl_egd = { "openssl-egd", "egd", OPT_OPENSSL_EGD, GROUP_OPENSSL, PH_SPEC, TYPE_FILENAME, OFUNC_SPEC }; + const struct optdesc opt_openssl_pseudo = { "openssl-pseudo", "pseudo", OPT_OPENSSL_PSEUDO, GROUP_OPENSSL, PH_SPEC, TYPE_BOOL, OFUNC_SPEC }; + #if OPENSSL_VERSION_NUMBER >= 0x00908000L + const struct optdesc opt_openssl_compress = { "openssl-compress", "compress", OPT_OPENSSL_COMPRESS, GROUP_OPENSSL, PH_SPEC, TYPE_STRING, OFUNC_SPEC }; +@@ -147,7 +146,7 @@ int xio_reset_fips_mode(void) { + static void openssl_conn_loginfo(SSL *ssl) { + Notice1("SSL connection using %s", SSL_get_cipher(ssl)); + +-#if OPENSSL_VERSION_NUMBER >= 0x00908000L ++#if (OPENSSL_VERSION_NUMBER >= 0x00908000L) && !defined(OPENSSL_NO_COMP) + { + const COMP_METHOD *comp, *expansion; + +@@ -722,7 +721,6 @@ int + char *opt_dhparam = NULL; /* file name of DH params */ + char *opt_cafile = NULL; /* certificate authority file */ + char *opt_capath = NULL; /* certificate authority directory */ +- char *opt_egd = NULL; /* entropy gathering daemon socket path */ + #if OPENSSL_VERSION_NUMBER >= 0x00908000L + char *opt_compress = NULL; /* compression method */ + #endif +@@ -741,7 +739,6 @@ int + retropt_string(opts, OPT_OPENSSL_CAPATH, &opt_capath); + retropt_string(opts, OPT_OPENSSL_KEY, &opt_key); + retropt_string(opts, OPT_OPENSSL_DHPARAM, &opt_dhparam); +- retropt_string(opts, OPT_OPENSSL_EGD, &opt_egd); + retropt_bool(opts,OPT_OPENSSL_PSEUDO, &opt_pseudo); + #if OPENSSL_VERSION_NUMBER >= 0x00908000L + retropt_string(opts, OPT_OPENSSL_COMPRESS, &opt_compress); +@@ -877,10 +874,6 @@ int + } + } + +- if (opt_egd) { +- sycRAND_egd(opt_egd); +- } +- + if (opt_pseudo) { + long int randdata; + /* initialize libc random from actual microseconds */ +@@ -1098,7 +1091,7 @@ static int openssl_SSL_ERROR_SSL(int level, const char + if (e == ((ERR_LIB_RAND<<24)| + (RAND_F_SSLEAY_RAND_BYTES<<12)| + (RAND_R_PRNG_NOT_SEEDED)) /*0x24064064*/) { +- Error("too few entropy; use options \"egd\" or \"pseudo\""); ++ Error("too few entropy; use option \"pseudo\""); + stat = STAT_NORETRY; + } else { + Msg2(level, "%s(): %s", funcname, ERR_error_string(e, buf)); +--- a/xio-openssl.h Sun Jun 23 07:16:48 2013 ++++ b/xio-openssl.h Sat Apr 19 15:58:21 2014 +@@ -21,7 +21,6 @@ extern const struct optdesc opt_openssl_key; + extern const struct optdesc opt_openssl_dhparam; + extern const struct optdesc opt_openssl_cafile; + extern const struct optdesc opt_openssl_capath; +-extern const struct optdesc opt_openssl_egd; + extern const struct optdesc opt_openssl_pseudo; + #if OPENSSL_VERSION_NUMBER >= 0x00908000L + extern const struct optdesc opt_openssl_compress; +--- a/xioopts.c Sat Jan 24 11:15:22 2015 ++++ b/xioopts.c Mon Apr 13 15:06:25 2015 +@@ -412,7 +412,6 @@ const struct optname optionnames[] = { + #ifdef ECHOPRT + IF_TERMIOS("echoprt", &opt_echoprt) + #endif +- IF_OPENSSL("egd", &opt_openssl_egd) + IF_ANY ("end-close", &opt_end_close) + IF_TERMIOS("eof", &opt_veof) + IF_TERMIOS("eol", &opt_veol) +@@ -1102,7 +1101,6 @@ const struct optname optionnames[] = { + IF_OPENSSL("openssl-compress", &opt_openssl_compress) + #endif + IF_OPENSSL("openssl-dhparam", &opt_openssl_dhparam) +- IF_OPENSSL("openssl-egd", &opt_openssl_egd) + #if WITH_FIPS + IF_OPENSSL("openssl-fips", &opt_openssl_fips) + #endif +--- a/xioopts.h Sat Jan 24 11:15:22 2015 ++++ b/xioopts.h Mon Apr 13 15:06:25 2015 +@@ -478,7 +478,6 @@ enum e_optcode { + OPT_OPENSSL_COMPRESS, + #endif + OPT_OPENSSL_DHPARAM, +- OPT_OPENSSL_EGD, + OPT_OPENSSL_FIPS, + OPT_OPENSSL_KEY, + OPT_OPENSSL_METHOD, diff --git a/talimatname/genel/s/socat/talimat b/talimatname/genel/s/socat/talimat new file mode 100644 index 000000000..b438e7ca8 --- /dev/null +++ b/talimatname/genel/s/socat/talimat @@ -0,0 +1,18 @@ +# Tanım: SOcket CAT - netcat benzeri ek özellikli araç +# URL: http://www.dest-unreach.org/socat +# Paketçi: milisarge +# Gerekler: + +isim=socat +surum=1.7.3.1 +devir=1 +kaynak=(http://www.dest-unreach.org/$isim/download/$isim-$surum.tar.bz2 + libressl.patch) + +derle() { + cd $isim-$surum + patch -p1 < $SRC/libressl.patch + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sound-theme-freedesktop/talimat b/talimatname/genel/s/sound-theme-freedesktop/talimat new file mode 100644 index 000000000..ad3850925 --- /dev/null +++ b/talimatname/genel/s/sound-theme-freedesktop/talimat @@ -0,0 +1,17 @@ +# Tanım: Bu paket masaüstü için ses temaları içeriyor. +# URL: http://freedesktop.org/wiki/Specifications/sound-theme-spec +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool + +isim=sound-theme-freedesktop +surum=0.8 +devir=1 + +kaynak=(http://people.freedesktop.org/~mccann/dist/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/soundtouch/talimat b/talimatname/genel/s/soundtouch/talimat new file mode 100644 index 000000000..a1e1e02c8 --- /dev/null +++ b/talimatname/genel/s/soundtouch/talimat @@ -0,0 +1,17 @@ +# Tanım: Ses tempo, basamak ve oynatma oranını değiştirmeye izin veren ses işleme kitaplığı. +# Url: http://www.surina.net/soundtouch/ +# Paketçi: milisarge +# Gerekler: + +isim=soundtouch +surum=1.9.2 +devir=1 +kaynak=(http://www.surina.net/soundtouch/$isim-$surum.tar.gz) +derle() { +cd $isim +./bootstrap +./configure --prefix=/usr \ +--docdir=/usr/share/doc/$isim-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sox/sox-dynamic.patch b/talimatname/genel/s/sox/sox-dynamic.patch new file mode 100644 index 000000000..94ac6a282 --- /dev/null +++ b/talimatname/genel/s/sox/sox-dynamic.patch @@ -0,0 +1,12 @@ +diff -Naur sox-14.4.2-orig/src/Makefile.am sox-14.4.2/src/Makefile.am +--- sox-14.4.2-orig/src/Makefile.am 2015-04-08 17:11:09.555343005 -0400 ++++ sox-14.4.2/src/Makefile.am 2015-04-08 17:11:25.115317153 -0400 +@@ -95,7 +95,7 @@ + + libsox_la_CFLAGS = @WARN_CFLAGS@ + libsox_la_LDFLAGS = @APP_LDFLAGS@ -version-info @SHLIB_VERSION@ \ +- -export-symbols-regex '^(sox_.*|lsx_(check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|fail_errno|filelength|find_(enum_(text|value)|file_extension)|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|realloc|rewind|seeki|sigfigs3p?|strcasecmp|tell|unreadb|write(b|_b_buf|buf|s)))$$' ++ -export-symbols-regex '^(sox_.*|lsx_(error|flush|check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|fail_errno|filelength|find_(enum_(text|value)|file_extension)|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|realloc|rewind|seeki|sigfigs3p?|strcasecmp|tell|unreadb|write(b|_b_buf|buf|s)))$$' + + if HAVE_WIN32_LTDL + libsox_la_SOURCES += win32-ltdl.c win32-ltdl.h diff --git a/talimatname/genel/s/sox/talimat b/talimatname/genel/s/sox/talimat new file mode 100644 index 000000000..f244f9519 --- /dev/null +++ b/talimatname/genel/s/sox/talimat @@ -0,0 +1,27 @@ +# Tanım: Çok panelli sekmeli dosya yöneticisi +# URL: http://sox.sourceforge.net/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: file libsndfile libpng lame opencore-amr gsm libao libmad libid3tag wavpack pulseaudio opusfile time + +isim=sox +surum=14.4.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2 + sox-dynamic.patch) + +derle() { + cd $isim-$surum + sed -i 's|man1/sox.1 soxeffect.7|man1/sox.1.gz soxeffect.7.gz|' Makefile.in + + patch -p1 -i $SRC/sox-dynamic.patch + + aclocal + automake + + ./configure --prefix=/usr --sysconfdir=/etc \ + --with-dyn-default --with-distro="NuTyX" + make + make bindir=. installcheck + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/soxr/talimat b/talimatname/genel/s/soxr/talimat new file mode 100644 index 000000000..210a70036 --- /dev/null +++ b/talimatname/genel/s/soxr/talimat @@ -0,0 +1,31 @@ +# Tanım: The SoX Resampler library that aims to give fast and high quality results for any constant resampling ratio +# URL: http://sourceforge.net/p/soxr/wiki/Home/ +# Paketçi: milisarge +# Gerekler: cmake + +isim=soxr +surum=0.1.2 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/soxr/soxr-$surum-Source.tar.xz) + +derle() { + cd soxr-$surum-Source + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DVISIBILITY_HIDDENL=ON \ + -DWITH_AVFFT=ON \ + -DWITH_DOUBLE_PRECISION=ON \ + -DWITH_LSR_BINDINGS=ON \ + -DWITH_OPENMP=ON \ + -DWITH_PFFFT=ON \ + -DWITH_SIMD=ON \ + . + make + make DESTDIR="$PKG" install + install -Dm644 LICENCE "$PKG"/usr/share/licenses/$isim/LICENSE + rm -r "$PKG"/usr/share/doc/ +} diff --git a/talimatname/genel/s/spacefm/spacefm.kur-kos b/talimatname/genel/s/spacefm/spacefm.kur-kos new file mode 100644 index 000000000..9bc54ecba --- /dev/null +++ b/talimatname/genel/s/spacefm/spacefm.kur-kos @@ -0,0 +1,2 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +gtk-update-icon-cache -q -t -f /usr/share/icons/Faenza diff --git a/talimatname/genel/s/spacefm/talimat b/talimatname/genel/s/spacefm/talimat new file mode 100644 index 000000000..558ab9901 --- /dev/null +++ b/talimatname/genel/s/spacefm/talimat @@ -0,0 +1,18 @@ +# Tanım: Çok panelli sekmeli dosya yöneticisi +# URL: http://ignorantguru.github.com/spacefm/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk2 eudev shared-mime-info desktop-file-utils xorg-libxdamage ffmpegthumbnailer + +isim=spacefm +surum=1.0.6 +devir=1 +kaynak=(https://github.com/IgnorantGuru/$isim/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-pixmaps \ + --with-gtk3 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/spacenavd/talimat b/talimatname/genel/s/spacenavd/talimat new file mode 100644 index 000000000..1e701aadc --- /dev/null +++ b/talimatname/genel/s/spacenavd/talimat @@ -0,0 +1,18 @@ +# Tanım: 3D giriş cihazları için tescilli 3Dconnexion cihaz sürücüsü ve SDK'nın alternatifi +# URL: http://spacenav.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: xorg + +isim=spacenavd +surum=0.6 +devir=1 + +kaynak=(https://freefr.dl.sourceforge.net/project/spacenav/spacenav%20daemon/spacenavd%20$surum/$isim-$surum.tar.gz) + +derle() { + cd ${isim}-${surum} + ./configure --prefix=/usr \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/spamassassin/spamassassin-net-dns-01.patch b/talimatname/genel/s/spamassassin/spamassassin-net-dns-01.patch new file mode 100644 index 000000000..42f323ff6 --- /dev/null +++ b/talimatname/genel/s/spamassassin/spamassassin-net-dns-01.patch @@ -0,0 +1,13 @@ +--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/DnsResolver.pm 2015/07/20 18:23:18 1691991 ++++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/DnsResolver.pm 2015/07/20 18:24:48 1691992 +@@ -592,6 +592,9 @@ + }; + + if ($packet) { ++ # RD flag needs to be set explicitly since Net::DNS 1.01, Bug 7223 ++ $packet->header->rd(1); ++ + # my $udp_payload_size = $self->{res}->udppacketsize; + my $udp_payload_size = $self->{conf}->{dns_options}->{edns}; + if ($udp_payload_size && $udp_payload_size > 512) { + diff --git a/talimatname/genel/s/spamassassin/spamassassin.service b/talimatname/genel/s/spamassassin/spamassassin.service new file mode 100644 index 000000000..e9e27ffe7 --- /dev/null +++ b/talimatname/genel/s/spamassassin/spamassassin.service @@ -0,0 +1,15 @@ +[Unit] +Tanım:Spamassassin daemon +After=syslog.target network.target + +[Service] +Type=forking +PIDFile=/var/run/spamd.pid +ExecStart=/usr/bin/vendor_perl/spamd -d --pidfile /var/run/spamd.pid -c -c -x --virtual-config-dir=/var/lib/spamassassin -u spamd -g spamd +StandardOutput=syslog +StandardError=syslog +Restart=always + +[Install] +WantedBy=multi-user.target + diff --git a/talimatname/genel/s/spamassassin/talimat b/talimatname/genel/s/spamassassin/talimat new file mode 100644 index 000000000..d556690de --- /dev/null +++ b/talimatname/genel/s/spamassassin/talimat @@ -0,0 +1,35 @@ +# Tanım: Spam belirlemek için bir posta filtresi +# URL: http://search.cpan.org/ +# Paketçi: milisarge +# Gerekler: openssl zlib re2c perl-net-dns perl-io-socket-ssl perl-libwww perl-mail-spf perl-http-message perl-net-http perl-io-socket-inet6 perl-mail-dkim perl-crypt-ssleay razor perl-dbi + +isim=spamassassin +surum=3.4.1 +devir=1 + +kaynak=("http://www.us.apache.org/dist/spamassassin/source/Mail-SpamAssassin-$surum.tar.gz"{,.asc} + spamassassin.service + spamassassin-net-dns-01.patch) + +derle() { +cd Mail-SpamAssassin-$surum + +sed -i t/sa_compile.t \ +-e 's#^my $temp_binpath = $Config{sitebinexp};#my $temp_binpath = "/bin/site_perl/";#' + +patch -p3 -i $SRC/spamassassin-net-dns-01.patch + +PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor \ + CONTACT_ADDRESS=root@localhost ENABLE_SSL=yes PERL_TAINT=no + +make +make DESTDIR=$PKG install + +install -D -m644 $SRC/spamassassin.service $PKG/usr/lib/systemd/system/spamassassin.service +install -d -o 182 -g 182 -m 755 $PKG/var/lib/spamassassin + +find $PKG \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +} diff --git a/talimatname/genel/s/sparsehash/talimat b/talimatname/genel/s/sparsehash/talimat new file mode 100644 index 000000000..8fe03053b --- /dev/null +++ b/talimatname/genel/s/sparsehash/talimat @@ -0,0 +1,18 @@ +# Tanım: Alan ve hızın optimize edilmesi de dahil olmak üzere çeşitli karma harita uygulamaları içerir. +# URL: http://code.google.com/p/sparsehash +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=sparsehash +surum=2.0.3 +devir=1 + +kaynak=(https://github.com/sparsehash/sparsehash/archive/sparsehash-$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/spectacle/talimat b/talimatname/genel/s/spectacle/talimat new file mode 100644 index 000000000..ea9a8f6a8 --- /dev/null +++ b/talimatname/genel/s/spectacle/talimat @@ -0,0 +1,23 @@ +# Tanım: Spectacle, masaüstü ekran görüntülerini yakalamak için basit bir uygulamadır +# URL : https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kcoreaddons kf5-kwidgetsaddons kf5-kdbusaddons kf5-knotifications kf5-kconfig kf5-ki18n kf5-kio kf5-kxmlgui kf5-kwindowsystem xcb-proto xcb-util-cursor xcb-util-renderutil plasma-libkscreen libkipi kf5-kdeclarative +# Grup: kde + +isim=spectacle +surum=17.12.1 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz ) + +derle() { +cd $SRC/$isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/speedcrunch/talimat b/talimatname/genel/s/speedcrunch/talimat new file mode 100644 index 000000000..60bdb040b --- /dev/null +++ b/talimatname/genel/s/speedcrunch/talimat @@ -0,0 +1,18 @@ +# Tanım: calculator based on QT +# URL: http://speedcrunch.org/ +# Paketçi: milisarge +# Gerekler: qt5 + +isim=speedcrunch +surum=0.12.0 +devir=1 + +kaynak=(https://bitbucket.org/heldercorreia/speedcrunch/get/release-$surum.tar.bz2) +derle() +{ + cd */src + cmake . -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/s/speex/talimat b/talimatname/genel/s/speex/talimat new file mode 100644 index 000000000..311ffde0d --- /dev/null +++ b/talimatname/genel/s/speex/talimat @@ -0,0 +1,20 @@ +# Tanım: Ücretsiz konuşma için ücretsiz bir codec bileşeni +# URL: http://www.speex.org/ +# Paketçi: milisarge +# Gerekler: libogg speexdsp + +isim=speex +surum=1.2.0 +devir=1 + +kaynak=(http://downloads.us.xiph.org/releases/$isim/$isim-$surum.tar.gz) + + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-static \ + --enable-binaries # Must be given or configure won't use pkg-config correctly + make + make -k check + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/speexdsp/talimat b/talimatname/genel/s/speexdsp/talimat new file mode 100644 index 000000000..b43d9373e --- /dev/null +++ b/talimatname/genel/s/speexdsp/talimat @@ -0,0 +1,18 @@ +# Tanım: DSP library derived from Speex +# URL: http://downloads.us.xiph.org +# Paketçi: milisarge +# Gerekler: + +isim=speexdsp +surum=1.2rc3 +devir=1 +kaynak=(http://downloads.us.xiph.org/releases/speex/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-static + make + make DESTDIR="$PKG" install + install -Dm644 COPYING "$PKG/usr/share/licenses/$pkgname/LICENSE" +} + diff --git a/talimatname/genel/s/splix/splix-deviceID.patch b/talimatname/genel/s/splix/splix-deviceID.patch new file mode 100644 index 000000000..74822473d --- /dev/null +++ b/talimatname/genel/s/splix/splix-deviceID.patch @@ -0,0 +1,105 @@ +diff -up splix/ppd/samsung.drv.in.deviceID splix/ppd/samsung.drv.in +--- splix/ppd/samsung.drv.in.deviceID 2013-08-26 21:45:31.000000000 +0200 ++++ splix/ppd/samsung.drv.in 2013-09-02 13:56:57.002669362 +0200 +@@ -39,6 +39,7 @@ Manufacturer "Samsung" + Resolution k 1 0 0 0 "300dpi/300 DPI" + + ModelName "SCX-4200" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:SCX-4200 Series;CMD:GDI;" + PCFileName "scx4200.ppd" + } { + Resolution k 1 0 0 0 "300dpi/300 DPI" +@@ -83,6 +84,7 @@ Manufacturer "Samsung" + PCFileName "ml1520.ppd" + } { + ModelName "ML-1610" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-1610;CMD:GDI;" + PCFileName "ml1610.ppd" + } { + ModelName "ML-1710" +@@ -121,6 +123,7 @@ Manufacturer "Samsung" + Throughput 22 + { + ModelName "ML-2250" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-2250;" + PCFileName "ml2250.ppd" + } { + ModelName "ML-2251" +@@ -166,6 +169,7 @@ Manufacturer "Samsung" + PCFileName "ml1640.ppd" + } { + ModelName "ML-2010" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-2010;CMD:GDI;" + PCFileName "ml2010.ppd" + } { + ModelName "ML-2015" +@@ -177,6 +181,7 @@ Manufacturer "Samsung" + #import "srtmode.defs" + + ModelName "ML-2510" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-2510 Series;CMD:GDI;" + PCFileName "ml2510.ppd" + } + } +@@ -193,15 +198,18 @@ Manufacturer "Samsung" + + { + ModelName "ML-1660" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-1660 Series;CMD:GDI,FWV,EXT;" + PCFileName "ml1660.ppd" + } { + ModelName "ML-1910" + PCFileName "ml1910.ppd" + } { + ModelName "ML-2525" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-2525 Series;CMD:GDI,FWV,EXT;" + PCFileName "ml2525.ppd" + } { + ModelName "ML-2525W" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:ML-2525W Series;CMD:GDI,FWV,EXT;" + PCFileName "ml2525w.ppd" + } + } { +@@ -465,6 +473,7 @@ Manufacturer "Samsung" + Attribute General CMSFile "CLP-310" + + ModelName "CLP-310" ++ Attribute "1284DeviceID" "" "MFG:Samsung;MDL:CLP-310 Series;CMD:SPLC,FWV;" + PCFileName "clp310.ppd" + }{ + Attribute General CMSFile "CLP-315" +diff -up splix/ppd/xerox.drv.in.deviceID splix/ppd/xerox.drv.in +--- splix/ppd/xerox.drv.in.deviceID 2013-08-26 17:22:00.000000000 +0200 ++++ splix/ppd/xerox.drv.in 2013-09-02 13:55:22.634957854 +0200 +@@ -66,6 +66,7 @@ Manufacturer "Xerox" + } { + #import "manualduplex.defs" + ModelName "Phaser 3120" ++ Attribute "1284DeviceID" "" "MFG:Xerox;MDL:Phaser 3120;CMD:GDI;" + PCFileName "ph3120.ppd" + } { + #import "manualduplex.defs" +@@ -74,6 +75,7 @@ Manufacturer "Xerox" + } { + #import "manualduplex.defs" + ModelName "Phaser 3130" ++ Attribute "1284DeviceID" "" "MFG:Xerox;MDL:Phaser 3130;CMD:PCL5E,PCL6;" + PCFileName "ph3130.ppd" + } { + // Multi-tray +@@ -118,6 +120,7 @@ Manufacturer "Xerox" + + { + ModelName "Phaser 3117" ++ Attribute "1284DeviceID" "" "MFG:Xerox;MDL:Phaser 3117;CMD:GDI;" + PCFileName "ph3117.ppd" + } { + Resolution k 1 0 0 0 "1200x600dpi/1200x600 DPI" +@@ -131,6 +134,7 @@ Manufacturer "Xerox" + + { + ModelName "Phaser 3124" ++ Attribute "1284DeviceID" "" "MFG:Xerox;MDL:Phaser 3124;CMD:GDI;" + PCFileName "ph3124.ppd" + } + } diff --git a/talimatname/genel/s/splix/talimat b/talimatname/genel/s/splix/talimat new file mode 100644 index 000000000..5ec6f42d8 --- /dev/null +++ b/talimatname/genel/s/splix/talimat @@ -0,0 +1,29 @@ +# Tanım: SPL (Samsung Printer Language) yazıcıları için cups sürücüleri +# URL: http://splix.ap2c.org/ +# Paketçi: milisarge +# Gerekler: cups jbigkit krb5 subversion ghostscript + +isim=splix +surum=2.0.0 +devir=1 +kaynak=(splix-deviceID.patch) + +derle() { + + cd $DERLEME_KAYNAKDIZIN + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + svn co http://svn.code.sf.net/p/splix/code/splix/ + else + cd $DERLEME_KAYNAKDIZIN/$isim + svn up + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim ${SRC}/$isim + cd "${SRC}/${isim}" + patch -Np1 -i ../splix-deviceID.patch + CXXFLAGS+=" -fno-strict-aliasing" + make drv + make all DRV_ONLY=1 + make DESTDIR="$PKG" install DRV_ONLY=1 + +} diff --git a/talimatname/genel/s/sqlcipher/talimat b/talimatname/genel/s/sqlcipher/talimat new file mode 100644 index 000000000..dc4ea7981 --- /dev/null +++ b/talimatname/genel/s/sqlcipher/talimat @@ -0,0 +1,17 @@ +# Tanım: sqlite veritabanları için 256bit şifreleme eklentisi +# URL: https://www.zetetic.net/sqlcipher/ +# Paketçi: milisarge +# Gerekler: sqlite tcl + +isim=sqlcipher +surum=3.4.1 +devir=1 +kaynak=(https://github.com/sqlcipher/$isim/archive/v$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --enable-tempstore=yes \ + CFLAGS="$CFLAGS -DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto" + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/s/sqlite/talimat b/talimatname/genel/s/sqlite/talimat new file mode 100644 index 000000000..8fe121d1e --- /dev/null +++ b/talimatname/genel/s/sqlite/talimat @@ -0,0 +1,36 @@ +# Tanım: SQL veritabanı motoru +# URL: http://www.sqlite.org/ +# Paketçi: milisarge +# Gerekler: + +isim=sqlite +surum=3.23.1 +_srcver=3230100 +devir=1 +_surum=$(printf "%i%.2i%.2i%.2i" ${surum//./ }) + +kaynak=(http://www.sqlite.org/2018/sqlite-autoconf-${_surum}.tar.gz) + +derle() { + cd sqlite-autoconf-$_srcver + export CPPFLAGS="$CPPFLAGS -DSQLITE_ENABLE_COLUMN_METADATA=1 \ + -DSQLITE_ENABLE_UNLOCK_NOTIFY \ + -DSQLITE_ENABLE_DBSTAT_VTAB=1 \ + -DSQLITE_ENABLE_FTS3_TOKENIZER=1 \ + -DSQLITE_SECURE_DELETE \ + -DSQLITE_MAX_VARIABLE_NUMBER=250000 \ + -DSQLITE_MAX_EXPR_DEPTH=10000" + + ./configure --prefix=/usr \ + --disable-static \ + --disable-amalgamation \ + --enable-fts3 \ + --enable-fts4 \ + --enable-fts5 \ + --enable-rtree \ + --enable-json1 + make + # build additional tools + make + make DESTDIR=${PKG} install +} diff --git a/talimatname/genel/s/sqlitebrowser/talimat b/talimatname/genel/s/sqlitebrowser/talimat new file mode 100644 index 000000000..2b17a0680 --- /dev/null +++ b/talimatname/genel/s/sqlitebrowser/talimat @@ -0,0 +1,24 @@ +# Tanım: SQL veritabanı Qt5 tabanlı yönetim arayüzü +# URL: http://www.sqlite.org/ +# Paketçi: milisarge +# Gerekler: sqlite cmake libxkbcommon qt5 + +isim=sqlitebrowser +surum=3.9.1 +devir=1 + +kaynak=(https://github.com/sqlitebrowser/sqlitebrowser/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$SRC"/$isim-$surum + sed -i 's|Icon=.*|Icon=sqlitebrowser|' distri/sqlitebrowser.desktop + sed -i \ + -e 's|DB Browser for SQLite|sqlitebrowser|g' \ + CMakeLists.txt + cmake -DUSE_QT5=TRUE -DCMAKE_INSTALL_PREFIX=/usr . + make + make install DESTDIR="$PKG" + install -Dm0644 distri/sqlitebrowser.desktop "$PKG"/usr/share/applications/sqlitebrowser.desktop + install -dm0755 "$PKG"/usr/share/icons/ + install -m0644 images/sqlitebrowser.svg "$PKG"/usr/share/icons/ +} diff --git a/talimatname/genel/s/sqlmap/talimat b/talimatname/genel/s/sqlmap/talimat new file mode 100644 index 000000000..1657dfee6 --- /dev/null +++ b/talimatname/genel/s/sqlmap/talimat @@ -0,0 +1,41 @@ +# Tanım: SQL enjeksiyon kusurlarını sömürme sürecini otomatikleştirin +# URL: http://sqlmap.org +# Paketçi: milisarge +# Gerekler: python + +isim=sqlmap +surum=git +devir=1 +kaynak=() + +derle() { + git clone https://github.com/sqlmapproject/sqlmap.git + cd $isim + python2 -m compileall . + python2 -O -m compileall . + + install -d "$PKG/etc" + install -d "$PKG/usr/bin" + install -d "$PKG/opt/$isim" + install -d "$PKG/usr/share/doc" + + mv doc "$PKG/usr/share/doc/$isim" + mv sqlmap.conf "$PKG/etc/sqlmap.conf" + ln -sf /etc/sqlmap.conf "$PKG/opt/$isim/sqlmap.conf" + cp -R --no-preserve=ownership * "$PKG/opt/$isim" + + cat > "$PKG/usr/bin/sqlmap" << EOF +#!/bin/sh +cd /opt/$isim +python2 sqlmap.py "\$@" +EOF + cat > "$PKG/usr/bin/sqlmapapi" << EOF +#!/bin/sh +cd /opt/$isim +python2 sqlmapapi.py "\$@" +EOF + + chmod 755 "$PKG/usr/bin/sqlmap" + chmod 755 "$PKG/usr/bin/sqlmapapi" + +} diff --git a/talimatname/genel/s/squeak-vm/talimat b/talimatname/genel/s/squeak-vm/talimat new file mode 100644 index 000000000..611ce43b7 --- /dev/null +++ b/talimatname/genel/s/squeak-vm/talimat @@ -0,0 +1,23 @@ +# Tanım: Smalltalk programlama dili ve ortamının tam özellikli uygulanması +# URL: http://squeakvm.org +# Paketçi: Cihan Alkan +# Gerekler: cmake xorg-libxrender pulseaudio +# Grup: geliştirme + +isim=squeak-vm +surum=4.10.2.2614 +devir=1 +kaynak=(http://squeakvm.org/unix/release/Squeak-$surum-src.tar.gz) + +derle() { + cd "$SRC"/Squeak-$surum-src + + ./unix/cmake/configure --prefix=/usr --without-quartz --with-x \ + --enable-mpg-mmx + + make + make DESTDIR="$PKG"/ install + + install -Dm644 "$SRC"/Squeak-$surum-src/unix/doc/LICENSE \ + "$PKG"/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/s/squid/squid.kur-kos b/talimatname/genel/s/squid/squid.kur-kos new file mode 100644 index 000000000..88e9f8b37 --- /dev/null +++ b/talimatname/genel/s/squid/squid.kur-kos @@ -0,0 +1,5 @@ +#!/bin/sh +/sbin/groupadd -g 90 squid +/sbin/useradd -g squid -u 90 -d /var/squid -s /bin/false squid +/bin/passwd -l squid +install -d -m 0700 -o squid -g squid /var/{log/squid,squid} diff --git a/talimatname/genel/s/squid/squid_servisi b/talimatname/genel/s/squid/squid_servisi new file mode 100644 index 000000000..116a3382c --- /dev/null +++ b/talimatname/genel/s/squid/squid_servisi @@ -0,0 +1,42 @@ +#!/bin/sh +# +# /etc/rc.d/squid: start/stop squid daemon +# + +SSD=/sbin/start-stop-daemon +PROG=/usr/sbin/squid +PID=/var/run/squid.pid +OPTS="-Y" + +case $1 in +start) + $SSD --start --pidfile $PID --exec $PROG -- $OPTS + ;; +stop) + $SSD --stop --retry 10 --pidfile $PID --signal INT + ;; +shutdown) + $SSD --stop --retry 60 --pidfile $PID --signal TERM + ;; +restart) + $0 stop + $0 start + ;; +reload) + $SSD --stop --pidfile $PID --signal HUP + ;; +status) + $SSD --status --pidfile $PID + case $? in + 0) echo "$PROG is running with pid $(cat $PID)" ;; + 1) echo "$PROG is not running but the pid file $PID exists" ;; + 3) echo "$PROG is not running" ;; + 4) echo "Unable to determine the program status" ;; + esac + ;; +*) + echo "usage: $0 [start|stop|shutdown|restart|reload|status]" + ;; +esac + +# End of file diff --git a/talimatname/genel/s/squid/talimat b/talimatname/genel/s/squid/talimat new file mode 100644 index 000000000..2ea40625c --- /dev/null +++ b/talimatname/genel/s/squid/talimat @@ -0,0 +1,40 @@ +# Tanım: Fonksiyonel vekil sunucu yazılımı +# URL: http://www.squid-cache.org +# Paketçi: milisarge +# Gerekler: + +isim=squid +surum=3.5.24 +devir=2 +kaynak=(http://www.squid-cache.org/Versions/v3/3.5/$isim-$surum.tar.xz + squid_servisi) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --sysconfdir=/etc/squid \ + --libexecdir=/usr/lib/squid \ + --localstatedir=/var \ + --datadir=/usr/share/squid \ + --with-logdir=/var/log/squid \ + --with-pidfile=/var/run/squid.pid \ + --with-swapdir=/var/squid \ + --with-default-user=squid \ + --enable-linux-netfilter \ + --enable-storeio=ufs,aufs,diskd,rock \ + --enable-removal-policies=lru,heap \ + --with-large-files \ + --with-pthreads \ + --with-aufs-threads=16 \ + --disable-auto-locale \ + --with-openssl \ + --enable-ssl-crtd + + make all + make DESTDIR=$PKG install + + rm -r $PKG/var/run + find $PKG/usr/share/squid/errors/* -prune ! -name templates | xargs rm -r + install -D -m 755 $SRC/squid_servisi $PKG/etc/rc.d/init.d/squid +} diff --git a/talimatname/genel/s/ssh-askpass/ssh-askpass.kur-kos b/talimatname/genel/s/ssh-askpass/ssh-askpass.kur-kos new file mode 100644 index 000000000..839dc3e9c --- /dev/null +++ b/talimatname/genel/s/ssh-askpass/ssh-askpass.kur-kos @@ -0,0 +1,8 @@ +if ( ! grep ssh-askpass etc/sudo.conf 2> /dev/null ) +then + cat >> etc/sudo.conf << "EOF" +# Path to askpass helper program +Path askpass /usr/libexec/openssh/ssh-askpass +EOF + chmod -v 0644 /etc/sudo.conf +fi diff --git a/talimatname/genel/s/ssh-askpass/talimat b/talimatname/genel/s/ssh-askpass/talimat new file mode 100644 index 000000000..9f1b9d1d6 --- /dev/null +++ b/talimatname/genel/s/ssh-askpass/talimat @@ -0,0 +1,20 @@ +# Tanım: Yönetici ayrıcalıkları gerektiren paketlerin şifresini almak için iletişim kutusu +# URL: http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ +# Paketçi: milisarge +# Depend on: gdk-pixbuf gtk2 xorg-libx11 + +isim=ssh-askpass +surum=7.1p2 +devir=2 +kaynak=(http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.1p2.tar.gz) + +derle() { + +cd openssh-$surum/contrib +make gnome-ssh-askpass2 +install -v -d -m755 $PKG/usr/libexec/openssh/contrib +install -v -m755 gnome-ssh-askpass2 \ +$PKG/usr/libexec/openssh/contrib +ln -sv -f contrib/gnome-ssh-askpass2 \ +$PKG/usr/libexec/openssh/ssh-askpass +} diff --git a/talimatname/genel/s/sshfs-fuse/talimat b/talimatname/genel/s/sshfs-fuse/talimat new file mode 100644 index 000000000..24f6e8c42 --- /dev/null +++ b/talimatname/genel/s/sshfs-fuse/talimat @@ -0,0 +1,16 @@ +# Tanım: SSH Dosya Aktarım Protokolünü temel alan FUSE istemcisi +# URL: http://fuse.sourceforge.net/sshfs.html +# Paketçi: milisarge@gmail.com +# Gerekler: fuse glib openssh + +isim=sshfs-fuse +surum=2.5 +devir=1 +kaynak=(https://github.com/libfuse/sshfs/releases/download/sshfs_${version//./_}//$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/sshuttle/prefixes.conf b/talimatname/genel/s/sshuttle/prefixes.conf new file mode 100644 index 000000000..ca472b9a1 --- /dev/null +++ b/talimatname/genel/s/sshuttle/prefixes.conf @@ -0,0 +1,5 @@ +# Output prefixes here, one per line. Prefix is in: +# prefix/netmask format +# Like this: +# 192.168.0.0/16 +# 192.0.43.10/32 diff --git a/talimatname/genel/s/sshuttle/talimat b/talimatname/genel/s/sshuttle/talimat new file mode 100644 index 000000000..0dcc1f10a --- /dev/null +++ b/talimatname/genel/s/sshuttle/talimat @@ -0,0 +1,28 @@ +# Tanım: tcp paketleri ssh üzerinde yönlendiren şeffaf vekil sunucu +# URL: https://github.com/sshuttle/sshuttle +# Paketçi: milisarge +# Gerekler: python3 python3-setuptools iptables net-tools libffi + +isim=sshuttle +hesap=sshuttle +surum=0.78.2 +devir=1.0 +kaynak=(prefixes.conf + tunnel.conf) + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/$hesap/$isim $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + python3 setup.py build + python3 setup.py install --root="$PKG" -O1 + install -d "$PKG/etc/sshuttle" + install -m644 "$SRC"/{tunnel.conf,prefixes.conf} "$PKG/etc/sshuttle" +} diff --git a/talimatname/genel/s/sshuttle/tunnel.conf b/talimatname/genel/s/sshuttle/tunnel.conf new file mode 100644 index 000000000..64fb54edb --- /dev/null +++ b/talimatname/genel/s/sshuttle/tunnel.conf @@ -0,0 +1,19 @@ +# Here is where you can specify any SSH tunnel options See ssh_config(5) for +# details. You need to leave the Host line intact, but everything else can +# specify whatever you want +Host sshuttle_tunnel + +# REQUIRED: Set this to be the host to which you would like to connect your +# tunnel +#Hostname localhost + +# REQUIRED: Set this to be the target SSH user on the remote system +#User foo + +# --------------------------------------------------------------------------- +# The rest are all optional; see ssh_config(5) for the full list of what can +# be specified. Some very commonly needed ones are below. +# --------------------------------------------------------------------------- + +# SSH key used for connecting +#IdentityFile /path/to/key diff --git a/talimatname/genel/s/sslyze/talimat b/talimatname/genel/s/sslyze/talimat new file mode 100644 index 000000000..b6b551f4c --- /dev/null +++ b/talimatname/genel/s/sslyze/talimat @@ -0,0 +1,16 @@ +# Tanım: SSL sunucu analiz uygulaması +# URL: https://github.com/nabla-c0d3/sslyze/ +# Paketçi: milisarge +# Gerekler: python-setuptools python python-nassl python-lxml python-typing + +isim=sslyze +surum=1.0.0 +devir=1 +kaynak=(https://github.com/nabla-c0d3/sslyze/archive/$surum.tar.gz) + +derle() { + cd sslyze-$surum + python2 setup.py build + python2 setup.py install --root="$PKG" --optimize=1 + install -Dm644 README.md "$PKG/usr/share/doc/sslyze/README.md" +} diff --git a/talimatname/genel/s/st/talimat b/talimatname/genel/s/st/talimat new file mode 100644 index 000000000..f1580a12d --- /dev/null +++ b/talimatname/genel/s/st/talimat @@ -0,0 +1,29 @@ +# Tanım: X için basit terminal uygulaması +# URL: http://st.suckless.org/ +# Paketçi: milisarge +# Gerekler: xorg-libxext xorg-libxft + +isim=st +surum=0.7 +devir=1 + +kaynak=(http://dl.suckless.org/st/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + local file + sed \ + -e '/char font/s/= .*/= "Fixed:pixelsize=17:style=Condensed";/' \ + -e '/char worddelimiters/s/= .*/= " '"'"'`\\\"()[]{}<>|";/' \ + -e '/int defaultcs/s/= .*/= 1;/' \ + -i config.def.h + sed \ + -e 's/CPPFLAGS =/CPPFLAGS +=/g' \ + -e 's/CFLAGS =/CFLAGS +=/g' \ + -e 's/LDFLAGS =/LDFLAGS +=/g' \ + -e 's/_BSD_SOURCE/_DEFAULT_SOURCE/' \ + -i config.mk + sed '/@tic/d' -i Makefile + make X11INC=/usr/include/X11 X11LIB=/usr/lib/X11 + make PREFIX=/usr DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/s/stacer/talimat b/talimatname/genel/s/stacer/talimat new file mode 100644 index 000000000..aa7a78807 --- /dev/null +++ b/talimatname/genel/s/stacer/talimat @@ -0,0 +1,57 @@ +# Tanım: Linux Sistem Doktoru ve İzleme +# URL: https://github.com/oguzhaninan/Stacer +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: sistem + +isim=stacer +surum=1.0.8 +devir=1 + +kaynak=(https://github.com/oguzhaninan/Stacer/archive/v1.0.8.tar.gz::$isim-$surum.tar.gz) + +derle() { + export QT_PLUGIN_PATH=$QTDIR/plugins + export LD_LIBRARY_PATH=$QTDIR/lib + cd "Stacer-$surum" + P_DIR=$(pwd) + DIST_DIR=dist + BUILD_DIR=build + #clean + rm -rf dist + + mkdir -p $DIST_DIR/$BUILD_DIR + cd $DIST_DIR/$BUILD_DIR + + #build + $QTDIR/usr/bin/qmake-qt5 -spec linux-g++ "CONFIG += release" $SRC/Stacer-$surum/Stacer.pro && make + + cd $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer-core && make + cd $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer && make + + mkdir $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/lib + + cp $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer-core/libstacer-core.so.1.0.0 $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/lib/libstacer-core.so.1 + + cd $SRC/Stacer-$surum + lrelease stacer/stacer.pro + + mkdir $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/translations + mv $SRC/Stacer-$surum/translations/*.qm $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/translations + rm -rf $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer-core + find $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer \( -name "moc_*" -or -name "*.o" -or -name "qrc_*" -or -name "Makefile*" -or -name "*.a" -or -name "*.h" \) -exec rm {} \; + + mkdir -p $PKG/usr/bin + mkdir -p $PKG/usr/share/pixmaps + mkdir -p $PKG/usr/share/applications + mkdir -p $PKG/usr/share/stacer + mkdir -p $PKG/usr/lib + mkdir -p $PKG/usr/share/icons + + cp -R $SRC/Stacer-$surum/icons/hicolor/128x128/apps $PKG/usr/share/pixmaps/stacer.png + cp -R $SRC/Stacer-$surum/stacer.desktop $PKG/usr/share/applications/stacer.desktop + cp -R $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/lib/* $PKG/usr/lib/ + cp -R $SRC/Stacer-$surum/icons/* $PKG/usr/share/icons/ + cp -R $SRC/Stacer-$surum/$DIST_DIR/$BUILD_DIR/stacer/* $PKG/usr/share/stacer/ + ln -s /usr/share/stacer/stacer "$PKG/usr/bin/stacer" +} diff --git a/talimatname/genel/s/start-stop-daemon/makefile b/talimatname/genel/s/start-stop-daemon/makefile new file mode 100644 index 000000000..976a01ab3 --- /dev/null +++ b/talimatname/genel/s/start-stop-daemon/makefile @@ -0,0 +1,12 @@ +CC = cc +CFLAGS += -g -Wall +PROGRAM = start-stop-daemon +SOURCES = start-stop-daemon.c + +$(PROGRAM): $(SOURCES) + $(CC) $(CFLAGS) -o $(@) $(SOURCES) + + +all: $(PROGRAM) +clean: ; rm -f $(PROGRAM) +force: clean all diff --git a/talimatname/genel/s/start-stop-daemon/ornek_servis b/talimatname/genel/s/start-stop-daemon/ornek_servis new file mode 100644 index 000000000..dad1ea465 --- /dev/null +++ b/talimatname/genel/s/start-stop-daemon/ornek_servis @@ -0,0 +1,48 @@ +#!/bin/sh + +# Derived from https://gist.github.com/sodik82/4f4aafdb52e84102b75d + +set -e +. /lib/lsb/init-functions + +# Must be a valid filename +NAME=foo +PIDFILE=/run/$NAME.pid + +# Full path to executable +DAEMON=/usr/local/bin/bar + +# Options +DAEMON_OPTS="--baz=quux" + +# User to run the command as +USER=www + + +export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" + +case "$1" in + start) + echo -n "Starting daemon: "$NAME + start-stop-daemon --start --quiet -b -m --pidfile $PIDFILE --chdir $WORK_DIR --chuid $USER --exec $DAEMON -- $DAEMON_OPTS + echo "." + ;; + stop) + echo -n "Stopping daemon: "$NAME + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + echo "." + ;; + restart) + echo -n "Restarting daemon: "$NAME + start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE + start-stop-daemon --start --quiet -b -m --pidfile $PIDFILE --chdir $WORK_DIR --chuid $USER --exec $DAEMON -- $DAEMON_OPTS + echo "." + ;; + status) + status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $? + ;; + + *) + echo "Usage: "$1" {start|stop|restart}" + exit 1 +esac diff --git a/talimatname/genel/s/start-stop-daemon/start-stop-daemon.8 b/talimatname/genel/s/start-stop-daemon/start-stop-daemon.8 new file mode 100644 index 000000000..deae6c6b0 --- /dev/null +++ b/talimatname/genel/s/start-stop-daemon/start-stop-daemon.8 @@ -0,0 +1,381 @@ +.\" dpkg manual page - start-stop-daemon(8) +.\" +.\" Copyright © 1999 Klee Dienes +.\" Copyright © 1999 Ben Collins +.\" Copyright © 2000-2001 Wichert Akkerman +.\" Copyright © 2002-2003 Adam Heath +.\" Copyright © 2004 Scott James Remnant +.\" Copyright © 2008-2015 Guillem Jover +.\" +.\" This is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" This is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program. If not, see . +. +.TH start\-stop\-daemon 8 "2014-03-26" "Debian Project" "dpkg utilities" +.SH NAME +start\-stop\-daemon \- start and stop system daemon programs +. +.SH SYNOPSIS +.B start\-stop\-daemon +.RI [ option "...] " command +. +.SH DESCRIPTION +.B start\-stop\-daemon +is used to control the creation and termination of system-level processes. +Using one of the matching options, \fBstart\-stop\-daemon\fP +can be configured to find existing instances of a running process. +.PP +Note: unless +.B \-\-pid +or +.B \-\-pidfile +are specified, +.B start\-stop\-daemon +behaves similar to +.BR killall (1). +.B start\-stop\-daemon +will scan the process table looking for any processes which +match the process name, parent pid, uid, and/or gid (if specified). Any +matching process will prevent +.BR \-\-start +from starting the daemon. All matching processes will be sent the TERM +signal (or the one specified via \fB\-\-signal\fP or \fB\-\-retry\fP) if +.BR \-\-stop +is specified. For daemons which have long-lived children +which need to live through a +.BR \-\-stop , +you must specify a pidfile. +. +.SH COMMANDS +.TP +.BR \-S ", " \-\-start " [" \-\- "] \fIarguments\fP" +Check for the existence of a specified process. +If such a process exists, +.B start\-stop\-daemon +does nothing, and exits with error status 1 (0 if +.BR \-\-oknodo +is specified). +If such a process does not exist, it starts an +instance, using either the executable specified by +.B \-\-exec +or, if specified, by +.BR \-\-startas . +Any arguments given after +.BR \-\- +on the command line are passed unmodified to the program being +started. +.TP +.BR \-K ", " \-\-stop +Checks for the existence of a specified process. +If such a process exists, +.B start\-stop\-daemon +sends it the signal specified by +.BR \-\-signal , +and exits with error status 0. +If such a process does not exist, +.B start\-stop\-daemon +exits with error status 1 +(0 if +.BR \-\-oknodo +is specified). If +.B \-\-retry +is specified, then +.B start\-stop\-daemon +will check that the process(es) have terminated. +.TP +.BR \-T ", " \-\-status +Check for the existence of a specified process, and returns an exit status +code, according to the LSB Init Script Actions (since version 1.16.1). +.TP +.BR \-H ", " \-\-help +Show usage information and exit. +.TP +.BR \-V ", " \-\-version +Show the program version and exit. +. +.SH OPTIONS +.SS Matching options +.TP +.BR \-\-pid " \fIpid\fP" +Check for a process with the specified \fIpid\fP (since version 1.17.6). +The \fIpid\fP must be a number greater than 0. +.TP +.BR \-\-ppid " \fIppid\fP" +Check for a process with the specified parent pid \fIppid\fP +(since version 1.17.7). +The \fIppid\fP must be a number greater than 0. +.TP +.BR \-p ", " \-\-pidfile " \fIpid-file\fP" +Check whether a process has created the file \fIpid-file\fP. Note: using this +matching option alone might cause unintended processes to be acted on, if the +old process terminated without being able to remove the \fIpid-file\fP. +.TP +.BR \-x ", " \-\-exec " \fIexecutable\fP" +Check for processes that are instances of this \fIexecutable\fP. The +\fIexecutable\fP argument should be an absolute pathname. Note: this might +not work as intended with interpreted scripts, as the executable will point +to the interpreter. Take into account processes running from inside a chroot +will also be matched, so other match restrictions might be needed. +.TP +.BR \-n ", " \-\-name " \fIprocess-name\fP" +Check for processes with the name \fIprocess-name\fP. The \fIprocess-name\fP +is usually the process filename, but it could have been changed by the +process itself. Note: on most systems this information is retrieved from +the process comm name from the kernel, which tends to have a relatively +short length limit (assuming more than 15 characters is non-portable). +.TP +.BR \-u ", " \-\-user " \fIusername\fP|\fIuid\fP +Check for processes owned by the user specified by \fIusername\fP or +\fIuid\fP. Note: using this matching option alone will cause all processes +matching the user to be acted on. +. +.SS Generic options +.TP +.BR \-g ", " \-\-group " \fIgroup\fP|\fIgid\fP" +Change to \fIgroup\fP or \fIgid\fP when starting the process. +.TP +.BR \-s ", " \-\-signal " \fIsignal\fP" +With +.BR \-\-stop , +specifies the signal to send to processes being stopped (default TERM). +.TP +.BR \-R ", " \-\-retry " \fItimeout\fP|\fIschedule\fP" +With +.BR \-\-stop , +specifies that +.B start\-stop\-daemon +is to check whether the process(es) +do finish. It will check repeatedly whether any matching processes +are running, until none are. If the processes do not exit it will +then take further action as determined by the schedule. + +If +.I timeout +is specified instead of +.IR schedule , +then the schedule +.IB signal / timeout /KILL/ timeout +is used, where +.I signal +is the signal specified with +.BR \-\-signal . + +.I schedule +is a list of at least two items separated by slashes +.RB ( / ); +each item may be +.BI \- signal-number +or [\fB\-\fP]\fIsignal-name\fP, +which means to send that signal, +or +.IR timeout , +which means to wait that many seconds for processes to +exit, +or +.BR forever , +which means to repeat the rest of the schedule forever if +necessary. + +If the end of the schedule is reached and +.BR forever +is not specified, then +.B start\-stop\-daemon +exits with error status 2. +If a schedule is specified, then any signal specified +with +.B \-\-signal +is ignored. +.TP +.BR \-a ", " \-\-startas " \fIpathname\fP" +With +.BR \-\-start , +start the process specified by +.IR pathname . +If not specified, defaults to the argument given to +.BR \-\-exec . +.TP +.BR \-t ", " \-\-test +Print actions that would be taken and set appropriate return value, +but take no action. +.TP +.BR \-o ", " \-\-oknodo +Return exit status 0 instead of 1 if no actions are (would be) taken. +.TP +.BR \-q ", " \-\-quiet +Do not print informational messages; only display error messages. +.TP +.BR \-c ", " \-\-chuid " \fIusername\fR|\fIuid\fP[\fB:\fP\fIgroup\fR|\fIgid\fP]" +Change to this username/uid before starting the process. You can also +specify a group by appending a +.BR : , +then the group or gid in the same way +as you would for the \fBchown\fP(1) command (\fIuser\fP\fB:\fP\fIgroup\fP). +If a user is specified without a group, the primary GID for that user is used. +When using this option +you must realize that the primary and supplemental groups are set as well, +even if the +.B \-\-group +option is not specified. The +.B \-\-group +option is only for +groups that the user isn't normally a member of (like adding per process +group membership for generic users like +.BR nobody ). +.TP +.BR \-r ", " \-\-chroot " \fIroot\fP" +Chdir and chroot to +.I root +before starting the process. Please note that the pidfile is also written +after the chroot. +.TP +.BR \-d ", " \-\-chdir " \fIpath\fP" +Chdir to +.I path +before starting the process. This is done after the chroot if the +\fB\-r\fP|\fB\-\-chroot\fP option is set. When not specified, +.B start\-stop\-daemon +will chdir to the root directory before starting the process. +.TP +.BR \-b ", " \-\-background +Typically used with programs that don't detach on their own. This option +will force +.B start\-stop\-daemon +to fork before starting the process, and force it into the background. +.B Warning: start\-stop\-daemon +cannot check the exit status if the process fails to execute for +.B any +reason. This is a last resort, and is only meant for programs that either +make no sense forking on their own, or where it's not feasible to add the +code for them to do this themselves. +.TP +.BR \-C ", " \-\-no\-close +Do not close any file descriptor when forcing the daemon into the background +(since version 1.16.5). +Used for debugging purposes to see the process output, or to redirect file +descriptors to log the process output. +Only relevant when using \fB\-\-background\fP. +.TP +.BR \-N ", " \-\-nicelevel " \fIint\fP" +This alters the priority of the process before starting it. +.TP +.BR \-P ", " \-\-procsched " \fIpolicy\fP\fB:\fP\fIpriority\fP" +This alters the process scheduler policy and priority of the process before +starting it (since version 1.15.0). +The priority can be optionally specified by appending a \fB:\fP +followed by the value. The default \fIpriority\fP is 0. The currently +supported policy values are \fBother\fP, \fBfifo\fP and \fBrr\fP. +.TP +.BR \-I ", " \-\-iosched " \fIclass\fP\fB:\fP\fIpriority\fP" +This alters the IO scheduler class and priority of the process before starting +it (since version 1.15.0). +The priority can be optionally specified by appending a \fB:\fP followed +by the value. The default \fIpriority\fP is 4, unless \fIclass\fP is \fBidle\fP, +then \fIpriority\fP will always be 7. The currently supported values for +\fIclass\fP are \fBidle\fP, \fBbest-effort\fP and \fBreal-time\fP. +.TP +.BR \-k ", " \-\-umask " \fImask\fP" +This sets the umask of the process before starting it (since version 1.13.22). +.TP +.BR \-m ", " \-\-make\-pidfile +Used when starting a program that does not create its own pid file. This +option will make +.B start\-stop\-daemon +create the file referenced with +.B \-\-pidfile +and place the pid into it just before executing the process. Note, the +file will only be removed when stopping the program if +\fB\-\-remove\-pidfile\fP is used. +.B Note: +This feature may not work in all cases. Most notably when the program +being executed forks from its main process. Because of this, it is usually +only useful when combined with the +.B \-\-background +option. +.TP +.B \-\-remove\-pidfile +Used when stopping a program that does not remove its own pid file +(since version 1.17.19). +This option will make +.B start\-stop\-daemon +remove the file referenced with +.B \-\-pidfile +after terminating the process. +.TP +.BR \-v ", " \-\-verbose +Print verbose informational messages. +. +.SH EXIT STATUS +.TP +.B 0 +The requested action was performed. If +.B \-\-oknodo +was specified, it's also possible that nothing had to be done. +This can happen when +.B \-\-start +was specified and a matching process was already running, or when +.B \-\-stop +was specified and there were no matching processes. +.TP +.B 1 +If +.B \-\-oknodo +was not specified and nothing was done. +.TP +.B 2 +If +.B \-\-stop +and +.B \-\-retry +were specified, but the end of the schedule was reached and the processes were +still running. +.TP +.B 3 +Any other error. +.PP +When using the \fB\-\-status\fP command, the following status codes are +returned: +.TP +.B 0 +Program is running. +.TP +.B 1 +Program is not running and the pid file exists. +.TP +.B 3 +Program is not running. +.TP +.B 4 +Unable to determine program status. +. +.SH EXAMPLE +Start the \fBfood\fP daemon, unless one is already running (a process named +food, running as user food, with pid in food.pid): +.IP +.nf +start\-stop\-daemon \-\-start \-\-oknodo \-\-user food \-\-name food \\ + \-\-pidfile /run/food.pid \-\-startas /usr/sbin/food \\ + \-\-chuid food \-\- \-\-daemon +.fi +.PP +Send \fBSIGTERM\fP to \fBfood\fP and wait up to 5 seconds for it to stop: +.IP +.nf +start\-stop\-daemon \-\-stop \-\-oknodo \-\-user food \-\-name food \\ + \-\-pidfile /run/food.pid \-\-retry 5 +.fi +.PP +Demonstration of a custom schedule for stopping \fBfood\fP: +.IP +.nf +start\-stop\-daemon \-\-stop \-\-oknodo \-\-user food \-\-name food \\ + \-\-pidfile /run/food.pid \-\-retry=TERM/30/KILL/5 +.fi diff --git a/talimatname/genel/s/start-stop-daemon/start-stop-daemon.c b/talimatname/genel/s/start-stop-daemon/start-stop-daemon.c new file mode 100644 index 000000000..a749008bc --- /dev/null +++ b/talimatname/genel/s/start-stop-daemon/start-stop-daemon.c @@ -0,0 +1,1059 @@ +/* + * A rewrite of the original Debian's start-stop-daemon Perl script + * in C (faster - it is executed many times during system startup). + * + * Written by Marek Michalkiewicz , + * public domain. Based conceptually on start-stop-daemon.pl, by Ian + * Jackson . May be used and distributed + * freely for any purpose. Changes by Christian Schwarz + * , to make output conform to the Debian + * Console Message Standard, also placed in public domain. Minor + * changes by Klee Dienes , also placed in the Public + * Domain. + * + * Changes by Ben Collins , added --chuid, --background + * and --make-pidfile options, placed in public domain aswell. + * + * Port to OpenBSD by Sontri Tomo Huynh + * and Andreas Schuldei + * + * Changes by Ian Jackson: added --retry (and associated rearrangements). + * + * Modified for Gentoo rc-scripts by Donny Davies : + * I removed the BSD/Hurd/OtherOS stuff, added #include + * and stuck in a #define VERSION "1.9.18". Now it compiles without + * the whole automake/config.h dance. + */ + +#ifdef HAVE_LXC +#define _GNU_SOURCE +#include +#endif /* HAVE_LXC */ + +#include +#define VERSION "1.9.18" + +#define MIN_POLL_INTERVAL 20000 /*us*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int testmode = 0; +static int quietmode = 0; +static int exitnodo = 1; +static int start = 0; +static int stop = 0; +static int background = 0; +static int mpidfile = 0; +static int signal_nr = 15; +static const char *signal_str = NULL; +static int user_id = -1; +static int runas_uid = -1; +static int runas_gid = -1; +static const char *userspec = NULL; +static char *changeuser = NULL; +static const char *changegroup = NULL; +static char *changeroot = NULL; +static const char *cmdname = NULL; +static char *execname = NULL; +static char *startas = NULL; +static const char *pidfile = NULL; +static char what_stop[1024]; +static const char *schedule_str = NULL; +static const char *progname = ""; +static int nicelevel = 0; + +static struct stat exec_stat; + +struct pid_list { + struct pid_list *next; + pid_t pid; +}; + +static struct pid_list *found = NULL; +static struct pid_list *killed = NULL; + +struct schedule_item { + enum { sched_timeout, sched_signal, sched_goto, sched_forever } type; + int value; /* seconds, signal no., or index into array */ + /* sched_forever is only seen within parse_schedule and callees */ +}; + +static int schedule_length; +static struct schedule_item *schedule = NULL; + +LIST_HEAD(namespace_head, namespace); + +struct namespace { + LIST_ENTRY(namespace) list; + char *path; + int nstype; +}; + +static struct namespace_head namespace_head; + +static void *xmalloc(int size); +static void push(struct pid_list **list, pid_t pid); +static void do_help(void); +static void parse_options(int argc, char * const *argv); +static int pid_is_user(pid_t pid, uid_t uid); +static int pid_is_cmd(pid_t pid, const char *name); +static void check(pid_t pid); +static void do_pidfile(const char *name); +static void do_stop(int signal_nr, int quietmode, + int *n_killed, int *n_notkilled, int retry_nr); +static int pid_is_exec(pid_t pid, const struct stat *esb); + +#ifdef __GNUC__ +static void fatal(const char *format, ...) + __attribute__((noreturn, format(printf, 1, 2))); +static void badusage(const char *msg) + __attribute__((noreturn)); +#else +static void fatal(const char *format, ...); +static void badusage(const char *msg); +#endif + +/* This next part serves only to construct the TVCALC macro, which + * is used for doing arithmetic on struct timeval's. It works like this: + * TVCALC(result, expression); + * where result is a struct timeval (and must be an lvalue) and + * expression is the single expression for both components. In this + * expression you can use the special values TVELEM, which when fed a + * const struct timeval* gives you the relevant component, and + * TVADJUST. TVADJUST is necessary when subtracting timevals, to make + * it easier to renormalise. Whenver you subtract timeval elements, + * you must make sure that TVADJUST is added to the result of the + * subtraction (before any resulting multiplication or what have you). + * TVELEM must be linear in TVADJUST. + */ +typedef long tvselector(const struct timeval*); +static long tvselector_sec(const struct timeval *tv) { return tv->tv_sec; } +static long tvselector_usec(const struct timeval *tv) { return tv->tv_usec; } +#define TVCALC_ELEM(result, expr, sec, adj) \ +{ \ + const long TVADJUST = adj; \ + long (*const TVELEM)(const struct timeval*) = tvselector_##sec; \ + (result).tv_##sec = (expr); \ +} +#define TVCALC(result,expr) \ +do { \ + TVCALC_ELEM(result, expr, sec, (-1)); \ + TVCALC_ELEM(result, expr, usec, (+1000000)); \ + (result).tv_sec += (result).tv_usec / 1000000; \ + (result).tv_usec %= 1000000; \ +} while(0) + + +static void +fatal(const char *format, ...) +{ + va_list arglist; + + fprintf(stderr, "%s: ", progname); + va_start(arglist, format); + vfprintf(stderr, format, arglist); + va_end(arglist); + putc('\n', stderr); + exit(2); +} + + +static void * +xmalloc(int size) +{ + void *ptr; + + ptr = malloc(size); + if (ptr) + return ptr; + fatal("malloc(%d) failed", size); +} + +static void +xgettimeofday(struct timeval *tv) +{ + if (gettimeofday(tv,0) != 0) + fatal("gettimeofday failed: %s", strerror(errno)); +} + +static void +push(struct pid_list **list, pid_t pid) +{ + struct pid_list *p; + + p = xmalloc(sizeof(*p)); + p->next = *list; + p->pid = pid; + *list = p; +} + +static void +clear(struct pid_list **list) +{ + struct pid_list *here, *next; + + for (here = *list; here != NULL; here = next) { + next = here->next; + free(here); + } + + *list = NULL; +} + +static char * +next_dirname(const char *s) +{ + char *cur; + + cur = (char *)s; + + if (*cur != '\0') { + for (; *cur != '/'; ++cur) + if (*cur == '\0') + return cur; + + for (; *cur == '/'; ++cur) + ; + } + + return cur; +} + +static void +add_namespace(const char *path) +{ + int nstype; + char *nsdirname, *nsname, *cur; + struct namespace *namespace; + + cur = (char *)path; + nsdirname = nsname = ""; + + while ((cur = next_dirname(cur))[0] != '\0') { + nsdirname = nsname; + nsname = cur; + } + + if (!memcmp(nsdirname, "ipcns/", strlen("ipcns/"))) + nstype = CLONE_NEWIPC; + else if (!memcmp(nsdirname, "netns/", strlen("netns/"))) + nstype = CLONE_NEWNET; + else if (!memcmp(nsdirname, "utcns/", strlen("utcns/"))) + nstype = CLONE_NEWUTS; + else + badusage("invalid namepspace path"); + + namespace = xmalloc(sizeof(*namespace)); + namespace->path = (char *)path; + namespace->nstype = nstype; + LIST_INSERT_HEAD(&namespace_head, namespace, list); +} + +#ifdef HAVE_LXC +static void +set_namespaces() +{ + struct namespace *namespace; + int fd; + + LIST_FOREACH(namespace, &namespace_head, list) { + if ((fd = open(namespace->path, O_RDONLY)) == -1) + fatal("open namespace %s: %s", namespace->path, strerror(errno)); + if (setns(fd, namespace->nstype) == -1) + fatal("setns %s: %s", namespace->path, strerror(errno)); + } +} +#else +static void +set_namespaces() +{ + if (!LIST_EMPTY(&namespace_head)) + fatal("LCX namespaces not supported"); +} +#endif + +static void +do_help(void) +{ + printf( +"start-stop-daemon " VERSION " for Milis linux - small and fast C version written by\n" +"Marek Michalkiewicz , public domain.\n" +"Milis Linux milisarge@gmail.com .\n" +"\n" +"Usage:\n" +" start-stop-daemon -S|--start options ... -- arguments ...\n" +" start-stop-daemon -K|--stop options ...\n" +" start-stop-daemon -H|--help\n" +" start-stop-daemon -V|--version\n" +"\n" +"Options (at least one of --exec|--pidfile|--user is required):\n" +" -x|--exec program to start/check if it is running\n" +" -p|--pidfile pid file to check\n" +" -c|--chuid \n" +" change to this user/group before starting process\n" +" -u|--user | stop processes owned by this user\n" +" -n|--name stop processes with this name\n" +" -s|--signal signal to send (default TERM)\n" +" -a|--startas program to start (default is )\n" +" -N|--nicelevel add incr to the process's nice level\n" +" -b|--background force the process to detach\n" +" -m|--make-pidfile create the pidfile before starting\n" +" -R|--retry check whether processes die, and retry\n" +" -t|--test test mode, don't do anything\n" +" -o|--oknodo exit status 0 (not 1) if nothing done\n" +" -q|--quiet be more quiet\n" +" -v|--verbose be more verbose\n" +"Retry is |//... where is one of\n" +" -|[-] send that signal\n" +" wait that many seconds\n" +" forever repeat remainder forever\n" +"or may be just , meaning //KILL/\n" +"\n" +"Exit status: 0 = done 1 = nothing done (=> 0 if --oknodo)\n" +" 3 = trouble 2 = with --retry, processes wouldn't die\n"); +} + + +static void +badusage(const char *msg) +{ + if (msg) + fprintf(stderr, "%s: %s\n", progname, msg); + fprintf(stderr, "Try `%s --help' for more information.\n", progname); + exit(3); +} + +struct sigpair { + const char *name; + int signal; +}; + +const struct sigpair siglist[] = { + { "ABRT", SIGABRT }, + { "ALRM", SIGALRM }, + { "FPE", SIGFPE }, + { "HUP", SIGHUP }, + { "ILL", SIGILL }, + { "INT", SIGINT }, + { "KILL", SIGKILL }, + { "PIPE", SIGPIPE }, + { "QUIT", SIGQUIT }, + { "SEGV", SIGSEGV }, + { "TERM", SIGTERM }, + { "USR1", SIGUSR1 }, + { "USR2", SIGUSR2 }, + { "CHLD", SIGCHLD }, + { "CONT", SIGCONT }, + { "STOP", SIGSTOP }, + { "TSTP", SIGTSTP }, + { "TTIN", SIGTTIN }, + { "TTOU", SIGTTOU } +}; + +static int parse_integer (const char *string, int *value_r) { + unsigned long ul; + char *ep; + + if (!string[0]) + return -1; + + ul= strtoul(string,&ep,10); + if (ul > INT_MAX || *ep != '\0') + return -1; + + *value_r= ul; + return 0; +} + +static int parse_signal (const char *signal_str, int *signal_nr) +{ + unsigned int i; + + if (parse_integer(signal_str, signal_nr) == 0) + return 0; + + for (i = 0; i < sizeof (siglist) / sizeof (siglist[0]); i++) { + if (strcmp (signal_str, siglist[i].name) == 0) { + *signal_nr = siglist[i].signal; + return 0; + } + } + return -1; +} + +static void +parse_schedule_item(const char *string, struct schedule_item *item) { + const char *after_hyph; + + if (!strcmp(string,"forever")) { + item->type = sched_forever; + } else if (isdigit(string[0])) { + item->type = sched_timeout; + if (parse_integer(string, &item->value) != 0) + badusage("invalid timeout value in schedule"); + } else if ((after_hyph = string + (string[0] == '-')) && + parse_signal(after_hyph, &item->value) == 0) { + item->type = sched_signal; + } else { + badusage("invalid schedule item (must be [-], " + "-, or `forever'"); + } +} + +static void +parse_schedule(const char *schedule_str) { + char item_buf[20]; + const char *slash; + int count, repeatat; + ptrdiff_t str_len; + + count = 0; + for (slash = schedule_str; *slash; slash++) + if (*slash == '/') + count++; + + schedule_length = (count == 0) ? 4 : count+1; + schedule = xmalloc(sizeof(*schedule) * schedule_length); + + if (count == 0) { + schedule[0].type = sched_signal; + schedule[0].value = signal_nr; + parse_schedule_item(schedule_str, &schedule[1]); + if (schedule[1].type != sched_timeout) { + badusage ("--retry takes timeout, or schedule list" + " of at least two items"); + } + schedule[2].type = sched_signal; + schedule[2].value = SIGKILL; + schedule[3]= schedule[1]; + } else { + count = 0; + repeatat = -1; + while (schedule_str != NULL) { + slash = strchr(schedule_str,'/'); + str_len = slash ? slash - schedule_str : strlen(schedule_str); + if (str_len >= (ptrdiff_t)sizeof(item_buf)) + badusage("invalid schedule item: far too long" + " (you must delimit items with slashes)"); + memcpy(item_buf, schedule_str, str_len); + item_buf[str_len] = 0; + schedule_str = slash ? slash+1 : NULL; + + parse_schedule_item(item_buf, &schedule[count]); + if (schedule[count].type == sched_forever) { + if (repeatat >= 0) + badusage("invalid schedule: `forever'" + " appears more than once"); + repeatat = count; + continue; + } + count++; + } + if (repeatat >= 0) { + schedule[count].type = sched_goto; + schedule[count].value = repeatat; + count++; + } + assert(count == schedule_length); + } +} + +static void +parse_options(int argc, char * const *argv) +{ + static struct option longopts[] = { + { "help", 0, NULL, 'H'}, + { "stop", 0, NULL, 'K'}, + { "start", 0, NULL, 'S'}, + { "version", 0, NULL, 'V'}, + { "startas", 1, NULL, 'a'}, + { "name", 1, NULL, 'n'}, + { "oknodo", 0, NULL, 'o'}, + { "pidfile", 1, NULL, 'p'}, + { "quiet", 0, NULL, 'q'}, + { "signal", 1, NULL, 's'}, + { "test", 0, NULL, 't'}, + { "user", 1, NULL, 'u'}, + { "chroot", 1, NULL, 'r'}, + { "namespace", 1, NULL, 'd'}, + { "verbose", 0, NULL, 'v'}, + { "exec", 1, NULL, 'x'}, + { "chuid", 1, NULL, 'c'}, + { "nicelevel", 1, NULL, 'N'}, + { "background", 0, NULL, 'b'}, + { "make-pidfile", 0, NULL, 'm'}, + { "retry", 1, NULL, 'R'}, + { NULL, 0, NULL, 0} + }; + int c; + + for (;;) { + c = getopt_long(argc, argv, "HKSVa:n:op:qr:d:s:tu:vx:c:N:bmR:", + longopts, (int *) 0); + if (c == -1) + break; + switch (c) { + case 'H': /* --help */ + do_help(); + exit(0); + case 'K': /* --stop */ + stop = 1; + break; + case 'S': /* --start */ + start = 1; + break; + case 'V': /* --version */ + printf("start-stop-daemon " VERSION "\n"); + exit(0); + case 'a': /* --startas */ + startas = optarg; + break; + case 'n': /* --name */ + cmdname = optarg; + break; + case 'o': /* --oknodo */ + exitnodo = 0; + break; + case 'p': /* --pidfile */ + pidfile = optarg; + break; + case 'q': /* --quiet */ + quietmode = 1; + break; + case 's': /* --signal */ + signal_str = optarg; + break; + case 't': /* --test */ + testmode = 1; + break; + case 'u': /* --user | */ + userspec = optarg; + break; + case 'v': /* --verbose */ + quietmode = -1; + break; + case 'x': /* --exec */ + execname = optarg; + break; + case 'c': /* --chuid | */ + /* we copy the string just in case we need the + * argument later. */ + changeuser = strdup(optarg); + changeuser = strtok(changeuser, ":"); + changegroup = strtok(NULL, ":"); + break; + case 'r': /* --chroot /new/root */ + changeroot = optarg; + break; + case 'd': /* --namespace /.../||/name */ + add_namespace(optarg); + break; + case 'N': /* --nice */ + nicelevel = atoi(optarg); + break; + case 'b': /* --background */ + background = 1; + break; + case 'm': /* --make-pidfile */ + mpidfile = 1; + break; + case 'R': /* --retry | */ + schedule_str = optarg; + break; + default: + badusage(NULL); /* message printed by getopt */ + } + } + + if (signal_str != NULL) { + if (parse_signal (signal_str, &signal_nr) != 0) + badusage("signal value must be numeric or name" + " of signal (KILL, INTR, ...)"); + } + + if (schedule_str != NULL) { + parse_schedule(schedule_str); + } + + if (start == stop) + badusage("need one of --start or --stop"); + + if (!execname && !pidfile && !userspec && !cmdname) + badusage("need at least one of --exec, --pidfile, --user or --name"); + + if (!startas) + startas = execname; + + if (start && !startas) + badusage("--start needs --exec or --startas"); + + if (mpidfile && pidfile == NULL) + badusage("--make-pidfile is only relevant with --pidfile"); + + if (background && !start) + badusage("--background is only relevant with --start"); + +} + +static int +pid_is_exec(pid_t pid, const struct stat *esb) +{ + struct stat sb; + char buf[32]; + + sprintf(buf, "/proc/%d/exe", pid); + if (stat(buf, &sb) != 0) + return 0; + return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino); +} + + +static int +pid_is_user(pid_t pid, uid_t uid) +{ + struct stat sb; + char buf[32]; + + sprintf(buf, "/proc/%d", pid); + if (stat(buf, &sb) != 0) + return 0; + return (sb.st_uid == uid); +} + + +static int +pid_is_cmd(pid_t pid, const char *name) +{ + char buf[32]; + FILE *f; + int c; + + sprintf(buf, "/proc/%d/stat", pid); + f = fopen(buf, "r"); + if (!f) + return 0; + while ((c = getc(f)) != EOF && c != '(') + ; + if (c != '(') { + fclose(f); + return 0; + } + /* this hopefully handles command names containing ')' */ + while ((c = getc(f)) != EOF && c == *name) + name++; + fclose(f); + return (c == ')' && *name == '\0'); +} + + +static void +check(pid_t pid) +{ + if (execname && !pid_is_exec(pid, &exec_stat)) + return; + if (userspec && !pid_is_user(pid, user_id)) + return; + if (cmdname && !pid_is_cmd(pid, cmdname)) + return; + push(&found, pid); +} + +static void +do_pidfile(const char *name) +{ + FILE *f; + pid_t pid; + + f = fopen(name, "r"); + if (f) { + if (fscanf(f, "%d", &pid) == 1) + check(pid); + fclose(f); + } else if (errno != ENOENT) + fatal("open pidfile %s: %s", name, strerror(errno)); + +} + +/* WTA: this needs to be an autoconf check for /proc/pid existance. + */ +static void +do_procinit(void) +{ + DIR *procdir; + struct dirent *entry; + int foundany; + pid_t pid; + + procdir = opendir("/proc"); + if (!procdir) + fatal("opendir /proc: %s", strerror(errno)); + + foundany = 0; + while ((entry = readdir(procdir)) != NULL) { + if (sscanf(entry->d_name, "%d", &pid) != 1) + continue; + foundany++; + check(pid); + } + closedir(procdir); + if (!foundany) + fatal("nothing in /proc - not mounted?"); +} + +static void +do_findprocs(void) +{ + clear(&found); + + if (pidfile) + do_pidfile(pidfile); + else + do_procinit(); +} + +/* return 1 on failure */ +static void +do_stop(int signal_nr, int quietmode, int *n_killed, int *n_notkilled, int retry_nr) +{ + struct pid_list *p; + + do_findprocs(); + + *n_killed = 0; + *n_notkilled = 0; + + if (!found) + return; + + clear(&killed); + + for (p = found; p; p = p->next) { + if (testmode) + printf("Would send signal %d to %d.\n", + signal_nr, p->pid); + else if (kill(p->pid, signal_nr) == 0) { + push(&killed, p->pid); + (*n_killed)++; + } else { + printf("%s: warning: failed to kill %d: %s\n", + progname, p->pid, strerror(errno)); + (*n_notkilled)++; + } + } + if (quietmode < 0 && killed) { + printf("Stopped %s (pid", what_stop); + for (p = killed; p; p = p->next) + printf(" %d", p->pid); + putchar(')'); + if (retry_nr > 0) + printf(", retry #%d", retry_nr); + printf(".\n"); + } +} + + +static void +set_what_stop(const char *str) +{ + strncpy(what_stop, str, sizeof(what_stop)); + what_stop[sizeof(what_stop)-1] = '\0'; +} + +static int +run_stop_schedule(void) +{ + int r, position, n_killed, n_notkilled, value, ratio, anykilled, retry_nr; + struct timeval stopat, before, after, interval, maxinterval; + + if (testmode) { + if (schedule != NULL) { + printf("Ignoring --retry in test mode\n"); + schedule = NULL; + } + } + + if (cmdname) + set_what_stop(cmdname); + else if (execname) + set_what_stop(execname); + else if (pidfile) + sprintf(what_stop, "process in pidfile `%.200s'", pidfile); + else if (userspec) + sprintf(what_stop, "process(es) owned by `%.200s'", userspec); + else + fatal("internal error, please report"); + + anykilled = 0; + retry_nr = 0; + + if (schedule == NULL) { + do_stop(signal_nr, quietmode, &n_killed, &n_notkilled, 0); + if (n_notkilled > 0 && quietmode <= 0) + printf("%d pids were not killed\n", n_notkilled); + if (n_killed) + anykilled = 1; + goto x_finished; + } + + for (position = 0; position < schedule_length; ) { + value= schedule[position].value; + n_notkilled = 0; + + switch (schedule[position].type) { + + case sched_goto: + position = value; + continue; + + case sched_signal: + do_stop(value, quietmode, &n_killed, &n_notkilled, retry_nr++); + if (!n_killed) + goto x_finished; + else + anykilled = 1; + goto next_item; + + case sched_timeout: + /* We want to keep polling for the processes, to see if they've exited, + * or until the timeout expires. + * + * This is a somewhat complicated algorithm to try to ensure that we + * notice reasonably quickly when all the processes have exited, but + * don't spend too much CPU time polling. In particular, on a fast + * machine with quick-exiting daemons we don't want to delay system + * shutdown too much, whereas on a slow one, or where processes are + * taking some time to exit, we want to increase the polling + * interval. + * + * The algorithm is as follows: we measure the elapsed time it takes + * to do one poll(), and wait a multiple of this time for the next + * poll. However, if that would put us past the end of the timeout + * period we wait only as long as the timeout period, but in any case + * we always wait at least MIN_POLL_INTERVAL (20ms). The multiple + * (`ratio') starts out as 2, and increases by 1 for each poll to a + * maximum of 10; so we use up to between 30% and 10% of the + * machine's resources (assuming a few reasonable things about system + * performance). + */ + xgettimeofday(&stopat); + stopat.tv_sec += value; + ratio = 1; + for (;;) { + xgettimeofday(&before); + if (timercmp(&before,&stopat,>)) + goto next_item; + + do_stop(0, 1, &n_killed, &n_notkilled, 0); + if (!n_killed) + goto x_finished; + + xgettimeofday(&after); + + if (!timercmp(&after,&stopat,<)) + goto next_item; + + if (ratio < 10) + ratio++; + + TVCALC(interval, ratio * (TVELEM(&after) - TVELEM(&before) + TVADJUST)); + TVCALC(maxinterval, TVELEM(&stopat) - TVELEM(&after) + TVADJUST); + + if (timercmp(&interval,&maxinterval,>)) + interval = maxinterval; + + if (interval.tv_sec == 0 && + interval.tv_usec <= MIN_POLL_INTERVAL) + interval.tv_usec = MIN_POLL_INTERVAL; + + r = select(0,0,0,0,&interval); + if (r < 0 && errno != EINTR) + fatal("select() failed for pause: %s", + strerror(errno)); + } + + default: + assert(!"schedule[].type value must be valid"); + + } + + next_item: + position++; + } + + if (quietmode <= 0) + printf("Program %s, %d process(es), refused to die.\n", + what_stop, n_killed); + + return 2; + +x_finished: + if (!anykilled) { + if (quietmode <= 0) + printf("No %s found running; none killed.\n", what_stop); + return exitnodo; + } else { + return 0; + } +} + +/* +int main(int argc, char **argv) NONRETURNING; +*/ + +int +main(int argc, char **argv) +{ + progname = argv[0]; + + LIST_INIT(&namespace_head); + + parse_options(argc, argv); + argc -= optind; + argv += optind; + + if (execname && stat(execname, &exec_stat)) + fatal("stat %s: %s", execname, strerror(errno)); + + if (userspec && sscanf(userspec, "%d", &user_id) != 1) { + struct passwd *pw; + + pw = getpwnam(userspec); + if (!pw) + fatal("user `%s' not found\n", userspec); + + user_id = pw->pw_uid; + } + + if (changegroup && sscanf(changegroup, "%d", &runas_gid) != 1) { + struct group *gr = getgrnam(changegroup); + if (!gr) + fatal("group `%s' not found\n", changegroup); + runas_gid = gr->gr_gid; + } + if (changeuser && sscanf(changeuser, "%d", &runas_uid) != 1) { + struct passwd *pw = getpwnam(changeuser); + if (!pw) + fatal("user `%s' not found\n", changeuser); + runas_uid = pw->pw_uid; + if (changegroup == NULL) { /* pass the default group of this user */ + changegroup = ""; /* just empty */ + runas_gid = pw->pw_gid; + } + } + + if (stop) { + int i = run_stop_schedule(); + exit(i); + } + + do_findprocs(); + + if (found) { + if (quietmode <= 0) + printf("%s already running.\n", execname); + exit(exitnodo); + } + if (testmode) { + printf("Would start %s ", startas); + while (argc-- > 0) + printf("%s ", *argv++); + if (changeuser != NULL) { + printf(" (as user %s[%d]", changeuser, runas_uid); + if (changegroup != NULL) + printf(", and group %s[%d])", changegroup, runas_gid); + else + printf(")"); + } + if (changeroot != NULL) + printf(" in directory %s", changeroot); + if (nicelevel) + printf(", and add %i to the priority", nicelevel); + printf(".\n"); + exit(0); + } + if (quietmode < 0) + printf("Starting %s...\n", startas); + *--argv = startas; + if (changeroot != NULL) { + if (chdir(changeroot) < 0) + fatal("Unable to chdir() to %s", changeroot); + if (chroot(changeroot) < 0) + fatal("Unable to chroot() to %s", changeroot); + } + if (changeuser != NULL) { + if (setgid(runas_gid)) + fatal("Unable to set gid to %d", runas_gid); + if (initgroups(changeuser, runas_gid)) + fatal("Unable to set initgroups() with gid %d", runas_gid); + if (setuid(runas_uid)) + fatal("Unable to set uid to %s", changeuser); + } + + if (background) { /* ok, we need to detach this process */ + int i, fd; + if (quietmode < 0) + printf("Detatching to start %s...", startas); + i = fork(); + if (i<0) { + fatal("Unable to fork.\n"); + } + if (i) { /* parent */ + if (quietmode < 0) + printf("done.\n"); + exit(0); + } + /* child continues here */ + /* now close all extra fds */ + for (i=getdtablesize()-1; i>=0; --i) close(i); + /* change tty */ + fd = open("/dev/tty", O_RDWR); + ioctl(fd, TIOCNOTTY, 0); + close(fd); + chdir("/"); + umask(022); /* set a default for dumb programs */ + setpgid(0,0); /* set the process group */ + fd=open("/dev/null", O_RDWR); /* stdin */ + dup(fd); /* stdout */ + dup(fd); /* stderr */ + } + if (nicelevel) { + errno = 0; + if (nice(nicelevel) < 0 && errno) + fatal("Unable to alter nice level by %i: %s", nicelevel, + strerror(errno)); + } + if (mpidfile && pidfile != NULL) { /* user wants _us_ to make the pidfile :) */ + FILE *pidf = fopen(pidfile, "w"); + pid_t pidt = getpid(); + if (pidf == NULL) + fatal("Unable to open pidfile `%s' for writing: %s", pidfile, + strerror(errno)); + fprintf(pidf, "%d\n", pidt); + fclose(pidf); + } + set_namespaces(); + execv(startas, argv); + fatal("Unable to start %s: %s", startas, strerror(errno)); +} diff --git a/talimatname/genel/s/start-stop-daemon/talimat b/talimatname/genel/s/start-stop-daemon/talimat new file mode 100644 index 000000000..837390a6e --- /dev/null +++ b/talimatname/genel/s/start-stop-daemon/talimat @@ -0,0 +1,16 @@ +# Tanım: sistem servislerinin kontrol programı +# URL: http://man7.org/linux/man-pages/man8/start-stop-daemon.8.html +# Paketçi: milisarge +# Gerekler: + +isim=start-stop-daemon +surum=1.0 +devir=1 +kaynak=(start-stop-daemon.c start-stop-daemon.8 ornek_servis makefile) + +derle() { + make + install -d $PKG/{sbin,usr/share/man/man8} + install -m 755 $isim $PKG/sbin/ + install -m 644 $isim.8 $PKG/usr/share/man/man8/ +} diff --git a/talimatname/genel/s/startup-notification/talimat b/talimatname/genel/s/startup-notification/talimat new file mode 100644 index 000000000..b3f9fcd8d --- /dev/null +++ b/talimatname/genel/s/startup-notification/talimat @@ -0,0 +1,20 @@ +# Tanım: Uygulama başlatmayı izleme ve görüntüleme +# URL: http://freedesktop.org/wiki/Software/startup-notification +# Paketçi: milisarge +# Gerekler: xorg-libx11 xcb-util + +isim=startup-notification +surum=0.12 +devir=1 + +kaynak=(http://www.freedesktop.org/software/$isim/releases/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --infodir=/usr/share/info \ + --mandir=/usr/share/man + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/s/steghide/climit.diff b/talimatname/genel/s/steghide/climit.diff new file mode 100644 index 000000000..a7e54f51c --- /dev/null +++ b/talimatname/genel/s/steghide/climit.diff @@ -0,0 +1,11 @@ +diff -ruN steghide-0.5.1.orig/src/Graph.cc steghide-0.5.1/src/Graph.cc +--- steghide-0.5.1.orig/src/Graph.cc 2003-10-11 23:54:26.000000000 +0200 ++++ steghide-0.5.1/src/Graph.cc 2008-12-14 14:23:27.000000000 +0100 +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include "BitString.h" + #include "CvrStgFile.h" diff --git a/talimatname/genel/s/steghide/float-constexpr.diff b/talimatname/genel/s/steghide/float-constexpr.diff new file mode 100644 index 000000000..7c5fb3a91 --- /dev/null +++ b/talimatname/genel/s/steghide/float-constexpr.diff @@ -0,0 +1,24 @@ +diff -urN a/src/Arguments.h b/src/Arguments.h +--- a/src/Arguments.h 2017-02-25 20:00:52.071294580 +0100 ++++ b/src/Arguments.h 2017-02-25 20:02:45.312061439 +0100 +@@ -100,7 +100,7 @@ + static const VERBOSITY Default_Verbosity = NORMAL ; + static const unsigned long Default_Radius = 0 ; // there is no default radius for all file formats + static const unsigned int Max_Algorithm = 3 ; +- static const float Default_Goal = 100.0 ; ++ static constexpr float Default_Goal = 100.0 ; + static const DEBUGCOMMAND Default_DebugCommand = NONE ; + static const bool Default_Check = false ; + static const unsigned int Default_DebugLevel = 0 ; +diff -urN a/src/ProgressOutput.h b/src/ProgressOutput.h +--- a/src/ProgressOutput.h 2017-02-25 20:00:52.071294580 +0100 ++++ b/src/ProgressOutput.h 2017-02-25 20:03:13.528919155 +0100 +@@ -64,7 +64,7 @@ + **/ + void done (float rate, float avgweight = NoAvgWeight) const ; + +- static const float NoAvgWeight = -1.0 ; ++ static constexpr float NoAvgWeight = -1.0 ; + + protected: + std::string vcompose (const char *msgfmt, va_list ap) const ; diff --git a/talimatname/genel/s/steghide/talimat b/talimatname/genel/s/steghide/talimat new file mode 100644 index 000000000..c95606207 --- /dev/null +++ b/talimatname/genel/s/steghide/talimat @@ -0,0 +1,22 @@ +# Tanım: Ses ve resim dosyaları içinde veri gizleme uygulaması +# URL: http://steghide.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: mhash libmcrypt +# Grup: güvenlik + +isim=steghide +surum=0.5.1 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.bz2 + float-constexpr.diff + climit.diff + template-headers.diff) + +derle() { + cd $isim-$surum + cat $SRC/*.diff | patch -Np1 + CONFIG_SHELL=/bin/bash CXX='g++ -std=c++11' ./configure --prefix=/usr --mandir=/usr/share/man + make + make DESTDIR=$PKG PREFIX=/usr MANDIR=/usr/share/man install + rm -rf $PKG/usr/share/{doc,locale} +} diff --git a/talimatname/genel/s/steghide/template-headers.diff b/talimatname/genel/s/steghide/template-headers.diff new file mode 100644 index 000000000..36848dd4c --- /dev/null +++ b/talimatname/genel/s/steghide/template-headers.diff @@ -0,0 +1,75 @@ +diff -Naur steghide-0.5.1.orig/src/AuData.h steghide-0.5.1.new/src/AuData.h +--- steghide-0.5.1.orig/src/AuData.h 2003-09-28 11:30:29.000000000 -0400 ++++ steghide-0.5.1.new/src/AuData.h 2007-06-28 17:22:44.000000000 -0400 +@@ -26,22 +26,30 @@ + + // AuMuLawAudioData + typedef AudioDataImpl AuMuLawAudioData ; ++template<> + inline BYTE AuMuLawAudioData::readValue (BinaryIO* io) const { return (io->read8()) ; } ++template<> + inline void AuMuLawAudioData::writeValue (BinaryIO* io, BYTE v) const { io->write8(v) ; } + + // AuPCM8AudioData + typedef AudioDataImpl AuPCM8AudioData ; ++template<> + inline SBYTE AuPCM8AudioData::readValue (BinaryIO* io) const { return ((SBYTE) io->read8()) ; } ++template<> + inline void AuPCM8AudioData::writeValue (BinaryIO* io, SBYTE v) const { io->write8((BYTE) v) ; } + + // AuPCM16AudioData + typedef AudioDataImpl AuPCM16AudioData ; ++template<> + inline SWORD16 AuPCM16AudioData::readValue (BinaryIO* io) const { return ((SWORD16) io->read16_be()) ; } ++template<> + inline void AuPCM16AudioData::writeValue (BinaryIO* io, SWORD16 v) const { io->write16_be((UWORD16) v) ; } + + // AuPCM32AudioData + typedef AudioDataImpl AuPCM32AudioData ; ++template<> + inline SWORD32 AuPCM32AudioData::readValue (BinaryIO* io) const { return ((SWORD32) io->read32_be()) ; } ++template<> + inline void AuPCM32AudioData::writeValue (BinaryIO* io, SWORD32 v) const { io->write32_be((UWORD32) v) ; } + + #endif // ndef SH_AUDATA_H +diff -Naur steghide-0.5.1.orig/src/AuSampleValues.cc steghide-0.5.1.new/src/AuSampleValues.cc +--- steghide-0.5.1.orig/src/AuSampleValues.cc 2003-09-28 11:30:30.000000000 -0400 ++++ steghide-0.5.1.new/src/AuSampleValues.cc 2007-06-28 17:23:52.000000000 -0400 +@@ -21,17 +21,25 @@ + #include "AuSampleValues.h" + + // AuMuLawSampleValue ++template<> + const BYTE AuMuLawSampleValue::MinValue = 0 ; ++template<> + const BYTE AuMuLawSampleValue::MaxValue = BYTE_MAX ; + + // AuPCM8SampleValue ++template<> + const SBYTE AuPCM8SampleValue::MinValue = SBYTE_MIN ; ++template<> + const SBYTE AuPCM8SampleValue::MaxValue = SBYTE_MAX ; + + // AuPCM16SampleValue ++template<> + const SWORD16 AuPCM16SampleValue::MinValue = SWORD16_MIN ; ++template<> + const SWORD16 AuPCM16SampleValue::MaxValue = SWORD16_MAX ; + + // AuPCM32SampleValue ++template<> + const SWORD32 AuPCM32SampleValue::MinValue = SWORD32_MIN ; ++template<> + const SWORD32 AuPCM32SampleValue::MaxValue = SWORD32_MAX ; +diff -Naur steghide-0.5.1.orig/src/MHashPP.cc steghide-0.5.1.new/src/MHashPP.cc +--- steghide-0.5.1.orig/src/MHashPP.cc 2003-10-05 06:17:50.000000000 -0400 ++++ steghide-0.5.1.new/src/MHashPP.cc 2007-06-28 17:22:44.000000000 -0400 +@@ -120,7 +120,7 @@ + + std::string MHashPP::getAlgorithmName (hashid id) + { +- char *name = mhash_get_hash_name (id) ; ++ char *name = (char *) mhash_get_hash_name (id) ; + std::string retval ; + if (name == NULL) { + retval = std::string ("") ; diff --git a/talimatname/genel/s/stfl/talimat b/talimatname/genel/s/stfl/talimat new file mode 100644 index 000000000..5e98b5cee --- /dev/null +++ b/talimatname/genel/s/stfl/talimat @@ -0,0 +1,15 @@ +# Tanım: Metin terminalleri için curses tabanlı bir widget seti uygulayan kütüphane +# URL: http://www.clifford.at/stfl +# Paketçi: milisarge +# Gerekler: ncurses + +isim=stfl +surum=0.24 +devir=1 +kaynak=(http://www.clifford.at/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's|ncursesw/||' stfl_internals.h + make prefix=/usr FOUND_SWIG=0 DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/stopwatch/talimat b/talimatname/genel/s/stopwatch/talimat new file mode 100644 index 000000000..fadea2d3e --- /dev/null +++ b/talimatname/genel/s/stopwatch/talimat @@ -0,0 +1,16 @@ +# Tanım: Elle zamanlamayı fiziksel bir kronometrede olduğu gibi sağlar. Geri sayım sayacı olarak da kullanılabilir. +# URL: http://expect.sourceforge.net/stopwatch/ +# Paketçi: milisarge +# Gerekler: tcl tk + +isim=stopwatch +surum=3.4 +devir=1 +kaynak=(http://expect.sourceforge.net/$isim/$isim.tar.gz) + +derle() { + cd $isim-$surum + sed -i -e 's/depot\/path/usr\/bin/g' stopwatch + install -D -m0755 $isim $PKG/usr/sbin/$isim + +} diff --git a/talimatname/genel/s/strace/talimat b/talimatname/genel/s/strace/talimat new file mode 100644 index 000000000..831033ce2 --- /dev/null +++ b/talimatname/genel/s/strace/talimat @@ -0,0 +1,17 @@ +# Tanım: Sistem çağrı izleme programı (iz, makas, vb. gibi) +# URL: http://sourceforge.net/projects/strace/ +# Paketçi: milisarge +# Gerekler: libunwind + +isim=strace +surum=4.12 +devir=1 +kaynak=(http://download.sourceforge.net/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --with-libunwind + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/strigi/talimat b/talimatname/genel/s/strigi/talimat new file mode 100644 index 000000000..ee5637d01 --- /dev/null +++ b/talimatname/genel/s/strigi/talimat @@ -0,0 +1,25 @@ +# Tanım: Qt GUI ile hızlı tarama masaüstü arama motoru +# URL: http://strigi.sourceforge.net +# Paketçi: milisarge +# Gerekler: curl qt4 exiv2 ffmpeg libxml2 + +isim=strigi +surum=0.7.8 +devir=2 + +kaynak=( http://www.vandenoever.info/software/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +sed -i "s/BufferedStream :/STREAMS_EXPORT &/" libstreams/include/strigi/bufferedstream.h +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_CLUCENE=OFF \ + -DENABLE_CLUCENE_NG=OFF \ + .. +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/stunnel/cert-openssl.patch b/talimatname/genel/s/stunnel/cert-openssl.patch new file mode 100644 index 000000000..ef37d2aa6 --- /dev/null +++ b/talimatname/genel/s/stunnel/cert-openssl.patch @@ -0,0 +1,12 @@ +diff -rupN a/tools/makecert.sh b/tools/makecert.sh +--- a/tools/makecert.sh 2015-10-24 18:53:23.000000000 +0200 ++++ b/tools/makecert.sh 2015-11-25 05:05:53.936591000 +0100 +@@ -7,7 +7,7 @@ else + fi + + if test -n "$2"; then +- OPENSSL="$2/bin/openssl" ++ OPENSSL="/bin/openssl" + else + OPENSSL=openssl + fi diff --git a/talimatname/genel/s/stunnel/stunnel.conf b/talimatname/genel/s/stunnel/stunnel.conf new file mode 100644 index 000000000..b17220088 --- /dev/null +++ b/talimatname/genel/s/stunnel/stunnel.conf @@ -0,0 +1,21 @@ +; File: /etc/stunnel/stunnel.conf + +; Note: The pid and output locations are relative to the chroot location. + +pid = /run/stunnel.pid +chroot = /var/lib/stunnel +client = no +setuid = stunnel +setgid = stunnel +cert = /etc/stunnel/stunnel.pem + +;debug = 7 +;output = stunnel.log + +;[https] +;accept = 443 +;connect = 80 +;; "TIMEOUTclose = 0" is a workaround for a design flaw in Microsoft SSL +;; Microsoft implementations do not use SSL close-notify alert and thus +;; they are vulnerable to truncation attacks +;TIMEOUTclose = 0 diff --git a/talimatname/genel/s/stunnel/stunnel.kos-kur b/talimatname/genel/s/stunnel/stunnel.kos-kur new file mode 100644 index 000000000..8baa518d8 --- /dev/null +++ b/talimatname/genel/s/stunnel/stunnel.kos-kur @@ -0,0 +1,7 @@ +if [ -z "`grep '^stunnel:' etc/group`" ]; then + groupadd -g 51 stunnel +fi +if [ -z "`grep '^stunnel:' etc/passwd`" ]; then + useradd -c "stunnel Daemon" -d /var/lib/stunnel \ + -g stunnel -s /bin/false -u 51 stunnel +fi diff --git a/talimatname/genel/s/stunnel/stunnel.kur-kos b/talimatname/genel/s/stunnel/stunnel.kur-kos new file mode 100644 index 000000000..b67531cd3 --- /dev/null +++ b/talimatname/genel/s/stunnel/stunnel.kur-kos @@ -0,0 +1,2 @@ +install -v -m750 -o stunnel -g stunnel -d var/lib/stunnel/run +chown stunnel:stunnel var/lib/stunnel diff --git a/talimatname/genel/s/stunnel/talimat b/talimatname/genel/s/stunnel/talimat new file mode 100644 index 000000000..6ee05cf51 --- /dev/null +++ b/talimatname/genel/s/stunnel/talimat @@ -0,0 +1,37 @@ +# Tanım: Güvenli kanallar üzerinden iletişim kurabilmeniz için SSL içindeki keyfi TCP bağlantılarını şifreleyin +# URL: http://www.stunnel.org +# Paketçi: milisarge +# Gerekler: + +isim=stunnel +surum=5.26 +devir=2 + +kaynak=(ftp://ftp.stunnel.org/stunnel/archive/5.x/$isim-$surum.tar.gz cert-openssl.patch stunnel.conf) + +derle() { + + cd $isim-$surum + + patch -p1 -i $SRC/cert-openssl.patch + + source /etc/blfs-bootscripts + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-systemd + make + + make DESTDIR=$PKG install + + make DESTDIR=$PKG cert + + cd $scripts-$scriptsversion + make DESTDIR=$PKG install-stunnel + + install -v -m750 -d $PKG/etc/stunnel + cp -v $SRC/stunnel.conf $PKG/etc/stunnel/stunnel.conf + +} diff --git a/talimatname/genel/s/sublime-text/talimat b/talimatname/genel/s/sublime-text/talimat new file mode 100644 index 000000000..185f02cc3 --- /dev/null +++ b/talimatname/genel/s/sublime-text/talimat @@ -0,0 +1,20 @@ +# Tanım: Geliştiriciler için sofistike text editörü +# URL: https://www.sublimetext.com +# Paketçi: milisarge +# Gerekler: desktop-file-utils libpng gtk2 + +isim=sublime-text +surum=3 +devir=2 +kaynak=(https://download.sublimetext.com/sublime_text_3_build_3143_x64.tar.bz2) + +derle() { + cd $SRC/sublime_text_3 + + mkdir -p $PKG/usr/share/applications/ + mkdir -p $PKG/opt/sublime_text/ + + mv sublime_text.desktop $PKG/usr/share/applications/ + mv -v * $PKG/opt/sublime_text/ + rm $PKG/opt/sublime_text/python3.3.zip +} diff --git a/talimatname/genel/s/subversion/talimat b/talimatname/genel/s/subversion/talimat new file mode 100644 index 000000000..ef11c7ae8 --- /dev/null +++ b/talimatname/genel/s/subversion/talimat @@ -0,0 +1,27 @@ +# Tanım: Bir sürüm kontrol sistemi (CVS değiştirme) +# URL: http://subversion.apache.org +# Paketçi: milisarge@gmail.com +# Gerekler: apr serf cyrus-sasl + +isim=subversion +surum=1.9.3 +devir=1 +kaynak=(http://www.apache.org/dist/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --with-apr=/usr \ + --with-apr-util=/usr \ + --without-swig \ + --without-apxs \ + --disable-mod-activation \ + --disable-nls + + make + make -j1 DESTDIR=$PKG install + + # Makeinfo mevcut olduğunda bilgi sayfaları oluşturuluyor gibi görünüyor + rm -rf $PKG/usr/info +} diff --git a/talimatname/genel/s/supercat/talimat b/talimatname/genel/s/supercat/talimat new file mode 100644 index 000000000..be0d1244b --- /dev/null +++ b/talimatname/genel/s/supercat/talimat @@ -0,0 +1,17 @@ +# Tanım: Supercat, düzenli ifadeleri/dizeleri/karakterleri eşleştirerek metni renklendiren bir programdır. +# URL: http://supercat.nosredna.net +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: sistem + +isim=supercat +surum=0.5.6 +devir=1 +kaynak=(http://supercat.nosredna.net/supercat-$surum.tar.gz) + +derle() { + cd supercat-${surum} + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/supertux/talimat b/talimatname/genel/s/supertux/talimat new file mode 100644 index 000000000..d6fb28afc --- /dev/null +++ b/talimatname/genel/s/supertux/talimat @@ -0,0 +1,20 @@ +# Tanım: Bir zamanların efsane oyunu SuperMario benzeri bir oyun +# URL: http://supertux.github.io/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: sdl2-image physfs openal libogg libvorbis glew glbinding cmake boost + +isim=supertux +surum=0.5.1 +devir=1 +kaynak=(https://github.com/SuperTux/supertux/releases/download/v$surum/SuperTux-v$surum-Source.tar.gz) + +derle() { + cd SuperTux-v$surum-Source + cmake . \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DINSTALL_SUBDIR_BIN=bin \ + -DCMAKE_BUILD_TYPE=Release + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/supertuxkart/talimat b/talimatname/genel/s/supertuxkart/talimat new file mode 100644 index 000000000..3e21c5171 --- /dev/null +++ b/talimatname/genel/s/supertuxkart/talimat @@ -0,0 +1,30 @@ +# Tanım: 3D kart yarış oyunu +# URL: http://supertuxkart.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: cmake setconf bluez subversion xorg-mesa imagemagick openal libvorbis fribidi xorg-libxrandr xorg-glu + +isim=supertuxkart +surum=0.9.2 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum-src.tar.xz) + +derle() { + cd ${SRC}/supertuxkart-${surum} + + _fn="data/${isim}.desktop" + setconf "$_fn" Exec "$isim" + setconf "$_fn" TryExec "$isim" + setconf "$_fn" Icon "$isim"_128 + + [[ -d build ]] && rm -r build + mkdir build && cd build + + cmake .. \ + -DIRRLICHT_DIR="$SRC/irrlicht" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_CXX_FLAGS="-lpthread -lm -ldl $CXXFLAGS -std=gnu++98" + + make + make DESTDIR=${PKG} install +} diff --git a/talimatname/genel/s/sweeper/talimat b/talimatname/genel/s/sweeper/talimat new file mode 100644 index 000000000..5fd514f6a --- /dev/null +++ b/talimatname/genel/s/sweeper/talimat @@ -0,0 +1,23 @@ +# Tanım: Sistem Temizleyici +# URL: https://kde.org/applications/utilities/sweeper +# Paketçi: Cihan Alkan +# Gerekler: kf5-kio kf5-kactivities-stats +# Grup: sistem + +isim=sweeper +surum=17.12.0 +devir=1 +kaynak=(https://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + + mkdir -p build + cd build + cmake ../sweeper-$surum \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DBUILD_TESTING=OFF + make + + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/s/sweethome3d/talimat b/talimatname/genel/s/sweethome3d/talimat new file mode 100644 index 000000000..b583661b7 --- /dev/null +++ b/talimatname/genel/s/sweethome3d/talimat @@ -0,0 +1,120 @@ +# Tanım: Evinizin planını 3D ortamda çizmek için bir iç mekan tasarımı uygulaması +# URL: http://www.sweethome3d.com/ +# Paketçi: Oltulu +# Gerekler: shared-mime-info desktop-file-utils xorg-libxext xorg-libxrender openjdk +# Grup: grafik_tasarım + +isim=sweethome3d +surum=5.6 +devir=1 +kaynak=(http://downloads.sourceforge.net/${isim}/SweetHome3D-${surum}-linux-x64.tgz::SweetHome3D-${surum}-linux-x64.tgz) + +derle() { + cd $SRC + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Version=1.0 +Type=Application +Name=Sweet Home 3D +Comment=Bir iç tasarım uygulaması +TryExec=sweethome3d +Exec=sweethome3d %f +Icon=sweethome3d +Categories=Graphics;Office;Java; +StartupWMClass=com-eteks-sweethome3d-SweetHome3D +MimeType=application/x-sweethome3d + +EOF + +# SH +mkdir -pv $PKG/usr/bin && +cat > $PKG/usr/bin/$isim << "EOF" && +#!/bin/sh + +APP_CLASSPATH="" +JAVA_EXEC="" +JAVA_OPTS="${JAVA_OPTS} -Xmx1024m" + +if [ -n "${JAVA_HOME}" ] +then + if [ -x "${JAVA_HOME}/bin/java" ] + then + JAVA_EXEC="${JAVA_HOME}/bin/java" + fi +else + JAVA_EXEC="$(which java)" +fi + +if [ -z "${JAVA_EXEC}" ] +then + echo "No 'java' executable can be found, please set JAVA_HOME variable or" + echo "use the 'archlinux-java' script to set the Java version." + exit 1 +fi + +# Build classpath +APP_CLASSPATH="SweetHome3D.jar:Furniture.jar:Textures.jar:Help.jar:iText-2.1.7.jar:freehep-vectorgraphics-svg-2.1.1b.jar:sunflow-0.07.3i.jar:jmf.jar:batik-svgpathparser-1.7.jar" +if [ "${SWEETHOME3D_JAVA3D}" = "1.5" ] +then + JAVA_OPTS="${JAVA_OPTS} -Djava.library.path=/usr/lib/sweethome3d/java3d-1.5" + APP_CLASSPATH="${APP_CLASSPATH}:/usr/lib/sweethome3d/java3d-1.5/j3dcore.jar:/usr/lib/sweethome3d/java3d-1.5/j3dutils.jar:/usr/lib/sweethome3d/java3d-1.5/vecmath.jar" +else + JAVA_OPTS="${JAVA_OPTS} -Djava.library.path=/usr/lib/sweethome3d/java3d-1.6 -Djogamp.gluegen.UseTempJarCache=false" + APP_CLASSPATH="${APP_CLASSPATH}:/usr/lib/sweethome3d/java3d-1.6/j3dcore.jar:/usr/lib/sweethome3d/java3d-1.6/j3dutils.jar:/usr/lib/sweethome3d/java3d-1.6/vecmath.jar:/usr/lib/sweethome3d/java3d-1.6/gluegen-rt.jar:/usr/lib/sweethome3d/java3d-1.6/jogl-java3d.jar" +fi +APP_CLASSPATH="${APP_CLASSPATH}:javaws.jar" + +cd "/usr/share/java/sweethome3d" + +exec "${JAVA_EXEC}" \ + -classpath "${APP_CLASSPATH}" \ + ${JAVA_OPTS} \ + -Dcom.eteks.sweethome3d.applicationId=SweetHome3D#Installer \ + com.eteks.sweethome3d.SweetHome3D \ + -open "$1" + +EOF + +# Xml +mkdir -pv $PKG/usr/share/mime/packages && +cat > $PKG/usr/share/mime/packages/$isim.xml << "EOF" && + + + + Sweet Home 3D project + + + + +EOF + + # Lisansları kur + cd "SweetHome3D-${surum}" + install -m 755 -d "${PKG}/usr/share/licenses/${isim}" + install -m 755 -t "${PKG}/usr/share/licenses/${isim}" THIRDPARTY-LICENSE-* + # Install icon + install -m 644 -D "SweetHome3DIcon.png" "${PKG}/usr/share/pixmaps/${isim}.png" + # Install javaws.jar from jre8 + install -m 755 -d "${PKG}/usr/share/java/${isim}" + install -m 644 -t "${PKG}/usr/share/java/${isim}" jre8/lib/javaws.jar + # Install main program and libraries + cd "lib" + install -m 644 -t "${PKG}/usr/share/java/${isim}" *.jar + # Java3D 1.5 kütüphanesi + install -m 755 -d "${PKG}/usr/lib/${isim}/java3d-1.5" + mv -t "${PKG}/usr/lib/${isim}/java3d-1.5" \ + "${PKG}"/usr/share/java/${isim}/{j3dcore.jar,j3dutils.jar,vecmath.jar} + install -m 755 -t "${PKG}/usr/lib/${isim}/java3d-1.5" libj3dcore-ogl.so + # Java3D 1.6 kütüphanesi + install -m 755 -d "${PKG}/usr/lib/${isim}/java3d-1.6" + install -m 644 -t "${PKG}/usr/lib/${isim}/java3d-1.6" java3d-1.6/*.jar + install -m 755 -t "${PKG}/usr/lib/${isim}/java3d-1.6" java3d-1.6/*.so + +chmod 755 $PKG/usr/share/applications/$isim.desktop +chmod 644 ${PKG}/usr/share/mime/packages/${isim}.xml +chmod 755 ${PKG}/usr/bin/$isim +chmod +x ${PKG}/usr/bin/$isim +} diff --git a/talimatname/genel/s/swi-prolog/talimat b/talimatname/genel/s/swi-prolog/talimat new file mode 100644 index 000000000..68aac1887 --- /dev/null +++ b/talimatname/genel/s/swi-prolog/talimat @@ -0,0 +1,22 @@ +# Tanım: Prolog environment +# URL: http://www.swi-prolog.org/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo xorg-libxft xorg-libxinerama xorg-libxpm unixodbc +# Grup: geliştirme + +isim=swi-prolog +surum=7.6.4 +devir=1 +kaynak=(http://www.swi-prolog.org/download/stable/src/swipl-${surum/_/-}.tar.gz +) + +derle() { + cd "swipl-${surum/_/-}" + ./configure --with-world --prefix=/usr + (cd src; ./configure --enable-readline --prefix=/usr) + make + make -C "$SRC/swipl-${surum/_/-}" check || true + make -C "$SRC/swipl-${surum/_/-}" DESTDIR="$PKG" install + # Fix for FS#20873 + chmod +x "$PKG/usr/lib/swipl-${surum/_/-}/library/dialect/sicstus/swipl-lfr.pl" +} diff --git a/talimatname/genel/s/swig/talimat b/talimatname/genel/s/swig/talimat new file mode 100644 index 000000000..a6b0312b1 --- /dev/null +++ b/talimatname/genel/s/swig/talimat @@ -0,0 +1,18 @@ +# Tanım: SWIG Basitleştirilmiş Sarmalayıcı ve Arayüz Jeneratörü +# URL: http://www.swig.org/ +# Paketçi: milisarge +# Gerekler: pcre + +isim=swig +surum=3.0.12 +devir=1 + +kaynak=("http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz") + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + install -D -m644 LICENSE $PKG/usr/share/licenses/$isim/LICENSE +} diff --git a/talimatname/genel/s/sxhkd/sxhkd.kurkos b/talimatname/genel/s/sxhkd/sxhkd.kurkos new file mode 100644 index 000000000..aa4ba638f --- /dev/null +++ b/talimatname/genel/s/sxhkd/sxhkd.kurkos @@ -0,0 +1,3 @@ +mkdir -p ~/.config/sxhkd +cp /sources/milis.git/talimatname/genel/sxhkd/sxhkdrc ~/.config/sxhkd +echo "~/.config/sxhkd altındaki ayar dosyasına bakınız." diff --git a/talimatname/genel/s/sxhkd/sxhkdrc b/talimatname/genel/s/sxhkd/sxhkdrc new file mode 100644 index 000000000..8297d86ce --- /dev/null +++ b/talimatname/genel/s/sxhkd/sxhkdrc @@ -0,0 +1,4 @@ +super + Escape + notify-send merhaba +super + F2 + notify-send gülegüle diff --git a/talimatname/genel/s/sxhkd/talimat b/talimatname/genel/s/sxhkd/talimat new file mode 100644 index 000000000..65d5b2d34 --- /dev/null +++ b/talimatname/genel/s/sxhkd/talimat @@ -0,0 +1,19 @@ +# Tanım: Sxhkd, komutları çalıştırarak girdi olaylarına tepki veren bir X arka plan programıdır. +# URL: https://github.com/baskerville/sxhkd +# Paketçi: milisarge +# Gerekler: libxcb xcb-util xcb-util-wm xcb-util-keysyms + +isim=sxhkd +surum=0.5.8 +devir=1 + +kaynak=(https://github.com/baskerville/sxhkd/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make PREFIX=/usr + make PREFIX=/usr DESTDIR="$PKG" install +} + + + diff --git a/talimatname/genel/s/sxiv/sxiv.giflib.patch b/talimatname/genel/s/sxiv/sxiv.giflib.patch new file mode 100644 index 000000000..54115553f --- /dev/null +++ b/talimatname/genel/s/sxiv/sxiv.giflib.patch @@ -0,0 +1,15 @@ +diff -rupN a/image.c b/image.c +--- a/image.c 2014-04-24 20:40:26.000000000 +0200 ++++ b/image.c 2014-05-27 11:39:41.786715632 +0200 +@@ -278,7 +278,11 @@ bool img_load_gif(img_t *img, const file + } + } while (rec != TERMINATE_RECORD_TYPE); + ++#if defined(GIFLIB_MAJOR) && GIFLIB_MAJOR >= 5 && GIFLIB_MINOR >= 1 ++ DGifCloseFile(gif, NULL); ++#else + DGifCloseFile(gif); ++#endif + + if (err && !file->loaded) + warn("corrupted gif file: %s", file->name); diff --git a/talimatname/genel/s/sxiv/talimat b/talimatname/genel/s/sxiv/talimat new file mode 100644 index 000000000..769bd5f13 --- /dev/null +++ b/talimatname/genel/s/sxiv/talimat @@ -0,0 +1,22 @@ +# Tanım: Basit X resim görüntüleyici. +# URL: https://github.com/muennich/sxiv +# Paketçi: milisarge +# Gerekler: desktop-file-utils hicolor-icon-theme imlib2 + +isim=sxiv +surum=1.2 +devir=1 + +kaynak=( +https://github.com/muennich/sxiv/archive/v$surum.tar.gz +sxiv.giflib.patch) + +derle(){ + cd $isim-$surum + patch -p1 -i ../sxiv.giflib.patch + make + make PREFIX=/usr DESTDIR=$PKG install + make -C icon PREFIX=/usr DESTDIR=$PKG install + install -Dm644 sxiv.desktop \ + $PKG/usr/share/applications/sxiv.desktop +} diff --git a/talimatname/genel/s/sylpheed/sylpheed.kur-kos b/talimatname/genel/s/sylpheed/sylpheed.kur-kos new file mode 100644 index 000000000..21f842bd7 --- /dev/null +++ b/talimatname/genel/s/sylpheed/sylpheed.kur-kos @@ -0,0 +1 @@ +update-desktop-database -q diff --git a/talimatname/genel/s/sylpheed/talimat b/talimatname/genel/s/sylpheed/talimat new file mode 100644 index 000000000..4629a95a4 --- /dev/null +++ b/talimatname/genel/s/sylpheed/talimat @@ -0,0 +1,25 @@ +# Tanım: Hafif ve kullanıcı dostu e-posta istemcisi +# URL: http://sylpheed.sraoss.jp/en/ +# Paketçi: milisarge +# Gerekler: atk expat freetype glib libpng pcre cairo cyrus-sasl xorg-fontconfig libassuan libgpg-error openldap pango gtk2 gnupg gpgme desktop-file-utils + +isim=sylpheed +surum=3.6.0 +devir=1 + +kaynak=(http://sylpheed.sraoss.jp/sylpheed/v${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --enable-static=no \ + --disable-gtkspell \ + --disable-gtktest \ + --disable-compface \ + --enable-gpgme \ + --enable-ssl \ + --enable-ldap + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/syndication/talimat b/talimatname/genel/s/syndication/talimat new file mode 100644 index 000000000..129d31a49 --- /dev/null +++ b/talimatname/genel/s/syndication/talimat @@ -0,0 +1,21 @@ +# Tanım: S/Atom ayrıştırıcı kitaplığı +# URL : https://projects.kde.org/syndication +# Paketçi: cihanAlkan +# Gerekler: kf5-extra-cmake-modules python kf5-kio + +isim=syndication +surum=17.12.0 +devir=1 + +kaynak=(http://download.kde.org/stable/applications/$surum/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/syntax-highlighting/talimat b/talimatname/genel/s/syntax-highlighting/talimat new file mode 100644 index 000000000..888b40a27 --- /dev/null +++ b/talimatname/genel/s/syntax-highlighting/talimat @@ -0,0 +1,23 @@ +# Tanım: Yapılandırılmış metin ve kod için sözdizimi vurgulama motoru +# URL: https://community.kde.org/Frameworks +# Paketçi: CihanAlkan +# Gerekler: kf5-extra-cmake-modules qt5 doxygen +# Grup: kde + +isim=syntax-highlighting +surum=5.41.0 +devir=1 +kaynak=(https://download.kde.org/stable/frameworks/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum + mkdir -p build + cd build +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DLIB_INSTALL_DIR=lib \ + -DBUILD_TESTING=OFF \ + -Wno-dev .. + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/s/sysfsutils/talimat b/talimatname/genel/s/sysfsutils/talimat new file mode 100644 index 000000000..b363bd552 --- /dev/null +++ b/talimatname/genel/s/sysfsutils/talimat @@ -0,0 +1,17 @@ +# Tanım: Sysfs temelli sistem araçları +# URL: http://linux-diag.sourceforge.net/Sysfsutils.html +# Paketçi: milisarge +# Gerekler: + +isim=sysfsutils +surum=2.1.0 +devir=2 +kaynak=(http://downloads.sourceforge.net/project/linux-diag/$isim/$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --mandir=/usr/share/man + make + make DESTDIR=$PKG install + rm -f $PKG/usr/bin/dlist_test +} diff --git a/talimatname/genel/s/syslinux/talimat b/talimatname/genel/s/syslinux/talimat new file mode 100644 index 000000000..7c608b663 --- /dev/null +++ b/talimatname/genel/s/syslinux/talimat @@ -0,0 +1,18 @@ +# Tanım: FAT, ext2 /3/4 ve btrfs dosya sistemlerinden, CD'lerden ve PXE'den önyükleme yapan önyükleyici yükleyicileri +# URL: http://syslinux.org +# Paketçi: milisarge +# Gerekler: mtools nasm + +isim=syslinux +surum=6.03 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/utils/boot/syslinux/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + sed -i "s|win32/syslinux.exe||g" Makefile + make || true + make SBINDIR=$PKG/usr/sbin BINDIR=$PKG/usr/bin INCDIR=$PKG/usr/include MANDIR=$PKG/usr/share/man AUXDIR=$PKG/usr/lib/syslinux install +} + diff --git a/talimatname/genel/s/sysstat/talimat b/talimatname/genel/s/sysstat/talimat new file mode 100644 index 000000000..4d87458f9 --- /dev/null +++ b/talimatname/genel/s/sysstat/talimat @@ -0,0 +1,20 @@ +# Tanım: Sistem performansını ve kullanım etkinliğini izlemek için kullanılan yardımcı programlar. +# URL: http://perso.wanadoo.fr/sebastien.godard +# Paketçi: milisarge +# Gerekler: + +isim=sysstat +surum=11.6.1 +devir=1 +kaynak=(http://perso.wanadoo.fr/sebastien.godard/sysstat-$surum.tar.xz) + +derle() { + cd $isim-$surum + sa_lib_dir=/usr/lib/sa \ + sa_dir=/var/log/sa \ + conf_dir=/etc/sysconfig \ + ./configure --prefix=/usr \ + --disable-file-attr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/system-config-printer/0001-Fix-constructing-the-auth-dialog.patch b/talimatname/genel/s/system-config-printer/0001-Fix-constructing-the-auth-dialog.patch new file mode 100644 index 000000000..a6dde49d1 --- /dev/null +++ b/talimatname/genel/s/system-config-printer/0001-Fix-constructing-the-auth-dialog.patch @@ -0,0 +1,31 @@ +From 2766d74a98e44693f5e966d541a6303b966c088b Mon Sep 17 00:00:00 2001 +Message-Id: <2766d74a98e44693f5e966d541a6303b966c088b.1518105780.git.jan.steffens@gmail.com> +From: "Jan Alexander Steffens (heftig)" +Date: Thu, 8 Feb 2018 17:01:01 +0100 +Subject: [PATCH] Fix constructing the auth dialog + +47973c80 (Remove deprecated Gtk objects) broke the auth dialog. + +Fixes https://bugs.archlinux.org/task/57364. +--- + authconn.py | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/authconn.py b/authconn.py +index 2a645dcc..0f3021cb 100644 +--- a/authconn.py ++++ b/authconn.py +@@ -78,11 +78,9 @@ class AuthDialog(Gtk.Dialog): + field = auth_info_required[i] + label = Gtk.Label (label=_(self.AUTH_FIELD.get (field, field))) + label.set_alignment (0, 0.5) +- grid.attach (label, 0, 1, i, i + 1) + grid.attach (label, 0, i, 1, 1) + entry = Gtk.Entry () + entry.set_visibility (field != 'password') +- grid.attach (entry, 1, 2, i, i + 1, 0, 0) + grid.attach (entry, 1, i, 1, 1) + self.field_entry.append (entry) + +-- +2.16.1 diff --git a/talimatname/genel/s/system-config-printer/talimat b/talimatname/genel/s/system-config-printer/talimat new file mode 100644 index 000000000..597497ffc --- /dev/null +++ b/talimatname/genel/s/system-config-printer/talimat @@ -0,0 +1,23 @@ +# Tanım: Bir CUPS yazıcı yapılandırma aracı ve durum uygulaması +# URL: https://github.com/zdohnal/system-config-printer +# Packager: Cihan_Alkan +# Gerekler: intltool xmlto docbook-xsl desktop-file-utils pychardet pycertifi pyidna libsecret pycups pydbus pycurl libnotify pyrequests python3-gobject gtk3 python3-cairo +# Grup: sistem + +isim=system-config-printer +surum=1.5.11 +devir=1 +kaynak=(https://github.com/zdohnal/system-config-printer/releases/download/$surum/system-config-printer-${surum}.tar.xz + 0001-Fix-constructing-the-auth-dialog.patch) + +derle() { + cd ${isim}-${surum} + patch -Np1 -i ../0001-Fix-constructing-the-auth-dialog.patch + + ./configure --prefix=/usr \ + --sbindir=/usr/bin \ + --sysconfdir=/etc \ + --with-udevdir=/usr/lib/udev --with-udev-rules + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/s/system-tools-backends/talimat b/talimatname/genel/s/system-tools-backends/talimat new file mode 100644 index 000000000..a1c398f57 --- /dev/null +++ b/talimatname/genel/s/system-tools-backends/talimat @@ -0,0 +1,18 @@ +# Tanım: Sistem Araçları Arka Uçları, Linux ve diğer Unix sistemleri için bir dizi çapraz platform komut dosyasıdır. +# URL: http://www.gnome.org +# Paketçi: milisarge +# Gerekler: perl-xml-parser dbus-glib polkit + +isim=system-tools-backends +surum=2.10.2 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/s/systemtap/talimat b/talimatname/genel/s/systemtap/talimat new file mode 100644 index 000000000..0901f70cb --- /dev/null +++ b/talimatname/genel/s/systemtap/talimat @@ -0,0 +1,24 @@ +# Tanım: Çalışan Linux sistemi hakkında bilgi toplamanın basitleştirilmesi için altyapı. +# URL: http://sourceware.org/systemtap/ +# Paketçi: milisarge +# Gerekler: elfutils + +isim=systemtap +surum=2.9 +devir=1 +kaynak=(http://sourceware.org/$isim/ftp/releases/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --mandir=/usr/man \ + --libexecdir=/usr/lib \ + --disable-rpath \ + + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/s/sysv-rc-conf/sysv-rc-conf.pl b/talimatname/genel/s/sysv-rc-conf/sysv-rc-conf.pl new file mode 100755 index 000000000..a68146b3c --- /dev/null +++ b/talimatname/genel/s/sysv-rc-conf/sysv-rc-conf.pl @@ -0,0 +1,1226 @@ +#!/usr/bin/perl -w +# This program is distributed under the terms of the GNU General Public License +# +# This file is part of sysv-rc-conf. +# +# sysv-rc-conf is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# sysv-rc-conf is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with sysv-rc-conf; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Copyright 2004 Joe Oppegaard +# +use strict; +use Getopt::Long qw(:config no_ignore_case); + +use Curses; +use Curses::UI; + +use constant { + BOTTOM_LAB_HEIGHT => 2, + BOTTOM_WIN_HEIGHT => 4, + DEFAULT_K_PRI => 80, + DEFAULT_S_PRI => 20, + LABEL_WIDTH => 10, + LIST_SN_LENGTH => 12, + LIST_SN_PAD => 1, + MAX_ROWS => 8, + TOP_LABEL_HEIGHT => 2, +}; + +my $VERSION = "0.98"; + +my %opts = ( + cache_dir => "/var/lib/sysv-rc-conf", + order => 'a', + priority => '', + root => '/', + show => '', + verbose => '', + chkcfg_levels => '2345', # default runlevels to affect if not specified + chkcfg_list => undef, + chkcfg_sn => '', + chkcfg_state => '', +); + +GetOptions("cache=s" => \$opts{cache_dir}, + "level=s" => \$opts{chkcfg_levels}, + "list:s" => \$opts{chkcfg_list}, + "order=s" => \$opts{order}, + "priority" => \$opts{priority}, + "root=s" => \$opts{root}, + "show=s" => \$opts{show}, + "verbose=s" => \$opts{verbose}, + "Version" => sub { print STDERR "$0 $VERSION\n"; exit; }, + ); + +my $runlevel_cmd = '/sbin/runlevel'; + +$opts{verbose} ||= "/dev/null"; +open VERBOSE, "> $opts{verbose}" or die "Can't open $opts{verbose} : $!"; + +my $etc_rc = $opts{root} . "/etc/rc.d/rc"; +my $initd = $opts{root} . "/etc/init.d"; + +my @rls = qw/ 1 2 3 4 5 7 8 9 0 6 S /; + +check_args(); +setup_cache_env(); + +my @show_rls = split //, $opts{show}; + +# Page index +my $current_screen = 0; + +# Page screens +my @s = (); + +# All the runlevel information +my %runlevels = runlevel_status(); + +list_output(%runlevels) if defined $opts{chkcfg_list}; +chkconfig_emulation(); + +my $cui = new Curses::UI( -clear_on_exit => 0, + -color_support => 1, + -default_colors => 1, + ) or die "Can't create base Curses::UI object"; + +create_bottom_box(); + +# Get the service names for each screen +my @snames_per_screen = split_services(); + +create_main_window(); + +my %box_pos = (x => '00', y => '00'); + +$cui->set_binding( \&toggle_help, "h" ); +$cui->set_binding( \&revert_changes, "r") ; +$cui->set_binding( sub { exit }, "q" ); + +$cui->set_binding( \&next_page, "\cN" ); +$cui->set_binding( \&prev_page, "\cP" ); + +$s[$current_screen]->focus(); + +$cui->mainloop(); + +#--- rc access and modification subs ---# +sub update_link +{ + my ($sn, $rl, $sk, $pri) = @_; + + if (defined $sn && defined $rl && defined $sk && defined $pri) { + if (-e "$etc_rc$rl.d/$sk$pri$sn") { + # The symlink we are trying to make already exists + return 'exists'; + } + } + + opendir (RL, "$etc_rc$rl.d") or die "$0: opendir $etc_rc$rl.d : $!"; + + foreach (grep { /[SK]\d\d$sn/i } readdir(RL)) { + verbose("rm $etc_rc$rl.d/$_"); + unlink "$etc_rc$rl.d/$_" + or die "Can't unlink $etc_rc$rl.d/$_ : $!"; + } + + # If in priority mode and are completely deleting the link, $sk will + # be empty. + return 1 if $sk eq ''; + + $pri = get_pri_cache($sn, $rl, $sk) unless $pri; + + unless ($pri =~ /^\d\d$/) { die "Priority isn't two numbers: $pri" } + unless ($sk =~ /^[SK]$/) { die "You have to use S or K to start a link" } + + verbose("symlink $initd/$sn $etc_rc$rl.d/$sk$pri$sn"); + # unlike ln relative symlinks are relative to the target file, not the cwd + symlink "../init.d/$sn", "$etc_rc$rl.d/$sk$pri$sn" + or die "Can't symlink $etc_rc$rl.d/$sk$pri$sn to ../init.d/$sn : $!\n"; +} + +sub usage +{ + print STDERR <] +USAGE +} + +sub chkconfig_emulation +{ + $opts{chkcfg_sn} = $ARGV[0] if defined $ARGV[0]; + $opts{chkcfg_state} = $ARGV[1] if defined $ARGV[1]; + + if ($opts{chkcfg_sn} && not $opts{chkcfg_state}) { + # Check to see if service is configured to run in current rl + # exit true if it is, false if not. + # See chkconfig(8) + my $current_rl = current_runlevel(); + if (exists $runlevels{$opts{chkcfg_sn}}{$current_rl}) { + if ($runlevels{$opts{chkcfg_sn}}{$current_rl} =~ /^S/) { + # Service is configured to start, exit true + exit 0; + } + } + exit 1; + } + + if ($opts{chkcfg_sn} && $opts{chkcfg_state}) { + my $sk = ''; + if ($opts{chkcfg_state} =~ /^on$/i) { + $sk = 'S'; + } + elsif ($opts{chkcfg_state} =~ /^off$/i) { + $sk = 'K'; + } + else { + usage(); + } + + foreach (split //, $opts{chkcfg_levels}) { + update_link($opts{chkcfg_sn}, $_, $sk, undef); + } + + exit 0; + } + + # Program isn't being called like chkconfig, so return to normal + # operation. + return 1; +} + +sub list_output +{ + my (%runlevels) = @_; + + # There was an argument to --list + my $opt_sn = $opts{chkcfg_list}; + foreach my $sn (sort keys %runlevels) { + my $output = substr $sn, 0, LIST_SN_LENGTH; + $output .= " " until length $output >= LIST_SN_LENGTH + LIST_SN_PAD; + + foreach my $rl (sort keys %{$runlevels{$sn}}) { + $output .= "$rl:"; + if ($runlevels{$sn}{$rl} =~ /^[Ss]/) { + $output .= "on"; + } + else { + $output .= "off"; + } + $output .= "\t"; + } + chop($output); + $output .= "\n"; + if ($opt_sn) { + print $output if $sn eq $opt_sn; + } + else { + print $output; + } + } + + exit 0; +} + +sub revert_changes +{ + # Lookup table + my %cache = (); + foreach my $scr (@s) { + for (my $i = 0; $i < max_services() ; $i++) { + for (my $j = 0; $j <= $#show_rls; $j++) { + my $obj = $scr->getobj(zero_pad($i).zero_pad($j)); + my $ud = $obj->userdata(); + + $cache{ $ud->{sn} }{ $ud->{runlevel} } = $obj; + } + } + } + + foreach my $sn (keys %runlevels) { + foreach my $rl (keys %{$runlevels{$sn}}) { + $runlevels{$sn}{$rl} =~ /^([SK])(\d\d)$/; + my ($sk, $pri) = ($1, $2); + + next if update_link($sn, $rl, $sk, $pri) eq 'exists'; + + if (exists($cache{$sn}{$rl})) { + my $box = $cache{$sn}{$rl}; + if ($opts{priority}) { + # Reset the text + $box->text($sk.$pri); + $box->draw(1); + } + else { + # Simple layout, just toggle the box. + $box->toggle(); + $box->draw(1); + } + } + + + } + } + + $cui->dialog("Symlinks restored to original state!"); +} + +sub start_service +{ + my ($widget) = @_; + my $ud = $widget->userdata(); + + st_service($ud->{sn}, 'start'); +} + +sub stop_service +{ + my ($widget) = @_; + my $ud = $widget->userdata(); + + st_service($ud->{sn}, 'stop'); +} + +sub st_service +{ + my ($sn, $st) = @_; + + my $output = `$initd/$sn $st`; + + verbose("$initd/$sn $st : $output"); + $cui->dialog("Results of $initd/$sn $st :\n" . $output); +} + +sub get_pri_cache +{ + my ($sn, $rl, $sk) = @_; + # See if we can get an exact match from the cache, if not try to match + # the S or K except in a different run level, if there still is not a match + # get the opposite of S or K on another runlevel, if still no match return + # the default. + + open CACHE, "< $opts{cache_dir}/services" + or die "Can't open $opts{cache_dir}/services : $!"; + + chomp (my @cache = ); + close CACHE; + + # Try an exact cache match + foreach (@cache) { + # $arg_rl $arg_sk $arg_pri $arg_sn + next unless /^$rl\s+$sk\s+(\d\d)\s+$sn$/; + verbose("Got exact cache match for priority: $_"); + return $1; + } + + # Try an $sk match, except on any runlevel + foreach (@cache) { + next unless /^[\dsS]\s+$sk\s+(\d\d)\s+$sn$/; + verbose("Got differing runlevel cache for priority: $_"); + return $1; + } + + # Ok, try to match on any runlevel with either S or K + foreach (@cache) { + next unless /^[\dsS]\s+([SK])\s+(\d\d)\s+$sn$/; + verbose("Returning difference of 100 and $2: $_"); + # Sequence numbers are usually defined as stop = 100 - start + # So that means that start = 100 - stop + # Above we would have returned if $sk eq $1 so we know that $1 is + # the opposite of $sk. So return 100 - $2. + return zero_pad(100 - $2); + } + + verbose("No cache found, returning default"); + return DEFAULT_S_PRI if $sk eq 'S'; + return DEFAULT_K_PRI if $sk eq 'K'; +} + +sub pri_box_changed +{ + my ($widget) = @_; + + my $ud = $widget->userdata(); + my $new_link = $widget->get(); + + if ($new_link eq $ud->{last_good_text}) { + # Text didn't actually change, just moved out of the box + return 1; + } + + if ($new_link =~ /^([KS])(\d\d)$/ or $new_link =~ /^$/) { + my ($sk, $pri) = ('', ''); + if (defined $1 and defined $2) { + $sk = $1; + $pri = $2; + } + + update_link($ud->{sn}, $ud->{runlevel}, $sk, $pri); + + $ud->{last_good_text} = $new_link; + } + else { + $cui->error("Incorrect format: $new_link\n" . + "The correct format is a K or S followed by two digits!\n" . + "Returning field back to original state." + ); + + # Set the text in the box back to whatever the last good text was. + $widget->{-text} = $ud->{last_good_text}; + } +} + +sub simple_box_changed +{ + my ($box) = @_; + my $userdata = $box->userdata(); + + $userdata->{changed}++; + + if ($box->get()) { + update_link($userdata->{sn}, $userdata->{runlevel}, 'S', undef) + } + else { + update_link($userdata->{sn}, $userdata->{runlevel}, 'K', undef) + } +} + +sub runlevel_status +{ + my %runlevels = (); + + opendir (INITD, $initd) or die "$0: opendir $initd : $!"; + while ( defined(my $service = readdir INITD) ) { + next if $service =~ /\.sh$/; # see the debian policy manual + next if $service =~ /^\.+$/; # ignore . and .. + next unless -x "$initd/$service"; # ignore stuff like README + $runlevels{$service} = { }; + } + closedir INITD or die "$0: closedir $initd : $!"; + + # While 7-9 usually aren't used, init supports it. + foreach my $rl (@rls) { + unless (opendir(DIR, "$etc_rc$rl.d")) { + next if $rl =~ /^[789S]$/; + die "$0: opendir $etc_rc$rl.d : $!"; + } + while ( defined(my $file = readdir DIR) ) { + $file = "$etc_rc$rl.d/$file"; # Add the pathname to the file + next unless -l $file; + next if $file =~ /\.sh$/; + next unless $file =~ /([SK])(\d\d)(.+)$/; + my ($sk, $pri, $sn) = ($1, $2, $3); + $runlevels{$sn}{$rl} = $sk.$pri; + } + closedir DIR or die "$0: closedir $etc_rc$rl.d : $!"; + } + + update_cache(\%runlevels); + return %runlevels; +} + +sub setup_cache_env +{ + unless (-e $opts{cache_dir}) { + verbose("Creating non-existant cache directory: $opts{cache_dir}"); + mkdir $opts{cache_dir} or die "Can't create $opts{cache_dir} : $!"; + } + + unless (-e "$opts{cache_dir}/services") { + # Later we need to open the file with +< which can't create a new file + # so we'll emulate touch. + verbose("Touching $opts{cache_dir}/services"); + open CACHE, "> $opts{cache_dir}/services" + or die "Can't touch $opts{cache_dir}/services : $!"; + close CACHE; + } +} + +sub update_cache +{ + my ($runlevels) = @_; + + open CACHE, "+< $opts{cache_dir}/services" + or die "Can't open $opts{cache_dir}/services for rw access : $!"; + + # Check to see if this service & rl already exists somewhere in this file + # and update the line if so. + my %touched = (); + while () { + chomp; + next unless /^([\dSs])\s+([SK])\s+(\d\d)\s+([^\s]+)$/; + + my ($rl, $sk, $pri, $sn) = ($1, $2, $3, $4); + + if (exists $runlevels->{$sn}{$rl}) { + $runlevels->{$sn}{$rl} =~ /^([SK])(\d\d)$/; + $touched{$sn}{$rl} = 1; + + my ($n_sk, $n_pri) = ($1, $2); + next if $sk eq $n_sk && $pri eq $n_pri; + + s/^.+$/$rl $n_sk $n_pri $sn/; + } + } + + foreach my $sn (sort keys %{$runlevels}) { + foreach my $rl (sort keys %{$runlevels->{$sn}}) { + unless (exists $touched{$sn}{$rl}) { + $runlevels->{$sn}{$rl} =~ /^([SK])(\d\d)$/; + print CACHE "$rl $1 $2 $sn\n"; + } + } + } + + close CACHE or die "Can't close $opts{cache_dir}/services : $!"; +} + +#--- Misc subs ---# +sub check_args +{ + $opts{show} ||= get_default_show(); + + unless ($opts{show} =~ /^[S0-9]*$/) { + die "$0: --show must match [S0-9]\n"; + } + + if (length($opts{show}) > MAX_ROWS) { + die "$0: can only show ". MAX_ROWS . "rows at a time\n"; + } + + return 1; +} + +sub current_runlevel +{ + if (-e $runlevel_cmd) { + my $rl_out = `$runlevel_cmd`; + $rl_out = 1 if $rl_out =~ /unknown/; + $rl_out =~ /^\S\s?([Ss\d])?$/ or + die "Unknown return from $runlevel_cmd : $rl_out"; + return $1; + } + else { + return 1; + } +} + + +sub split_services +{ + # Figure out how many services can fit on the screen, then make + # as many screens as needed to fit all the services. + my @screens = (); + + my @services = (); + + my %o_opts = (); + $o_opts{p} = 1 if $opts{order} =~ /p/; + $o_opts{n} = 1 if $opts{order} =~ /n/; + $o_opts{a} = 1 unless exists $o_opts{p}; + + if ($opts{order} =~ /([Ss\d])/) { + $o_opts{rl} = $1; + } + else { + # If the --order option didn't set a runlevel to sort by, then + # use the current runlevel (from the output of /sbin/runlevel) or + # sort by runlevel 1 if the runlevel command doesn't exsist on this + # system. + $o_opts{rl} = current_runlevel(); + } + + # Process the opts we just set. + if (exists $o_opts{a}) { + if (exists $o_opts{n}) { + # Include the priority num on an alpha sort + foreach my $sn (sort keys %runlevels) { + next unless exists $runlevels{$sn}{$o_opts{rl}}; + next unless $runlevels{$sn}{$o_opts{rl}} =~ /^[SK](\d\d)$/; + push @services, $1.$sn; + } + } + else { + # Standard alpha sort + @services = sort keys %runlevels; + } + } + elsif (exists $o_opts{p}) { + # Sort by priority at runlevel specified or current runlevel + + my @tmp_order = ( [ ], [ ] ); # S is 0 and K is 1 + foreach my $sn (keys %runlevels) { + next unless exists $runlevels{$sn}{$o_opts{rl}}; + next unless $runlevels{$sn}{$o_opts{rl}} =~ /^([SK])(\d\d)$/; + + if ($1 eq 'S') { push @{$tmp_order[0]}, $2.$sn } + elsif ($1 eq 'K') { push @{$tmp_order[1]}, $2.$sn } + } + + foreach (0, 1) { + foreach my $ddsn (sort @{$tmp_order[$_]}) { + $ddsn =~ /^(\d\d)(.+)$/; + if (exists $o_opts{n}) { + # Include the priority num on a pri sort + push @services, $1.$2; + } + else { + push @services, $2; + } + } + } + } + + { + # We could be missing some services if they didn't have a link in the + # runlevel we were sorting by. This happens in all circumstances except + # the default of just 'a' being set. + my %seen = (); + foreach (@services) { + next unless $_ =~ /^(\d\d)?(.+)$/; + $seen{$2} = 1; + } + + foreach (sort keys %runlevels) { + unless (exists $seen{$_}) { + push(@services, $_); + } + } + } + + my $per_screen = max_services(); + + my $i = 0; + do { + $screens[$i] = [ splice(@services, 0, $per_screen) ]; + $i++; + } while @services; + + return @screens; +} + +sub max_services +{ + my $tmp_screen = $cui->add( + undef, 'Window', + -title => "N/A", + -border => 1, + -padtop => 1, + -padbottom => 4, + -ipad => 1, + ); + + my $ms = $tmp_screen->canvasheight() - TOP_LABEL_HEIGHT; + undef $tmp_screen; # Make sure the memory is cleaned up. + + return $ms; +} + +sub get_default_show +{ + my $show = ''; + foreach (@rls) { + if (-e "$etc_rc$_.d") { + $show .= $_; + } + } + return $show; +} + +sub zero_pad { sprintf('%.2u', $_[0]); } + +sub verbose { print VERBOSE $_[0]."\n" if $opts{verbose}; } + + +#--- Screen layout subs ---# +sub create_main_window +{ + create_help_window(); + + my $i = 0; + foreach my $services (@snames_per_screen) { + + # First create the main window all of this page of services goes in + my $id = "window_$i"; + my $screen = $cui->add( + $id, 'Window', + -title => +"SysV Runlevel Config -: stop service =/+: start service h: help q: quit", + -border => 1, + -padtop => 1, + -padbottom => 4, + -ipad => 1, + ); + + # Can't set these globally (on $cui) or else it overrides the + # keybindings on all other objects + $screen->set_binding( \&move_up, KEY_UP(), ); + $screen->set_binding( \&move_down, KEY_DOWN(), ); + $screen->set_binding( \&move_left, KEY_LEFT(), ); + $screen->set_binding( \&move_right, KEY_RIGHT(), ); + + create_top_label($screen); + + my $left_label = ''; + for (my $i = 0; $i < scalar(@$services); $i++) { + $left_label .= $services->[$i] . "\n"; + if ($services->[$i] =~ /^\d\d(.+)$/) { + # If the labels had numbers, we don't need them anymore. + $services->[$i] = $1; + } + } + + my $row = TOP_LABEL_HEIGHT; + + $screen->add( + undef, 'Label', + -text => $left_label, + -y => $row, + -width => LABEL_WIDTH, + -height => last_x() + 1, + ); + + foreach my $sn (@$services) { + if ($opts{priority}) { draw_priority_layout($screen, $sn, $row) } + else { draw_simple_layout($screen, $sn, $row) } + + $row++; + } + + $s[$i] = $screen; + + $i++; + } +} + +sub create_help_window +{ + my $help_text = < +EOF + + my $hw = $cui->add( + 'help_window', 'Window', + -title => +"SysV Runlevel Config -: stop service =/+: start service h: help q: quit", + -border => 1, + -padtop => 1, + -padbottom => 4, + -ipad => 1, + -userdata => 0, + ); + + $hw->add( + 'help_tv', 'TextViewer', + -text => $help_text, + -title => 'sysv-rc-conf help', + -vscrollbar => 1, + ); + +} + +sub draw_simple_layout +{ + my ($screen, $sn, $row) = @_; + + for (my $i = 0, my $right_n = 12; $i <= $#show_rls; $i++, $right_n += 8) { + my $on_or_off = 0; + # We only want to show S\d\d services as selected. + $on_or_off = 1 if exists $runlevels{$sn}{$show_rls[$i]} + && $runlevels{$sn}{$show_rls[$i]} =~ /^S\d\d$/; + + my $box = $screen->add( + zero_pad($row-2).zero_pad($i), 'Checkbox', + -label => '', + -checked => $on_or_off, + -border => 0, + -x => $right_n, + -y => $row, + -width => 5, + #-height => 1, + -userdata => { id => zero_pad($row-2).zero_pad($i), + sn => $sn, + changed => 0, + runlevel => $show_rls[$i], + }, + -onchange => \&simple_box_changed, + -onfocus => \&got_focus, + ); + + $box->set_binding( \&start_service, "=", "+" ); + $box->set_binding( \&stop_service, "-" ); + } +} + +sub draw_priority_layout +{ + my ($screen, $sn, $row) = @_; + + for (my $i = 0, my $right_n = 11; $i <= $#show_rls; $i++, $right_n += 8) { + my $text = exists $runlevels{$sn}{$show_rls[$i]} + ? $runlevels{$sn}{$show_rls[$i]} + : ''; + my $box = $screen->add( + zero_pad($row-2).zero_pad($i), 'TextEntry', + -sbborder => 1, + -x => $right_n, + -y => $row, + -width => 6, + -maxlength => 3, + -regexp => '/^[skSK\d]*$/', + -toupper => 1, + -showoverflow => 0, + -text => $text, + -userdata => { id => zero_pad($row-2).zero_pad($i), + sn => $sn, + changed => 0, + runlevel => $show_rls[$i], + last_good_text => $text, + }, + -onblur => \&pri_box_changed, + -onfocus => \&got_focus, + ); + + $box->set_binding( \&start_service, "=", "+" ); + $box->set_binding( \&stop_service, "-" ); + } +} + +sub create_top_label +{ + my ($window) = @_; + + my @label_rls = @show_rls; + + my $text = 'service ' . shift @label_rls; + foreach (@label_rls) { $text .= " $_" }; + $text .= "\n"; + $text .= "-" x 76; + + $window->add( + undef, 'Label', + -text => $text, + -y => 0, + -x => 0, + -height => TOP_LABEL_HEIGHT, + -textalignment => 'left', + ); +} + +sub create_bottom_box +{ + my $cmd_text = ''; + + if ($opts{priority}) { + $cmd_text = +"Editing: Backspace: bs ^d: delete ^b: backward ^f: forward"; + } + else { + $cmd_text = +" space: toggle service on / off ", + } + + my $exp_window = $cui->add( + 'exp_window', 'Window', + -border => 1, + -y => -1, + -height => BOTTOM_WIN_HEIGHT, + -ipadleft => 1, + -ipadright => 1, + ); + $exp_window->add(undef, 'Label', + -y => 0, + -width => -1, + -height => BOTTOM_LAB_HEIGHT, + -text => +"Use the arrow keys or mouse to move around. ^n: next pg ^p: prev pg\n$cmd_text", + ); +} + +sub toggle_help +{ + my $hw = $cui->getobj('help_window'); + my $hw_data = $hw->userdata(); + + if ($hw_data == 0) { + $hw->userdata($cui->getfocusobj); + $hw->focus(); + } + else { + # The help window is up, so turn it off by focusing the last + # object that was focused on before we pulled up the help window + $hw_data->focus(); + $hw->userdata(0); + } +} + +#--- Movement subs ---# +sub next_page +{ + $current_screen++; + $current_screen = 0 if $current_screen > last_screen(); + verbose("Going to screen $current_screen"); + _move_focus(00, $box_pos{y}); +} + +sub prev_page +{ + $current_screen--; + $current_screen = last_screen() if $current_screen < 0; + verbose("Going to screen $current_screen"); + $box_pos{x} = last_x(); + _move_focus($box_pos{x}, $box_pos{y}); +} + +sub got_focus +{ + my $widget = shift; + # Is there a better way to figure out my own id besides putting it + # in userdata on creation and fetching it? + my $userdata = $widget->userdata(); + my $id = $userdata->{id}; + + $id =~ /^(\d\d)(\d\d)$/; + + $box_pos{x} = $1; + $box_pos{y} = $2; +} + +sub move_left +{ + return if $box_pos{y} eq '00'; + _move_focus($box_pos{x}, $box_pos{y} - 1); +} + +sub move_right +{ + return if $box_pos{y} == scalar(@show_rls)-1; + _move_focus($box_pos{x}, $box_pos{y} + 1); +} + +sub move_up +{ + #return if $box_pos{x} eq '00'; + return prev_page() if $box_pos{x} eq '00'; + _move_focus($box_pos{x} - 1, $box_pos{y}); +} + +sub move_down +{ + # Index starts at 00, so we need one less then the max services that + # are on the screen. + return next_page() if $box_pos{x} == last_x(); + _move_focus($box_pos{x} + 1, $box_pos{y}); +} + +sub _move_focus +{ + $box_pos{x} = $_[0]; + $box_pos{y} = $_[1]; + my $box = $s[$current_screen]->getobj(zero_pad($_[0]).zero_pad($_[1])); + $box->focus(); +} + +sub last_x { return scalar(@{$snames_per_screen[$current_screen]})-1; } + +sub first_screen { return 0 } + +sub last_screen { return scalar(@s)-1 } + +=pod + +=head1 NAME + +B - Run-level configuration for SysV like init script links + +=head1 SYNOPSIS + +B [ I ] + +B [ --level I ] I EIE + +=head1 DESCRIPTION + +B gives an easy to use interface for managing +C symlinks. The interface comes in two different +flavors, one that simply allows turning services on or off and another that +allows for more fine tuned management of the symlinks. It's a replacement for +programs like B or B. + +B can also be used at the command line when the desired changes +to the symlinks are already known. The syntax is borrowed from B. + +=head1 GENERAL OPTIONS + +=over + +=item B<-c> DIRECTORY, B<--cache=>DIRECTORY + +The directory where the priority numbers, old runlevel configuration, etc. +should be stored. This defaults to C. See the FILES +section below. + +=item B<-r> DIRECTORY, B<--root=>DIRECTORY + +The root directory to use. This defaults to C. This comes in handy if the +root file system is mounted somewhere else, such as when using a rescue disk. + +=item B<-v> FILE, B<--verbose=>FILE + +Print verbose information to C + +=item B<-V>, B<--Version> + +Print version information to STDOUT and exit + +=back + +=head1 GUI RELATED OPTIONS + +=over + +=item B<-o> [ see description ], B<--order=>[ see description ] + +Allows various sorting orders and ways to display the rows. The argument can be +made up of any of the following: + +=over + +=item B + +Sort the rows Blphabetically. This is the default if the B<-o> option isn't +specified. + +=item B + +Show the priority numbers along with the name of the service. + +=item B

+ +Sorts by the B

riority numbers. + +=item B + +I can be any runlevel, 0-9 or S. This controls which runlevel the +priority numbers are sorted at. It only makes sense to use this in conjuntion +with B

. If omitted the priority numbers are sorted by the current runlevel +the system is in. + +=back + +=item B<-p>, B<--priority> + +Alternate layout. Instead of just showing a checkbox, the priority of the +service and the S or K are allowed to be edited. This is for more fine tuned +control then the default layout allows. + +=item B<-s> I, B<--show=>I + +Which runlevels to show. This defaults to up to 8 of the runlevels available +on the system. Usually this means it will show 1, 2, 3, 4, 5, 0, 6, and S. +The syntax calls for the runlevels to be allruntogether. For instance, to +show runlevels 3, 4, and 5 the syntax would be C<--show=345>. Also see +B<--order>. + +=back + +=head1 CLI RELATED OPTIONS + +=over + +=item B<--level> I + +The runlevels this operation will affect. I can be any number from +0-9 or S. For example, B<--level 135> will affect runlevels 1, 3, and 5. +If B<--level> is not set, the default is to affect runlevels 2, 3, 4, and 5. +This option is only used for the command line interface, see the section +below labled USING THE CLI for more information. + +=item B<--list> [I] + +This option will list all of the services and if they are stopped or started +when entering each runlevel. If I is specified, only the information +for that service is displayed. + +=back + +=head1 USING THE GUI + +=head2 Using the Default layout + +The default (simple) layout shows in a grid fashion all of the services that +are in C and which runlevels they are turned on at. For example, where +the C row and C<3> column intersect, if there is a checkbox there that +means the service will be turned on when entering runlevel 3. If there is no +checkbox it can mean that either there are no links to the service in that +specific runlevel, or that the service is turned off when entering that +runlevel. If more configuration detail is needed, see the next paragraph and +the B<--priority> option. + +=head2 Using the Priority layout + +The priority (advanced) layout also uses a grid fashion, but instead of +checkboxes there are text boxes that can have a few different values. If the +text box is blank, that means there isn't a symlink in that runlevel for that +service. This means that when changing into that runlevel that the service +will not be started or stopped, which is significant. If the text box starts +with the letter K that means that the service will be stopped when entering +that runlevel. If the text box starts with the letter S that means the service +will be started when entering that runlevel. The two digits following is the +order in which the services are started. That means that C would +start before C. For more information see your system documentation. + +=head2 Controls + +To move around use the arrow keys, or if the terminal support it, the mouse. +Typically there is more then one page of services (unless the terminal screen +is large), to move between the pages use CTRL-n or CTRL-p, or simply arrow key +down or up at the bottom or top of the screen, respectively. The bottom of the +screen also shows these movement commands for quick reference. To restore the +symlinks back to their original state before the B was run, +press the B key. The B key will display a quick reference help screen. + +=head2 Default layout + +When using the default layout use the space bar to toggle the service on / off. + +=head2 Priority layout + +The priority layout uses the default movement keys. In order to edit the fields +you can use CTRL-d to delete the character in front of the cursor or backspace +to backspace. Use CTRL-b or CTRL-f to move the cursor backwards or forwards +within the field. Note that only S, K, or any digit is allowed to be entered +into the field. + +=head2 Starting / Stopping Services + +To start a service, press the C<+> or C<=> key. +To stop a service, press the C<-> key. + +This will call C or C. + +=head1 USING THE CLI + +If the desired modifications to the symlinks are known and only one quick +change is needed, then you can use a CLI interface to B. +Examples: + + # sysv-rc-conf --level 35 ssh off + # sysv-rc-conf atd on + +The first example will turn ssh off on levels 3 and 5. The second example +turns atd on for runlevels 2, 3, 4, and 5. + +=head1 FILES + +B Feel free to skip this section + +B stores a cache of all the symlink information from +C in C (See the --cache +option to change the location of this file). It uses this cache to make an +intelligent decision on what priority number to give the K or S link when they +are changed in the simple layout. This cache is updated/created everytime the +program is launched. The format of the file is as follows: + + RUNLEVEL S|K PRIORITY SERVICE + +Here's a few examples: + + 2 K 74 ntpd + 2 K 50 xinetd + 3 S 08 iptables + 3 S 80 sendmail + +B will first see if it can get an exact match from the cache. +For example, if the symlink for C in runlevel 3 is S89cron and you +uncheck it, B will first see if there is an entry in the cache +that looks like C<3 K nn cron>, if so it will use nn for the priority number. + +If there wasn't a match, B will then see if there is another S or +K (whichever you're switching to, so in this example, K) entry on a different +runlevel - so an entry like C, where i is any runlevel. If found, +the link will use nn. + +If there still wasn't a match, B will look for the opposite of S +or K in any run level, and use 100 - that priority. So in our example, +C. If nn is 20, then it will use 80 (100 - 20), since that is +typically the way that the priority numbers are used. + +If there still isn't a match, the default priority of 20 for S links is used, +and the default priority of 80 for K links is used. + +=head1 COMPATIBILITY + +B should work on any Unix like system that manages services +when changing runlevels by using symlinks in C. Refer +to your system documentation to see if that's the case (usually there's a +C). + +=head1 CAVEATS + +B only manages the symlinks in the C +directories. It's possible that pacakages may have other ways of being +disabled or enabled. + +Because Curses takes over the screen sometimes error messages won't be +seen on the terminal. If you run across any weird problems try redirecting +STDERR to a file when you execute the program. + +For example: + # sysv-rc-conf 2E err.out + +=head1 REPORTING BUGS + +Report bugs to Joe Oppegaard Ejoe@pidone.orgE + +=head1 SEE ALSO + +B, B, B, C + + www: http://sysv-rc-conf.sourceforge.net + ftp: ftp://ftp.pidone.org/sysv-rc-conf + +=head1 AUTHOR + +Joe Oppegaard Ejoe@pidone.orgE diff --git a/talimatname/genel/s/sysv-rc-conf/talimat b/talimatname/genel/s/sysv-rc-conf/talimat new file mode 100644 index 000000000..2a317b135 --- /dev/null +++ b/talimatname/genel/s/sysv-rc-conf/talimat @@ -0,0 +1,16 @@ +# Tanım: sysvinit yonetimi +# URL: http://sysv-rc-conf.sourceforge.net/ +# Maintainer: milisarge +# Paketçi: milisarge +# Gerekler: perl-curses perl-curses-ui perl-term-readkey + +isim=sysv-rc-conf +surum=0.98 +devir=1 +kaynak=($isim.pl) + +derle() { + mkdir $PKG/usr + mkdir $PKG/usr/bin + install -m755 $isim.pl $PKG/usr/bin/$isim +} diff --git a/talimatname/genel/t/t4k-common/libpng15.patch b/talimatname/genel/t/t4k-common/libpng15.patch new file mode 100644 index 000000000..29991544d --- /dev/null +++ b/talimatname/genel/t/t4k-common/libpng15.patch @@ -0,0 +1,18 @@ +--- src/t4k_common-0.1.1/src/t4k_loaders.c 2011-04-08 05:46:07.000000000 +0300 ++++ src.new/t4k_common-0.1.1/src/t4k_loaders.c 2012-05-02 10:35:41.836670434 +0300 +@@ -1028,12 +1028,9 @@ + { + png_init_io(png_ptr, fi); + +- info_ptr->width = surf->w; +- info_ptr->height = surf->h; +- info_ptr->bit_depth = 8; +- info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; +- info_ptr->interlace_type = 1; +- info_ptr->valid = 0; /* will be updated by various png_set_FOO() functions */ ++ png_set_IHDR(png_ptr, info_ptr, surf->w, surf->h, 8, ++ PNG_COLOR_TYPE_RGB_ALPHA, 1, ++ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + PNG_sRGB_INTENT_PERCEPTUAL); diff --git a/talimatname/genel/t/t4k-common/talimat b/talimatname/genel/t/t4k-common/talimat new file mode 100644 index 000000000..9ff3e00dc --- /dev/null +++ b/talimatname/genel/t/t4k-common/talimat @@ -0,0 +1,21 @@ +# Tanım: TuxType ve TuxMath tarafından paylaşılan kod için ortak kütüphane +# URL: http://tux4kids.alioth.debian.org/ +# Paketçi: Cihan Alkan +# Gerekler: sdl-image sdl-mixer sdl-net sdl-ttf sdl-pango librsvg + +isim=t4k-common +_isim=t4k_common +surum=0.1.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/tuxmath/$_name/$_name-$surum.tar.gz + libpng15.patch) + + +derle() { + cd $SRC/$_name-$surum + patch -Np2 -i "$SRC/libpng15.patch" + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/taglib-extras/talimat b/talimatname/genel/t/taglib-extras/talimat new file mode 100644 index 000000000..3bc59e6d7 --- /dev/null +++ b/talimatname/genel/t/taglib-extras/talimat @@ -0,0 +1,20 @@ +# Tanım: KDE için ek taglib eklentileri +# URL: http://developer.kde.org/~wheeler/taglib.html +# Paketçi: milisarge +# Gerekler: taglib + +isim=taglib-extras +surum=1.0.1 +devir=1 + +kaynak=(http://downloads.nutyx.org/files/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install + +} + + diff --git a/talimatname/genel/t/taglib/talimat b/talimatname/genel/t/taglib/talimat new file mode 100644 index 000000000..41fe86e21 --- /dev/null +++ b/talimatname/genel/t/taglib/talimat @@ -0,0 +1,21 @@ +# Tanım: Çeşitli popüler ses biçimlerinin meta verilerini okumak ve düzenlemek için bir kütüphane +# URL: http://developer.kde.org/~wheeler/taglib.html +# Paketçi: milisarge +# Gerekler: cmake + +isim=taglib +surum=1.10 +devir=1 + +kaynak=( https://taglib.github.io/releases/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + .. + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/talloc/talimat b/talimatname/genel/t/talloc/talimat new file mode 100644 index 000000000..20c43d54c --- /dev/null +++ b/talimatname/genel/t/talloc/talimat @@ -0,0 +1,17 @@ +# Tanım: Talloc, yıkıcılarla hiyerarşik, referans sayılmış bir bellek havuzu sistemidir.Samba'da kullanılan çekirdek bellek ayırıcısıdır. +# URL: https://talloc.samba.org +# Paketçi: milisarge +# Gerekler: python libxslt + +isim=talloc +surum=2.1.10 +devir=1 +kaynak=(https://www.samba.org/ftp/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --enable-talloc-compat1 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tango-icon-theme-extras/talimat b/talimatname/genel/t/tango-icon-theme-extras/talimat new file mode 100644 index 000000000..4dd246c07 --- /dev/null +++ b/talimatname/genel/t/tango-icon-theme-extras/talimat @@ -0,0 +1,18 @@ +# Tanım: Tango Masaüstü Projesi, sanatçıların ve tasarımcıların uyabileceği bir simge stili kılavuzunu tanımlar. +# URL: http://tango.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: icon-naming-utils imagemagick + +isim=tango-icon-theme-extras +surum=0.1.0 +devir=1 + +kaynak=(http://tango.freedesktop.org/releases/$isim-$surum.tar.gz) + +derle() +{ +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tango-icon-theme/talimat b/talimatname/genel/t/tango-icon-theme/talimat new file mode 100644 index 000000000..c83eaab1c --- /dev/null +++ b/talimatname/genel/t/tango-icon-theme/talimat @@ -0,0 +1,18 @@ +# Tanım: The Tango Desktop Project defines an icon style guideline to which artists and designers can adhere. +# URL: http://tango.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: icon-naming-utils imagemagick + +isim=tango-icon-theme +surum=0.8.90 +devir=1 + +kaynak=(http://tango.freedesktop.org/releases/$isim-$surum.tar.gz) + +derle() +{ +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tcl/talimat b/talimatname/genel/t/tcl/talimat new file mode 100644 index 000000000..aaeb37efc --- /dev/null +++ b/talimatname/genel/t/tcl/talimat @@ -0,0 +1,40 @@ +# Tanım: Tcl betik dili +# URL: http://www.tcl.tk/ +# Paketçi: milisarge +# Gerekler: + +isim=tcl +surum=8.6.4 +devir=1 + +kaynak=( http://downloads.sourceforge.net/$isim/$isim$surum-src.tar.gz) + +derle() { +# build package +cd $isim$surum/unix + +if [ "$CARCH" = "x86_64" ]; then + ./configure --prefix=/usr --mandir=/usr/share/man --enable-threads --enable-64bit +else + ./configure --prefix=/usr --mandir=/usr/share/man --enable-threads --disable-64bit +fi + +make +sed -e "s#$SRCDIR/unix#/usr/lib#" \ + -e "s#$SRCDIR#/usr/include#" \ + -i tclConfig.sh +sed -e "s#$SRCDIR/unix/pkgs/tdbc1.0.3#/usr/lib/tdbc1.0.3#" \ + -e "s#$SRCDIR/pkgs/tdbc1.0.3/generic#/usr/include#" \ + -e "s#$SRCDIR/pkgs/tdbc1.0.3/library#/usr/lib/tcl8.6#" \ + -e "s#$SRCDIR/pkgs/tdbc1.0.3#/usr/include#" \ + -i pkgs/tdbc1.0.3/tdbcConfig.sh +sed -e "s#$SRCDIR/unix/pkgs/itcl4.0.3#/usr/lib/itcl4.0.3#" \ + -e "s#$SRCDIR/pkgs/itcl4.0.3/generic#/usr/include#" \ + -e "s#$SRCDIR/pkgs/itcl4.0.3#/usr/include#" \ + -i pkgs/itcl4.0.3/itclConfig.sh +unset SRCDIR +make DESTDIR=$PKG install +make DESTDIR=$PKG install-private-headers +ln -svf tclsh8.6 $PKG/usr/bin/tclsh +chmod -v 755 $PKG/usr/lib/libtcl8.6.so +} diff --git a/talimatname/genel/t/tcpdump/talimat b/talimatname/genel/t/tcpdump/talimat new file mode 100644 index 000000000..bfde5c738 --- /dev/null +++ b/talimatname/genel/t/tcpdump/talimat @@ -0,0 +1,17 @@ +# Tanım: Komut satırı arayüzü ile ağ algılayıcısı +# URL: http://www.tcpdump.org +# Paketçi: milisarge +# Gerekler: libpcap + +isim=tcpdump +surum=4.9.0 +devir=1 +kaynak=(http://www.tcpdump.org/release/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --enable-ipv6 + make + make DESTDIR=$PKG install + rm $PKG/usr/sbin/tcpdump.$surum +} diff --git a/talimatname/genel/t/tcptraceroute/talimat b/talimatname/genel/t/tcptraceroute/talimat new file mode 100644 index 000000000..0feeb3526 --- /dev/null +++ b/talimatname/genel/t/tcptraceroute/talimat @@ -0,0 +1,22 @@ +# Tanım: TCP paketlerini kullanan bir traceroute uygulaması. +# URL: http://michael.toren.net/code/tcptraceroute/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: libpcap libnet + +isim=tcptraceroute +surum=1.5beta7 +devir=1 +kaynak=(https://github.com/mct/tcptraceroute/archive/tcptraceroute-${surum}.tar.gz) + +derle() { + cd "$SRC/tcptraceroute-tcptraceroute-$surum" + + ./configure --prefix=/usr --sysconfdir=/etc + + mkdir -p "$PKG/usr/share" + + make + make DESTDIR=$PKG install + + mv "$PKG/usr/man" "$PKG/usr/share/" +} diff --git a/talimatname/genel/t/tdb/talimat b/talimatname/genel/t/tdb/talimat new file mode 100644 index 000000000..e2448ae0e --- /dev/null +++ b/talimatname/genel/t/tdb/talimat @@ -0,0 +1,19 @@ +# Tanım: GDBM'ye benzer basit bir Veritabanı, ancak aynı anda taahhütlere izin verir +# URL: http://tdb.samba.org/ +# Paketçi: milisarge +# Gerekler: python libxslt docbook-xsl + +isim=tdb +surum=1.3.15 +devir=1 +kaynak=(http://samba.org/ftp/${isim}/${isim}-${surum}.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --localstatedir=/var \ + --sysconfdir=/etc/samba + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/t/telegram-bin/talimat b/talimatname/genel/t/telegram-bin/talimat new file mode 100644 index 000000000..8f2397a82 --- /dev/null +++ b/talimatname/genel/t/telegram-bin/talimat @@ -0,0 +1,16 @@ +# Tanım: Güvenli IM platformu olan Telegram uygulaması +# URL: http://www.telegram.org +# Paketçi: milisarge +# Gerekler: + +isim=telegram-bin +surum=0.9.49 +devir=1 +kaynak=(https://updates.tdesktop.com/tlinux/tsetup.$surum.tar.xz) + +derle() { + cd Telegram + + install -Dm755 Telegram $PKG/usr/bin/telegram + install -Dm755 Updater $PKG/usr/bin/updater +} diff --git a/talimatname/genel/t/telegram-cli/talimat b/talimatname/genel/t/telegram-cli/talimat new file mode 100644 index 000000000..1cfcec2e7 --- /dev/null +++ b/talimatname/genel/t/telegram-cli/talimat @@ -0,0 +1,22 @@ +# Tanım: Telegram mesajlaşma konsol uygulaması +# URL: https://github.com/vysheng/tg +# Paketçi: milisarge +# Gerekler: git libconfig libevent lua jansson +# Grup: ağ + +isim=telegram-cli +surum=git +devir=1 +kaynak=(telegram-cli.patch) + +derle() { + git_indir https://github.com/vysheng/tg $isim + cd "$SRC/$isim" + git submodule update --init --recursive --force + patch -p1 < "$SRC/$isim.patch" + ./configure + make + cd "$SRC/$isim" + install -Dm644 tg-server.pub ${PKG}/etc/telegram-cli/server.pub + install -Dm755 bin/telegram-cli ${PKG}/usr/bin/telegram-cli +} diff --git a/talimatname/genel/t/telegram-cli/telegram-cli.patch b/talimatname/genel/t/telegram-cli/telegram-cli.patch new file mode 100644 index 000000000..2d2b7b04e --- /dev/null +++ b/talimatname/genel/t/telegram-cli/telegram-cli.patch @@ -0,0 +1,90 @@ +diff --git a/tgl/crypto/rsa_pem_openssl.c b/tgl/crypto/rsa_pem_openssl.c +index db653f2..5e6a697 100644 +--- a/tgl/crypto/rsa_pem_openssl.c ++++ b/tgl/crypto/rsa_pem_openssl.c +@@ -36,6 +36,12 @@ TGLC_WRAPPER_ASSOC(rsa,RSA) + // TODO: Refactor crucial struct-identity into its own header. + TGLC_WRAPPER_ASSOC(bn,BIGNUM) + ++/* ++ * Since OpenSSL version 1.1.0 the RSA struct (rsa_st) is opaque, ++ * see also https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes ++ */ ++#if (OPENSSL_VERSION_NUMBER < 0x10100000L) ++ + TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) { + RSA *ret = RSA_new (); + ret->e = unwrap_bn (TGLC_bn_new ()); +@@ -47,7 +53,30 @@ TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) { + #define RSA_GETTER(M) \ + TGLC_bn *TGLC_rsa_ ## M (TGLC_rsa *key) { \ + return wrap_bn (unwrap_rsa (key)->M); \ +- } \ ++ } ++ ++#else // OPENSSL_VERSION_NUMBER ++ ++TGLC_rsa *TGLC_rsa_new (unsigned long e, int n_bytes, const unsigned char *n) { ++ RSA *ret = RSA_new (); ++ BIGNUM *ret_e = unwrap_bn (TGLC_bn_new ()); ++ BIGNUM *ret_n = unwrap_bn (TGLC_bn_bin2bn (n, n_bytes, NULL)); ++ RSA_set0_key (ret, ret_n, ret_e, NULL); ++ TGLC_bn_set_word (wrap_bn (ret_e), e); ++ return wrap_rsa (ret); ++} ++ ++#define RSA_GETTER(M) \ ++TGLC_bn *TGLC_rsa_ ## M (TGLC_rsa *key) { \ ++ BIGNUM *rsa_n, *rsa_e, *rsa_d; \ ++ RSA_get0_key(unwrap_rsa (key), \ ++ (const BIGNUM **) &rsa_n, \ ++ (const BIGNUM **) &rsa_e, \ ++ (const BIGNUM **) &rsa_d); \ ++ return wrap_bn (rsa_ ## M); \ ++} ++ ++#endif // OPENSSL_VERSION_NUMBER + + RSA_GETTER(n); + RSA_GETTER(e); +@@ -60,4 +89,4 @@ TGLC_rsa *TGLC_pem_read_RSAPublicKey (FILE *fp) { + return wrap_rsa (PEM_read_RSAPublicKey (fp, NULL, NULL, NULL)); + } + +-#endif ++#endif // TGL_AVOID_OPENSSL +diff --git a/tgl/mtproto-utils.c b/tgl/mtproto-utils.c +index 0948bc8..cfdb216 100644 +--- a/tgl/mtproto-utils.c ++++ b/tgl/mtproto-utils.c +@@ -98,7 +98,7 @@ static unsigned long long BN2ull (TGLC_bn *b) { + if (sizeof (unsigned long) == 8) { + return TGLC_bn_get_word (b); + } else if (sizeof (unsigned long long) == 8) { +- assert (0); // As long as nobody ever uses this code, assume it is broken. ++// assert (0); // As long as nobody ever uses this code, assume it is broken. + unsigned long long tmp; + /* Here be dragons, but it should be okay due to be64toh */ + TGLC_bn_bn2bin (b, (unsigned char *) &tmp); +@@ -112,7 +112,7 @@ static void ull2BN (TGLC_bn *b, unsigned long long val) { + if (sizeof (unsigned long) == 8 || val < (1ll << 32)) { + TGLC_bn_set_word (b, val); + } else if (sizeof (unsigned long long) == 8) { +- assert (0); // As long as nobody ever uses this code, assume it is broken. ++// assert (0); // As long as nobody ever uses this code, assume it is broken. + htobe64(val); + /* Here be dragons, but it should be okay due to htobe64 */ + TGLC_bn_bin2bn ((unsigned char *) &val, 8, b); +diff --git a/tgl/tl-parser/tl-parser.c b/tgl/tl-parser/tl-parser.c +index 524b196..aeadbd2 100644 +--- a/tgl/tl-parser/tl-parser.c ++++ b/tgl/tl-parser/tl-parser.c +@@ -1903,7 +1903,7 @@ struct tl_combinator_tree *tl_parse_args134 (struct tree *T) { + //assert (S->data); + char *name = S->data; + if (!name) { +- static char s[20]; ++ static char s[21]; + sprintf (s, "%lld", lrand48 () * (1ll << 32) + lrand48 ()); + name = s; + } diff --git a/talimatname/genel/t/telepathy-accounts-signon/talimat b/talimatname/genel/t/telepathy-accounts-signon/talimat new file mode 100644 index 000000000..d86b7bb32 --- /dev/null +++ b/talimatname/genel/t/telepathy-accounts-signon/talimat @@ -0,0 +1,17 @@ +# Tanım: IM hesabı sağlamak için libaccounts ve libsignon ile entegre Telepati için bir görev kontrol eklentisi +# URL: https://gitlab.com/accounts-sso/telepathy-accounts-signon +# Paketçi: milisarge +# Gerekler: qt5 telepathy-mission-control libaccounts-glib libsignon-glib + +isim=telepathy-accounts-signon +surum=1.0 +devir=1 + +kaynak=(https://gitlab.com/accounts-sso/$isim/repository/archive.tar.gz) + +derle() { + mkdir -p build + cd build + qmake-qt5 ../$isim* + make INSTALL_ROOT=$PKG install +} diff --git a/talimatname/genel/t/telepathy-farstream/talimat b/talimatname/genel/t/telepathy-farstream/talimat new file mode 100644 index 000000000..4e3ab49b7 --- /dev/null +++ b/talimatname/genel/t/telepathy-farstream/talimat @@ -0,0 +1,18 @@ +# Tanım: Akış motorunu kullanmak için bir telepatik arka plan. +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: farstream telepathy-glib + +isim=telepathy-farstream +surum=0.6.0 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-gabble/talimat b/talimatname/genel/t/telepathy-gabble/talimat new file mode 100644 index 000000000..83dd8d41b --- /dev/null +++ b/talimatname/genel/t/telepathy-gabble/talimat @@ -0,0 +1,19 @@ +# Tanım: Telepati için bir Jabber / XMPP bağlantı yöneticisi +# URL: http://telepathy.freedesktop.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: telepathy-glib libsoup libnice sqlite libxslt + +isim=telepathy-gabble +surum=0.18.3 +devir=2 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --without-ca-certificates \ + --libexecdir=/usr/lib/telepathy + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-glib/talimat b/talimatname/genel/t/telepathy-glib/talimat new file mode 100644 index 000000000..3cae5869d --- /dev/null +++ b/talimatname/genel/t/telepathy-glib/talimat @@ -0,0 +1,20 @@ +# Tanım: Telepati D-Bus protokolü için GLib bağları +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: dbus-glib libxslt gobject-introspection vala + +isim=telepathy-glib +surum=0.24.1 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib/telepathy \ +--enable-vala-bindings \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-idle/talimat b/talimatname/genel/t/telepathy-idle/talimat new file mode 100644 index 000000000..83f5312ed --- /dev/null +++ b/talimatname/genel/t/telepathy-idle/talimat @@ -0,0 +1,18 @@ +# Tanım: Telepati için bir IRC bağlantı yöneticisi +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: telepathy-glib + +isim=telepathy-idle +surum=0.1.16 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib/telepathy +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-accounts-kcm/talimat b/talimatname/genel/t/telepathy-kde-accounts-kcm/talimat new file mode 100644 index 000000000..41a7a54a5 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-accounts-kcm/talimat @@ -0,0 +1,22 @@ +# Tanım: Telepati Anında Mesajlaşma Hesaplarını yapılandırmak için KCM Modülü +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules telepathy-qt5 kaccounts-providers intltool telepathy-gabble +# Grup: kde + +isim=telepathy-kde-accounts-kcm +surum=17.12.1 +devir=1 +_isim=ktp-accounts-kcm + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ${_isim}-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-approver/talimat b/talimatname/genel/t/telepathy-kde-approver/talimat new file mode 100644 index 000000000..119f9d9f0 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-approver/talimat @@ -0,0 +1,22 @@ +# Tanım: Telepati için KDE kanal onaycısı +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-qt5 kf5-knotifications kf5-kservice +# Grup: kde + +isim=telepathy-kde-approver +surum=17.12.1 +devir=1 +_isim=ktp-approver + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-approver-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-auth-handler/talimat b/talimatname/genel/t/telepathy-kde-auth-handler/talimat new file mode 100644 index 000000000..a71cb2cac --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-auth-handler/talimat @@ -0,0 +1,22 @@ +# Tanım: Hesap bağlanırken şifreler ve SSL hataları için UI/KWallet entegrasyonu sağlayın +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qca-qt5 telepathy-kde-common-internals kf5-kdewebkit +# Grup: kde + +isim=telepathy-kde-auth-handler +surum=17.12.1 +devir=1 +_isim=ktp-auth-handler + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-auth-handler-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-call-ui/talimat b/talimatname/genel/t/telepathy-kde-call-ui/talimat new file mode 100644 index 000000000..85bba9269 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-call-ui/talimat @@ -0,0 +1,22 @@ +# Tanım: Telepati için Sesli/Görüntülü Arama Arabirimi +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules boost telepathy-kde-common-internals qt5-gstreamer +# Grup: kde + +isim=telepathy-kde-call-ui +surum=17.12.1 +devir=1 +_isim=ktp-call-ui + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-call-ui-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-common-internals/talimat b/talimatname/genel/t/telepathy-kde-common-internals/talimat new file mode 100644 index 000000000..325fe9566 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-common-internals/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE-Telepati için ortak bileşenler +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools doxygen kf5-knotifyconfig kf5-ktexteditor kf5-kpeople telepathy-logger-qt kaccounts-integration libotr hicolor-icon-theme telepathy-accounts-signon telepathy-qt5 +# Grup: kde + +isim=telepathy-kde-common-internals +surum=17.12.1 +devir=1 +_isim=ktp-common-internals + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-common-internals-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-contact-list/talimat b/talimatname/genel/t/telepathy-kde-contact-list/talimat new file mode 100644 index 000000000..56e7fedfd --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-contact-list/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE Telepathy irtibat listesi uygulaması +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals +# Grup: kde + +isim=telepathy-kde-contact-list +surum=17.12.1 +devir=1 +_isim=ktp-contact-list + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-contact-list-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-contact-runner/talimat b/talimatname/genel/t/telepathy-kde-contact-runner/talimat new file mode 100644 index 000000000..2c517d542 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-contact-runner/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE Telepati için KRunner eklentisi +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals kf5-krunner +# Grup: kde + +isim=telepathy-kde-contact-runner +surum=17.12.1 +devir=1 +_isim=ktp-contact-runner + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-contact-runner-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-desktop-applets/talimat b/talimatname/genel/t/telepathy-kde-desktop-applets/talimat new file mode 100644 index 000000000..640db8b64 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-desktop-applets/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE-Telepati Plasma masaüstü uygulamaları +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools kf5-plasma-framework telepathy-kde-common-internals telepathy-kde-accounts-kcm +# Grup: kde + +isim=telepathy-kde-desktop-applets +surum=17.12.1 +devir=1 +_isim=ktp-desktop-applets + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-desktop-applets-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-filetransfer-handler/talimat b/talimatname/genel/t/telepathy-kde-filetransfer-handler/talimat new file mode 100644 index 000000000..4fd4fcc0b --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-filetransfer-handler/talimat @@ -0,0 +1,22 @@ +# Tanım: KDE Telepathy dosya aktarım işleyici +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals +# Grup: kde + +isim=telepathy-kde-filetransfer-handler +surum=17.12.1 +devir=1 +_isim=ktp-filetransfer-handler + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-filetransfer-handler-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-integration-module/talimat b/talimatname/genel/t/telepathy-kde-integration-module/talimat new file mode 100644 index 000000000..2afb17538 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-integration-module/talimat @@ -0,0 +1,22 @@ +# Tanım: KDED'e oturur ve kullanıcıyı otomatik erteleme veya bağlantı hatalarını işleme koyma gibi çeşitli sistem entegrasyonu ile ilgilenir +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals kf5-kidletime +# Grup: kde + +isim=telepathy-kde-kded-module +surum=17.12.1 +devir=1 +_isim=ktp-kded-module + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ${_isim}-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-send-file/talimat b/talimatname/genel/t/telepathy-kde-send-file/talimat new file mode 100644 index 000000000..0b2f97503 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-send-file/talimat @@ -0,0 +1,22 @@ +# Tanım: Belirtilen bir kişiyle bir dosya aktarım işi başlatmak için Dosya yöneticisi eklentisi +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals kf5-kio +# Grup: kde + +isim=telepathy-kde-send-file +surum=17.12.1 +devir=1 +_isim=ktp-send-file + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-send-file-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-kde-text-ui/talimat b/talimatname/genel/t/telepathy-kde-text-ui/talimat new file mode 100644 index 000000000..b040de7a9 --- /dev/null +++ b/talimatname/genel/t/telepathy-kde-text-ui/talimat @@ -0,0 +1,23 @@ +# Tanım: Metin Sohbetleri için telepati işleyicisi +# URL: http://community.kde.org/Real-Time_Communication_and_Collaboration +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules kf5-kdoctools telepathy-kde-common-internals kf5-kdewebkit kf5-kemoticons +# Grup: kde + +isim=telepathy-kde-text-ui +surum=17.12.1 +devir=1 +_isim=ktp-text-ui + +kaynak=(http://download.kde.org/stable/applications/$surum/src/${_isim}-$surum.tar.xz) + +derle() { + cd ktp-text-ui-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTING=OFF \ + -Wno-dev + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-logger-qt/talimat b/talimatname/genel/t/telepathy-logger-qt/talimat new file mode 100644 index 000000000..3f2278d9b --- /dev/null +++ b/talimatname/genel/t/telepathy-logger-qt/talimat @@ -0,0 +1,20 @@ +# Tanım: TpLogger istemci kitaplığında Qt Wrapper. +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules qt5 doxygen telepathy-qt5 glib dbus-glib telepathy-logger + +isim=telepathy-logger-qt +surum=15.04.0 +_surum=15.04 +devir=1 + +kaynak=(http://download.kde.org/stable/$isim/${_version}/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DLIB_INSTALL_DIR=lib +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-logger/talimat b/talimatname/genel/t/telepathy-logger/talimat new file mode 100644 index 000000000..b4db35be0 --- /dev/null +++ b/talimatname/genel/t/telepathy-logger/talimat @@ -0,0 +1,19 @@ +# Tanım: Telepati-logger, Telepati çerçevesindeki tüm iletişimlerin günlüğünü merkezileştiren bir arka plan programıdır. +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: intltool sqlite telepathy-glib gobject-introspection + +isim=telepathy-logger +surum=0.8.2 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib/telepathy \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-mission-control/talimat b/talimatname/genel/t/telepathy-mission-control/talimat new file mode 100644 index 000000000..50148b686 --- /dev/null +++ b/talimatname/genel/t/telepathy-mission-control/talimat @@ -0,0 +1,23 @@ +# Tanım: Bağlantı yöneticilerinin detaylarının bir kısmını soyutlayan bir Telepati bileşeni. +# URL: http://telepathy.freedesktop.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: telepathy-glib libgnome-keyring dconf networkmanager + +isim=telepathy-mission-control +surum=5.16.3 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib/telepathy \ +--with-connectivity=nm \ +--enable-gtk-doc \ +--disable-upower \ +--disable-static \ +--disable-schemas-compile +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy-python/talimat b/talimatname/genel/t/telepathy-python/talimat new file mode 100644 index 000000000..3aba46087 --- /dev/null +++ b/talimatname/genel/t/telepathy-python/talimat @@ -0,0 +1,19 @@ +# Tanım: Telepathy istemcilerinde ve bağlantı yöneticilerinde kullanmak için Python kütüphaneleri +# URL: http://telepathy.freedesktop.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: dbus-python libxslt + +isim=telepathy-python +surum=0.15.19 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + + python -m compileall $PKG/usr/lib/python2.7/site-packages/telepathy/ +} diff --git a/talimatname/genel/t/telepathy-qt5/talimat b/talimatname/genel/t/telepathy-qt5/talimat new file mode 100644 index 000000000..bc9ee0b78 --- /dev/null +++ b/talimatname/genel/t/telepathy-qt5/talimat @@ -0,0 +1,23 @@ +# Tanım: Qt5 tabanlı Telepathy istemcileri için bir kütüphane +# URL: http://telepathy.freedesktop.org/wiki/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: telepathy-farstream libxslt cmake doxygen qt5 + +isim=telepathy-qt5 +surum=0.9.7 +devir=1 + +kaynak=(http://telepathy.freedesktop.org/releases/telepathy-qt/telepathy-qt-$surum.tar.gz) + +derle() { + cd telepathy-qt-$surum + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPYTHON_EXECUTABLE=/usr/bin/python \ + -DDESIRED_QT_VERSION=5 \ + -DENABLE_EXAMPLES=OFF \ + -DENABLE_TESTS=OFF + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/telepathy/talimat b/talimatname/genel/t/telepathy/talimat new file mode 100644 index 000000000..c08643e26 --- /dev/null +++ b/talimatname/genel/t/telepathy/talimat @@ -0,0 +1,14 @@ +# Tanım: Bu paket Telepati paketlerini yükler +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: telepathy-kde-accounts-kcm telepathy-kde-approver telepathy-kde-auth-handler telepathy-kde-call-ui telepathy-kde-contact-runner telepathy-kde-contact-list telepathy-kde-desktop-applets telepathy-kde-filetransfer-handler telepathy-kde-integration-module telepathy-kde-send-file telepathy-kde-text-ui telepathy-mission-control telepathy-idle telepathy-logger telepathy-gabble telepathy-python + +isim=telepathy +surum=16.08.2 +devir=1 + +kaynak=(talimat) + +derle() { +echo "KDE Telepathy" +} diff --git a/talimatname/genel/t/termcap/talimat b/talimatname/genel/t/termcap/talimat new file mode 100644 index 000000000..7d9dc6a4a --- /dev/null +++ b/talimatname/genel/t/termcap/talimat @@ -0,0 +1,24 @@ +# Tanım: Programların ekran bilgisayar terminallerini cihazdan bağımsız biçimde kullanmasını sağlar +# URL: http://www.catb.org/~esr/terminfo/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: sistem + +isim=termcap +surum=1.3.1 +devir=1 +kaynak=(http://ftp.gnu.org/gnu/${isim}/${isim}-${surum}.tar.gz) + +derle() { + gcc -fPIC -c "${SRC}/${isim}-${surum}/${isim}.c" \ + -o "${SRC}"/"${isim}.o" \ + -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 || return 1 + gcc -shared -Wl,-soname,"lib${isim}.so" \ + -o "${SRC}/lib${isim}.so.${surum}" "${SRC}/${isim}.o" || return 1 + install -D -m755 "${SRC}/lib${isim}.so.${surum}" "${PKG}/usr/lib/lib${isim}.so.${surum}" + cd "${SRC}/${isim}-${surum}" + for infofile in termcap.info* + do install -D -m644 "${SRC}/${isim}-${surum}/${infofile}" "${PKG}/usr/share/info/${infofile}" + done + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/t/terminology/talimat b/talimatname/genel/t/terminology/talimat new file mode 100644 index 000000000..0b9de83e1 --- /dev/null +++ b/talimatname/genel/t/terminology/talimat @@ -0,0 +1,18 @@ +# Tanım: terminal emulator +# URL: http://www.enlightenment.org/ +# Paketçi: milisarge +# Gerekler: elementary + +isim=terminology +surum=1.0.0 +devir=1 +kaynak=(http://download.enlightenment.org/rel/apps/terminology/terminology-$surum.tar.xz) + +derle() +{ + cd terminology-$surum + ./configure --prefix=/usr \ + --mandir=/usr/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/terminus-font/talimat b/talimatname/genel/t/terminus-font/talimat new file mode 100644 index 000000000..0cf932899 --- /dev/null +++ b/talimatname/genel/t/terminus-font/talimat @@ -0,0 +1,30 @@ +# Tanım: Monospace bitmap font (for X11 and console) +# URL: URL: http://sourceforge.net/projects/terminus-font/ +# NuTyX package info file (http://nutyx.org) +# Paketçi: # NuTyX package info file (http://nutyx.org) +# Gerekler: xorg-app xorg-fontconfig xorg-font-util +isim=terminus-font +surum=4.39 +devir=1 + +kaynak=( +http://downloads.sourceforge.net/project/$isim/$isim-$surum/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr \ + --psfdir=/usr/share/kbd/consolefonts \ + --x11dir=/usr/share/fonts/misc + make + make DESTDIR=$PKG install + + install -Dm644 75-yes-terminus.conf \ + $PKG/etc/fonts/conf.avail/75-yes-terminus.conf + install -d $PKG/etc/fonts/conf.d + cd $PKG/etc/fonts/conf.d + ln -s ../conf.avail/75-yes-terminus.conf . +} + + + +# NuTyX Pkgfile (http://nutyx.org) diff --git a/talimatname/genel/t/terminus-font/terminus-font.kur-kos b/talimatname/genel/t/terminus-font/terminus-font.kur-kos new file mode 100644 index 000000000..a6abb81d4 --- /dev/null +++ b/talimatname/genel/t/terminus-font/terminus-font.kur-kos @@ -0,0 +1,12 @@ +# Update mkfontscale and mkfontdir: +if [ -x usr/bin/mkfontdir ]; then + ( cd usr/share/fonts/misc + mkfontscale . + mkfontdir . + ) +fi + +# Update the X font indexes: +if [ -x usr/bin/fc-cache ]; then + usr/bin/fc-cache -f +fi diff --git a/talimatname/genel/t/tesseract/talimat b/talimatname/genel/t/tesseract/talimat new file mode 100644 index 000000000..c01d76bc2 --- /dev/null +++ b/talimatname/genel/t/tesseract/talimat @@ -0,0 +1,28 @@ +# Tanım: OCR programı +# URL: https://github.com/tesseract-ocr/tesseract +# Paketçi: Cihan_Alkan +# Gerekler: libpng libtiff libjpeg-turbo zlib giflib leptonica icu cairo pango +# Grup: medya + +isim=tesseract +surum=3.05.01 +devir=1 + +kaynak=(https://github.com/tesseract-ocr/tesseract/archive/$surum.tar.gz::${isim}-${surum}.tar.gz + https://github.com/tesseract-ocr/tessdata/raw/master/osd.traineddata + https://github.com/tesseract-ocr/tessdata/raw/master/tur.traineddata) + +derle() { + cd "$SRC"/$isim-${surum} + [ -x configure ] || ./autogen.sh + [ -f Makefile ] || ./configure --prefix=/usr + make + make training + make DESTDIR="$PKG" install + make DESTDIR="$PKG" training-install + mkdir -p "$PKG"/usr/share/tessdata + install -Dm0644 "$SRC"/osd.traineddata "$PKG"/usr/share/tessdata/osd.traineddata + + cp $SRC/tur.traineddata $PKG/usr/share/tessdata/ + find $PKG/usr/share/tessdata -type f -exec chmod 0644 {} \; +} diff --git a/talimatname/genel/t/testdisk/talimat b/talimatname/genel/t/testdisk/talimat new file mode 100644 index 000000000..2e2c6496e --- /dev/null +++ b/talimatname/genel/t/testdisk/talimat @@ -0,0 +1,22 @@ +# Tanım: Testdisk güçlü ve özgür bir veri kurtarma yazılımıdır +# URL: http://www.cgsecurity.org/wiki/TestDisk +# Paketçi: yasarciv +# Gerekler: ntfs-3g libjpeg-turbo + +isim=testdisk +surum=7.0 +devir=1 +kaynak=(http://www.cgsecurity.org/$isim-$surum.tar.bz2) + +derle() { + +cd $isim-$surum + +./configure --prefix=/usr + + make + make DESTDIR=$PKG install + + rm -r $PKG/usr/share/doc + rm -r $PKG/usr/share/man/zh_CN +} diff --git a/talimatname/genel/t/tevent/talimat b/talimatname/genel/t/tevent/talimat new file mode 100644 index 000000000..bc19e514c --- /dev/null +++ b/talimatname/genel/t/tevent/talimat @@ -0,0 +1,18 @@ +# Tanım: Talloc bellek yönetimi kitaplığına dayanan olay sistemi +# URL: https://tevent.samba.org +# Paketçi: milisarge +# Gerekler: talloc python + +isim=tevent +surum=0.9.33 +devir=1 +kaynak=(https://www.samba.org/ftp/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --bundled-libraries=NONE \ + --builtin-libraries=replace + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tex-gyre-fonts/talimat b/talimatname/genel/t/tex-gyre-fonts/talimat new file mode 100644 index 000000000..d66148113 --- /dev/null +++ b/talimatname/genel/t/tex-gyre-fonts/talimat @@ -0,0 +1,16 @@ +# Tanım: Substitute PostScript fonts in OpenType format +# URL: http://www.gust.org.pl/projects/e-foundry/tex-gyre +# Paketçi: milisarge +# Gerekler: + +isim=tex-gyre-fonts +surum=2.005 +devir=1 +kaynak=(http://www.gust.org.pl/projects/e-foundry/tex-gyre/whole/tg-${surum}otf.zip + http://www.gust.org.pl/projects/e-foundry/tex-gyre/../licenses/GUST-FONT-LICENSE.txt) + +derle() { + install -d "$PKG/usr/share/fonts/${name%-fonts}" + install -t "$PKG/usr/share/fonts/${name%-fonts}" -m644 *.otf + install -Dm644 GUST-FONT-LICENSE.txt "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/t/texi2html/talimat b/talimatname/genel/t/texi2html/talimat new file mode 100644 index 000000000..4a25d942c --- /dev/null +++ b/talimatname/genel/t/texi2html/talimat @@ -0,0 +1,16 @@ +# Tanım: Texinfo belgelerini HTML'ye dönüştürür +# URL: http://www.nongnu.org/texi2html/ +# Paketçi: milisarge +# Gerekler: + +isim=texi2html +surum=5.0 +devir=1 +kaynak=("http://download.savannah.gnu.org/releases/texi2html/$isim-$surum.tar.bz2") + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/t/the_silver_searcher/talimat b/talimatname/genel/t/the_silver_searcher/talimat new file mode 100644 index 000000000..0da879906 --- /dev/null +++ b/talimatname/genel/t/the_silver_searcher/talimat @@ -0,0 +1,16 @@ +# Tanım: Hızlı kod arama aracı +# URL: https://github.com/ggreer/the_silver_searcher +# Paketçi: milisarge +# Gerekler: pcre + +isim=the_silver_searcher +surum=2.1.0 +devir=1 +kaynak=(https://github.com/ggreer/the_silver_searcher/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's_configure_configure --prefix=/usr_' build.sh + ./build.sh + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/t/theharvester/talimat b/talimatname/genel/t/theharvester/talimat new file mode 100644 index 000000000..c8fdabc50 --- /dev/null +++ b/talimatname/genel/t/theharvester/talimat @@ -0,0 +1,30 @@ +# Tanım: Farklı açık kaynaklarından e-posta hesapları ve alt alan adı toplamak için kullanılan araç. +# URL: http://www.edge-security.com/theHarvester.php +# Paketçi: ayakar +# Gerekler: python-pip python python-setuptools pyrequests + +isim=theharvester +surum=git +devir=1 +kaynak=() + +derle() { + git_indir https://github.com/laramies/theHarvester.git $isim + + cd $SRC/$isim + + sed -i 's|env python$|env python2|' theHarvester.py + + mkdir -p "$PKG/usr/bin" + mkdir -p "$PKG/usr/share/theharvester" + + install -Dm755 *.py "$PKG/usr/share/theharvester" + install -Dm644 -t "$PKG/usr/share/doc/theharvester" changelog.txt + install -Dm644 -t "$PKG/usr/share/licenses/theharvester" COPYING LICENSES + + cp --no-preserve=ownership -a discovery lib *.txt \ + "$PKG/usr/share/theharvester" + + ln -s "/usr/share/theharvester/theHarvester.py" "$PKG/usr/bin/theharvester" + rm -rf "$PKG"/usr/share/doc +} diff --git a/talimatname/genel/t/theharvester/theharvester.kur-kos b/talimatname/genel/t/theharvester/theharvester.kur-kos new file mode 100644 index 000000000..325bff712 --- /dev/null +++ b/talimatname/genel/t/theharvester/theharvester.kur-kos @@ -0,0 +1,2 @@ +#!/bin/sh +pip2 install shodan diff --git a/talimatname/genel/t/thrift/talimat b/talimatname/genel/t/thrift/talimat new file mode 100644 index 000000000..baa9e7735 --- /dev/null +++ b/talimatname/genel/t/thrift/talimat @@ -0,0 +1,41 @@ +# Tanım: Ölçeklenebilir çoğul programlama dilleri için IPC/RPC çatısı +# URL: http://thrift.apache.org/ +# Paketçi: milisarge +# Gerekler: qt5 boost libevent + +isim=thrift +surum=0.10.0 +devir=1 +kaynak=(https://github.com/apache/thrift/archive/$surum.zip::$isim-$zip.zip) + +derle() { + cd thrift-$surum + + ./bootstrap.sh + ./configure --prefix=/usr \ + --with-cpp \ + --with-c_glib \ + --with-qt5 \ + --with-libevent \ + --with-csharp \ + --without-haskell \ + --without-php \ + --without-ruby \ + --without-python \ + --without-erlang \ + --without-perl \ + --without-java \ + --without-c_sharp \ + --without-d \ + --without-php \ + --without-go \ + --without-lua \ + --without-nodejs \ + --without-tests + + make -j2 + make DESTDIR="$PKG" install + install -m0644 -D contrib/thrift.vim "$PKG"/usr/share/vim/vimfiles/syntax/thrift.vim + install -m0644 -D contrib/thrift.el "$PKG"/usr/share/emacs/site-lisp/thrift.el + +} diff --git a/talimatname/genel/t/thunar-archive-plugin/talimat b/talimatname/genel/t/thunar-archive-plugin/talimat new file mode 100644 index 000000000..fdf694b96 --- /dev/null +++ b/talimatname/genel/t/thunar-archive-plugin/talimat @@ -0,0 +1,58 @@ +# Tanım: Arşivlerle uğraşmak için Thunar filemanager eklentisi +# URL: http://foo-projects.org/~benny/projects/thunar-archive-plugin +# Paketçi: milisarge +# Gerekler: thunar xarchiver + +isim=thunar-archive-plugin +surum=0.3.1 +devir=1 +kaynak=(http://archive.xfce.org/src/thunar-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +## +derle() { +cd $isim-$surum + +./configure --prefix=/usr \ + --libexecdir=/usr/lib/thunar \ + --disable-static \ + --disable-nls + +make +make DESTDIR=$PKG install + +## +mkdir -p $PKG/usr/lib/thunar/thunar-archive-plugin/ +cat > $PKG/usr/lib/thunar/thunar-archive-plugin/xarchiver.tap << "EOF" +#!/bin/sh +# +# xarchiver.tap - Wrapper script to create and extract archive files +# in Thunar, via the thunar-archive-plugin, using xarchiver. +# +# determine the action and the folder, "$@" then contains only the files +action=$1; shift; +folder=$1; shift; + +# check the action +case $action in +create) + exec xarchiver "--add-to=$@" + ;; + +extract-here) + exec xarchiver "--extract-to=$folder" "$@" + ;; + +extract-to) + exec xarchiver --extract "$@" + ;; + +*) + echo "Unsupported action '$action'" >&2 + exit 1 +esac +EOF + +## +chmod 755 $PKG/usr/lib/thunar/thunar-archive-plugin/xarchiver.tap +} + diff --git a/talimatname/genel/t/thunar-vcs-plugin/talimat b/talimatname/genel/t/thunar-vcs-plugin/talimat new file mode 100644 index 000000000..3378ccde3 --- /dev/null +++ b/talimatname/genel/t/thunar-vcs-plugin/talimat @@ -0,0 +1,17 @@ +# Tanım: Thunar için SVN ve GIT entegrasyonu. +# URL: http://goodies.xfce.org/projects/thunar-plugins/thunar-vcs-plugin +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool thunar subversion apr + +isim=thunar-vcs-plugin +surum=0.1.5 +devir=1 +kaynak=(http://archive.xfce.org/src/thunar-plugins/thunar-vcs-plugin/${surum%.*}/$isim-$surum.tar.bz2 +) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/xfce4 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/thunar-vcs-plugin/thunar-vcs-plugin.kur-kos b/talimatname/genel/t/thunar-vcs-plugin/thunar-vcs-plugin.kur-kos new file mode 100644 index 000000000..2faa73a76 --- /dev/null +++ b/talimatname/genel/t/thunar-vcs-plugin/thunar-vcs-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -f /usr/share/icons/hicolor diff --git a/talimatname/genel/t/thunar-volman/talimat b/talimatname/genel/t/thunar-volman/talimat new file mode 100644 index 000000000..1ddc0af0c --- /dev/null +++ b/talimatname/genel/t/thunar-volman/talimat @@ -0,0 +1,17 @@ +# Tanım: thunar dosya yöneticisi disk yönetimi +# URL: http://thunar.xfce.org +# Paketçi: milisarge +# Gerekler: libgudev libnotify startup-notification exo xfce4-libui desktop-file-utils gvfs + +isim=thunar-volman +surum=0.8.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2 ) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/thunar-volman/thunar-volman.kur-kos b/talimatname/genel/t/thunar-volman/thunar-volman.kur-kos new file mode 100644 index 000000000..7507c558c --- /dev/null +++ b/talimatname/genel/t/thunar-volman/thunar-volman.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/t/thunar/no-root-warning.patch b/talimatname/genel/t/thunar/no-root-warning.patch new file mode 100644 index 000000000..968a0c269 --- /dev/null +++ b/talimatname/genel/t/thunar/no-root-warning.patch @@ -0,0 +1,4 @@ +835c835 +< if (G_UNLIKELY (geteuid () == 0)) +--- +> if (G_UNLIKELY (1 == 0)) diff --git a/talimatname/genel/t/thunar/talimat b/talimatname/genel/t/thunar/talimat new file mode 100644 index 000000000..ff768dac6 --- /dev/null +++ b/talimatname/genel/t/thunar/talimat @@ -0,0 +1,38 @@ +# Tanım: Thunar dosya yöneticisi +# URL: http://thunar.xfce.org +# Paketçi: milisarge +# Gerekler: libnotify libexif exo xfce4-libui xfce4-panel desktop-file-utils +# Grup: xfce4 + +isim=thunar +source /root/talimatname/genel/x/xfce4/surumler +surum="${thunar_surum}";[ -z ${thunar_surum} ] && \ +surum=1.6.12 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/thunar/${surum%.*}/Thunar-$surum.tar.bz2 + no-root-warning.patch) +derle() { + cd Thunar-$surum + patch $SRC/Thunar-$surum/thunar/thunar-window.c $SRC/no-root-warning.patch + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --enable-gio-unix \ + --enable-dbus \ + --enable-startup-notification \ + --enable-gudev \ + --enable-notifications \ + --enable-exif \ + --enable-pcre \ + --disable-debug + make + make DESTDIR=$PKG install + sed -i 's:x-directory/gnome-default-handler;::' $PKG/usr/share/applications/Thunar-folder-handler.desktop + rm -rf $PKG/usr/share/gtk-doc + rm -rf $PKG/usr/share/man + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/t/thunar/thunar.kur-kos b/talimatname/genel/t/thunar/thunar.kur-kos new file mode 100644 index 000000000..16c107e19 --- /dev/null +++ b/talimatname/genel/t/thunar/thunar.kur-kos @@ -0,0 +1,3 @@ +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache diff --git a/talimatname/genel/t/thunderbird/talimat b/talimatname/genel/t/thunderbird/talimat new file mode 100644 index 000000000..9adc37df2 --- /dev/null +++ b/talimatname/genel/t/thunderbird/talimat @@ -0,0 +1,134 @@ +# Tanım: Thunderbird, Mozilla kod tabanına dayanan tek başına bir posta/haber istemcisidir. HTML e-postalarını görüntülemek ve oluşturmak için Gecko rendering motorunu kullanır. +# URL: http://www.mozilla.org/thunderbird +# Paketçi: milisarge +# Gerekler: alsa-lib gtk2 zip unzip libevent libvpx nspr nss yasm dbus-glib doxygen gstreamer-plugins-good gstreamer-plugins-ffmpeg libnotify openjdk startup-notification hunspell sqlite wireless-tools xorg-libx11 xorg-libxt xorg-libxrandr desktop-file-utils hicolor-icon-theme shared-mime-info pulseaudio + +isim=thunderbird +surum=38.6.0 +devir=1 + +kaynak=(http://ftp.mozilla.org/pub/mozilla.org/thunderbird/releases/$surum/source/$isim-$surum.source.tar.bz2 + $isim.desktop) + +derle() { +export LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/lib/thunderbird" +export PYTHON="/usr/bin/python2" + +cd $SRC +ARCH=`uname -m` + +for lang in da de en-US es-ES fi fr it nb-NO nl pt-PT sv-SE +do +wget http://download.cdn.mozilla.net/pub/mozilla.org/$isim/releases/$surum/linux-$ARCH/xpi/$lang.xpi +done + +cd $SRC/comm-* + +cat > mozconfig << "EOF" +# If you have a multicore machine, the build may be faster if using parallel +# jobs. The build system automatically adds -jN to the "make" flags, where N +# is the number of CPU cores. The option below is therefore useless, unless +# you want to use a smaller number of jobs: +#mk_add_options MOZ_MAKE_FLAGS="-j1" + +# If you have installed DBus-Glib comment out this line: +# ac_add_options --disable-dbus + +# If you have installed wireless-tools comment out this line: +# ac_add_options --disable-necko-wifi + +# If you have installed libnotify comment out this line: +#### ac_add_options --disable-libnotify + +# GStreamer is necessary for H.264 video playback in HTML5 Video Player; +# to be enabled, also remember to set "media.gstreamer.enabled" to "true" +# in about:config. If you have installed GStreamer 0.x.y, comment out this line: +# ac_add_options --disable-gstreamer +# or uncomment this line, if you have installed GStreamer 1.x.y +#ac_add_options --enable-gstreamer=1.0 + +# Uncomment these lines if you have installed optional dependencies: +ac_add_options --enable-system-hunspell +ac_add_options --enable-startup-notification + +# Comment out following option if you have PulseAudio installed +# ac_add_options --disable-pulseaudio + +# If you want to compile the Mozilla Calendar, uncomment this line: +#ac_add_options --enable-calendar + +# Comment out following options if you have not installed +# recommended dependencies: +ac_add_options --enable-system-sqlite +ac_add_options --with-system-libevent +ac_add_options --with-system-libvpx +ac_add_options --with-system-nspr +ac_add_options --with-system-nss +ac_add_options --with-system-icu + +# The BLFS editors recommend not changing anything below this line: +ac_add_options --prefix=/usr +ac_add_options --enable-application=mail + +ac_add_options --disable-crashreporter +ac_add_options --disable-installer +ac_add_options --disable-updater +ac_add_options --disable-debug +ac_add_options --disable-tests + +ac_add_options --enable-optimize +ac_add_options --enable-strip +ac_add_options --enable-install-strip + +ac_add_options --enable-gio +ac_add_options --enable-official-branding +ac_add_options --enable-safe-browsing +ac_add_options --enable-url-classifier + +ac_add_options --enable-system-cairo +ac_add_options --enable-system-ffi +ac_add_options --enable-system-pixman + +ac_add_options --with-pthreads + +ac_add_options --with-system-bz2 +ac_add_options --with-system-jpeg +ac_add_options --with-system-png +ac_add_options --with-system-zlib + +EOF + +sed -e '/^ftglyph.h/i ftfntfmt.h' \ + -e '/^freetype\/ftcache.h/a freetype\/ftfntfmt.h' \ + -i mozilla/config/system-headers + +SHELL=/bin/sh make -f client.mk +SHELL=/bin/sh make -f client.mk DESTDIR=$PKG install INSTALL_SDK= + +mkdir -pv $PKG/usr/bin +ln -sfv ../lib/$isim-$surum/thunderbird $PKG/usr/bin + +mkdir -pv $PKG/usr/share/applications +install -Dm644 $SRC/thunderbird.desktop \ +$PKG/usr/share/applications/thunderbird.desktop + +for i in 16 22 24 32 48 256; do + install -Dm644 other-licenses/branding/thunderbird/mailicon$i.png \ + $PKG/usr/share/icons/hicolor/${i}x${i}/apps/thunderbird.png +done + + +mkdir -p $PKG/etc/ld.so.conf.d +echo "/usr/lib/$isim-$surum" > $PKG/etc/ld.so.conf.d/$isim.conf +cat > $PKG/usr/lib/thunderbird-$surum/defaults/pref/vendor.js << "EOF" +// Use LANG environment variable to choose locale +pref("intl.locale.matchOS", true); +EOF + +for lang in da de en-US es-ES fi fr it nb-NO nl pt-PT sv-SE +do + install -Dm644 $SRC/$lang.xpi \ + $PKG/usr/lib/thunderbird-$surum/extensions/langpack-$lang@thunderbird.mozilla.org.xpi +done +chown -R 0:0 $PKG/usr/lib/$isim-$surum +} diff --git a/talimatname/genel/t/thunderbird/thunderbird.desktop b/talimatname/genel/t/thunderbird/thunderbird.desktop new file mode 100644 index 000000000..b182e44f1 --- /dev/null +++ b/talimatname/genel/t/thunderbird/thunderbird.desktop @@ -0,0 +1,173 @@ +[Desktop Entry] +Name=Thunderbird +Comment=Send and receive mail with Thunderbird +Comment[ast]=Lleer y escribir corréu electrónicu +Comment[ca]=Llegiu i escriviu correu +Comment[cs]=Čtení a psaní pošty +Comment[da]=Skriv/læs e-post/nyhedsgruppe med Mozilla Thunderbird +Comment[de]=E-Mails und Nachrichten mit Thunderbird lesen und schreiben +Comment[el]=Διαβάστε και γράψτε γράμματα με το Mozilla Thunderbird +Comment[es]=Lea y escriba correos y noticias con Thunderbird +Comment[fi]=Lue ja kirjoita sähköposteja +Comment[fr]=Lire et écrire des courriels +Comment[gl]=Lea e escriba correo electrónico +Comment[he]=קריאה/כתיבה של דוא״ל/חדשות באמצעות Mozilla Thunderbird +Comment[hr]=Čitajte/šaljite e-poštu s Thunderbird +Comment[hu]=Levelek írása és olvasása a Thunderbirddel +Comment[it]=Per leggere e scrivere email +Comment[ja]=メールの読み書き +Comment[ko]=Mozilla Thunderbird 메일/뉴스 읽기 및 쓰기 클라이언트 +Comment[nl]=E-mail/nieuws lezen en schrijven met Mozilla Thunderbird +Comment[pl]=Czytanie i wysyłanie e-maili +Comment[pt_BR]=Leia e escreva suas mensagens +Comment[ru]=Читайте и пишите письма +Comment[sk]=Čítajte a píšte poštu pomocou programu Thunderbird +Comment[sv]=Läs och skriv e-post +Comment[ug]=ئېلخەت ۋە خەۋەرلەرنى Mozilla Thunderbird دا كۆرۈش ۋە يېزىش +Comment[uk]=Читання та написання листів +Comment[vi]=Đọc và soạn thư điện tử +Comment[zh_CN]=阅读邮件或新闻 +Comment[zh_TW]=以 Mozilla Thunderbird 讀寫郵件或新聞 +GenericName=Mail Client +GenericName[ast]=Client de correu +GenericName[ca]=Client de correu +GenericName[cs]=Poštovní klient +GenericName[da]=E-postklient +GenericName[de]=E-Mail-Anwendung +GenericName[el]=Λογισμικό αλληλογραφίας +GenericName[es]=Cliente de correo +GenericName[fi]=Sähköpostiohjelma +GenericName[fr]=Client de messagerie +GenericName[gl]=Cliente de correo electrónico +GenericName[he]=לקוח דוא״ל +GenericName[hr]=Klijent e-pošte +GenericName[hu]=Levelezőkliens +GenericName[it]=Client email +GenericName[ja]=電子メールクライアント +GenericName[ko]=메일 클라이언트 +GenericName[nl]=E-mailprogramma +GenericName[pl]=Klient poczty +GenericName[pt_BR]=Cliente de E-mail +GenericName[ru]=Почтовый клиент +GenericName[sk]=Poštový klient +GenericName[ug]=ئېلخەت دېتالى +GenericName[uk]=Поштова програма +GenericName[vi]=Phần mềm khách quản lý thư điện tử +GenericName[zh_CN]=邮件新闻客户端 +GenericName[zh_TW]=郵件用戶端 +Exec=thunderbird %u +Terminal=false +Type=Application +Icon=thunderbird +Categories=Network;Email; +MimeType=message/rfc822;x-scheme-handler/mailto;application/x-xpinstall; +StartupNotify=true +Actions=ComposeMessage;OpenAddressBook; + +[Desktop Action ComposeMessage] +Name=Write new message +Name[ar]=اكتب رسالة جديدة +Name[ast]=Redactar mensaxe nuevu +Name[be]=Напісаць новы ліст +Name[bg]=Съставяне на ново съобщение +Name[br]=Skrivañ ur gemennadenn nevez +Name[ca]=Escriu un missatge nou +Name[cs]=Napsat novou zprávu +Name[da]=Skriv en ny meddelelse +Name[de]=Neue Nachricht verfassen +Name[el]=Σύνταξη νέου μηνύματος +Name[es_AR]=Escribir un nuevo mensaje +Name[es_ES]=Redactar nuevo mensaje +Name[et]=Kirjuta uus kiri +Name[eu]=Idatzi mezu berria +Name[fi]=Kirjoita uusi viesti +Name[fr]=Rédiger un nouveau message +Name[fy_NL]=Skriuw in nij berjocht +Name[ga_IE]=Scríobh teachtaireacht nua +Name[gd]=Sgrìobh teachdaireachd ùr +Name[gl]=Escribir unha nova mensaxe +Name[he]=כתיבת הודעה חדשה +Name[hr]=Piši novu poruku +Name[hu]=Új üzenet írása +Name[hy_AM]=Գրել նոր նամակ +Name[is]=SKrifa nýjan póst +Name[it]=Scrivi nuovo messaggio +Name[ja]=新しいメッセージを作成する +Name[ko]=새 메시지 작성 +Name[lt]=Rašyti naują laišką +Name[nb_NO]=Skriv ny melding +Name[nl]=Nieuw bericht aanmaken +Name[nn_NO]=Skriv ny melding +Name[pl]=Nowa wiadomość +Name[pt_BR]=Nova mensagem +Name[pt_PT]=Escrever nova mensagem +Name[rm]=Scriver in nov messadi +Name[ro]=Scrie un mesaj nou +Name[ru]=Создать новое сообщение +Name[si]=නව ලිපියක් ලියන්න +Name[sk]=Nová e-mailová správa +Name[sl]=Sestavi novo sporočilo +Name[sq]=Shkruani mesazh të ri +Name[sr]=Писање нове поруке +Name[sv_SE]=Skriv ett nytt meddelande +Name[ta_LK]=புதிய செய்தியை எழுதுக +Name[tr]=Yeni ileti yaz +Name[uk]=Написати нового листа +Name[vi]=Viết thư mới +Name[zh_CN]=编写新消息 +Name[zh_TW]=寫一封新訊息 +Exec=thunderbird -compose + +[Desktop Action OpenAddressBook] +Name=Open address book +Name[ar]=افتح دفتر العناوين +Name[ast]=Abrir llibreta de direiciones +Name[be]=Адкрыць адрасную кнігу +Name[bg]=Отваряне на адресник +Name[br]=Digeriñ ur c'harned chomlec'hioù +Name[ca]=Obre la llibreta d'adreces +Name[cs]=Otevřít Adresář +Name[da]=Åbn adressebog +Name[de]=Adressbuch öffnen +Name[el]=Άνοιγμα ευρετηρίου διευθύνσεων +Name[es_AR]=Abrir libreta de direcciones +Name[es_ES]=Abrir libreta de direcciones +Name[et]=Ava aadressiraamat +Name[eu]=Ireki helbide-liburua +Name[fi]=Avaa osoitekirja +Name[fr]=Ouvrir un carnet d'adresses +Name[fy_NL]=Iepenje adresboek +Name[ga_IE]=Oscail leabhar seoltaí +Name[gd]=Fosgail leabhar-sheòlaidhean +Name[gl]=Abrir a axenda de enderezos +Name[he]=פתיחת ספר כתובות +Name[hr]=Otvori adresar +Name[hu]=Címjegyzék megnyitása +Name[hy_AM]=Բացել Հասցեագիրքը +Name[is]=Opna nafnaskrá +Name[it]=Apri rubrica +Name[ja]=アドレス帳を開く +Name[ko]=주소록 열기 +Name[lt]=Atverti adresų knygą +Name[nb_NO]=Åpne adressebok +Name[nl]=Adresboek openen +Name[nn_NO]=Opne adressebok +Name[pl]=Książka adresowa +Name[pt_BR]=Catálogo de endereços +Name[pt_PT]=Abrir livro de endereços +Name[rm]=Avrir il cudeschet d'adressas +Name[ro]=Deschide agenda de contacte +Name[ru]=Открыть адресную книгу +Name[si]=ලිපින පොත විවෘත කරන්න +Name[sk]=Otvoriť adresár +Name[sl]=Odpri adressar +Name[sq]=Hapni libër adresash +Name[sr]=Отвори адресар +Name[sv_SE]=Öppna adressboken +Name[ta_LK]=முகவரி பத்தகத்தை திறக்க +Name[tr]=Adres defterini aç +Name[uk]=Відкрити адресну книгу +Name[vi]=Mở sổ địa chỉ +Name[zh_CN]=打开通讯录 +Name[zh_TW]=開啟通訊錄 +Exec=thunderbird -addressbook diff --git a/talimatname/genel/t/thunderbird/thunderbird.kur-kos b/talimatname/genel/t/thunderbird/thunderbird.kur-kos new file mode 100644 index 000000000..f6546ca44 --- /dev/null +++ b/talimatname/genel/t/thunderbird/thunderbird.kur-kos @@ -0,0 +1,5 @@ +ldconfig -f etc/ld.so.conf.d/thunderbird.conf +# desktop database +update-desktop-database -q +# update icons cache +gtk-update-icon-cache -q -t -f usr/share/icons/hicolor diff --git a/talimatname/genel/t/tidy-html5/talimat b/talimatname/genel/t/tidy-html5/talimat new file mode 100644 index 000000000..f90b8ce53 --- /dev/null +++ b/talimatname/genel/t/tidy-html5/talimat @@ -0,0 +1,23 @@ +# Tanım: HTML, XHTML ve XML için HTML Temizlik kütüphanesi +# URL: https://github.com/htacg/tidy-html5 +# Paketçi: halityilmaz1982 +# Gerekler: cmake libxslt + +isim=tidy-html5 +surum=5.4.0 +devir=1 + +kaynak=(https://github.com/htacg/$isim/releases/download/$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + cd build/cmake + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TAB2SPACE=ON \ + ../.. + make + make DESTDIR=$PKG install + install -d $PKG/usr/bin + install -v -m755 $SRC/$isim-$surum/build/cmake/tab2space $PKG/usr/bin +} diff --git a/talimatname/genel/t/tidy/talimat b/talimatname/genel/t/tidy/talimat new file mode 100644 index 000000000..bc295bc99 --- /dev/null +++ b/talimatname/genel/t/tidy/talimat @@ -0,0 +1,28 @@ +# Tanım: HTML, XHTML ve XML dosyalarını okumak ve işaretleme biçimini temizlemek için kullanılan araçlar ve kitaplıklar +# URL: http://tidy.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=tidy +surum=20101110 +devir=1 +kaynak=(http://anduin.linuxfromscratch.org/BLFS/$isim/$isim-cvs\_$surum.tar.bz2) + +derle() { + + cd $isim-cvs\_$surum + + ./configure \ + --prefix=/usr \ + --disable-static + + make + make DESTDIR=$PKG install + + install -v -m644 -D htmldoc/tidy.1 \ + $PKG/usr/share/man/man1/tidy.1 + install -v -m755 -d $PKG/usr/share/doc/tidy-cvs_20101110 + install -v -m644 htmldoc/*.{html,gif,css} \ + $PKG/usr/share/doc/tidy-cvs_20101110 + +} diff --git a/talimatname/genel/t/tig/talimat b/talimatname/genel/t/tig/talimat new file mode 100644 index 000000000..22a341242 --- /dev/null +++ b/talimatname/genel/t/tig/talimat @@ -0,0 +1,15 @@ +# Tanım: Git için metin modu arabirimi. +# URL: http://jonas.nitro.dk/tig/ +# Paketçi: milisarge +# Gerekler: asciidoc xmlto + +isim=tig +surum=2.1.1 +devir=1 +kaynak=(http://jonas.nitro.dk/${isim}/releases/${isim}-${surum}.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc +make +make DESTDIR=$PKG install install-doc-man +} diff --git a/talimatname/genel/t/tigervnc/talimat b/talimatname/genel/t/tigervnc/talimat new file mode 100644 index 000000000..02f50b615 --- /dev/null +++ b/talimatname/genel/t/tigervnc/talimat @@ -0,0 +1,23 @@ +# Tanım: VNC istemcisi +# URL: http://tigervnc.org +# Paketçi: milisarge +# Gerekler: cmake fltk1 gegl libjpeg-turbo xorg-libxtst xorg-libxfont xorg-xauth xorg-xkbcomp xorg-libpixman libgcrypt xorg-libxdamage gnutls + +isim=tigervnc +surum=1.6.0 +devir=2 +kaynak=(https://github.com/TigerVNC/$isim/archive/v$surum.tar.gz) + +derle() { + mv $DERLEME_KAYNAKDIZIN/v$surum.tar.gz $DERLEME_KAYNAKDIZIN/$isim-$surum.tar.gz + mkdir build + cd build + + cmake -G "Unix Makefiles" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + ../$isim-$surum + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/t/tilda/talimat b/talimatname/genel/t/tilda/talimat new file mode 100644 index 000000000..ebad079a3 --- /dev/null +++ b/talimatname/genel/t/tilda/talimat @@ -0,0 +1,18 @@ +# Tanım: Linux ve Unix için Gtk tabanlı açılır terminal +# URL: https://github.com/lanoxx/tilda +# Paketçi: Cihan_Alkan +# Gerekler: vte3 confuse +# Grup: sistem + +isim=tilda +surum=1.4.1 +devir=1 +kaynak=(https://github.com/lanoxx/$isim/archive/$isim-$surum.tar.gz) + +derle() { + cd $isim-$isim-$surum + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/t/tilde/talimat b/talimatname/genel/t/tilde/talimat new file mode 100644 index 000000000..f00f232eb --- /dev/null +++ b/talimatname/genel/t/tilde/talimat @@ -0,0 +1,17 @@ +# Tanım: Terminal için sezgisel bir metin editörü. +# URL: http://os.ghalkes.nl/tilde.html +# Paketçi: Cihan_Alkan +# Gerekler: libtranscript libt3widget libt3highlight +# Grup: ofis_duzenleyici + +isim=tilde +surum=0.3.7 +devir=1 +kaynak=(http://os.ghalkes.nl/dist/$isim-$surum.tar.bz2) + +derle() { + cd "${SRC}/${isim}-${surum}" + CXXFLAGS="-O2 -std=c++11" ./configure --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/t/time/talimat b/talimatname/genel/t/time/talimat new file mode 100644 index 000000000..b522bafc3 --- /dev/null +++ b/talimatname/genel/t/time/talimat @@ -0,0 +1,30 @@ +# Tanım: Diğer programların kullandığı CPU kaynaklarının (örneğin zaman ve bellek gibi) birçoğunu ölçer. +# URL: http://ftp.gnu.org/gnu/time +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=time +surum=1.7 +devir=1 +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum + + sed -i 's/$(ACLOCAL)//' Makefile.in + sed -i 's/lu", ptok ((UL) resp->ru.ru_maxrss)/ld", resp->ru.ru_maxrss/' time.c + + ./configure \ + --prefix=/usr \ + --infodir=/usr/share/info + + make + + install -v -m755 -d $PKG/usr/share/info + install -v -m755 -d $PKG/usr/bin + + /usr/bin/install -c -m 644 ./time.info $PKG/usr/share/info/time.info + /usr/bin/install -c time $PKG/usr/bin/`echo time|sed 's,x,x,'` + +} diff --git a/talimatname/genel/t/tinc/talimat b/talimatname/genel/t/tinc/talimat new file mode 100644 index 000000000..6369aa06f --- /dev/null +++ b/talimatname/genel/t/tinc/talimat @@ -0,0 +1,23 @@ +# Tanım: bir vpn uygulaması +# URL: http://www.tinc-vpn.org +# Paketçi: milisarge +# Gerekler: + +isim=tinc +surum=1.0.31 +devir=1 +kaynak=(https://github.com/gsliepen/tinc/archive/release-$surum.tar.gz) + +derle() { + cd $isim-release-$surum + autoreconf -fsi + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --sbindir=/usr/bin + make + make DESTDIR=$PKG install + install -d "$PKG"/etc/tinc/ + install -dm755 "$PKG"/usr/share/tinc/examples + cp -r doc/sample-config $PKG/usr/share/tinc/examples + cp doc/sample-config/tinc.conf "$PKG"/etc/tinc/ + find "$PKG"/usr/share/tinc/examples -type f -exec chmod 644 {} + + find "$PKG"/usr/share/tinc/examples -type d -exec chmod 755 {} + +} diff --git a/talimatname/genel/t/tint2-extras/talimat b/talimatname/genel/t/tint2-extras/talimat new file mode 100644 index 000000000..df3592689 --- /dev/null +++ b/talimatname/genel/t/tint2-extras/talimat @@ -0,0 +1,28 @@ +# Tanım: Hafif panel/görev çubuğu +# URL: http://tint2.googlecode.com +# Paketçi: milisarge +# Gerekler: tint2 python-gtk + +isim=tint2-extras +surum=0.11 +devir=1 +kaynak=(http://tint2.googlecode.com/files/tint2-$surum.tar.bz2) + +derle() { + cd tint2-$surum + + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DENABLE_BATTERY=OFF \ + -DENABLE_EXAMPLES=ON \ + -DENABLE_TINT2CONF=ON \ + -DMANDIR=/usr/man \ + -DSYSCONFDIR=/usr/etc + + make + make DESTDIR=$PKG install + + install -d $PKG/usr/share/tint2 + mv $PKG/usr/share/doc/tint2/examples $PKG/usr/share/tint2 + rm -rf $PKG/usr/{bin/tint2,etc,man,share/doc} +} diff --git a/talimatname/genel/t/tint2/add-power-now-support.patch b/talimatname/genel/t/tint2/add-power-now-support.patch new file mode 100644 index 000000000..5057043df --- /dev/null +++ b/talimatname/genel/t/tint2/add-power-now-support.patch @@ -0,0 +1,19 @@ +diff -rup ../tint2-0.11.orig/src/battery/battery.c ./src/battery/battery.c +--- ../tint2-0.11.orig/src/battery/battery.c 2010-12-02 23:56:11.313403140 +0100 ++++ ./src/battery/battery.c 2010-12-02 23:57:22.266956142 +0100 +@@ -184,8 +184,14 @@ void init_battery() + } + g_free(path2); + } +- if (path_energy_now && path_energy_full) { ++ ++ path_current_now = g_build_filename(battery_dir, "power_now", NULL); ++ if (!g_file_test (path_current_now, G_FILE_TEST_EXISTS)) { ++ g_free(path_current_now); + path_current_now = g_build_filename(battery_dir, "current_now", NULL); ++ } ++ ++ if (path_energy_now && path_energy_full) { + path_status = g_build_filename(battery_dir, "status", NULL); + + // check file diff --git a/talimatname/genel/t/tint2/clock.patch b/talimatname/genel/t/tint2/clock.patch new file mode 100644 index 000000000..307611f66 --- /dev/null +++ b/talimatname/genel/t/tint2/clock.patch @@ -0,0 +1,22 @@ +--- trunk/src/clock/clock.c (revision 652) ++++ trunk/src/clock/clock.c (working copy) +@@ -23,6 +23,8 @@ + #include + #include + #include ++#include ++#include + + #include "window.h" + #include "server.h" +@@ -98,6 +103,10 @@ + // remember old_sec because after suspend/hibernate the clock should be updated directly, and not + // on next minute change + time_t old_sec = time_clock.tv_sec; ++ ++ // Little hack to wait executed commands in clock_action avoiding zombies ++ waitpid(-1, NULL, WNOHANG); ++ + gettimeofday(&time_clock, 0); + if (time_clock.tv_sec % 60 == 0 || time_clock.tv_sec - old_sec > 60) { + int i; diff --git a/talimatname/genel/t/tint2/talimat b/talimatname/genel/t/tint2/talimat new file mode 100644 index 000000000..746be04e5 --- /dev/null +++ b/talimatname/genel/t/tint2/talimat @@ -0,0 +1,28 @@ +# Tanım: Hafif panel/görev çubuğu +# URL: http://tint2.googlecode.com +# Paketçi: Vitaly Sinilin, vs at kp4 dot ru +# Gerekler: cmake imlib2 pango + +isim=tint2 +surum=0.11 +devir=2 +kaynak=(http://$isim.googlecode.com/files/$isim-$surum.tar.bz2 \ + add-power-now-support.patch) + +derle() { + cd $isim-$surum + + patch -p0 -i $SRC/add-power-now-support.patch + + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DENABLE_BATTERY=ON \ + -DENABLE_EXAMPLES=OFF \ + -DENABLE_TINT2CONF=OFF \ + -DMANDIR=/usr/man \ + -DSYSCONFDIR=/usr/etc + + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/t/tinyxml/entity.patch b/talimatname/genel/t/tinyxml/entity.patch new file mode 100644 index 000000000..66d89a617 --- /dev/null +++ b/talimatname/genel/t/tinyxml/entity.patch @@ -0,0 +1,64 @@ +? entity.patch +Index: tinyxml.cpp +=================================================================== +RCS file: /cvsroot/tinyxml/tinyxml/tinyxml.cpp,v +retrieving revision 1.105 +diff -u -r1.105 tinyxml.cpp +--- tinyxml.cpp 5 Jun 2010 19:06:57 -0000 1.105 ++++ tinyxml.cpp 19 Jul 2010 21:24:16 -0000 +@@ -57,30 +57,7 @@ + { + unsigned char c = (unsigned char) str[i]; + +- if ( c == '&' +- && i < ( (int)str.length() - 2 ) +- && str[i+1] == '#' +- && str[i+2] == 'x' ) +- { +- // Hexadecimal character reference. +- // Pass through unchanged. +- // © -- copyright symbol, for example. +- // +- // The -1 is a bug fix from Rob Laveaux. It keeps +- // an overflow from happening if there is no ';'. +- // There are actually 2 ways to exit this loop - +- // while fails (error case) and break (semicolon found). +- // However, there is no mechanism (currently) for +- // this function to return an error. +- while ( i<(int)str.length()-1 ) +- { +- outString->append( str.c_str() + i, 1 ); +- ++i; +- if ( str[i] == ';' ) +- break; +- } +- } +- else if ( c == '&' ) ++ if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; +Index: xmltest.cpp +=================================================================== +RCS file: /cvsroot/tinyxml/tinyxml/xmltest.cpp,v +retrieving revision 1.89 +diff -u -r1.89 xmltest.cpp +--- xmltest.cpp 5 Jun 2010 17:41:52 -0000 1.89 ++++ xmltest.cpp 19 Jul 2010 21:24:16 -0000 +@@ -1340,6 +1340,16 @@ + }*/ + } + ++ #ifdef TIXML_USE_STL ++ { ++ TiXmlDocument xml; ++ xml.Parse("foo&#xa+bar"); ++ std::string str; ++ str << xml; ++ XmlTest( "Entity escaping", "foo&#xa+bar", str.c_str() ); ++ } ++ #endif ++ + /* 1417717 experiment + { + TiXmlDocument xml; diff --git a/talimatname/genel/t/tinyxml/talimat b/talimatname/genel/t/tinyxml/talimat new file mode 100644 index 000000000..a91da1761 --- /dev/null +++ b/talimatname/genel/t/tinyxml/talimat @@ -0,0 +1,30 @@ +# Tanım: Basit, küçük, minimal, C ++ XML ayrıştırıcı +# URL: http://www.grinninglizard.com/tinyxml/ +# Paketçi: milisarge +# Gerekler: + +isim=tinyxml +surum=2.6.2 +devir=1 +kaynak=(http://download.sourceforge.net/project/$isim/$isim/$surum/${isim}_${version//./_}.zip \ + entity.patch $isim-use-stl.patch) + +derle() { + export CXXFLAGS="${CXXFLAGS} -fPIC" + cd $isim + + patch -p0 -i $SRC/entity.patch + patch -p0 -i $SRC/$isim-use-stl.patch + sed -i -e "/^TINYXML_USE_STL/ s/=.*/= YES/" \ + -e "/^RELEASE_CFLAGS/ s/-O3/${CXXFLAGS}/" Makefile + + make + g++ ${CXXFLAGS} -DTIXML_USE_STL -shared -o lib$isim.so.$surum \ + -Wl,-soname,lib$isim.so.${version:0:1} *.o + + mkdir -p $PKG/usr/{include,lib} + install -m 0755 lib$isim.so.$surum $PKG/usr/lib/ + install -m 0644 *.h $PKG/usr/include/ + ln -s lib$isim.so.$surum $PKG/usr/lib/lib$isim.so.${version:0:1} + ln -s lib$isim.so.$surum $PKG/usr/lib/lib$isim.so +} diff --git a/talimatname/genel/t/tinyxml/tinyxml-use-stl.patch b/talimatname/genel/t/tinyxml/tinyxml-use-stl.patch new file mode 100644 index 000000000..b368c6881 --- /dev/null +++ b/talimatname/genel/t/tinyxml/tinyxml-use-stl.patch @@ -0,0 +1,11 @@ +--- tinyxml.h.orig 2013-03-17 22:25:59.051524653 -0500 ++++ tinyxml.h 2013-03-17 22:26:27.319650497 -0500 +@@ -43,6 +43,8 @@ + #define DEBUG + #endif + ++#define TIXML_USE_STL ++ + #ifdef TIXML_USE_STL + #include + #include diff --git a/talimatname/genel/t/tk/talimat b/talimatname/genel/t/tk/talimat new file mode 100644 index 000000000..95cd54903 --- /dev/null +++ b/talimatname/genel/t/tk/talimat @@ -0,0 +1,43 @@ +# Tanım: TCL için bir GUI araç seti. +# URL: http://www.tcl.tk/ +# Paketçi: milisarge +# Gerekler: tcl xorg-fontconfig xorg-libxft xorg-libxscrnsaver + +isim=tk +surum=8.6.6 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/tcl/Tcl/$surum/$isim$surum-src.tar.gz) + +derle() { + cd $isim$surum/unix + + ./configure \ + --prefix=/usr \ + --mandir=/usr/share/man \ + --enable-gcc \ + --enable-shared \ + --enable-xft + + make + make MKLINKS_FLAGS="-s" INSTALL_ROOT=$PKG install install-private-headers + + cp ../generic/*.h $PKG/usr/include/ + cp tkUnixPort.h $PKG/usr/include/tkPort.h + cp tkUnixDefault.h $PKG/usr/include/tkDefault.h + cp tkUnixInt.h $PKG/usr/include/tkInt.h + + # remove $SRC traces + sed \ + -e "s|$SRC/tk$surum/unix|/usr/lib|g" \ + -e "s|$SRC/tk$surum|/usr/include|g" \ + -i $PKG/usr/lib/tkConfig.sh + + rm -r $PKG/usr/lib/tk${surum%.*}/demos + rm $PKG/usr/lib/tk${surum%.*}/images/README + + ln -s wish${surum%.*} $PKG/usr/bin/wish + ln -s libtk${surum%.*}.so $PKG/usr/lib/libtk.so + ln -s libtkstub${surum%.*}.a $PKG/usr/lib/libtkstub.a + + chmod -R u+w $PKG/usr/share/man +} diff --git a/talimatname/genel/t/tmux/talimat b/talimatname/genel/t/tmux/talimat new file mode 100644 index 000000000..d49826263 --- /dev/null +++ b/talimatname/genel/t/tmux/talimat @@ -0,0 +1,16 @@ +# Tanım: Terminal çoklayıcı. +# URL: https://tmux.github.io +# Paketçi: milisarge +# Gerekler: libevent + +isim=tmux +surum=2.2 +devir=1 +kaynak=(https://github.com/tmux/tmux/releases/download/$surum/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tolua++/talimat b/talimatname/genel/t/tolua++/talimat new file mode 100644 index 000000000..599f48374 --- /dev/null +++ b/talimatname/genel/t/tolua++/talimat @@ -0,0 +1,23 @@ +# Tanım: C / C ++ kodunu Lua ile bütünleştiren bir araç +# URL: http://www.codenix.com/~tolua +# Paketçi: milisarge +# Gerekler: scons lua51 + +isim=tolua++ +surum=1.0.93 +devir=1 + +kaynak=(ftp://ftp.debian.org/debian/pool/main/t/$isim/${isim}_$surum.orig.tar.bz2) + +derle() { +cd $isim-$surum + +cat > config_linux.py << "EOF" +CCFLAGS = ['-I/usr/include/lua5.1', '-O2', '-ansi', '-Wall', '-fPIC'] +prefix = '/usr' +LIBS = ['lua5.1', 'dl', 'm'] +EOF + +scons all +scons prefix=$PKG/usr install +} diff --git a/talimatname/genel/t/tomb/talimat b/talimatname/genel/t/tomb/talimat new file mode 100644 index 000000000..36323f15f --- /dev/null +++ b/talimatname/genel/t/tomb/talimat @@ -0,0 +1,29 @@ +# Tanım: Şifreli dizin yuvaları yapmaya yarayan konsol uygulaması +# Url: https://www.dyne.org/software/tomb +# Paketçi: milisarge +# Gerekler: zsh cryptsetup gnupg sudo e2fsprogs + +isim=tomb +surum=git +devir=1 +kaynak=(https://raw.githubusercontent.com/parazyd/gtomb/master/gtomb::gtomb-$devir) +_git_url="https://github.com/dyne/Tomb" + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone $_git_url $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim/extras/kdf-keys + make + make DESTDIR="${PKG}" PREFIX=/usr install + cd $SRC/$isim + make DESTDIR="${PKG}" PREFIX=/usr install + sed -i "s|/usr/local/bin|/usr/bin|g" $SRC/gtomb-$devir + cp $SRC/gtomb-$devir $PKG/usr/bin/gtomb +} + diff --git a/talimatname/genel/t/totem-pl-parser/talimat b/talimatname/genel/t/totem-pl-parser/talimat new file mode 100644 index 000000000..7761f9de1 --- /dev/null +++ b/talimatname/genel/t/totem-pl-parser/talimat @@ -0,0 +1,18 @@ +# Tanım: GObject tabanlı kitaplık, çalma listesi formatlarını analiz eder ve kaydeder. +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: gmime intltool libsoup gobject-introspection + +isim=totem-pl-parser +surum=3.10.6 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/t/totem/talimat b/talimatname/genel/t/totem/talimat new file mode 100644 index 000000000..8c92d4f7e --- /dev/null +++ b/talimatname/genel/t/totem/talimat @@ -0,0 +1,20 @@ +# Tanım: GStreamer tabanlı GNOME3 film oynatıcı. +# URL: http://www.gnome.org/projects/totem/" +# Paketçi: yasarciv67@gmail.com +# Gerekler: gsettings-desktop-schemas desktop-file-utils gtk-update-icon-cache grilo libpeas gnome-icon-theme iso-codes gnome-doc-utils python-xdg clutter-gst clutter-gtk xorg-libsm libpeas python-gobject libgdata gstreamer1-plugins-good gstreamer1-plugins-bad totem-pl-parser nautilus python3-pylint + +isim=totem +surum=3.22.0 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-static \ + --enable-python \ + --enable-nautilus +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/totem/totem.kur-kos b/talimatname/genel/t/totem/totem.kur-kos new file mode 100644 index 000000000..c1b223d73 --- /dev/null +++ b/talimatname/genel/t/totem/totem.kur-kos @@ -0,0 +1,3 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/t/toxcore/talimat b/talimatname/genel/t/toxcore/talimat new file mode 100644 index 000000000..cf84f44eb --- /dev/null +++ b/talimatname/genel/t/toxcore/talimat @@ -0,0 +1,21 @@ +# Tanım: p2p şifreli iletişim protokol çekirdeği +# URL: https://github.com/TokTok/c-toxcore/ +# Paketçi: milisarge +# Gerekler: libconfig libsodium libvpx opus cmake + +isim=toxcore +surum=0.1.10 +devir=1 +kaynak=(https://github.com/TokTok/c-toxcore/archive/v$surum.tar.gz) + +derle() { + cd c-toxcore-$surum + sed -i "/Rpath/d;/RPATH/d" CMakeLists.txt + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DDHT_BOOTSTRAP=on \ + -DBOOTSTRAP_DAEMON=on \ + -DBUILD_NTOX=off + make + make DESTDIR="$PKG" install + install -Dm644 ./other/bootstrap_daemon/tox-bootstrapd.conf "$PKG/etc/tox-bootstrapd.conf" +} diff --git a/talimatname/genel/t/toxcore/toxcore.kur-kos b/talimatname/genel/t/toxcore/toxcore.kur-kos new file mode 100644 index 000000000..b424bd46a --- /dev/null +++ b/talimatname/genel/t/toxcore/toxcore.kur-kos @@ -0,0 +1,4 @@ +/sbin/groupadd -g 92 tox-bootstrapd +/sbin/useradd -g tox-bootstrapd -u 92 -d /var/tox-bootstrapd -s /bin/false tox-bootstrapd +/bin/passwd -l tox-bootstrapd +[[ -d var/lib/tox-bootstrapd ]] || install -dm 750 -o tox-bootstrapd -g tox-bootstrapd var/lib/tox-bootstrapd diff --git a/talimatname/genel/t/toybox/talimat b/talimatname/genel/t/toybox/talimat new file mode 100644 index 000000000..e7301c3e7 --- /dev/null +++ b/talimatname/genel/t/toybox/talimat @@ -0,0 +1,20 @@ +# Tanım: A BSD lisanslı busybox alternatifi +# URL: http://landley.net/toybox/ +# Paketçi: milisarge +# Gerekler: + +isim=toybox +surum=0.7.4 +devir=1.0 +kaynak=(http://landley.net/toybox/downloads/toybox-$surum.tar.gz) + +derle() { + cd "${SRC}/${isim}-${surum}" + make menuconfig + bash scripts/make.sh + mkdir -p "${PKG}/usr/share/licenses/${isim}" + mkdir -p "${PKG}/usr/bin" + PREFIX=${PKG}/usr/toybox/ make install + install -m755 "${SRC}/${isim}-${surum}/${isim}" "${PKG}/usr/bin/" + cp "${SRC}/${isim}-${surum}/LICENSE" "${PKG}/usr/share/licenses/toybox/" +} diff --git a/talimatname/genel/t/traceroute/talimat b/talimatname/genel/t/traceroute/talimat new file mode 100644 index 000000000..aea277a1d --- /dev/null +++ b/talimatname/genel/t/traceroute/talimat @@ -0,0 +1,16 @@ +# Tanım: Belirli bir ana makineye ulaşmak için paketlerin aldığı ağ yolunu görüntüleyin. +# URL: http://traceroute.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=traceroute +surum=2.0.21 +devir=1 + +kaynak=(http://downloads.sourceforge.net/traceroute/traceroute-$surum.tar.gz) + +derle(){ + cd $isim-$surum + make + make prefix=/usr DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tracker/talimat b/talimatname/genel/t/tracker/talimat new file mode 100644 index 000000000..d8cf2b0af --- /dev/null +++ b/talimatname/genel/t/tracker/talimat @@ -0,0 +1,23 @@ +# Tanım: Anlamsal veri depolama. +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: dbus exempi libgee gdk-pixbuf glib gnome-keyring gobject-introspection gstreamer1-plugins-base gtk3 icu libjpeg-turbo libexif libgsf libmediaart libosinfo libpng networkmanager pango poppler python sqlite libtiff totem-pl-parser upower util-linux vala zlib desktop-file-utils gtk-update-icon-cache + +isim=tracker +surum=1.10.3 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle(){ + cd $isim-$surum +./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-static \ + --disable-unit-tests \ + --disable-miner-evolution \ + --disable-miner-firefox \ + --disable-miner-thunderbird + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tracker/tracker.kur-kos b/talimatname/genel/t/tracker/tracker.kur-kos new file mode 100644 index 000000000..51b045731 --- /dev/null +++ b/talimatname/genel/t/tracker/tracker.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/t/transmission/talimat b/talimatname/genel/t/transmission/talimat new file mode 100644 index 000000000..fcea8627f --- /dev/null +++ b/talimatname/genel/t/transmission/talimat @@ -0,0 +1,22 @@ +# Tanım: Komut satırı ve web kullanıcı arayüzü ile BitTorrent istemcisi/arka plan programı +# URL: https://transmissionbt.com/ +# Paketçi: milisarge +# Gerekler: curl libevent gtk3 intltool + +isim=transmission +surum=2.92 +devir=1 +kaynak=(https://download.transmissionbt.com/files/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --enable-cli \ + --enable-daemon \ + --with-gtk + make + make DESTDIR=$PKG install + + rm $PKG/usr/share/transmission/web/LICENSE +} diff --git a/talimatname/genel/t/transmission/transmission.kur-kos b/talimatname/genel/t/transmission/transmission.kur-kos new file mode 100644 index 000000000..1dd81428d --- /dev/null +++ b/talimatname/genel/t/transmission/transmission.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database -q +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/t/trayer/manpage.diff b/talimatname/genel/t/trayer/manpage.diff new file mode 100644 index 000000000..76d6ad53f --- /dev/null +++ b/talimatname/genel/t/trayer/manpage.diff @@ -0,0 +1,197 @@ +Tanım: Debian manpage and path setup +Author: Jens Peter Secher +Index: trayer/trayer.1 +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ trayer/trayer.1 2011-05-08 21:38:37.000000000 +0200 +@@ -0,0 +1,190 @@ ++.TH TRAYER 1 "Feb 14, 2005" "FVWM\-Crystal" ++.SH NAME ++trayer \- a lightweight GTK2\-based systray for UNIX desktop ++.SH SYNOPSIS ++.B trayer \-h ++.br ++.B trayer \-v ++.br ++.B trayer ++.\" ++.RB [\| \-\-edge ++.RI \| left \||\| right \||\| top \||\| bottom \||\| none \|] ++.\" ++.RB [\| \-\-align ++.RI \| left \||\| right \||\| center \|] ++.\" ++.RB [\| \-\-margin ++.RI \| \|] ++.\" ++.RB [\| \-\-widthtype ++.RI \| request \||\| pixel \||\| percent ++.RI \|] ++.\" ++.RB [\| \-\-width ++.RI \| \|] ++.\" ++.RB [\| \-\-heighttype ++.RI \| \|] ++.\" ++.RB [\| \-\-height ++.RI \| \|] ++.\" ++.RB [\| \-\-SetDockType ++.RI \| true \||\| false \|] ++.\" ++.RB [\| \-\-SetPartialStrut ++.RI \| true \||\| false \|] ++.\" ++.RB [\| \-\-transparent ++.RI \| true \||\| false \|] ++.\" ++.RB [\| \-\-alpha ++.RI \| \|] ++.\" ++.RB [\| \-\-tint ++.RI \| \|] ++.\" ++.RB [\| \-\-distance ++.RI \| \|] ++.\" ++.RB [\| \-\-expand ++.RI \| true \||\| false \|] ++.\" ++.RB [\| \-\-padding ++.RI \| \|] ++.\" ++.SH DESCRIPTION ++.B trayer ++is a small program designed to provide system tray similar to these in ++.B GNOME ++/ ++.B KDE ++desktop environments for window managers which does not ++support that function. It is similar to other applications such as ++.B peksystray ++and \fBdocker\fP. ++.PP ++System tray is a place, where many applications put their icons, so they are ++always visible. Such icons may present status of an application and allow user ++to control the program. ++.PP ++\fBtrayer\fP's code was extracted from \fBfbpanel\fP application, you can find more ++about it on its homepage: http://fbpanel.sourceforge.net/. ++.SH OPTIONS ++This programs follow the usual GNU command line syntax, with long ++options starting with two dashes (`-'). ++A summary of options is included below. ++.TP ++.B \-\-help ++.TP ++.B \-h ++Show summary of options and exit. ++ ++.TP ++.B \-\-version ++.TP ++.B \-v ++Show version of program and exit. ++ ++.TP ++\fB\-\-edge\fP \fIleft\fP\||\|\fIright\fP\||\|\fItop\fP\||\|\fIbottom\fP\||\|\fInone\fP ++Specifies a screen edge to use. ++ ++.TP ++\fB\-\-align\fP \fIleft\fP\||\|\fIcenter\fP\||\|\fIright\fP ++Specifies an align of the icons. ++ ++.TP ++\fB\-\-margin\fP \fI\fP ++Specifies length of margin (in pixels) ++ ++.TP ++\fB\-\-widthtype\fB \fIrequest\fP\||\|\fIpixel\fP\||\|\fIpercent\fP ++Specifies method of calculating trayer's window width: ++.RS ++.TP ++\fIrequest\fP ++Follow application icons' size, so trayer may shrink or expand dynamically. ++ ++.TP ++\fIpixel\fP ++Set a fixed size, given with \fB\-\-width\fP option in pixels. ++ ++.TP ++\fIpercent\fP ++Set a fixed size, given with \fB\-\-width\fP option in percentage of a length of screen edge. ++.RE ++ ++.TP ++\fB\-\-width\fP \fI\fP ++Width of trayer's window. Ignored when \fB\-\-widthtype\fP is set to \fIrequest\fP. ++ ++.TP ++\fB\-\-heighttype\fP \fIrequest\fP\||\|\fIpixel\fP\||\|\fIpercent\fP ++Specifies method of calculating trayer's window height: ++.RS ++.TP ++\fIrequest\fP ++Follow application icons' size, so trayer may shrink or expand dynamically. ++ ++.TP ++\fIpixel\fP ++Set a fixed size, given with \fB\-\-height\fP option in pixels. ++ ++.TP ++\fIpercent\fP ++Set a fixed size, given with \fB\-\-height\fP option in percentage of a length of screen edge. ++.RE ++ ++.TP ++\fB\-\-height\fP \fI\fP ++Height of trayer's window. Ignored when \fB\-\-heighttype\fP is set to \fIrequest\fP. ++ ++.TP ++\fB\-\-SetDockType\fP \fItrue\fP\||\|\fIfalse\fP ++Identify panel window type as dock. ++ ++.TP ++\fB\-\-SetPartialStrut\fP \fItrue\fP\||\|\fIfalse\fP ++Reserve panel space so that it will not be covered by maximized windows. ++ ++.TP ++\fB\-\-transparent\fP \fItrue\fP\||\|\fIfalse\fP ++Use transparency. ++ ++.TP ++\fB\-\-alpha\fP \fI\fP ++Percentage of transparency (0 \- nontransparent, 255 \- fully transparent) ++ ++.TP ++\fB\-\-tint\fP \fI\fP ++Color used to tint transparent background. Color is given as a 24-bit C hexadecimal integer, for example: 0xff0000 is red, 0xff8800 is orange and 0x00ff00 is green. ++ ++.TP ++\fB\-\-distance\fP \fI\fP ++Specifies distance between trayer's window and screen edge (in pixels) ++ ++.TP ++\fB\-\-expand\fP \fItrue\fP\||\|\fIfalse\fP ++Specifies whether trayer may accommodate extra space when there is too much ++icons. ++ ++.TP ++\fB\-\-padding\fP \fI\fP ++Extra space between icons and trayer window's border. ++ ++.SH SEE ALSO ++.BR fbpanel (1) ++.SH AUTHORS ++Anatoly Asviyan \- fbpanel ++.br ++Rafal Bisingier ++.br ++Maciej Delmanowski ++.br ++Grzegorz Nieweglowski ++.br ++Thomas Rydzynski ++.PP ++This manual page was written by Tomasz Melcer . diff --git a/talimatname/genel/t/trayer/talimat b/talimatname/genel/t/trayer/talimat new file mode 100644 index 000000000..5fc5696c2 --- /dev/null +++ b/talimatname/genel/t/trayer/talimat @@ -0,0 +1,22 @@ +# Tanım: Hafif bir GTK2 tabanlı systray +# URL: http://home.gna.org/fvwm-crystal/ +# Paketçi: milisarge@gmail.com +# Gerekler: xorg-libxmu gtk2 + +isim=trayer +surum=1.0 +devir=1 +kaynak=(http://download.gna.org/fvwm-crystal/trayer/${surum}/${isim}-${surum}.tar.gz + trayer.diff manpage.diff ) + +derle() { + cd $isim-$surum + patch -p0 -i ../trayer.diff + patch -p1 -i ../manpage.diff + sed -i 's/$(LIBS) $(OBJ) $(SYSTRAYOBJ)/$(OBJ) $(SYSTRAYOBJ) $(LIBS) -lX11/' Makefile + make CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" + make PREFIX="$PKG/usr" install + install -D -m644 trayer.1 "$PKG/usr/share/man/man1/trayer.1" + install -D -m644 COPYING "$PKG/usr/share/licenses/$PKG/LICENSE" +} + diff --git a/talimatname/genel/t/trayer/trayer.diff b/talimatname/genel/t/trayer/trayer.diff new file mode 100644 index 000000000..469d249dc --- /dev/null +++ b/talimatname/genel/t/trayer/trayer.diff @@ -0,0 +1,22 @@ + # This patchfile was courtesy of the Debian team. Thanks! +--- Makefile.common ++++ Makefile.common~ +@@ -25,7 +25,7 @@ + endif + + # -DGTK_DISABLE_DEPRECATED does not work yet +-CFLAGS += -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED ++CFLAGS += -DG_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED + + %.o: %.c + $(CC) $(CFLAGS) $(INCS) -c $< +--- panel.c ++++ panel.c~ +@@ -588,7 +588,6 @@ + printf(" --height \n"); + printf(" --SetDockType \n"); + printf(" --SetPartialStrut \n"); +- printf(" --RoundCorners \n"); + printf(" --transparent \n"); + printf(" --alpha \n"); + printf(" --tint \n"); diff --git a/talimatname/genel/t/tree/talimat b/talimatname/genel/t/tree/talimat new file mode 100644 index 000000000..e70ee050e --- /dev/null +++ b/talimatname/genel/t/tree/talimat @@ -0,0 +1,17 @@ +# Tanım: Dizin ağacını göster +# URL: http://mama.indstate.edu/users/ice/tree/ +# Paketçi: milisarge +# Gerekler: + +isim=tree +surum=1.7.0 +devir=1 + +kaynak=(ftp://mama.indstate.edu/linux/$isim/$isim-$surum.tgz) + +derle() { + cd $isim-$surum + make + mkdir -p $PKG/usr/bin + cp tree $PKG/usr/bin/ +} diff --git a/talimatname/genel/t/trinity/talimat b/talimatname/genel/t/trinity/talimat new file mode 100644 index 000000000..dd427b64d --- /dev/null +++ b/talimatname/genel/t/trinity/talimat @@ -0,0 +1,19 @@ +# Tanım: Linux sistem çağrılarının test uygulaması +# Url: http://codemonkey.org.uk/projects/trinity/ +# Paketçi: milisarge +# Gerekler: +# Grup: güvenlik + +isim=trinity +surum=1.8 +devir=1 +kaynak=(http://codemonkey.org.uk/projects/trinity/trinity-1.8.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + mkdir -p $PKG/usr/bin + install -m755 trinity $PKG/usr/bin/ +} + diff --git a/talimatname/genel/t/tripwire/talimat b/talimatname/genel/t/tripwire/talimat new file mode 100644 index 000000000..d83238980 --- /dev/null +++ b/talimatname/genel/t/tripwire/talimat @@ -0,0 +1,56 @@ +# Tanım: Bir saldırı tespit sistemi +# URL: http://sourceforge.net/projects/tripwire/ +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: güvenlik + +isim=tripwire +surum=2.4.3.6 +devir=1 +kaynak=(https://github.com/Tripwire/tripwire-open-source/archive/2.4.3.6.tar.gz::$isim-$surum.tar.gz + twpol.txt + twcfg.txt) + +derle() { + cd tripwire-open-source-$surum + +#build package +# CFLAGS="$CFLAGS -fno-strict-aliasing" CXXFLAGS="$CXXFLAGS -fno-strict-aliasing" \ + autoreconf --force --install + ./autogen.sh + ./configure --sysconfdir=/etc/tripwire + make -j4 + + # This package doesn't have a typical make install, so we do it by hand. + +#create var/lib directories + install -d ${PKG}/var/lib + install -d -m700 ${PKG}/var/lib/tripwire + install -d -m700 ${PKG}/var/lib/tripwire/report + +#install binaries + install -d ${PKG}/usr/bin + install -m755 bin/siggen ${PKG}/usr/bin/ + install -m755 bin/tripwire ${PKG}/usr/bin/ + install -m755 bin/twadmin ${PKG}/usr/bin/ + install -m755 bin/twprint ${PKG}/usr/bin/ + +#copy install files for use by user after install, and fix a path + install -d ${PKG}/usr/share/$isim + install -m755 installer/install.sh ${PKG}/usr/share/$isim/ + install -m644 installer/install.cfg ${PKG}/usr/share/$isim/ + sed -i 's#./install/install.cfg#./install.cfg#' ${PKG}/usr/share/$isim/install.sh + +#install man pages - FS#13766 fixed + install -d ${PKG}/usr/share/man/{man4,man5,man8} + install -m644 man/man4/*.4 ${PKG}/usr/share/man/man4/ + install -m644 man/man5/*.5 ${PKG}/usr/share/man/man5/ + install -m644 man/man8/*.8 ${PKG}/usr/share/man/man8/ + +#install configuration files + mkdir ${PKG}/etc + mkdir ${PKG}/etc/tripwire + install -d ${PKG}/etc/$isim + install -m644 ${SRC}/twpol.txt ${PKG}/etc/tripwire/twpol.txt + install -m644 ${SRC}/twcfg.txt ${PKG}/etc/tripwire/twcfg.txt +} diff --git a/talimatname/genel/t/tripwire/twcfg.txt b/talimatname/genel/t/tripwire/twcfg.txt new file mode 100644 index 000000000..d4392be0b --- /dev/null +++ b/talimatname/genel/t/tripwire/twcfg.txt @@ -0,0 +1,15 @@ +ROOT =/usr/sbin +POLFILE =/etc/tripwire/tw.pol +DBFILE =/var/lib/tripwire/$(HOSTNAME).twd +REPORTFILE =/var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr +SITEKEYFILE =/etc/tripwire/site.key +LOCALKEYFILE =/etc/tripwire/$(HOSTNAME)-local.key +EDITOR =/usr/bin/vi +LATEPROMPTING =false +LOOSEDIRECTORYCHECKING =false +MAILNOVIOLATIONS =true +EMAILREPORTLEVEL =3 +REPORTLEVEL =3 +MAILMETHOD =SENDMAIL +SYSLOGREPORTING =false +MAILPROGRAM =/usr/sbin/sendmail -oi -t diff --git a/talimatname/genel/t/tripwire/twpol.txt b/talimatname/genel/t/tripwire/twpol.txt new file mode 100644 index 000000000..051804889 --- /dev/null +++ b/talimatname/genel/t/tripwire/twpol.txt @@ -0,0 +1,1093 @@ + ############################################################################## + # ## +############################################################################## # +# # # +# This is the example Tripwire Policy file. It is intended as a place to # # +# start creating your own custom Tripwire Policy file. Referring to it as # # +# well as the Tripwire Policy Guide should give you enough information to # # +# make a good custom Tripwire Policy file that better covers your # # +# configuration and security needs. A text version of this policy file is # # +# called twpol.txt. # # +# # # +# Note that this file is tuned to an 'everything' install of Red Hat Linux. # # +# If run unmodified, this file should create no errors on database # # +# creation, or violations on a subsiquent integrity check. However, it is # # +# impossible for there to be one policy file for all machines, so this # # +# existing one errs on the side of security. Your Linux configuration will # # +# most likey differ from the one our policy file was tuned to, and will # # +# therefore require some editing of the default Tripwire Policy file. # # +# # # +# The example policy file is best run with 'Loose Directory Checking' # # +# enabled. Set LOOSEDIRECTORYCHECKING=TRUE in the Tripwire Configuration # # +# file. # # +# # # +# Email support is not included and must be added to this file. # # +# Add the 'emailto=' to the rule directive section of each rule (add a comma # # +# after the 'severity=' line and add an 'emailto=' and include the email # # +# addresses you want the violation reports to go to). Addresses are # # +# semi-colon delimited. # # +# ## +############################################################################## + + + + ############################################################################## + # ## +############################################################################## # +# # # +# Global Variable Definitions # # +# # # +# These are defined at install time by the installation script. You may # # +# Manually edit these if you are using this file directly and not from the # # +# installation script itself. # # +# ## +############################################################################## + +@@section GLOBAL +TWROOT=/usr/sbin; +TWBIN=/usr/sbin; +TWPOL="/etc/tripwire"; +TWDB="/var/lib/tripwire"; +TWSKEY="/etc/tripwire"; +TWLKEY="/etc/tripwire"; +TWREPORT="/var/lib/tripwire/report"; +HOSTNAME=localhost; + +@@section FS +SEC_CRIT = $(IgnoreNone)-SHa ; # Critical files that cannot change +SEC_SUID = $(IgnoreNone)-SHa ; # Binaries with the SUID or SGID flags set +SEC_BIN = $(ReadOnly) ; # Binaries that should not change +SEC_CONFIG = $(Dynamic) ; # Config files that are changed infrequently but accessed often +SEC_LOG = $(Growing) ; # Files that grow, but that should never change ownership +SEC_INVARIANT = +tpug ; # Directories that should never change permission or ownership +SIG_LOW = 33 ; # Non-critical files that are of minimal security impact +SIG_MED = 66 ; # Non-critical files that are of significant security impact +SIG_HI = 100 ; # Critical files that are significant points of vulnerability + + +# Tripwire Binaries +( + rulename = "Tripwire Binaries", + severity = $(SIG_HI) +) +{ + $(TWBIN)/siggen -> $(SEC_BIN) ; + $(TWBIN)/tripwire -> $(SEC_BIN) ; + $(TWBIN)/twadmin -> $(SEC_BIN) ; + $(TWBIN)/twprint -> $(SEC_BIN) ; +} + +# Tripwire Data Files - Configuration Files, Policy Files, Keys, Reports, Databases +( + rulename = "Tripwire Data Files", + severity = $(SIG_HI) +) +{ + # NOTE: We remove the inode attribute because when Tripwire creates a backup, + # it does so by renaming the old file and creating a new one (which will + # have a new inode number). Inode is left turned on for keys, which shouldn't + # ever change. + + # NOTE: The first integrity check triggers this rule and each integrity check + # afterward triggers this rule until a database update is run, since the + # database file does not exist before that point. + + $(TWDB) -> $(SEC_CONFIG) -i ; + $(TWPOL)/tw.pol -> $(SEC_BIN) -i ; + $(TWPOL)/tw.cfg -> $(SEC_BIN) -i ; + $(TWLKEY)/$(HOSTNAME)-local.key -> $(SEC_BIN) ; + $(TWSKEY)/site.key -> $(SEC_BIN) ; + + #don't scan the individual reports + $(TWREPORT) -> $(SEC_CONFIG) (recurse=0) ; +} + + +# Tripwire HQ Connector Binaries +#( +# rulename = "Tripwire HQ Connector Binaries", +# severity = $(SIG_HI) +#) +#{ +# $(TWBIN)/hqagent -> $(SEC_BIN) ; +#} +# +# Tripwire HQ Connector - Configuration Files, Keys, and Logs + + ############################################################################## + # ## +############################################################################## # +# # # +# Note: File locations here are different than in a stock HQ Connector # # +# installation. This is because Tripwire 2.3 uses a different path # # +# structure than Tripwire 2.2.1. # # +# # # +# You may need to update your HQ Agent configuation file (or this policy # # +# file) to correct the paths. We have attempted to support the FHS standard # # +# here by placing the HQ Agent files similarly to the way Tripwire 2.3 # # +# places them. # # +# ## +############################################################################## + +#( +# rulename = "Tripwire HQ Connector Data Files", +# severity = $(SIG_HI) +#) +#{ +# ############################################################################# +# ############################################################################## +# # NOTE: Removing the inode attribute because when Tripwire creates a backup ## +# # it does so by renaming the old file and creating a new one (which will ## +# # have a new inode number). Leaving inode turned on for keys, which ## +# # shouldn't ever change. ## +# ############################################################################# +# +# $(TWBIN)/agent.cfg -> $(SEC_BIN) -i ; +# $(TWLKEY)/authentication.key -> $(SEC_BIN) ; +# $(TWDB)/tasks.dat -> $(SEC_CONFIG) ; +# $(TWDB)/schedule.dat -> $(SEC_CONFIG) ; +# +# # Uncomment if you have agent logging enabled. +# #/var/log/tripwire/agent.log -> $(SEC_LOG) ; +#} + + + +# Commonly accessed directories that should remain static with regards to owner and group +( + rulename = "Invariant Directories", + severity = $(SIG_MED) +) +{ + / -> $(SEC_INVARIANT) (recurse = 0) ; + /home -> $(SEC_INVARIANT) (recurse = 0) ; + /etc -> $(SEC_INVARIANT) (recurse = 0) ; +} + ################################################ + # ## +################################################ # +# # # +# File System and Disk Administration Programs # # +# ## +################################################ + +( + rulename = "File System and Disk Administraton Programs", + severity = $(SIG_HI) +) +{ + /sbin/accton -> $(SEC_CRIT) ; + /sbin/badblocks -> $(SEC_CRIT) ; + /sbin/busybox -> $(SEC_CRIT) ; + /sbin/busybox.anaconda -> $(SEC_CRIT) ; + /sbin/convertquota -> $(SEC_CRIT) ; + /sbin/dosfsck -> $(SEC_CRIT) ; + /sbin/debugfs -> $(SEC_CRIT) ; + /sbin/debugreiserfs -> $(SEC_CRIT) ; + /sbin/dumpe2fs -> $(SEC_CRIT) ; + /sbin/dump -> $(SEC_CRIT) ; + /sbin/dump.static -> $(SEC_CRIT) ; + # /sbin/e2fsadm -> $(SEC_CRIT) ; tune2fs? + /sbin/e2fsck -> $(SEC_CRIT) ; + /sbin/e2label -> $(SEC_CRIT) ; + /sbin/fdisk -> $(SEC_CRIT) ; + /sbin/fsck -> $(SEC_CRIT) ; + /sbin/fsck.ext2 -> $(SEC_CRIT) ; + /sbin/fsck.ext3 -> $(SEC_CRIT) ; + /sbin/fsck.minix -> $(SEC_CRIT) ; + /sbin/fsck.msdos -> $(SEC_CRIT) ; + /sbin/fsck.vfat -> $(SEC_CRIT) ; + /sbin/ftl_check -> $(SEC_CRIT) ; + /sbin/ftl_format -> $(SEC_CRIT) ; + /sbin/hdparm -> $(SEC_CRIT) ; + #/sbin/lvchange -> $(SEC_CRIT) ; + #/sbin/lvcreate -> $(SEC_CRIT) ; + #/sbin/lvdisplay -> $(SEC_CRIT) ; + #/sbin/lvextend -> $(SEC_CRIT) ; + #/sbin/lvmchange -> $(SEC_CRIT) ; + #/sbin/lvmcreate_initrd -> $(SEC_CRIT) ; + #/sbin/lvmdiskscan -> $(SEC_CRIT) ; + #/sbin/lvmsadc -> $(SEC_CRIT) ; + #/sbin/lvmsar -> $(SEC_CRIT) ; + #/sbin/lvreduce -> $(SEC_CRIT) ; + #/sbin/lvremove -> $(SEC_CRIT) ; + #/sbin/lvrename -> $(SEC_CRIT) ; + #/sbin/lvscan -> $(SEC_CRIT) ; + /sbin/mkbootdisk -> $(SEC_CRIT) ; + /sbin/mkdosfs -> $(SEC_CRIT) ; + /sbin/mke2fs -> $(SEC_CRIT) ; + /sbin/mkfs -> $(SEC_CRIT) ; + /sbin/mkfs.bfs -> $(SEC_CRIT) ; + /sbin/mkfs.ext2 -> $(SEC_CRIT) ; + /sbin/mkfs.minix -> $(SEC_CRIT) ; + /sbin/mkfs.msdos -> $(SEC_CRIT) ; + /sbin/mkfs.vfat -> $(SEC_CRIT) ; + /sbin/mkinitrd -> $(SEC_CRIT) ; + #/sbin/mkpv -> $(SEC_CRIT) ; + /sbin/mkraid -> $(SEC_CRIT) ; + /sbin/mkreiserfs -> $(SEC_CRIT) ; + /sbin/mkswap -> $(SEC_CRIT) ; + #/sbin/mtx -> $(SEC_CRIT) ; + /sbin/pam_console_apply -> $(SEC_CRIT) ; + /sbin/parted -> $(SEC_CRIT) ; + /sbin/pcinitrd -> $(SEC_CRIT) ; + #/sbin/pvchange -> $(SEC_CRIT) ; + #/sbin/pvcreate -> $(SEC_CRIT) ; + #/sbin/pvdata -> $(SEC_CRIT) ; + #/sbin/pvdisplay -> $(SEC_CRIT) ; + #/sbin/pvmove -> $(SEC_CRIT) ; + #/sbin/pvscan -> $(SEC_CRIT) ; + /sbin/quotacheck -> $(SEC_CRIT) ; + /sbin/quotaon -> $(SEC_CRIT) ; + /sbin/raidstart -> $(SEC_CRIT) ; + /sbin/reiserfsck -> $(SEC_CRIT) ; + /sbin/resize2fs -> $(SEC_CRIT) ; + /sbin/resize_reiserfs -> $(SEC_CRIT) ; + /sbin/restore -> $(SEC_CRIT) ; + /sbin/restore.static -> $(SEC_CRIT) ; + /sbin/scsi_info -> $(SEC_CRIT) ; + /sbin/sfdisk -> $(SEC_CRIT) ; + /sbin/stinit -> $(SEC_CRIT) ; + #/sbin/tapeinfo -> $(SEC_CRIT) ; + /sbin/tune2fs -> $(SEC_CRIT) ; + /sbin/unpack -> $(SEC_CRIT) ; + /sbin/update -> $(SEC_CRIT) ; + #/sbin/vgcfgbackup -> $(SEC_CRIT) ; + #/sbin/vgcfgrestore -> $(SEC_CRIT) ; + #/sbin/vgchange -> $(SEC_CRIT) ; + #/sbin/vgck -> $(SEC_CRIT) ; + #/sbin/vgcreate -> $(SEC_CRIT) ; + #/sbin/vgdisplay -> $(SEC_CRIT) ; + #/sbin/vgexport -> $(SEC_CRIT) ; + #/sbin/vgextend -> $(SEC_CRIT) ; + #/sbin/vgimport -> $(SEC_CRIT) ; + #/sbin/vgmerge -> $(SEC_CRIT) ; + #/sbin/vgmknodes -> $(SEC_CRIT) ; + #/sbin/vgreduce -> $(SEC_CRIT) ; + #/sbin/vgremove -> $(SEC_CRIT) ; + #/sbin/vgrename -> $(SEC_CRIT) ; + #/sbin/vgscan -> $(SEC_CRIT) ; + #/sbin/vgsplit -> $(SEC_CRIT) ; + /bin/chgrp -> $(SEC_CRIT) ; + /bin/chmod -> $(SEC_CRIT) ; + /bin/chown -> $(SEC_CRIT) ; + /bin/cp -> $(SEC_CRIT) ; + /bin/cpio -> $(SEC_CRIT) ; + /bin/mount -> $(SEC_CRIT) ; + /bin/umount -> $(SEC_CRIT) ; + /bin/mkdir -> $(SEC_CRIT) ; + /bin/mknod -> $(SEC_CRIT) ; + /bin/mktemp -> $(SEC_CRIT) ; + /bin/rm -> $(SEC_CRIT) ; + /bin/rmdir -> $(SEC_CRIT) ; + /bin/touch -> $(SEC_CRIT) ; +} + + ################################## + # ## +################################## # +# # # +# Kernel Administration Programs # # +# ## +################################## + +( + rulename = "Kernel Administration Programs", + severity = $(SIG_HI) +) +{ + /sbin/adjtimex -> $(SEC_CRIT) ; + /sbin/ctrlaltdel -> $(SEC_CRIT) ; + /sbin/depmod -> $(SEC_CRIT) ; + /sbin/insmod -> $(SEC_CRIT) ; + /sbin/insmod.static -> $(SEC_CRIT) ; + /sbin/insmod_ksymoops_clean -> $(SEC_CRIT) ; + /sbin/klogd -> $(SEC_CRIT) ; + /sbin/ldconfig -> $(SEC_CRIT) ; + /sbin/minilogd -> $(SEC_CRIT) ; + /sbin/modinfo -> $(SEC_CRIT) ; + #/sbin/nuactlun -> $(SEC_CRIT) ; + #/sbin/nuscsitcpd -> $(SEC_CRIT) ; + /sbin/pivot_root -> $(SEC_CRIT) ; + /sbin/sndconfig -> $(SEC_CRIT) ; + /sbin/sysctl -> $(SEC_CRIT) ; +} + + ####################### + # ## +####################### # +# # # +# Networking Programs # # +# ## +####################### + +( + rulename = "Networking Programs", + severity = $(SIG_HI) +) +{ + /etc/sysconfig/network-scripts/ifdown -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-cipcb -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-ippp -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-ipv6 -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-isdn -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-post -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-ppp -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-sit -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifdown-sl -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-aliases -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-cipcb -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-ippp -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-ipv6 -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-isdn -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-plip -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-plusb -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-post -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-ppp -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-routes -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-sit -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-sl -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/ifup-wireless -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/network-functions -> $(SEC_CRIT) ; + /etc/sysconfig/network-scripts/network-functions-ipv6 -> $(SEC_CRIT) ; + /bin/ping -> $(SEC_CRIT) ; + /sbin/agetty -> $(SEC_CRIT) ; + /sbin/arp -> $(SEC_CRIT) ; + /sbin/arping -> $(SEC_CRIT) ; + /sbin/dhcpcd -> $(SEC_CRIT) ; + /sbin/ether-wake -> $(SEC_CRIT) ; + #/sbin/getty -> $(SEC_CRIT) ; + /sbin/ifcfg -> $(SEC_CRIT) ; + /sbin/ifconfig -> $(SEC_CRIT) ; + /sbin/ifdown -> $(SEC_CRIT) ; + /sbin/ifenslave -> $(SEC_CRIT) ; + /sbin/ifport -> $(SEC_CRIT) ; + /sbin/ifup -> $(SEC_CRIT) ; + /sbin/ifuser -> $(SEC_CRIT) ; + /sbin/ip -> $(SEC_CRIT) ; + /sbin/ip6tables -> $(SEC_CRIT) ; + /sbin/ipchains -> $(SEC_CRIT) ; + /sbin/ipchains-restore -> $(SEC_CRIT) ; + /sbin/ipchains-save -> $(SEC_CRIT) ; + /sbin/ipfwadm -> $(SEC_CRIT) ; + /sbin/ipmaddr -> $(SEC_CRIT) ; + /sbin/iptables -> $(SEC_CRIT) ; + /sbin/iptables-restore -> $(SEC_CRIT) ; + /sbin/iptables-save -> $(SEC_CRIT) ; + /sbin/iptunnel -> $(SEC_CRIT) ; + /sbin/ipvsadm -> $(SEC_CRIT) ; + /sbin/ipvsadm-restore -> $(SEC_CRIT) ; + /sbin/ipvsadm-save -> $(SEC_CRIT) ; + /sbin/ipx_configure -> $(SEC_CRIT) ; + /sbin/ipx_interface -> $(SEC_CRIT) ; + /sbin/ipx_internal_net -> $(SEC_CRIT) ; + /sbin/iwconfig -> $(SEC_CRIT) ; + /sbin/iwgetid -> $(SEC_CRIT) ; + /sbin/iwlist -> $(SEC_CRIT) ; + /sbin/iwpriv -> $(SEC_CRIT) ; + /sbin/iwspy -> $(SEC_CRIT) ; + /sbin/mgetty -> $(SEC_CRIT) ; + /sbin/mingetty -> $(SEC_CRIT) ; + /sbin/nameif -> $(SEC_CRIT) ; + /sbin/netreport -> $(SEC_CRIT) ; + /sbin/plipconfig -> $(SEC_CRIT) ; + /sbin/portmap -> $(SEC_CRIT) ; + /sbin/ppp-watch -> $(SEC_CRIT) ; + #/sbin/rarp -> $(SEC_CRIT) ; + /sbin/route -> $(SEC_CRIT) ; + /sbin/slattach -> $(SEC_CRIT) ; + /sbin/tc -> $(SEC_CRIT) ; + #/sbin/uugetty -> $(SEC_CRIT) ; + /sbin/vgetty -> $(SEC_CRIT) ; + /sbin/ypbind -> $(SEC_CRIT) ; +} + + ################################## + # ## +################################## # +# # # +# System Administration Programs # # +# ## +################################## + +( + rulename = "System Administration Programs", + severity = $(SIG_HI) +) +{ + /sbin/chkconfig -> $(SEC_CRIT) ; + /sbin/fuser -> $(SEC_CRIT) ; + /sbin/halt -> $(SEC_CRIT) ; + /sbin/init -> $(SEC_CRIT) ; + /sbin/initlog -> $(SEC_CRIT) ; + /sbin/install-info -> $(SEC_CRIT) ; + /sbin/killall5 -> $(SEC_CRIT) ; + #/sbin/linuxconf -> $(SEC_CRIT) ; + #/sbin/linuxconf-auth -> $(SEC_CRIT) ; + /sbin/pam_tally -> $(SEC_CRIT) ; + /sbin/pwdb_chkpwd -> $(SEC_CRIT) ; + #/sbin/remadmin -> $(SEC_CRIT) ; + /sbin/rescuept -> $(SEC_CRIT) ; + /sbin/rmt -> $(SEC_CRIT) ; + /sbin/rpc.lockd -> $(SEC_CRIT) ; + /sbin/rpc.statd -> $(SEC_CRIT) ; + /sbin/rpcdebug -> $(SEC_CRIT) ; + /sbin/service -> $(SEC_CRIT) ; + /sbin/setsysfont -> $(SEC_CRIT) ; + /sbin/shutdown -> $(SEC_CRIT) ; + /sbin/sulogin -> $(SEC_CRIT) ; + /sbin/swapon -> $(SEC_CRIT) ; + /sbin/syslogd -> $(SEC_CRIT) ; + /sbin/unix_chkpwd -> $(SEC_CRIT) ; + /bin/pwd -> $(SEC_CRIT) ; + /bin/uname -> $(SEC_CRIT) ; +} + + ######################################## + # ## +######################################## # +# # # +# Hardware and Device Control Programs # # +# ## +######################################## +( + rulename = "Hardware and Device Control Programs", + severity = $(SIG_HI) +) +{ + /bin/setserial -> $(SEC_CRIT) ; + /bin/sfxload -> $(SEC_CRIT) ; + /sbin/blockdev -> $(SEC_CRIT) ; + /sbin/cardctl -> $(SEC_CRIT) ; + /sbin/cardmgr -> $(SEC_CRIT) ; + /sbin/cbq -> $(SEC_CRIT) ; + /sbin/dump_cis -> $(SEC_CRIT) ; + /sbin/elvtune -> $(SEC_CRIT) ; + /sbin/hotplug -> $(SEC_CRIT) ; + /sbin/hwclock -> $(SEC_CRIT) ; + /sbin/ide_info -> $(SEC_CRIT) ; + #/sbin/isapnp -> $(SEC_CRIT) ; + #/sbin/kbdrate -> $(SEC_CRIT) ; + /sbin/losetup -> $(SEC_CRIT) ; + /sbin/lspci -> $(SEC_CRIT) ; + /sbin/lspnp -> $(SEC_CRIT) ; + /sbin/mii-tool -> $(SEC_CRIT) ; + /sbin/pack_cis -> $(SEC_CRIT) ; + #/sbin/pnpdump -> $(SEC_CRIT) ; + /sbin/probe -> $(SEC_CRIT) ; + #/sbin/pump -> $(SEC_CRIT) ; + /sbin/setpci -> $(SEC_CRIT) ; + /sbin/shapecfg -> $(SEC_CRIT) ; +} + + ############################### + # ## +############################### # +# # # +# System Information Programs # # +# ## +############################### +( + rulename = "System Information Programs", + severity = $(SIG_HI) +) +{ + /sbin/consoletype -> $(SEC_CRIT) ; + /sbin/kernelversion -> $(SEC_CRIT) ; + /sbin/runlevel -> $(SEC_CRIT) ; +} + + #################################### + # ## +#################################### # +# # # +# Application Information Programs # # +# ## +#################################### + +( + rulename = "Application Information Programs", + severity = $(SIG_HI) +) +{ + /sbin/genksyms -> $(SEC_CRIT) ; + #/sbin/genksyms.old -> $(SEC_CRIT) ; + /sbin/rtmon -> $(SEC_CRIT) ; +} + + ########################## + # ## +########################## # +# # # +# Shell Related Programs # # +# ## +########################## +( + rulename = "Shell Related Programs", + severity = $(SIG_HI) +) +{ + /sbin/getkey -> $(SEC_CRIT) ; + /sbin/nash -> $(SEC_CRIT) ; + /sbin/sash -> $(SEC_CRIT) ; +} + + + ################ + # ## +################ # +# # # +# OS Utilities # # +# ## +################ +( + rulename = "Operating System Utilities", + severity = $(SIG_HI) +) +{ + /bin/arch -> $(SEC_CRIT) ; + /bin/ash -> $(SEC_CRIT) ; + /bin/ash.static -> $(SEC_CRIT) ; + /bin/aumix-minimal -> $(SEC_CRIT) ; + /bin/basename -> $(SEC_CRIT) ; + /bin/cat -> $(SEC_CRIT) ; + #/bin/consolechars -> $(SEC_CRIT) ; + /bin/cut -> $(SEC_CRIT) ; + /bin/date -> $(SEC_CRIT) ; + /bin/dd -> $(SEC_CRIT) ; + /bin/df -> $(SEC_CRIT) ; + /bin/dmesg -> $(SEC_CRIT) ; + /bin/doexec -> $(SEC_CRIT) ; + /bin/echo -> $(SEC_CRIT) ; + /bin/ed -> $(SEC_CRIT) ; + /bin/egrep -> $(SEC_CRIT) ; + /bin/false -> $(SEC_CRIT) ; + /bin/fgrep -> $(SEC_CRIT) ; + /bin/gawk -> $(SEC_CRIT) ; + /bin/gawk-3.1.0 -> $(SEC_CRIT) ; + /bin/gettext -> $(SEC_CRIT) ; + /bin/grep -> $(SEC_CRIT) ; + /bin/gunzip -> $(SEC_CRIT) ; + /bin/gzip -> $(SEC_CRIT) ; + /bin/hostname -> $(SEC_CRIT) ; + /bin/igawk -> $(SEC_CRIT) ; + /bin/ipcalc -> $(SEC_CRIT) ; + /bin/kill -> $(SEC_CRIT) ; + /bin/ln -> $(SEC_CRIT) ; + /bin/loadkeys -> $(SEC_CRIT) ; + /bin/login -> $(SEC_CRIT) ; + /bin/ls -> $(SEC_CRIT) ; + /bin/mail -> $(SEC_CRIT) ; + /bin/more -> $(SEC_CRIT) ; + /bin/mt -> $(SEC_CRIT) ; + /bin/mv -> $(SEC_CRIT) ; + /bin/netstat -> $(SEC_CRIT) ; + /bin/nice -> $(SEC_CRIT) ; + /bin/pgawk -> $(SEC_CRIT) ; + /bin/ps -> $(SEC_CRIT) ; + /bin/rpm -> $(SEC_CRIT) ; + /bin/sed -> $(SEC_CRIT) ; + /bin/sleep -> $(SEC_CRIT) ; + /bin/sort -> $(SEC_CRIT) ; + /bin/stty -> $(SEC_CRIT) ; + /bin/su -> $(SEC_CRIT) ; + /bin/sync -> $(SEC_CRIT) ; + /bin/tar -> $(SEC_CRIT) ; + /bin/true -> $(SEC_CRIT) ; + /bin/usleep -> $(SEC_CRIT) ; + /bin/vi -> $(SEC_CRIT) ; + /bin/zcat -> $(SEC_CRIT) ; + /bin/zsh -> $(SEC_CRIT) ; + /bin/zsh-4.0.2 -> $(SEC_CRIT) ; + /sbin/sln -> $(SEC_CRIT) ; + /usr/bin/vimtutor -> $(SEC_CRIT) ; +} + + ############################## + # ## +############################## # +# # # +# Critical Utility Sym-Links # # +# ## +############################## +( + rulename = "Critical Utility Sym-Links", + severity = $(SIG_HI) +) +{ + #/sbin/askrunlevel -> $(SEC_CRIT) ; + /sbin/clock -> $(SEC_CRIT) ; + #/sbin/fixperm -> $(SEC_CRIT) ; + /sbin/fsck.reiserfs -> $(SEC_CRIT) ; + #/sbin/fsconf -> $(SEC_CRIT) ; + /sbin/ipfwadm-wrapper -> $(SEC_CRIT) ; + /sbin/kallsyms -> $(SEC_CRIT) ; + /sbin/ksyms -> $(SEC_CRIT) ; + /sbin/lsmod -> $(SEC_CRIT) ; + #/sbin/mailconf -> $(SEC_CRIT) ; + /sbin/mkfs.reiserfs -> $(SEC_CRIT) ; + #/sbin/modemconf -> $(SEC_CRIT) ; + /sbin/modprobe -> $(SEC_CRIT) ; + /sbin/mount.ncp -> $(SEC_CRIT) ; + /sbin/mount.ncpfs -> $(SEC_CRIT) ; + /sbin/mount.smb -> $(SEC_CRIT) ; + /sbin/mount.smbfs -> $(SEC_CRIT) ; + #/sbin/netconf -> $(SEC_CRIT) ; + /sbin/pidof -> $(SEC_CRIT) ; + /sbin/poweroff -> $(SEC_CRIT) ; + /sbin/quotaoff -> $(SEC_CRIT) ; + /sbin/raid0run -> $(SEC_CRIT) ; + /sbin/raidhotadd -> $(SEC_CRIT) ; + /sbin/raidhotgenerateerror -> $(SEC_CRIT) ; + /sbin/raidhotremove -> $(SEC_CRIT) ; + /sbin/raidstop -> $(SEC_CRIT) ; + /sbin/rdump -> $(SEC_CRIT) ; + /sbin/rdump.static -> $(SEC_CRIT) ; + /sbin/reboot -> $(SEC_CRIT) ; + /sbin/rmmod -> $(SEC_CRIT) ; + /sbin/rrestore -> $(SEC_CRIT) ; + /sbin/rrestore.static -> $(SEC_CRIT) ; + /sbin/swapoff -> $(SEC_CRIT) ; + /sbin/telinit -> $(SEC_CRIT) ; + #/sbin/userconf -> $(SEC_CRIT) ; + #/sbin/uucpconf -> $(SEC_CRIT) ; + #/sbin/vregistry -> $(SEC_CRIT) ; + /bin/awk -> $(SEC_CRIT) ; + /bin/bash2 -> $(SEC_CRIT) ; + /bin/bsh -> $(SEC_CRIT) ; + /bin/csh -> $(SEC_CRIT) ; + /bin/dnsdomainname -> $(SEC_CRIT) ; + /bin/domainname -> $(SEC_CRIT) ; + /bin/ex -> $(SEC_CRIT) ; + /bin/gtar -> $(SEC_CRIT) ; + /bin/nisdomainname -> $(SEC_CRIT) ; + /bin/red -> $(SEC_CRIT) ; + /bin/rvi -> $(SEC_CRIT) ; + /bin/rview -> $(SEC_CRIT) ; + /bin/view -> $(SEC_CRIT) ; + /bin/ypdomainname -> $(SEC_CRIT) ; +} + + + ######################### + # ## +######################### # +# # # +# Temporary directories # # +# ## +######################### +( + rulename = "Temporary directories", + recurse = false, + severity = $(SIG_LOW) +) +{ + /usr/tmp -> $(SEC_INVARIANT) ; + /var/tmp -> $(SEC_INVARIANT) ; + /tmp -> $(SEC_INVARIANT) ; +} + + ############### + # ## +############### # +# # # +# Local files # # +# ## +############### +( + rulename = "User binaries", + severity = $(SIG_MED) +) +{ + /sbin -> $(SEC_BIN) (recurse = 1) ; + /usr/bin -> $(SEC_BIN) (recurse = 1) ; + /usr/sbin -> $(SEC_BIN) (recurse = 1) ; + /usr/local/bin -> $(SEC_BIN) (recurse = 1) ; +} + +( + rulename = "Shell Binaries", + severity = $(SIG_HI) +) +{ + /bin/bash -> $(SEC_BIN) ; + /bin/ksh -> $(SEC_BIN) ; + # /bin/psh -> $(SEC_BIN) ; # No longer used? + # /bin/Rsh -> $(SEC_BIN) ; # No longer used? + /bin/sh -> $(SEC_BIN) ; + # /bin/shell -> $(SEC_SUID) ; # No longer used? + # /bin/tsh -> $(SEC_BIN) ; # No longer used? + /bin/tcsh -> $(SEC_BIN) ; + /sbin/nologin -> $(SEC_BIN) ; +} + +( + rulename = "Security Control", + severity = $(SIG_HI) +) +{ + /etc/group -> $(SEC_CRIT) ; + /etc/security -> $(SEC_CRIT) ; + #/var/spool/cron/crontabs -> $(SEC_CRIT) ; # Uncomment when this file exists +} + +#( +# rulename = "Boot Scripts", +# severity = $(SIG_HI) +#) +#{ +# /etc/rc -> $(SEC_CONFIG) ; +# /etc/rc.bsdnet -> $(SEC_CONFIG) ; +# /etc/rc.dt -> $(SEC_CONFIG) ; +# /etc/rc.net -> $(SEC_CONFIG) ; +# /etc/rc.net.serial -> $(SEC_CONFIG) ; +# /etc/rc.nfs -> $(SEC_CONFIG) ; +# /etc/rc.powerfail -> $(SEC_CONFIG) ; +# /etc/rc.tcpip -> $(SEC_CONFIG) ; +# /etc/trcfmt.Z -> $(SEC_CONFIG) ; +#} + +( + rulename = "Login Scripts", + severity = $(SIG_HI) +) +{ + /etc/bashrc -> $(SEC_CONFIG) ; + /etc/csh.cshrc -> $(SEC_CONFIG) ; + /etc/csh.login -> $(SEC_CONFIG) ; + /etc/inputrc -> $(SEC_CONFIG) ; + # /etc/tsh_profile -> $(SEC_CONFIG) ; #Uncomment when this file exists + /etc/profile -> $(SEC_CONFIG) ; +} + +# Libraries +( + rulename = "Libraries", + severity = $(SIG_MED) +) +{ + /usr/lib -> $(SEC_BIN) ; + /usr/local/lib -> $(SEC_BIN) ; +} + + + ###################################################### + # ## +###################################################### # +# # # +# Critical System Boot Files # # +# These files are critical to a correct system boot. # # +# ## +###################################################### + +( + rulename = "Critical system boot files", + severity = $(SIG_HI) +) +{ + /boot -> $(SEC_CRIT) ; + #/sbin/devfsd -> $(SEC_CRIT) ; + /sbin/grub -> $(SEC_CRIT) ; + /sbin/grub-install -> $(SEC_CRIT) ; + /sbin/grub-md5-crypt -> $(SEC_CRIT) ; + /sbin/installkernel -> $(SEC_CRIT) ; + /sbin/lilo -> $(SEC_CRIT) ; + /sbin/mkkerneldoth -> $(SEC_CRIT) ; + !/boot/System.map ; + !/boot/module-info ; + /usr/share/grub/i386-redhat/e2fs_stage1_5 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/fat_stage1_5 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/ffs_stage1_5 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/minix_stage1_5 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/reiserfs_stage1_5 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/stage1 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/stage2 -> $(SEC_CRIT) ; + /usr/share/grub/i386-redhat/vstafs_stage1_5 -> $(SEC_CRIT) ; + # other boot files may exist. Look for: + #/ufsboot -> $(SEC_CRIT) ; +} + ################################################## + ################################################### + # These files change every time the system boots ## + ################################################## +( + rulename = "System boot changes", + severity = $(SIG_HI) +) +{ + !/var/run/ftp.pids-all ; # Comes and goes on reboot. + !/root/.enlightenment ; + /dev/log -> $(SEC_CONFIG) ; + /dev/cua0 -> $(SEC_CONFIG) ; + # /dev/printer -> $(SEC_CONFIG) ; # Uncomment if you have a printer device + /dev/console -> $(SEC_CONFIG) -u ; # User ID may change on console login/logout. + /dev/tty1 -> $(SEC_CONFIG) ; # tty devices + /dev/tty2 -> $(SEC_CONFIG) ; # tty devices + /dev/tty3 -> $(SEC_CONFIG) ; # are extremely + /dev/tty4 -> $(SEC_CONFIG) ; # variable + /dev/tty5 -> $(SEC_CONFIG) ; + /dev/tty6 -> $(SEC_CONFIG) ; + /dev/urandom -> $(SEC_CONFIG) ; + /dev/initctl -> $(SEC_CONFIG) ; + /var/lock/subsys -> $(SEC_CONFIG) ; + /var/lock/subsys/amd -> $(SEC_CONFIG) ; + /var/lock/subsys/anacron -> $(SEC_CONFIG) ; + /var/lock/subsys/apmd -> $(SEC_CONFIG) ; + /var/lock/subsys/arpwatch -> $(SEC_CONFIG) ; + /var/lock/subsys/atd -> $(SEC_CONFIG) ; + /var/lock/subsys/autofs -> $(SEC_CONFIG) ; + /var/lock/subsys/bcm5820 -> $(SEC_CONFIG) ; + /var/lock/subsys/bgpd -> $(SEC_CONFIG) ; + /var/lock/subsys/bootparamd -> $(SEC_CONFIG) ; + /var/lock/subsys/canna -> $(SEC_CONFIG) ; + /var/lock/subsys/crond -> $(SEC_CONFIG) ; + /var/lock/subsys/cWnn -> $(SEC_CONFIG) ; + /var/lock/subsys/dhcpd -> $(SEC_CONFIG) ; + /var/lock/subsys/firewall -> $(SEC_CONFIG) ; + /var/lock/subsys/freeWnn -> $(SEC_CONFIG) ; + /var/lock/subsys/gated -> $(SEC_CONFIG) ; + /var/lock/subsys/gpm -> $(SEC_CONFIG) ; + /var/lock/subsys/httpd -> $(SEC_CONFIG) ; + /var/lock/subsys/identd -> $(SEC_CONFIG) ; + /var/lock/subsys/innd -> $(SEC_CONFIG) ; + /var/lock/subsys/ipchains -> $(SEC_CONFIG) ; + /var/lock/subsys/iptables -> $(SEC_CONFIG) ; + /var/lock/subsys/ipvsadm -> $(SEC_CONFIG) ; + /var/lock/subsys/irda -> $(SEC_CONFIG) ; + /var/lock/subsys/iscsi -> $(SEC_CONFIG) ; + /var/lock/subsys/isdn -> $(SEC_CONFIG) ; + /var/lock/subsys/junkbuster -> $(SEC_CONFIG) ; + /var/lock/subsys/kadmin -> $(SEC_CONFIG) ; + /var/lock/subsys/keytable -> $(SEC_CONFIG) ; + /var/lock/subsys/kprop -> $(SEC_CONFIG) ; + /var/lock/subsys/krb524 -> $(SEC_CONFIG) ; + /var/lock/subsys/krb5kdc -> $(SEC_CONFIG) ; + /var/lock/subsys/kudzu -> $(SEC_CONFIG) ; + /var/lock/subsys/kWnn -> $(SEC_CONFIG) ; + /var/lock/subsys/ldap -> $(SEC_CONFIG) ; + /var/lock/subsys/linuxconf -> $(SEC_CONFIG) ; + /var/lock/subsys/lpd -> $(SEC_CONFIG) ; + /var/lock/subsys/mars_nwe -> $(SEC_CONFIG) ; + /var/lock/subsys/mcserv -> $(SEC_CONFIG) ; + /var/lock/subsys/mysqld -> $(SEC_CONFIG) ; + /var/lock/subsys/named -> $(SEC_CONFIG) ; + /var/lock/subsys/netfs -> $(SEC_CONFIG) ; + /var/lock/subsys/network -> $(SEC_CONFIG) ; + /var/lock/subsys/nfs -> $(SEC_CONFIG) ; + /var/lock/subsys/nfslock -> $(SEC_CONFIG) ; + /var/lock/subsys/nscd -> $(SEC_CONFIG) ; + /var/lock/subsys/ntpd -> $(SEC_CONFIG) ; + /var/lock/subsys/ospf6d -> $(SEC_CONFIG) ; + /var/lock/subsys/ospfd -> $(SEC_CONFIG) ; + /var/lock/subsys/pcmcia -> $(SEC_CONFIG) ; + /var/lock/subsys/portmap -> $(SEC_CONFIG) ; + /var/lock/subsys/postgresql -> $(SEC_CONFIG) ; + /var/lock/subsys/pxe -> $(SEC_CONFIG) ; + /var/lock/subsys/radvd -> $(SEC_CONFIG) ; + /var/lock/subsys/random -> $(SEC_CONFIG) ; + /var/lock/subsys/rarpd -> $(SEC_CONFIG) ; + /var/lock/subsys/reconfig -> $(SEC_CONFIG) ; + /var/lock/subsys/rhnsd -> $(SEC_CONFIG) ; + /var/lock/subsys/ripd -> $(SEC_CONFIG) ; + /var/lock/subsys/ripngd -> $(SEC_CONFIG) ; + /var/lock/subsys/routed -> $(SEC_CONFIG) ; + /var/lock/subsys/rstatd -> $(SEC_CONFIG) ; + /var/lock/subsys/rusersd -> $(SEC_CONFIG) ; + /var/lock/subsys/rwalld -> $(SEC_CONFIG) ; + /var/lock/subsys/rwhod -> $(SEC_CONFIG) ; + /var/lock/subsys/sendmail -> $(SEC_CONFIG) ; + /var/lock/subsys/smb -> $(SEC_CONFIG) ; + /var/lock/subsys/snmpd -> $(SEC_CONFIG) ; + /var/lock/subsys/squid -> $(SEC_CONFIG) ; + /var/lock/subsys/sshd -> $(SEC_CONFIG) ; + /var/lock/subsys/syslog -> $(SEC_CONFIG) ; + /var/lock/subsys/tux -> $(SEC_CONFIG) ; + /var/lock/subsys/tWnn -> $(SEC_CONFIG) ; + /var/lock/subsys/ups -> $(SEC_CONFIG) ; + /var/lock/subsys/vncserver -> $(SEC_CONFIG) ; + /var/lock/subsys/wine -> $(SEC_CONFIG) ; + /var/lock/subsys/xfs -> $(SEC_CONFIG) ; + /var/lock/subsys/xinetd -> $(SEC_CONFIG) ; + /var/lock/subsys/ypbind -> $(SEC_CONFIG) ; + /var/lock/subsys/yppasswdd -> $(SEC_CONFIG) ; + /var/lock/subsys/ypserv -> $(SEC_CONFIG) ; + /var/lock/subsys/ypxfrd -> $(SEC_CONFIG) ; + /var/lock/subsys/zebra -> $(SEC_CONFIG) ; + /var/run -> $(SEC_CONFIG) ; + /var/log -> $(SEC_CONFIG) ; + /etc/ioctl.save -> $(SEC_CONFIG) ; + /etc/issue.net -> $(SEC_CONFIG) -i ; # Inode number changes + /etc/issue -> $(SEC_CONFIG) ; + /etc/mtab -> $(SEC_CONFIG) -i ; # Inode number changes on any mount/unmount + /lib/modules -> $(SEC_CONFIG) ; + /etc/.pwd.lock -> $(SEC_CONFIG) ; + # /lib/modules/preferred -> $(SEC_CONFIG) ; #Uncomment when this file exists +} + +# These files change the behavior of the root account +( + rulename = "Root config files", + severity = 100 +) +{ + /root -> $(SEC_CRIT) ; # Catch all additions to /root + /root/.Xresources -> $(SEC_CONFIG) ; + /root/.bashrc -> $(SEC_CONFIG) ; + /root/.bash_profile -> $(SEC_CONFIG) ; + /root/.bash_logout -> $(SEC_CONFIG) ; + /root/.cshrc -> $(SEC_CONFIG) ; + /root/.tcshrc -> $(SEC_CONFIG) ; + #/root/Mail -> $(SEC_CONFIG) ; + #/root/mail -> $(SEC_CONFIG) ; + #/root/.amandahosts -> $(SEC_CONFIG) ; + #/root/.addressbook.lu -> $(SEC_CONFIG) ; + #/root/.addressbook -> $(SEC_CONFIG) ; + /root/.bash_history -> $(SEC_CONFIG) ; + #/root/.elm -> $(SEC_CONFIG) ; + /root/.esd_auth -> $(SEC_CONFIG) ; + /root/.gnome_private -> $(SEC_CONFIG) ; + /root/.gnome-desktop -> $(SEC_CONFIG) ; + /root/.gnome -> $(SEC_CONFIG) ; + /root/.ICEauthority -> $(SEC_CONFIG) ; + #/root/.mc -> $(SEC_CONFIG) ; + #/root/.pinerc -> $(SEC_CONFIG) ; + #/root/.sawfish -> $(SEC_CONFIG) ; + /root/.Xauthority -> $(SEC_CONFIG) -i ; # Changes Inode number on login + #/root/.xauth -> $(SEC_CONFIG) ; + #/root/.xsession-errors -> $(SEC_CONFIG) ; +} + + ################################ + # ## +################################ # +# # # +# Critical configuration files # # +# ## +################################ +( + rulename = "Critical configuration files", + severity = $(SIG_HI) +) +{ + #/etc/conf.linuxconf -> $(SEC_BIN) ; + /etc/crontab -> $(SEC_BIN) ; + /etc/cron.hourly -> $(SEC_BIN) ; + /etc/cron.daily -> $(SEC_BIN) ; + /etc/cron.weekly -> $(SEC_BIN) ; + /etc/cron.monthly -> $(SEC_BIN) ; + /etc/default -> $(SEC_BIN) ; + /etc/fstab -> $(SEC_BIN) ; + /etc/exports -> $(SEC_BIN) ; + /etc/group- -> $(SEC_BIN) ; # changes should be infrequent + /etc/host.conf -> $(SEC_BIN) ; + /etc/hosts.allow -> $(SEC_BIN) ; + /etc/hosts.deny -> $(SEC_BIN) ; + /etc/httpd/conf -> $(SEC_BIN) ; # changes should be infrequent + /etc/protocols -> $(SEC_BIN) ; + /etc/services -> $(SEC_BIN) ; + /etc/rc.d/init.d -> $(SEC_BIN) ; + /etc/rc.d -> $(SEC_BIN) ; + /etc/mail.rc -> $(SEC_BIN) ; + /etc/modules.conf -> $(SEC_BIN) ; + /etc/motd -> $(SEC_BIN) ; + /etc/named.conf -> $(SEC_BIN) ; + /etc/passwd -> $(SEC_CONFIG) ; + /etc/passwd- -> $(SEC_CONFIG) ; + /etc/profile.d -> $(SEC_BIN) ; + /var/lib/nfs/rmtab -> $(SEC_BIN) ; + /usr/sbin/fixrmtab -> $(SEC_BIN) ; + /etc/rpc -> $(SEC_BIN) ; + /etc/sysconfig -> $(SEC_BIN) ; + /etc/samba/smb.conf -> $(SEC_CONFIG) ; + #/etc/gettydefs -> $(SEC_BIN) ; + /etc/nsswitch.conf -> $(SEC_BIN) ; + /etc/yp.conf -> $(SEC_BIN) ; + /etc/hosts -> $(SEC_CONFIG) ; + /etc/xinetd.conf -> $(SEC_CONFIG) ; + /etc/inittab -> $(SEC_CONFIG) ; + /etc/resolv.conf -> $(SEC_CONFIG) ; + /etc/syslog.conf -> $(SEC_CONFIG) ; +} + + #################### + # ## +#################### # +# # # +# Critical devices # # +# ## +#################### +( + rulename = "Critical devices", + severity = $(SIG_HI), + recurse = false +) +{ + /dev/kmem -> $(Device) ; + /dev/mem -> $(Device) ; + /dev/null -> $(Device) ; + /dev/zero -> $(Device) ; + /proc/devices -> $(Device) ; + /proc/net -> $(Device) ; + /proc/sys -> $(Device) ; + /proc/cpuinfo -> $(Device) ; + /proc/modules -> $(Device) ; + /proc/mounts -> $(Device) ; + /proc/dma -> $(Device) ; + /proc/filesystems -> $(Device) ; + /proc/pci -> $(Device) ; + /proc/interrupts -> $(Device) ; + /proc/driver/rtc -> $(Device) ; + /proc/ioports -> $(Device) ; + /proc/scsi -> $(Device) ; + /proc/kcore -> $(Device) ; + /proc/self -> $(Device) ; + /proc/kmsg -> $(Device) ; + /proc/stat -> $(Device) ; + /proc/ksyms -> $(Device) ; + /proc/loadavg -> $(Device) ; + /proc/uptime -> $(Device) ; + /proc/locks -> $(Device) ; + /proc/version -> $(Device) ; + /proc/mdstat -> $(Device) ; + /proc/meminfo -> $(Device) ; + /proc/cmdline -> $(Device) ; + /proc/misc -> $(Device) ; +} + +# Rest of critical system binaries +( + rulename = "OS executables and libraries", + severity = $(SIG_HI) +) +{ + /bin -> $(SEC_BIN) ; + /lib -> $(SEC_BIN) ; +} + +#============================================================================= +# +# Copyright 2000 Tripwire, Inc. Tripwire is a registered trademark of Tripwire, +# Inc. in the United States and other countries. All rights reserved. +# +# Linux is a registered trademark of Linus Torvalds. +# +# UNIX is a registered trademark of The Open Group. +# +#============================================================================= +# +# Permission is granted to make and distribute verbatim copies of this document +# provided the copyright notice and this permission notice are preserved on all +# copies. +# +# Permission is granted to copy and distribute modified versions of this +# document under the conditions for verbatim copying, provided that the entire +# resulting derived work is distributed under the terms of a permission notice +# identical to this one. +# +# Permission is granted to copy and distribute translations of this document +# into another language, under the above conditions for modified versions, +# except that this permission notice may be stated in a translation approved by +# Tripwire, Inc. +# +# DCM diff --git a/talimatname/genel/t/trojita/talimat b/talimatname/genel/t/trojita/talimat new file mode 100644 index 000000000..b62c0ecde --- /dev/null +++ b/talimatname/genel/t/trojita/talimat @@ -0,0 +1,21 @@ +# Tanım: QT IMAP e-posta istemcisi +# URL: http://trojita.flaska.net +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: git desktop-file-utils hicolor-icon-theme qt5-webkit qtkeychain-qt5 qt5 gpgmepp + +isim=trojita +surum=0.7 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.xz) + +derle() { + mkdir build + cd build + cmake ../$isim-$surum \ + -DQT_QMAKE_EXECUTABLE=qmake-qt5 \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/t/tslib/talimat b/talimatname/genel/t/tslib/talimat new file mode 100644 index 000000000..84ec1a0b3 --- /dev/null +++ b/talimatname/genel/t/tslib/talimat @@ -0,0 +1,21 @@ +# Tanım: Dokunmatik Ekran Erişim Kitaplığı. +# URL: https://github.com/kergoth/tslib +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=tslib +surum=1.1 +devir=1 + +kaynak=( https://github.com/kergoth/tslib/releases/download/1.1/tslib-1.1.tar.xz) + +derle(){ +cd $isim-$surum +./autogen.sh +./configure --prefix=/usr \ + --sysconfdir=/etc + +make +make DESTDIR=$PKG install +rm -f $PKG/usr/share/doc +} diff --git a/talimatname/genel/t/tsocks/fix-mkinstalldirs.patch b/talimatname/genel/t/tsocks/fix-mkinstalldirs.patch new file mode 100644 index 000000000..70465cbc8 --- /dev/null +++ b/talimatname/genel/t/tsocks/fix-mkinstalldirs.patch @@ -0,0 +1,12 @@ +--- a/Makefile.in 2014-09-23 16:50:30.336402163 +0200 ++++ b/Makefile.in 2013-06-28 18:04:10.000000000 +0200 +@@ -12,7 +12,7 @@ + includedir = @includedir@ + + SHELL = /bin/sh +-MKINSTALLDIRS = ${SHELL} mkinstalldirs ++MKINSTALLDIRS = mkdir -p + SHCC = ${CC} -fPIC + INSPECT = inspectsocks + SAVE = saveme + diff --git a/talimatname/genel/t/tsocks/talimat b/talimatname/genel/t/tsocks/talimat new file mode 100644 index 000000000..ab03d4d79 --- /dev/null +++ b/talimatname/genel/t/tsocks/talimat @@ -0,0 +1,23 @@ +# Tanım: Transparan SOCKS vekil kütüphanesi (ipv6 destekli) +# URL: https://github.com/Elysion-tcfa/tsocks +# Paketçi: milisarge +# Gerekler: + +isim=tsocks +surum=1.8beta6 +devir=1 +GIT_COMMIT=be36c83a7326c75123fa019a4cb53792ecd8f689 + +kaynak=(https://github.com/Elysion-tcfa/tsocks/archive/${GIT_COMMIT}.tar.gz + fix-mkinstalldirs.patch) + +derle(){ + cd "${SRC}/tsocks-${GIT_COMMIT}" + export CPPFLAGS= + patch -p1 < ../fix-mkinstalldirs.patch + ./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --libdir=/usr/lib + make + make DESTDIR="${PKG}" install + install -d "${PKG}/usr/share/${isim}" + install -m644 tsocks.conf.{simple,complex}.example "${PKG}/usr/share/${isim}" +} diff --git a/talimatname/genel/t/ttf-liberation/talimat b/talimatname/genel/t/ttf-liberation/talimat new file mode 100644 index 000000000..d6ad3f2f7 --- /dev/null +++ b/talimatname/genel/t/ttf-liberation/talimat @@ -0,0 +1,28 @@ +# Tanım: Red Hats Liberation yazı tipleri. +# URL: https://www.redhat.com/promo/fonts/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg-fontconfig xorg-font-util xorg-encodings fontforge + +isim=ttf-liberation +surum=2.00.1 +devir=1 + +kaynak=( +https://fedorahosted.org/releases/l/i/liberation-fonts/liberation-fonts-ttf-$surum.tar.gz +ttf-liberation.30-0-liberation-mono.conf +ttf-liberation.30-0-liberation-sans.conf +ttf-liberation.30-0-liberation-serif.conf) + +derle(){ + cd liberation-fonts-ttf-$surum + install -d $PKG/usr/share/fonts/TTF/ + install -m644 *.ttf $PKG/usr/share/fonts/TTF/ + + # install fontconfig files + install -Dm644 $SRC/ttf-liberation.30-0-liberation-mono.conf \ + $PKG/etc/fonts/conf.avail/30-$isim-mono.conf + install -Dm644 $SRC/ttf-liberation.30-0-liberation-sans.conf \ + $PKG/etc/fonts/conf.avail/30-$isim-sans.conf + install -Dm644 $SRC/ttf-liberation.30-0-liberation-serif.conf \ + $PKG/etc/fonts/conf.avail/30-$pkgname-serif.conf +} diff --git a/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-mono.conf b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-mono.conf new file mode 100644 index 000000000..acf5178d2 --- /dev/null +++ b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-mono.conf @@ -0,0 +1,17 @@ + + + + + + Courier New + + Liberation Mono + + + + Liberation Mono + + Courier New + + + \ No newline at end of file diff --git a/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-sans.conf b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-sans.conf new file mode 100644 index 000000000..6e70b4092 --- /dev/null +++ b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-sans.conf @@ -0,0 +1,17 @@ + + + + + + Arial + + Liberation Sans + + + + Liberation Sans + + Arial + + + \ No newline at end of file diff --git a/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-serif.conf b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-serif.conf new file mode 100644 index 000000000..b69a13a32 --- /dev/null +++ b/talimatname/genel/t/ttf-liberation/ttf-liberation.30-0-liberation-serif.conf @@ -0,0 +1,17 @@ + + + + + + Times New Roman + + Liberation Serif + + + + Liberation Serif + + Times New Roman + + + \ No newline at end of file diff --git a/talimatname/genel/t/ttf-liberation/ttf-liberation.kur-kos b/talimatname/genel/t/ttf-liberation/ttf-liberation.kur-kos new file mode 100644 index 000000000..1fedfec2d --- /dev/null +++ b/talimatname/genel/t/ttf-liberation/ttf-liberation.kur-kos @@ -0,0 +1,12 @@ +# Update mkfontscale and mkfontdir: +if [ -x usr/bin/mkfontdir ]; then + ( cd usr/share/fonts/TTF + mkfontscale . + mkfontdir . + ) +fi + +# Update the X font indexes: +if [ -x usr/bin/fc-cache ]; then + usr/bin/fc-cache -f +fi diff --git a/talimatname/genel/t/ttf-linux-libertine/talimat b/talimatname/genel/t/ttf-linux-libertine/talimat new file mode 100644 index 000000000..28531f1f4 --- /dev/null +++ b/talimatname/genel/t/ttf-linux-libertine/talimat @@ -0,0 +1,23 @@ +# Tanım: Büyük Unicode kapsamı olan Serif (Libertine) ve Sans Serif (Biolinum) OpenType fontlar +# URL: http://linuxlibertine.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-fontconfig + +_reldate=2012_07_02 + +isim=ttf-linux-libertine +surum=5.3.0 +devir=1 + +kaynak=("http://downloads.sourceforge.net/project/linuxlibertine/linuxlibertine/${surum}/LinLibertine"{TTF,OTF}"_${surum}_${_reldate}.tgz") + +derle() { + cd $SRC + install -dm755 $PKG/usr/share/fonts/{OTF,TTF} + install -m644 *.ttf $PKG/usr/share/fonts/TTF + install -m644 *.otf $PKG/usr/share/fonts/OTF + + install -Dm644 OFL-1.1.txt $PKG/usr/share/licenses/$isim/LICENSE + install -Dm644 LICENCE.txt $PKG/usr/share/licenses/$isim/README +} + diff --git a/talimatname/genel/t/ttf-ms-fonts/talimat b/talimatname/genel/t/ttf-ms-fonts/talimat new file mode 100644 index 000000000..404a76ade --- /dev/null +++ b/talimatname/genel/t/ttf-ms-fonts/talimat @@ -0,0 +1,26 @@ +# Tanım: Microsoft'un Çekirdek TTF Fontları +# URL: http://corefonts.sourceforge.net +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-fontconfig libarchive p7zip +_sfpath="http://downloads.sourceforge.net/corefonts" + +isim=ttf-ms-fonts +surum=2.0 +devir=1 + +kaynak=($_sfpath/andale32.exe $_sfpath/arial32.exe $_sfpath/arialb32.exe + $_sfpath/comic32.exe $_sfpath/courie32.exe $_sfpath/georgi32.exe + $_sfpath/impact32.exe $_sfpath/times32.exe $_sfpath/trebuc32.exe + $_sfpath/verdan32.exe $_sfpath/webdin32.exe ) + +derle() { + for i in *.exe; do + 7z e -y $i; + done + + install -dm755 "$PKG/usr/share/fonts/TTF" + + for font in *.{ttf,TTF}; do + install -m644 $font $PKG/usr/share/fonts/TTF/$(echo $font|tr A-Z a-z) + done +} diff --git a/talimatname/genel/t/tumbler/talimat b/talimatname/genel/t/tumbler/talimat new file mode 100644 index 000000000..5d670c6dd --- /dev/null +++ b/talimatname/genel/t/tumbler/talimat @@ -0,0 +1,22 @@ +# Tanım: Küçük resim yönetimi D-Bus teknik özelliklerine dayanan bir D-Bus minik resim oluşturma hizmeti. +# URL: http://www.ohloh.net/p/tumbler-xfce +# Paketçi: milisarge +# Gerekler: libjpeg-turbo libpng freetype gdk-pixbuf dbus-glib intltool gstreamer libgsf +# Grup: xfce4 + +isim=tumbler +source /root/talimatname/genel/x/xfce4/surumler +surum="${tumbler_surum}";[ -z ${tumbler_surum} ] && \ +surum=0.1.31 +devir=2 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/t/tuntox/shared-build.patch b/talimatname/genel/t/tuntox/shared-build.patch new file mode 100644 index 000000000..2e4d9b9fe --- /dev/null +++ b/talimatname/genel/t/tuntox/shared-build.patch @@ -0,0 +1,22 @@ +diff --git a/Makefile b/Makefile +index 5e19d0a..96c6ff3 100644 +--- a/Makefile ++++ b/Makefile +@@ -3,7 +3,7 @@ DEPS=libtoxcore + CC=gcc + CFLAGS=-g #-std=c99 + CFLAGS += $(shell pkg-config --cflags $(DEPS)) +-LDFLAGS=-g -pthread -lm -static -lrt ++LDFLAGS=-g -pthread -lm -lrt + LDFLAGS += $(shell pkg-config --libs $(DEPS)) + OBJECTS=$(SOURCES:.c=.o) + INCLUDES = $(wildcard *.h) +@@ -19,7 +19,7 @@ gitversion.c: gitversion.h + $(CC) $(CFLAGS) $< -c -o $@ + + tuntox: $(OBJECTS) $(INCLUDES) +- $(CC) -o $@ $(OBJECTS) -ltoxcore -lpthread $(LDFLAGS) /usr/local/lib/libsodium.a /usr/local/lib/libtoxcore.a ++ $(CC) -o $@ $(OBJECTS) -ltoxcore -lpthread $(LDFLAGS) -lsodium + + cscope.out: + cscope -bv ./*.[ch] diff --git a/talimatname/genel/t/tuntox/talimat b/talimatname/genel/t/tuntox/talimat new file mode 100644 index 000000000..07977403c --- /dev/null +++ b/talimatname/genel/t/tuntox/talimat @@ -0,0 +1,23 @@ +# Tanım: Tox protokolü üzerinden tünel TCP bağlantıları +# URL: http://tuntox.pl/ +# Paketçi: milisarge +# Gerekler: cscope toxcore + +isim=tuntox +surum=git +devir=1 + +kaynak=(shared-build.patch) +derle() { +if [ ! -d $DERLEME_KAYNAKDIZIN/$isim.git ];then + git clone https://github.com/gjedeer/$isim.git +else + cd $DERLEME_KAYNAKDIZIN/$isim.git + git pull + cd - +fi +cd $isim +patch -p1 -i ../shared-build.patch +make +install -Dm755 tuntox "$PKG/usr/bin/tuntox" +} diff --git a/talimatname/genel/t/tup/talimat b/talimatname/genel/t/tup/talimat new file mode 100644 index 000000000..e27985268 --- /dev/null +++ b/talimatname/genel/t/tup/talimat @@ -0,0 +1,23 @@ +# Tanım: Hızlı ve dosya bazlı derleme sistemi uygulaması +# URL: http://gittup.org/tup/index.html +# Paketçi: milisarge +# Gerekler: git fuse +# Grup: geliştirme + +isim=tup +surum=git +devir=1 +kaynak=() + +derle() { + adres="https://github.com/gittup/tup" + git_indir ${adres} ${isim} + cd $SRC/${isim} + + sh bootstrap.sh + install -d "$PKG"/usr/bin "$PKG"/usr/share/man/man1 "$PKG"/usr/share/vim/vimfiles/{syntax,ftdetect} + install -m755 -t "$PKG"/usr/bin tup + install -m644 -t "$PKG"/usr/share/man/man1 tup.1 + install -m644 -t "$PKG"/usr/share/vim/vimfiles/syntax contrib/syntax/tup.vim + echo 'au BufNewFile,BufRead Tupfile,*.tup setf tup' > "$PKG"/usr/share/vim/vimfiles/ftdetect/tup.vim +} diff --git a/talimatname/genel/t/turses/talimat b/talimatname/genel/t/turses/talimat new file mode 100644 index 000000000..8090fc998 --- /dev/null +++ b/talimatname/genel/t/turses/talimat @@ -0,0 +1,16 @@ +# Tanım: Konsol için bir Twitter istemcisi. +# URL: http://pypi.python.org/pypi/turses/ +# Paketçi: milisarge +# Gerekler: python-oauth2 python-setuptools python-tweepy python-urwid + +isim=turses +surum=0.2.23 +devir=1 + +kaynak=( +http://pypi.python.org/packages/source/t/turses/turses-$surum.tar.gz) + +derle() { + cd $isim-$surum + python2 setup.py install --prefix=/usr --root=$PKG +} diff --git a/talimatname/genel/t/tuxmath/talimat b/talimatname/genel/t/tuxmath/talimat new file mode 100644 index 000000000..fc4e78051 --- /dev/null +++ b/talimatname/genel/t/tuxmath/talimat @@ -0,0 +1,31 @@ +# Tanım: Çocukların matematik gerçeklerini uygulamalarına yardımcı olan bir arcade oyunu +# URL: http://tux4kids.alioth.debian.org/ +# Paketçi: Cihan Alkan +# Gerekler: t4k-common + +isim=tuxmath +surum=2.0.3 +devir=1 + +kaynak=(http://distro.ibiblio.org/slitaz/sources/packages/t/tuxmath_w_fonts-2.0.3.tar.gz + tuxmath.desktop) + + +derle() { + cd tuxmath_w_fonts-2.0.3 + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install + # install .desktop dosyası ve simge + mkdir -p $PKG/usr/share/{applications,pixmaps} + install -D $SRC/tuxmath.desktop $PKG/usr/share/applications/tuxmath.desktop + install -D -m644 data/images/icons/icon.png $PKG/usr/share/pixmaps/tuxmath.png + + # install lisans + install -D -m644 doc/OFL \ + $PKG/usr/share/licenses/$isim/OFL + install -D -m644 doc/README_DATA_LICENSES \ + $PKG/usr/share/licenses/$isim/DATA_LICENSES +} diff --git a/talimatname/genel/t/tuxmath/tuxmath.desktop b/talimatname/genel/t/tuxmath/tuxmath.desktop new file mode 100644 index 000000000..a9c287aa6 --- /dev/null +++ b/talimatname/genel/t/tuxmath/tuxmath.desktop @@ -0,0 +1,18 @@ +[Desktop Entry] +Name=Tux Math +GenericName=Educational math game +GenericName[de]=Mathe Spiel +GenericName[ru]=Образовательная игра +GenericName[tr]=Matematik Oyunu +Comment=Tux Math - Learn math with Tux! +Comment[pl]=Tux Math - Ucz siê matematyki z Tuxem! +Comment[de]=Tux Math - Lerne Mathe mit Tux! +Comment[ru]=Обучение арифметике с пингвином в главной роли +Comment[tr]=Eğitici Matematik Oyunu +Exec=tuxmath +Icon=tuxmath +Type=Application +Terminal=false +Categories=Education;Math; +## X-SuSE-translate=false +X-Ubuntu-Gettext-Domain=tuxmath diff --git a/talimatname/genel/t/tuxpaint/talimat b/talimatname/genel/t/tuxpaint/talimat new file mode 100644 index 000000000..824b06e6f --- /dev/null +++ b/talimatname/genel/t/tuxpaint/talimat @@ -0,0 +1,52 @@ +# Tanım: Küçük çocuklar için tasarlanmış çizim programı +# URL: http://tuxpaint.org/ +# Paketçi: Cihan Alkan +# Gerekler: optipng setconf sdl-ttf sdl-mixer python fribidi sdl-image sdl-pango libpaper librsvg + +isim=tuxpaint +surum=0.9.22 +devir=1 + +kaynak=(https://downloads.sourceforge.net/sourceforge/tuxpaint/$isim-$surum.tar.gz) + +derle() { + + cd $isim-$surum +# python2 fix + for f in docs/zh_tw/mkTuxpaintIM.py fonts/locale/zh_tw_docs/maketuxfont.py; do + sed -i '0,/on/s//on2/' $f + done + + # libpng15 fix + sed -i 's:$(ARCH_LINKS):$(ARCH_LINKS) -lpng:' Makefile + + # libpng16 fix + find -name '*.png' -exec optipng -quiet -force -fix {} + + + # fullscreen by default + sed -i 's:# fu:fu:' src/tuxpaint.conf + + # desktop shortcut categories + setconf src/tuxpaint.desktop Categories 'Game;KidsGame;Graphics;RasterGraphics;' + + # bash completion placement + setconf Makefile COMPLETIONDIR '$(DESTDIR)/usr/share/bash-completion/completions' + + cd $SRC + make -C "$isim-$surum" PREFIX=/usr clean translations all -j1 + + make -C "$isim-$surum" \ + PREFIX=/usr \ + GNOME_PREFIX=/usr \ + X11_ICON_PREFIX="$PKG/usr/share/pixmaps" \ + DESTDIR="$PKG" \ + install -j1 + + # fix permissions + chmod -R 644 "$PKG/usr/share/doc/tuxpaint-dev/"* + chmod 755 "$PKG/usr/share/doc/tuxpaint-dev/html" + + # bash completions + mv "$PKG/usr/share/bash-completion/completions/tuxpaint-completion.bash" \ + "$PKG/usr/share/bash-completion/completions/tuxpaint" +} diff --git a/talimatname/genel/t/txt2tags/talimat b/talimatname/genel/t/txt2tags/talimat new file mode 100644 index 000000000..3ac24505c --- /dev/null +++ b/talimatname/genel/t/txt2tags/talimat @@ -0,0 +1,34 @@ +# Tanım: Txt2tags bir belge üretecidir +# URL: http://txt2tags.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=txt2tags +surum=2.6 +devir=1 + +kaynak=(http://txt2tags.googlecode.com/files/$isim-$surum.tgz) + +derle() { +cd $isim-$surum + mkdir -p $PKG/usr/bin + mkdir -p $PKG/usr/share/{man/man1,man/fr/man1,vim/syntax,doc/$isim} + # bin + sed -i "s/env\ python/env\ python2/" txt2tags + install -m 755 txt2tags $PKG/usr/bin + install -m 755 extras/{t2tmake.rb,gensite,html-update.sh} $PKG/usr/bin + # vim + install -m 644 extras/*.vim $PKG/usr/share/vim/syntax + # page man + install -m 644 doc/manpage.man $PKG/usr/share/man/man1/txt2tags.1 + install -m 644 doc/manpage-fr.man $PKG/usr/share/man/fr/man1/txt2tags.1 + # doc + install -m 644 doc/{*.pdf,*.t2t} $PKG/usr/share/doc/$isim + # locale fr + mkdir -p $PKG/usr/share/locale/fr/LC_MESSAGES/ + cd po + msgfmt -o txt2tags.mo fr.po + install -m 644 txt2tags.mo $PKG/usr/share/locale/fr/LC_MESSAGES +} + + diff --git a/talimatname/genel/u/uchardet/talimat b/talimatname/genel/u/uchardet/talimat new file mode 100644 index 000000000..73a5dae3f --- /dev/null +++ b/talimatname/genel/u/uchardet/talimat @@ -0,0 +1,20 @@ +# Tanım: Encoding detector library ported from Mozilla +# URL: https://www.freedesktop.org/wiki/Software/uchardet +# Paketçi: milisarge +# Gerekler: cmake + +isim=uchardet +surum=0.0.6 +devir=1 +kaynak=(https://www.freedesktop.org/software/uchardet/releases/uchardet-0.0.6.tar.xz +) + +derle() { + cd ${isim}-${surum} + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_BUILD_TYPE=Release + make + make DESTDIR="${PKG}/" install +} diff --git a/talimatname/genel/u/ucspi-tcp/head-1.patch b/talimatname/genel/u/ucspi-tcp/head-1.patch new file mode 100644 index 000000000..b8b0fd9b3 --- /dev/null +++ b/talimatname/genel/u/ucspi-tcp/head-1.patch @@ -0,0 +1,40 @@ +--- Makefile.orig 2003-09-03 10:42:49.624475128 -0400 ++++ Makefile 2003-09-03 10:43:04.950145272 -0400 +@@ -41 +41 @@ +- ./auto-str auto_home `head -1 conf-home` > auto_home.c ++ ./auto-str auto_home `head -n 1 conf-home` > auto_home.c +@@ -152 +152 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -164 +164 @@ +- echo exec "`head -1 conf-cc`" '-c $${1+"$$@"}' \ ++ echo exec "`head -n 1 conf-cc`" '-c $${1+"$$@"}' \ +@@ -171 +171 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -295 +295 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -349 +349 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -392 +392 @@ +- echo exec "`head -1 conf-ld`" \ ++ echo exec "`head -n 1 conf-ld`" \ +@@ -419 +419 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -517 +517 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -674,2 +674,2 @@ +- echo CC=\'`head -1 conf-cc`\'; \ +- echo LD=\'`head -1 conf-ld`\'; \ ++ echo CC=\'`head -n 1 conf-cc`\'; \ ++ echo LD=\'`head -n 1 conf-ld`\'; \ +@@ -718 +718 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ +@@ -860 +860 @@ +- | sed s}HOME}"`head -1 conf-home`"}g \ ++ | sed s}HOME}"`head -n 1 conf-home`"}g \ diff --git a/talimatname/genel/u/ucspi-tcp/talimat b/talimatname/genel/u/ucspi-tcp/talimat new file mode 100644 index 000000000..eca56e3fe --- /dev/null +++ b/talimatname/genel/u/ucspi-tcp/talimat @@ -0,0 +1,26 @@ +# Tanım: Tcp istemci-sunucu uygulamalar üretmek için konsol uygulaması +# URL: http://cr.yp.to/ucspi-tcp.html +# Paketçi: milisarge +# Gerekler: +# Grup: + +isim=ucspi-tcp +surum=0.88 +devir=1 +kaynak=(http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz + ucspi-tcp-0.88-ipv6.patch + head-1.patch) + +derle() { + cd "$SRC/$isim-$surum" + patch -p0 < "$SRC/head-1.patch" + patch -p1 < "$SRC/ucspi-tcp-$surum-ipv6.patch" + echo "gcc ${CFLAGS}" > conf-cc + echo "/usr" > conf-home + make + for bin in tcpserver tcprules tcprulescheck argv0 recordio \ + tcpclient *\@ tcpcat mconnect mconnect-io addcr \ + delcr fixcrio rblsmtpd; do + install -m 755 -D $bin "$PKG/usr/bin/$bin" + done +} diff --git a/talimatname/genel/u/ucspi-tcp/ucspi-tcp-0.88-ipv6.patch b/talimatname/genel/u/ucspi-tcp/ucspi-tcp-0.88-ipv6.patch new file mode 100644 index 000000000..d83be6a8b --- /dev/null +++ b/talimatname/genel/u/ucspi-tcp/ucspi-tcp-0.88-ipv6.patch @@ -0,0 +1,4976 @@ +diff -uNr ucspi-tcp-0.88.orig/FILES ucspi-tcp-0.88/FILES +--- ucspi-tcp-0.88.orig/FILES 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/FILES 2009-08-04 17:45:59.000000000 -0500 +@@ -216,3 +216,40 @@ + warn-auto.sh + warn-shsgr + x86cpuid.c ++dns_ip6.c ++dns_ipq6.c ++dns_nd6.c ++dns_sortip6.c ++fmt_xlong.c ++ip6_fmt.c ++ip6_scan.c ++scan_0x.c ++socket_accept6.c ++socket_bind6.c ++socket_conn6.c ++socket_local6.c ++socket_recv6.c ++socket_remote6.c ++socket_send6.c ++socket_tcp6.c ++timeoutconn6.c ++tryip6.c ++haveip6.h2 ++haveip6.h1 ++remoteinfo6.c ++addcr.1 ++argv0.1 ++date@.1 ++delcr.1 ++finger@.1 ++fixcr.1 ++http@.1 ++mconnect.1 ++recordio.1 ++tcp-environ.5 ++tcpcat.1 ++tcpclient.1 ++tcprules.1 ++tcprulescheck.1 ++tcpserver.1 ++who@.1 +diff -uNr ucspi-tcp-0.88.orig/Makefile ucspi-tcp-0.88/Makefile +--- ucspi-tcp-0.88.orig/Makefile 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/Makefile 2009-08-04 17:45:59.000000000 -0500 +@@ -76,12 +76,14 @@ + makelib byte_chr.o byte_copy.o byte_cr.o byte_diff.o byte_rchr.o \ + byte_zero.o case_diffb.o case_diffs.o fmt_ulong.o ip4_fmt.o \ + ip4_scan.o scan_ulong.o str_chr.o str_diff.o str_len.o str_start.o \ +-uint16_pack.o uint16_unpack.o uint32_pack.o uint32_unpack.o ++uint16_pack.o uint16_unpack.o uint32_pack.o uint32_unpack.o \ ++ip6_fmt.o scan_ip6.o scan_xlong.o fmt_xlong.o + ./makelib byte.a byte_chr.o byte_copy.o byte_cr.o \ + byte_diff.o byte_rchr.o byte_zero.o case_diffb.o \ + case_diffs.o fmt_ulong.o ip4_fmt.o ip4_scan.o scan_ulong.o \ + str_chr.o str_diff.o str_len.o str_start.o uint16_pack.o \ +- uint16_unpack.o uint32_pack.o uint32_unpack.o ++ uint16_unpack.o uint32_pack.o uint32_unpack.o ip6_fmt.o \ ++ scan_ip6.o scan_xlong.o fmt_xlong.o + + byte_chr.o: \ + compile byte_chr.c byte.h +@@ -181,11 +183,13 @@ + dns.a: \ + makelib dns_dfd.o dns_domain.o dns_dtda.o dns_ip.o dns_ipq.o \ + dns_name.o dns_nd.o dns_packet.o dns_random.o dns_rcip.o dns_rcrw.o \ +-dns_resolve.o dns_sortip.o dns_transmit.o dns_txt.o ++dns_resolve.o dns_sortip.o dns_transmit.o dns_txt.o dns_ip6.o \ ++dns_sortip6.o dns_nd6.o dns_ipq6.o + ./makelib dns.a dns_dfd.o dns_domain.o dns_dtda.o dns_ip.o \ + dns_ipq.o dns_name.o dns_nd.o dns_packet.o dns_random.o \ + dns_rcip.o dns_rcrw.o dns_resolve.o dns_sortip.o \ +- dns_transmit.o dns_txt.o ++ dns_transmit.o dns_txt.o dns_ip6.o dns_sortip6.o dns_nd6.o \ ++ dns_ipq6.o + + dns_dfd.o: \ + compile dns_dfd.c error.h alloc.h byte.h dns.h stralloc.h gen_alloc.h \ +@@ -257,7 +261,7 @@ + dns_transmit.o: \ + compile dns_transmit.c socket.h uint16.h alloc.h error.h byte.h \ + readwrite.h uint16.h dns.h stralloc.h gen_alloc.h iopause.h taia.h \ +-tai.h uint64.h taia.h ++tai.h uint64.h taia.h uint32.h + ./compile dns_transmit.c + + dns_txt.o: \ +@@ -498,9 +502,15 @@ + remoteinfo.o: \ + compile remoteinfo.c fmt.h buffer.h socket.h uint16.h error.h \ + iopause.h taia.h tai.h uint64.h timeoutconn.h uint16.h remoteinfo.h \ +-stralloc.h gen_alloc.h uint16.h ++stralloc.h gen_alloc.h uint16.h uint32.h + ./compile remoteinfo.c + ++remoteinfo6.o: \ ++compile remoteinfo6.c fmt.h buffer.h socket.h uint16.h error.h \ ++iopause.h taia.h tai.h uint64.h timeoutconn.h uint16.h remoteinfo.h \ ++stralloc.h gen_alloc.h uint16.h uint32.h ++ ./compile remoteinfo6.c ++ + rts: \ + warn-auto.sh rts.sh conf-home + cat warn-auto.sh rts.sh \ +@@ -557,43 +567,43 @@ + rm -f trylsock.o trylsock + + socket_accept.o: \ +-compile socket_accept.c byte.h socket.h uint16.h ++compile socket_accept.c byte.h socket.h uint16.h uint32.h + ./compile socket_accept.c + + socket_bind.o: \ +-compile socket_bind.c byte.h socket.h uint16.h ++compile socket_bind.c byte.h socket.h uint16.h uint32.h + ./compile socket_bind.c + + socket_conn.o: \ +-compile socket_conn.c readwrite.h byte.h socket.h uint16.h ++compile socket_conn.c readwrite.h byte.h socket.h uint16.h uint32.h + ./compile socket_conn.c + + socket_delay.o: \ +-compile socket_delay.c socket.h uint16.h ++compile socket_delay.c socket.h uint16.h uint32.h + ./compile socket_delay.c + + socket_listen.o: \ +-compile socket_listen.c socket.h uint16.h ++compile socket_listen.c socket.h uint16.h uint32.h + ./compile socket_listen.c + + socket_local.o: \ +-compile socket_local.c byte.h socket.h uint16.h ++compile socket_local.c byte.h socket.h uint16.h uint32.h + ./compile socket_local.c + + socket_opts.o: \ +-compile socket_opts.c socket.h uint16.h ++compile socket_opts.c socket.h uint16.h uint32.h + ./compile socket_opts.c + + socket_remote.o: \ +-compile socket_remote.c byte.h socket.h uint16.h ++compile socket_remote.c byte.h socket.h uint16.h uint32.h + ./compile socket_remote.c + + socket_tcp.o: \ +-compile socket_tcp.c ndelay.h socket.h uint16.h ++compile socket_tcp.c ndelay.h socket.h uint16.h uint32.h + ./compile socket_tcp.c + + socket_udp.o: \ +-compile socket_udp.c ndelay.h socket.h uint16.h ++compile socket_udp.c ndelay.h socket.h uint16.h uint32.h + ./compile socket_udp.c + + str_chr.o: \ +@@ -710,9 +720,9 @@ + chmod 755 tcpcat + + tcpclient: \ +-load tcpclient.o remoteinfo.o timeoutconn.o dns.a time.a unix.a \ +-byte.a socket.lib +- ./load tcpclient remoteinfo.o timeoutconn.o dns.a time.a \ ++load tcpclient.o remoteinfo6.o dns.a time.a unix.a \ ++byte.a socket.lib byte.h timeoutconn6.o ++ ./load tcpclient remoteinfo6.o timeoutconn6.o dns.a time.a \ + unix.a byte.a `cat socket.lib` + + tcpclient.o: \ +@@ -720,7 +730,7 @@ + scan.h str.h ip4.h uint16.h socket.h uint16.h fd.h stralloc.h \ + gen_alloc.h buffer.h error.h strerr.h pathexec.h timeoutconn.h \ + uint16.h remoteinfo.h stralloc.h uint16.h dns.h stralloc.h iopause.h \ +-taia.h tai.h uint64.h taia.h ++taia.h tai.h uint64.h taia.h uint32.h + ./compile tcpclient.c + + tcprules: \ +@@ -742,9 +752,9 @@ + ./compile tcprulescheck.c + + tcpserver: \ +-load tcpserver.o rules.o remoteinfo.o timeoutconn.o cdb.a dns.a \ ++load tcpserver.o rules.o remoteinfo6.o timeoutconn6.o cdb.a dns.a \ + time.a unix.a byte.a socket.lib +- ./load tcpserver rules.o remoteinfo.o timeoutconn.o cdb.a \ ++ ./load tcpserver rules.o remoteinfo6.o timeoutconn6.o cdb.a \ + dns.a time.a unix.a byte.a `cat socket.lib` + + tcpserver.o: \ +@@ -753,7 +763,7 @@ + alloc.h buffer.h error.h strerr.h sgetopt.h subgetopt.h pathexec.h \ + socket.h uint16.h ndelay.h remoteinfo.h stralloc.h uint16.h rules.h \ + stralloc.h sig.h dns.h stralloc.h iopause.h taia.h tai.h uint64.h \ +-taia.h ++taia.h uint32.h + ./compile tcpserver.c + + time.a: \ +@@ -765,9 +775,14 @@ + + timeoutconn.o: \ + compile timeoutconn.c ndelay.h socket.h uint16.h iopause.h taia.h \ +-tai.h uint64.h error.h timeoutconn.h uint16.h ++tai.h uint64.h error.h timeoutconn.h uint16.h uint32.h + ./compile timeoutconn.c + ++timeoutconn6.o: \ ++compile timeoutconn6.c ndelay.h socket.h uint16.h iopause.h taia.h \ ++tai.h uint64.h error.h timeoutconn.h uint16.h uint32.h ++ ./compile timeoutconn6.c ++ + uint16_pack.o: \ + compile uint16_pack.c uint16.h + ./compile uint16_pack.c +@@ -806,7 +821,12 @@ + socket_opts.o socket_remote.o socket_tcp.o socket_udp.o \ + stralloc_cat.o stralloc_catb.o stralloc_cats.o stralloc_copy.o \ + stralloc_eady.o stralloc_opyb.o stralloc_opys.o stralloc_pend.o \ +-strerr_die.o strerr_sys.o subgetopt.o wait_nohang.o wait_pid.o ++strerr_die.o strerr_sys.o subgetopt.o wait_nohang.o wait_pid.o \ ++socket_conn6.o socket_bind6.o socket_accept6.o socket_recv6.o \ ++socket_send6.o socket_local6.o socket_remote6.o socket_tcp6.o \ ++socket_getifname.o socket_getifidx.o socket_v4mappedprefix.o \ ++socket_ip4loopback.o socket_v6any.o socket_v6loopback.o \ ++socket_udp6.o + ./makelib unix.a alloc.o alloc_re.o buffer.o buffer_0.o \ + buffer_1.o buffer_2.o buffer_copy.o buffer_get.o \ + buffer_put.o env.o error.o error_str.o fd_copy.o fd_move.o \ +@@ -819,7 +839,12 @@ + socket_udp.o stralloc_cat.o stralloc_catb.o stralloc_cats.o \ + stralloc_copy.o stralloc_eady.o stralloc_opyb.o \ + stralloc_opys.o stralloc_pend.o strerr_die.o strerr_sys.o \ +- subgetopt.o wait_nohang.o wait_pid.o ++ subgetopt.o wait_nohang.o wait_pid.o socket_conn6.o \ ++ socket_bind6.o socket_accept6.o socket_recv6.o socket_send6.o \ ++ socket_local6.o socket_remote6.o socket_tcp6.o \ ++ socket_getifname.o socket_getifidx.o socket_v4mappedprefix.o \ ++ socket_ip4loopback.o socket_v6any.o socket_v6loopback.o \ ++ socket_udp6.o + + wait_nohang.o: \ + compile wait_nohang.c haswaitp.h +@@ -835,3 +860,110 @@ + | sed s}HOME}"`head -1 conf-home`"}g \ + > who@ + chmod 755 who@ ++ ++socket_conn6.o: \ ++compile socket_conn6.c socket.h uint16.h haveip6.h error.h ip6.h \ ++uint32.h ++ ./compile socket_conn6.c ++ ++socket_bind6.o: \ ++compile socket_bind6.c socket.h uint16.h haveip6.h error.h ip6.h \ ++uint32.h ++ ./compile socket_bind6.c ++ ++socket_accept6.o: \ ++compile socket_accept6.c socket.h uint16.h haveip6.h error.h ip6.h \ ++uint32.h ++ ./compile socket_accept6.c ++ ++socket_recv6.o: \ ++compile socket_recv6.c socket.h uint16.h haveip6.h error.h ip6.h \ ++uint32.h ++ ./compile socket_recv6.c ++ ++socket_send6.o: \ ++compile socket_send6.c socket.h uint16.h haveip6.h error.h uint32.h ++ ./compile socket_send6.c ++ ++socket_local6.o: \ ++compile socket_local6.c socket.h uint16.h haveip6.h error.h uint32.h ++ ./compile socket_local6.c ++ ++socket_remote6.o: \ ++compile socket_remote6.c socket.h uint16.h haveip6.h error.h uint32.h ++ ./compile socket_remote6.c ++ ++dns_sortip6.o: \ ++compile dns_sortip6.c byte.h dns.h stralloc.h gen_alloc.h iopause.h \ ++taia.h tai.h uint64.h taia.h ++ ./compile dns_sortip6.c ++ ++dns_nd6.o: \ ++compile dns_nd6.c byte.h fmt.h dns.h stralloc.h gen_alloc.h iopause.h \ ++taia.h tai.h uint64.h taia.h ++ ./compile dns_nd6.c ++ ++dns_ipq6.o: \ ++compile dns_ipq6.c stralloc.h gen_alloc.h case.h byte.h str.h dns.h \ ++stralloc.h iopause.h taia.h tai.h uint64.h taia.h ip6.h ++ ./compile dns_ipq6.c ++ ++dns_ip6.o: \ ++compile dns_ip6.c stralloc.h gen_alloc.h uint16.h byte.h dns.h \ ++stralloc.h iopause.h taia.h tai.h uint64.h taia.h ++ ./compile dns_ip6.c ++ ++fmt_xlong.o: \ ++compile fmt_xlong.c scan.h ++ ./compile fmt_xlong.c ++ ++scan_xlong.o: \ ++compile scan_xlong.c scan.h ++ ./compile scan_xlong.c ++ ++ip6_fmt.o: \ ++compile ip6_fmt.c fmt.h ip6.h ++ ./compile ip6_fmt.c ++ ++scan_ip6.o: \ ++compile scan_ip6.c scan.h ip6.h ++ ./compile scan_ip6.c ++ ++socket_tcp6.o: \ ++compile socket_tcp6.c ndelay.h socket.h uint16.h haveip6.h uint32.h ++ ./compile socket_tcp6.c ++ ++socket_udp6.o: \ ++compile socket_udp6.c ndelay.h socket.h uint16.h haveip6.h uint32.h ++ ./compile socket_udp6.c ++ ++haveip6.h: \ ++tryip6.c choose compile haveip6.h1 haveip6.h2 ++ ./choose c tryip6 haveip6.h1 haveip6.h2 > haveip6.h ++ ++socket_getifname.o: \ ++compile socket_getifname.c socket.h uint16.h uint32.h ++ ./compile socket_getifname.c ++ ++socket_getifidx.o: \ ++compile socket_getifidx.c socket.h uint16.h uint32.h ++ ./compile socket_getifidx.c ++ ++socket_ip4loopback.o: \ ++compile socket_ip4loopback.c ++ ./compile socket_ip4loopback.c ++ ++socket_v4mappedprefix.o: \ ++compile socket_v4mappedprefix.c ++ ./compile socket_v4mappedprefix.c ++ ++socket_v6any.o: \ ++compile socket_v6any.c ++ ./compile socket_v6any.c ++ ++socket_v6loopback.o: \ ++compile socket_v6loopback.c ++ ./compile socket_v6loopback.c ++ ++clean: ++ rm -f `cat TARGETS` +diff -uNr ucspi-tcp-0.88.orig/TARGETS ucspi-tcp-0.88/TARGETS +--- ucspi-tcp-0.88.orig/TARGETS 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/TARGETS 2009-08-04 17:45:59.000000000 -0500 +@@ -169,3 +169,31 @@ + it + setup + check ++dns_ip6.o ++dns_ipq6.o ++dns_nd6.o ++dns_sortip6.o ++fmt_xlong.o ++ip6_fmt.o ++ip6_scan.o ++scan_0x.o ++socket_accept6.o ++socket_bind6.o ++socket_conn6.o ++socket_local6.o ++socket_recv6.o ++socket_remote6.o ++socket_send6.o ++socket_tcp6.o ++timeoutconn6.o ++haveip6.h ++remoteinfo6.o ++socket_getifidx.o ++socket_getifname.o ++scan_ip6.o ++scan_xlong.o ++socket_ip4loopback.o ++socket_udp6.o ++socket_v4mappedprefix.o ++socket_v6any.o ++socket_v6loopback.o +diff -uNr ucspi-tcp-0.88.orig/addcr.1 ucspi-tcp-0.88/addcr.1 +--- ucspi-tcp-0.88.orig/addcr.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/addcr.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,22 @@ ++.TH addcr 1 ++.SH NAME ++addcr \- add a CR before each LF ++.SH SYNOPSIS ++.B addcr ++.SH DESCRIPTION ++.B addcr ++inserts CR at the end of each line of input. ++It does not insert CR at the end of a partial final line. ++.SH COMPATIBILITY ++Some vendors ship ++.B unix2dos ++or ++.B bsd2dos ++tools similar to ++.BR addcr . ++Those tools often blow up on long lines and nulls. ++.B addcr ++has no trouble with long lines and nulls. ++.SH "SEE ALSO" ++delcr(1), ++fixcr(1) +diff -uNr ucspi-tcp-0.88.orig/argv0.1 ucspi-tcp-0.88/argv0.1 +--- ucspi-tcp-0.88.orig/argv0.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/argv0.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,47 @@ ++.TH argv0 1 ++.SH NAME ++argv0 \- run a program with a specified 0th argument ++.SH SYNOPSIS ++.B argv0 ++.I realname ++.I zero ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B argv0 ++runs ++the program stored as ++.I realname ++on disk, ++with the given ++arguments. ++It sets the 0th argument of ++the program to ++.IR zero . ++ ++For example, ++ ++.EX ++ argv0 /bin/csh -bin/csh ++.EE ++ ++runs ++.B /bin/csh ++with a 0th argument of ++.BR -bin/csh . ++.B csh ++will think it is a login shell ++and behave accordingly. ++ ++.B argv0 ++can be used to run some ++.B inetd ++wrappers under ++.BR tcpserver . ++.SH "SEE ALSO" ++csh(1), ++tcpserver(1), ++execve(2), ++execvp(3), ++inetd(8) +diff -uNr ucspi-tcp-0.88.orig/date@.1 ucspi-tcp-0.88/date@.1 +--- ucspi-tcp-0.88.orig/date@.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/date@.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,32 @@ ++.TH date@ 1 ++.SH NAME ++date@ \- print the date on a host ++.SH SYNTAX ++.B date@ ++[ ++.I host ++] ++.SH DESCRIPTION ++.B date@ ++connects to TCP port 13 (Daytime) on ++.I host ++and prints any data it receives. ++It removes CR and converts unprintable characters to a visible format. ++ ++If ++.I host ++is not supplied, ++.B date@ ++connects to the local host. ++ ++Some computers respond to port 13 with a human-readable date. ++For example, they may be running ++ ++.EX ++ tcpserver 0 13 date & ++.EE ++.SH "SEE ALSO" ++cat(1), ++delcr(1), ++tcpclient(1), ++tcpserver(1) +diff -uNr ucspi-tcp-0.88.orig/delcr.1 ucspi-tcp-0.88/delcr.1 +--- ucspi-tcp-0.88.orig/delcr.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/delcr.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,30 @@ ++.TH delcr 1 ++.SH NAME ++delcr \- remove a CR before each LF ++.SH SYNOPSIS ++.B delcr ++.SH DESCRIPTION ++.B delcr ++removes a CR at the end of each line of input, ++if a CR is present. ++It also removes a CR at the end of a partial final line. ++ ++The pipeline ++ ++.EX ++ addcr | delcr ++.EE ++ ++prints an exact copy of its input. ++.SH COMPATIBILITY ++Some vendors ship ++.B dos2unix ++or ++.B dos2bsd ++tools similar to ++.BR delcr . ++Those tools often blow up on long lines and nulls. ++.B delcr ++has no trouble with long lines and nulls. ++.SH "SEE ALSO" ++addcr(1) +diff -uNr ucspi-tcp-0.88.orig/dns.h ucspi-tcp-0.88/dns.h +--- ucspi-tcp-0.88.orig/dns.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns.h 2009-08-04 17:45:59.000000000 -0500 +@@ -34,51 +34,60 @@ + unsigned int curserver; + struct taia deadline; + unsigned int pos; +- char *servers; +- char localip[4]; ++ const char *servers; ++ char localip[16]; ++ unsigned int scope_id; + char qtype[2]; + } ; + +-extern void dns_random_init(char *); ++extern void dns_random_init(const char *); + extern unsigned int dns_random(unsigned int); + + extern void dns_sortip(char *,unsigned int); ++extern void dns_sortip6(char *,unsigned int); + + extern void dns_domain_free(char **); +-extern int dns_domain_copy(char **,char *); +-extern unsigned int dns_domain_length(char *); +-extern int dns_domain_equal(char *,char *); +-extern char *dns_domain_suffix(char *,char *); +-extern int dns_domain_fromdot(char **,char *,unsigned int); +-extern int dns_domain_todot_cat(stralloc *,char *); +- +-extern unsigned int dns_packet_copy(char *,unsigned int,unsigned int,char *,unsigned int); +-extern unsigned int dns_packet_getname(char *,unsigned int,unsigned int,char **); +-extern unsigned int dns_packet_skipname(char *,unsigned int,unsigned int); +-extern int dns_packet_nameequal(char *,unsigned int,unsigned int,char *,unsigned int,unsigned int); ++extern int dns_domain_copy(char **,const char *); ++extern unsigned int dns_domain_length(const char *); ++extern int dns_domain_equal(const char *,const char *); ++extern int dns_domain_suffix(const char *,const char *); ++extern unsigned int dns_domain_suffixpos(const char *,const char *); ++extern int dns_domain_fromdot(char **,const char *,unsigned int); ++extern int dns_domain_todot_cat(stralloc *,const char *); ++ ++extern unsigned int dns_packet_copy(const char *,unsigned int,unsigned int,char *,unsigned int); ++extern unsigned int dns_packet_getname(const char *,unsigned int,unsigned int,char **); ++extern unsigned int dns_packet_skipname(const char *,unsigned int,unsigned int); + +-extern int dns_transmit_start(struct dns_transmit *,char *,int,char *,char *,char *); ++extern int dns_transmit_start(struct dns_transmit *,const char *,int,const char *,const char *,const char *); + extern void dns_transmit_free(struct dns_transmit *); + extern void dns_transmit_io(struct dns_transmit *,iopause_fd *,struct taia *); +-extern int dns_transmit_get(struct dns_transmit *,iopause_fd *,struct taia *); ++extern int dns_transmit_get(struct dns_transmit *,const iopause_fd *,const struct taia *); + + extern int dns_resolvconfip(char *); +-extern int dns_resolve(char *,char *); ++extern int dns_resolve(const char *,const char *); + extern struct dns_transmit dns_resolve_tx; + +-extern int dns_ip4_packet(stralloc *,char *,unsigned int); +-extern int dns_ip4(stralloc *,stralloc *); +-extern int dns_name_packet(stralloc *,char *,unsigned int); +-extern void dns_name4_domain(char *,char *); ++extern int dns_ip4_packet(stralloc *,const char *,unsigned int); ++extern int dns_ip4(stralloc *,const stralloc *); ++extern int dns_ip6_packet(stralloc *,const char *,unsigned int); ++extern int dns_ip6(stralloc *,stralloc *); ++extern int dns_name_packet(stralloc *,const char *,unsigned int); ++extern void dns_name4_domain(char *,const char *); + #define DNS_NAME4_DOMAIN 31 +-extern int dns_name4(stralloc *,char *); +-extern int dns_txt_packet(stralloc *,char *,unsigned int); +-extern int dns_txt(stralloc *,stralloc *); +-extern int dns_mx_packet(stralloc *,char *,unsigned int); +-extern int dns_mx(stralloc *,stralloc *); ++extern int dns_name4(stralloc *,const char *); ++extern int dns_txt_packet(stralloc *,const char *,unsigned int); ++extern int dns_txt(stralloc *,const stralloc *); ++extern int dns_mx_packet(stralloc *,const char *,unsigned int); ++extern int dns_mx(stralloc *,const stralloc *); + + extern int dns_resolvconfrewrite(stralloc *); +-extern int dns_ip4_qualify_rules(stralloc *,stralloc *,stralloc *,stralloc *); +-extern int dns_ip4_qualify(stralloc *,stralloc *,stralloc *); ++extern int dns_ip4_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *); ++extern int dns_ip4_qualify(stralloc *,stralloc *,const stralloc *); ++extern int dns_ip6_qualify_rules(stralloc *,stralloc *,const stralloc *,const stralloc *); ++extern int dns_ip6_qualify(stralloc *,stralloc *,const stralloc *); ++ ++extern int dns_name6_domain(char *,char *); ++#define DNS_NAME6_DOMAIN (4*16+11) + + #endif +diff -uNr ucspi-tcp-0.88.orig/dns_dfd.c ucspi-tcp-0.88/dns_dfd.c +--- ucspi-tcp-0.88.orig/dns_dfd.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_dfd.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,9 +1,10 @@ +-#include "error.h" +-#include "alloc.h" ++#include ++#include + #include "byte.h" + #include "dns.h" ++#include "error.h" + +-int dns_domain_fromdot(char **out,char *buf,unsigned int n) ++int dns_domain_fromdot(char **out,const char *buf,unsigned int n) + { + char label[63]; + unsigned int labellen = 0; /* <= sizeof label */ +@@ -59,11 +60,11 @@ + if (namelen + 1 > sizeof name) return 0; + name[namelen++] = 0; + +- x = alloc(namelen); ++ x = malloc(namelen); + if (!x) return 0; + byte_copy(x,namelen,name); + +- if (*out) alloc_free(*out); ++ if (*out) free(*out); + *out = x; + return 1; + } +diff -uNr ucspi-tcp-0.88.orig/dns_domain.c ucspi-tcp-0.88/dns_domain.c +--- ucspi-tcp-0.88.orig/dns_domain.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_domain.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,16 +1,15 @@ +-#include "error.h" +-#include "alloc.h" ++#include + #include "case.h" + #include "byte.h" + #include "dns.h" + +-unsigned int dns_domain_length(char *dn) ++unsigned int dns_domain_length(const char *dn) + { +- char *x; ++ const char *x; + unsigned char c; + + x = dn; +- while (c = *x++) ++ while ((c = *x++)) + x += (unsigned int) c; + return x - dn; + } +@@ -18,26 +17,26 @@ + void dns_domain_free(char **out) + { + if (*out) { +- alloc_free(*out); ++ free(*out); + *out = 0; + } + } + +-int dns_domain_copy(char **out,char *in) ++int dns_domain_copy(char **out,const char *in) + { + unsigned int len; + char *x; + + len = dns_domain_length(in); +- x = alloc(len); ++ x = malloc(len); + if (!x) return 0; + byte_copy(x,len,in); +- if (*out) alloc_free(*out); ++ if (*out) free(*out); + *out = x; + return 1; + } + +-int dns_domain_equal(char *dn1,char *dn2) ++int dns_domain_equal(const char *dn1,const char *dn2) + { + unsigned int len; + +@@ -48,12 +47,25 @@ + return 1; + } + +-char *dns_domain_suffix(char *big,char *little) ++int dns_domain_suffix(const char *big,const char *little) ++{ ++ unsigned char c; ++ ++ for (;;) { ++ if (dns_domain_equal(big,little)) return 1; ++ c = *big++; ++ if (!c) return 0; ++ big += c; ++ } ++} ++ ++unsigned int dns_domain_suffixpos(const char *big,const char *little) + { ++ const char *orig = big; + unsigned char c; + + for (;;) { +- if (dns_domain_equal(big,little)) return big; ++ if (dns_domain_equal(big,little)) return big - orig; + c = *big++; + if (!c) return 0; + big += c; +diff -uNr ucspi-tcp-0.88.orig/dns_dtda.c ucspi-tcp-0.88/dns_dtda.c +--- ucspi-tcp-0.88.orig/dns_dtda.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_dtda.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,7 +1,7 @@ + #include "stralloc.h" + #include "dns.h" + +-int dns_domain_todot_cat(stralloc *out,char *d) ++int dns_domain_todot_cat(stralloc *out,const char *d) + { + char ch; + char ch2; +diff -uNr ucspi-tcp-0.88.orig/dns_ip.c ucspi-tcp-0.88/dns_ip.c +--- ucspi-tcp-0.88.orig/dns_ip.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_ip.c 2009-08-04 17:45:59.000000000 -0500 +@@ -3,7 +3,7 @@ + #include "byte.h" + #include "dns.h" + +-int dns_ip4_packet(stralloc *out,char *buf,unsigned int len) ++int dns_ip4_packet(stralloc *out,const char *buf,unsigned int len) + { + unsigned int pos; + char header[12]; +@@ -36,7 +36,7 @@ + + static char *q = 0; + +-int dns_ip4(stralloc *out,stralloc *fqdn) ++int dns_ip4(stralloc *out,const stralloc *fqdn) + { + unsigned int i; + char code; +diff -uNr ucspi-tcp-0.88.orig/dns_ip6.c ucspi-tcp-0.88/dns_ip6.c +--- ucspi-tcp-0.88.orig/dns_ip6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/dns_ip6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,103 @@ ++#include "stralloc.h" ++#include "uint16.h" ++#include "byte.h" ++#include "dns.h" ++#include "ip4.h" ++#include "ip6.h" ++ ++static int dns_ip6_packet_add(stralloc *out,const char *buf,unsigned int len) ++{ ++ unsigned int pos; ++ char header[16]; ++ uint16 numanswers; ++ uint16 datalen; ++ ++ pos = dns_packet_copy(buf,len,0,header,12); if (!pos) return -1; ++ uint16_unpack_big(header + 6,&numanswers); ++ pos = dns_packet_skipname(buf,len,pos); if (!pos) return -1; ++ pos += 4; ++ ++ while (numanswers--) { ++ pos = dns_packet_skipname(buf,len,pos); if (!pos) return -1; ++ pos = dns_packet_copy(buf,len,pos,header,10); if (!pos) return -1; ++ uint16_unpack_big(header + 8,&datalen); ++ if (byte_equal(header,2,DNS_T_AAAA)) { ++ if (byte_equal(header + 2,2,DNS_C_IN)) ++ if (datalen == 16) { ++ if (!dns_packet_copy(buf,len,pos,header,16)) return -1; ++ if (!stralloc_catb(out,header,16)) return -1; ++ } ++ } else if (byte_equal(header,2,DNS_T_A)) ++ if (byte_equal(header + 2,2,DNS_C_IN)) ++ if (datalen == 4) { ++ byte_copy(header,12,V4mappedprefix); ++ if (!dns_packet_copy(buf,len,pos,header+12,4)) return -1; ++ if (!stralloc_catb(out,header,16)) return -1; ++ } ++ pos += datalen; ++ } ++ ++ dns_sortip6(out->s,out->len); ++ return 0; ++} ++ ++int dns_ip6_packet(stralloc *out,const char *buf,unsigned int len) { ++ if (!stralloc_copys(out,"")) return -1; ++ return dns_ip6_packet_add(out,buf,len); ++} ++ ++static char *q = 0; ++ ++int dns_ip6(stralloc *out,stralloc *fqdn) ++{ ++ unsigned int i; ++ char code; ++ char ch; ++ char ip[16]; ++ ++ if (!stralloc_copys(out,"")) return -1; ++ if (!stralloc_readyplus(fqdn,1)) return -1; ++ fqdn->s[fqdn->len]=0; ++ if ((i=scan_ip6(fqdn->s,ip))) { ++ if (fqdn->s[i]) return -1; ++ stralloc_copyb(out,ip,16); ++ return 0; ++ } ++ code = 0; ++ for (i = 0;i <= fqdn->len;++i) { ++ if (i < fqdn->len) ++ ch = fqdn->s[i]; ++ else ++ ch = '.'; ++ ++ if ((ch == '[') || (ch == ']')) continue; ++ if (ch == '.') { ++ if (!stralloc_append(out,&code)) return -1; ++ code = 0; ++ continue; ++ } ++ if ((ch >= '0') && (ch <= '9')) { ++ code *= 10; ++ code += ch - '0'; ++ continue; ++ } ++ ++ if (!dns_domain_fromdot(&q,fqdn->s,fqdn->len)) return -1; ++ if (!stralloc_copys(out,"")) return -1; ++ if (dns_resolve(q,DNS_T_AAAA) != -1) ++ if (dns_ip6_packet_add(out,dns_resolve_tx.packet,dns_resolve_tx.packetlen) != -1) { ++ dns_transmit_free(&dns_resolve_tx); ++ dns_domain_free(&q); ++ } ++ if (!dns_domain_fromdot(&q,fqdn->s,fqdn->len)) return -1; ++ if (dns_resolve(q,DNS_T_A) != -1) ++ if (dns_ip6_packet_add(out,dns_resolve_tx.packet,dns_resolve_tx.packetlen) != -1) { ++ dns_transmit_free(&dns_resolve_tx); ++ dns_domain_free(&q); ++ } ++ return out->a>0?0:-1; ++ } ++ ++ out->len &= ~3; ++ return 0; ++} +diff -uNr ucspi-tcp-0.88.orig/dns_ipq.c ucspi-tcp-0.88/dns_ipq.c +--- ucspi-tcp-0.88.orig/dns_ipq.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_ipq.c 2009-08-04 17:45:59.000000000 -0500 +@@ -4,7 +4,7 @@ + #include "str.h" + #include "dns.h" + +-static int doit(stralloc *work,char *rule) ++static int doit(stralloc *work,const char *rule) + { + char ch; + unsigned int colon; +@@ -30,7 +30,7 @@ + return stralloc_cats(work,rule + colon + 1); + } + +-int dns_ip4_qualify_rules(stralloc *out,stralloc *fqdn,stralloc *in,stralloc *rules) ++int dns_ip4_qualify_rules(stralloc *out,stralloc *fqdn,const stralloc *in,const stralloc *rules) + { + unsigned int i; + unsigned int j; +@@ -63,7 +63,7 @@ + } + } + +-int dns_ip4_qualify(stralloc *out,stralloc *fqdn,stralloc *in) ++int dns_ip4_qualify(stralloc *out,stralloc *fqdn,const stralloc *in) + { + static stralloc rules; + if (dns_resolvconfrewrite(&rules) == -1) return -1; +diff -uNr ucspi-tcp-0.88.orig/dns_ipq6.c ucspi-tcp-0.88/dns_ipq6.c +--- ucspi-tcp-0.88.orig/dns_ipq6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/dns_ipq6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,72 @@ ++#include "stralloc.h" ++#include "case.h" ++#include "byte.h" ++#include "str.h" ++#include "dns.h" ++ ++static int doit(stralloc *work,const char *rule) ++{ ++ char ch; ++ unsigned int colon; ++ unsigned int prefixlen; ++ ++ ch = *rule++; ++ if ((ch != '?') && (ch != '=') && (ch != '*') && (ch != '-')) return 1; ++ colon = str_chr(rule,':'); ++ if (!rule[colon]) return 1; ++ ++ if (work->len < colon) return 1; ++ prefixlen = work->len - colon; ++ if ((ch == '=') && prefixlen) return 1; ++ if (case_diffb(rule,colon,work->s + prefixlen)) return 1; ++ if (ch == '?') { ++ if (byte_chr(work->s,prefixlen,'.') < prefixlen) return 1; ++ if (byte_chr(work->s,prefixlen,':') < prefixlen) return 1; ++ if (byte_chr(work->s,prefixlen,'[') < prefixlen) return 1; ++ if (byte_chr(work->s,prefixlen,']') < prefixlen) return 1; ++ } ++ ++ work->len = prefixlen; ++ if (ch == '-') work->len = 0; ++ return stralloc_cats(work,rule + colon + 1); ++} ++ ++int dns_ip6_qualify_rules(stralloc *out,stralloc *fqdn,const stralloc *in,const stralloc *rules) ++{ ++ unsigned int i; ++ unsigned int j; ++ unsigned int plus; ++ unsigned int fqdnlen; ++ ++ if (!stralloc_copy(fqdn,in)) return -1; ++ ++ for (j = i = 0;j < rules->len;++j) ++ if (!rules->s[j]) { ++ if (!doit(fqdn,rules->s + i)) return -1; ++ i = j + 1; ++ } ++ ++ fqdnlen = fqdn->len; ++ plus = byte_chr(fqdn->s,fqdnlen,'+'); ++ if (plus >= fqdnlen) ++ return dns_ip6(out,fqdn); ++ ++ i = plus + 1; ++ for (;;) { ++ j = byte_chr(fqdn->s + i,fqdnlen - i,'+'); ++ byte_copy(fqdn->s + plus,j,fqdn->s + i); ++ fqdn->len = plus + j; ++ if (dns_ip6(out,fqdn) == -1) return -1; ++ if (out->len) return 0; ++ i += j; ++ if (i >= fqdnlen) return 0; ++ ++i; ++ } ++} ++ ++int dns_ip6_qualify(stralloc *out,stralloc *fqdn,const stralloc *in) ++{ ++ static stralloc rules; ++ if (dns_resolvconfrewrite(&rules) == -1) return -1; ++ return dns_ip6_qualify_rules(out,fqdn,in,&rules); ++} +diff -uNr ucspi-tcp-0.88.orig/dns_name.c ucspi-tcp-0.88/dns_name.c +--- ucspi-tcp-0.88.orig/dns_name.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_name.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,10 +2,11 @@ + #include "uint16.h" + #include "byte.h" + #include "dns.h" ++#include "ip6.h" + + static char *q = 0; + +-int dns_name_packet(stralloc *out,char *buf,unsigned int len) ++int dns_name_packet(stralloc *out,const char *buf,unsigned int len) + { + unsigned int pos; + char header[12]; +@@ -35,7 +36,7 @@ + return 0; + } + +-int dns_name4(stralloc *out,char ip[4]) ++int dns_name4(stralloc *out,const char ip[4]) + { + char name[DNS_NAME4_DOMAIN]; + +@@ -46,3 +47,17 @@ + dns_domain_free(&q); + return 0; + } ++ ++int dns_name6(stralloc *out,char ip[16]) ++{ ++ char name[DNS_NAME6_DOMAIN]; ++ ++ if (ip6_isv4mapped(ip)) ++ return dns_name4(out,ip+12); ++ dns_name6_domain(name,ip); ++ if (dns_resolve(name,DNS_T_PTR) == -1) return -1; ++ if (dns_name_packet(out,dns_resolve_tx.packet,dns_resolve_tx.packetlen) == -1) return -1; ++ dns_transmit_free(&dns_resolve_tx); ++ dns_domain_free(&q); ++ return 0; ++} +diff -uNr ucspi-tcp-0.88.orig/dns_nd.c ucspi-tcp-0.88/dns_nd.c +--- ucspi-tcp-0.88.orig/dns_nd.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_nd.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,7 +2,7 @@ + #include "fmt.h" + #include "dns.h" + +-void dns_name4_domain(char name[DNS_NAME4_DOMAIN],char ip[4]) ++void dns_name4_domain(char name[DNS_NAME4_DOMAIN],const char ip[4]) + { + unsigned int namelen; + unsigned int i; +diff -uNr ucspi-tcp-0.88.orig/dns_nd6.c ucspi-tcp-0.88/dns_nd6.c +--- ucspi-tcp-0.88.orig/dns_nd6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/dns_nd6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,28 @@ ++#include "byte.h" ++#include "fmt.h" ++#include "dns.h" ++ ++/* RFC1886: ++ * 4321:0:1:2:3:4:567:89ab ++ * -> ++ * b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.IP6.INT. ++ */ ++ ++static inline char tohex(char c) { ++ return c>=10?c-10+'a':c+'0'; ++} ++ ++int dns_name6_domain(char name[DNS_NAME6_DOMAIN],char ip[16]) ++{ ++ unsigned int j; ++ ++ for (j=0; j<16; j++) { ++ name[j*4]=1; ++ name[j*4+1]=tohex(ip[15-j] & 15); ++ name[j*4+2]=1; ++ name[j*4+3]=tohex((unsigned char)ip[15-j] >> 4); ++ } ++ byte_copy(name + 4*16,10,"\3ip6\4arpa\0"); ++ return 4*16+10; ++} ++ +diff -uNr ucspi-tcp-0.88.orig/dns_packet.c ucspi-tcp-0.88/dns_packet.c +--- ucspi-tcp-0.88.orig/dns_packet.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_packet.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,10 +2,11 @@ + DNS should have used LZ77 instead of its own sophomoric compression algorithm. + */ + +-#include "error.h" ++#include + #include "dns.h" ++#include "error.h" + +-unsigned int dns_packet_copy(char *buf,unsigned int len,unsigned int pos,char *out,unsigned int outlen) ++unsigned int dns_packet_copy(const char *buf,unsigned int len,unsigned int pos,char *out,unsigned int outlen) + { + while (outlen) { + if (pos >= len) { errno = error_proto; return 0; } +@@ -15,7 +16,7 @@ + return pos; + } + +-unsigned int dns_packet_skipname(char *buf,unsigned int len,unsigned int pos) ++unsigned int dns_packet_skipname(const char *buf,unsigned int len,unsigned int pos) + { + unsigned char ch; + +@@ -32,7 +33,7 @@ + return 0; + } + +-unsigned int dns_packet_getname(char *buf,unsigned int len,unsigned int pos,char **d) ++unsigned int dns_packet_getname(const char *buf,unsigned int len,unsigned int pos,char **d) + { + unsigned int loop = 0; + unsigned int state = 0; +diff -uNr ucspi-tcp-0.88.orig/dns_random.c ucspi-tcp-0.88/dns_random.c +--- ucspi-tcp-0.88.orig/dns_random.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_random.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,3 +1,4 @@ ++#include + #include "dns.h" + #include "taia.h" + #include "uint32.h" +@@ -29,7 +30,7 @@ + } + } + +-void dns_random_init(char data[128]) ++void dns_random_init(const char data[128]) + { + int i; + struct taia t; +diff -uNr ucspi-tcp-0.88.orig/dns_rcip.c ucspi-tcp-0.88/dns_rcip.c +--- ucspi-tcp-0.88.orig/dns_rcip.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_rcip.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,12 +2,13 @@ + #include "openreadclose.h" + #include "byte.h" + #include "ip4.h" +-#include "env.h" ++#include "ip6.h" + #include "dns.h" ++#include "env.h" + + static stralloc data = {0}; + +-static int init(char ip[64]) ++static int init(char ip[256]) + { + int i; + int j; +@@ -16,15 +17,16 @@ + + x = env_get("DNSCACHEIP"); + if (x) +- while (iplen <= 60) ++ while (iplen <= 60) { + if (*x == '.') + ++x; + else { +- i = ip4_scan(x,ip + iplen); ++ i = scan_ip6(x,ip + iplen); + if (!i) break; + x += i; +- iplen += 4; ++ iplen += 16; + } ++ } + + if (!iplen) { + i = openreadclose("/etc/resolv.conf",&data,64); +@@ -39,8 +41,9 @@ + while ((data.s[i] == ' ') || (data.s[i] == '\t')) + ++i; + if (iplen <= 60) +- if (ip4_scan(data.s + i,ip + iplen)) +- iplen += 4; ++ if (scan_ip6(data.s + i,ip + iplen)) { ++ iplen += 16; ++ } + } + i = j + 1; + } +@@ -48,19 +51,19 @@ + } + + if (!iplen) { +- byte_copy(ip,4,"\177\0\0\1"); +- iplen = 4; ++ byte_copy(ip,16,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"); ++ iplen = 16; + } +- byte_zero(ip + iplen,64 - iplen); ++ byte_zero(ip + iplen,256 - iplen); + return 0; + } + + static int ok = 0; + static unsigned int uses; + static struct taia deadline; +-static char ip[64]; /* defined if ok */ ++static char ip[256]; /* defined if ok */ + +-int dns_resolvconfip(char s[64]) ++int dns_resolvconfip(char s[256]) + { + struct taia now; + +@@ -77,6 +80,6 @@ + } + + --uses; +- byte_copy(s,64,ip); ++ byte_copy(s,256,ip); + return 0; + } +diff -uNr ucspi-tcp-0.88.orig/dns_rcrw.c ucspi-tcp-0.88/dns_rcrw.c +--- ucspi-tcp-0.88.orig/dns_rcrw.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_rcrw.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,16 +1,17 @@ ++#include + #include "taia.h" +-#include "env.h" + #include "byte.h" + #include "str.h" + #include "openreadclose.h" + #include "dns.h" ++#include "env.h" + + static stralloc data = {0}; + + static int init(stralloc *rules) + { + char host[256]; +- char *x; ++ const char *x; + int i; + int j; + int k; +diff -uNr ucspi-tcp-0.88.orig/dns_resolve.c ucspi-tcp-0.88/dns_resolve.c +--- ucspi-tcp-0.88.orig/dns_resolve.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_resolve.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,19 +2,20 @@ + #include "taia.h" + #include "byte.h" + #include "dns.h" ++#include "ip6.h" + + struct dns_transmit dns_resolve_tx = {0}; + +-int dns_resolve(char *q,char qtype[2]) ++int dns_resolve(const char *q,const char qtype[2]) + { + struct taia stamp; + struct taia deadline; +- char servers[64]; ++ char servers[256]; + iopause_fd x[1]; + int r; + + if (dns_resolvconfip(servers) == -1) return -1; +- if (dns_transmit_start(&dns_resolve_tx,servers,1,q,qtype,"\0\0\0\0") == -1) return -1; ++ if (dns_transmit_start(&dns_resolve_tx,servers,1,q,qtype,V6any) == -1) return -1; + + for (;;) { + taia_now(&stamp); +diff -uNr ucspi-tcp-0.88.orig/dns_sortip6.c ucspi-tcp-0.88/dns_sortip6.c +--- ucspi-tcp-0.88.orig/dns_sortip6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/dns_sortip6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,20 @@ ++#include "byte.h" ++#include "dns.h" ++ ++/* XXX: sort servers by configurable notion of closeness? */ ++/* XXX: pay attention to competence of each server? */ ++ ++void dns_sortip6(char *s,unsigned int n) ++{ ++ unsigned int i; ++ char tmp[16]; ++ ++ n >>= 4; ++ while (n > 1) { ++ i = dns_random(n); ++ --n; ++ byte_copy(tmp,16,s + (i << 4)); ++ byte_copy(s + (i << 4),16,s + (n << 4)); ++ byte_copy(s + (n << 4),16,tmp); ++ } ++} +diff -uNr ucspi-tcp-0.88.orig/dns_transmit.c ucspi-tcp-0.88/dns_transmit.c +--- ucspi-tcp-0.88.orig/dns_transmit.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_transmit.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,12 +1,15 @@ ++#include ++#include ++#include ++#include + #include "socket.h" +-#include "alloc.h" +-#include "error.h" ++#include + #include "byte.h" +-#include "readwrite.h" + #include "uint16.h" + #include "dns.h" ++#include "ip6.h" + +-static int serverwantstcp(char *buf,unsigned int len) ++static int serverwantstcp(const char *buf,unsigned int len) + { + char out[12]; + +@@ -15,7 +18,7 @@ + return 0; + } + +-static int serverfailed(char *buf,unsigned int len) ++static int serverfailed(const char *buf,unsigned int len) + { + char out[12]; + unsigned int rcode; +@@ -23,11 +26,11 @@ + if (!dns_packet_copy(buf,len,0,out,12)) return 1; + rcode = out[3]; + rcode &= 15; +- if (rcode && (rcode != 3)) { errno = error_again; return 1; } ++ if (rcode && (rcode != 3)) { errno = EAGAIN; return 1; } + return 0; + } + +-static int irrelevant(struct dns_transmit *d,char *buf,unsigned int len) ++static int irrelevant(const struct dns_transmit *d,const char *buf,unsigned int len) + { + char out[12]; + char *dn; +@@ -40,8 +43,8 @@ + + dn = 0; + pos = dns_packet_getname(buf,len,pos,&dn); if (!pos) return 1; +- if (!dns_domain_equal(dn,d->query + 14)) { alloc_free(dn); return 1; } +- alloc_free(dn); ++ if (!dns_domain_equal(dn,d->query + 14)) { free(dn); return 1; } ++ free(dn); + + pos = dns_packet_copy(buf,len,pos,out,4); if (!pos) return 1; + if (byte_diff(out,2,d->qtype)) return 1; +@@ -53,14 +56,14 @@ + static void packetfree(struct dns_transmit *d) + { + if (!d->packet) return; +- alloc_free(d->packet); ++ free(d->packet); + d->packet = 0; + } + + static void queryfree(struct dns_transmit *d) + { + if (!d->query) return; +- alloc_free(d->query); ++ free(d->query); + d->query = 0; + } + +@@ -83,9 +86,9 @@ + int j; + + for (j = 0;j < 10;++j) +- if (socket_bind4(d->s1 - 1,d->localip,1025 + dns_random(64510)) == 0) ++ if (socket_bind6(d->s1 - 1,d->localip,1025 + dns_random(64510),d->scope_id) == 0) + return 0; +- if (socket_bind4(d->s1 - 1,d->localip,0) == 0) ++ if (socket_bind6(d->s1 - 1,d->localip,0,d->scope_id) == 0) + return 0; + return -1; + } +@@ -94,22 +97,22 @@ + + static int thisudp(struct dns_transmit *d) + { +- char *ip; ++ const char *ip; + + socketfree(d); + + while (d->udploop < 4) { + for (;d->curserver < 16;++d->curserver) { +- ip = d->servers + 4 * d->curserver; +- if (byte_diff(ip,4,"\0\0\0\0")) { ++ ip = d->servers + 16 * d->curserver; ++ if (byte_diff(ip,16,V6any)) { + d->query[2] = dns_random(256); + d->query[3] = dns_random(256); + +- d->s1 = 1 + socket_udp(); ++ d->s1 = 1 + socket_udp6(); + if (!d->s1) { dns_transmit_free(d); return -1; } + if (randombind(d) == -1) { dns_transmit_free(d); return -1; } + +- if (socket_connect4(d->s1 - 1,ip,53) == 0) ++ if (socket_connect6(d->s1 - 1,ip,53,d->scope_id) == 0) + if (send(d->s1 - 1,d->query + 2,d->querylen - 2,0) == d->querylen - 2) { + struct taia now; + taia_now(&now); +@@ -145,29 +148,29 @@ + static int thistcp(struct dns_transmit *d) + { + struct taia now; +- char *ip; ++ const char *ip; + + socketfree(d); + packetfree(d); + + for (;d->curserver < 16;++d->curserver) { +- ip = d->servers + 4 * d->curserver; +- if (byte_diff(ip,4,"\0\0\0\0")) { ++ ip = d->servers + 16 * d->curserver; ++ if (byte_diff(ip,16,V6any)) { + d->query[2] = dns_random(256); + d->query[3] = dns_random(256); + +- d->s1 = 1 + socket_tcp(); ++ d->s1 = 1 + socket_tcp6(); + if (!d->s1) { dns_transmit_free(d); return -1; } + if (randombind(d) == -1) { dns_transmit_free(d); return -1; } + + taia_now(&now); + taia_uint(&d->deadline,10); + taia_add(&d->deadline,&d->deadline,&now); +- if (socket_connect4(d->s1 - 1,ip,53) == 0) { ++ if (socket_connect6(d->s1 - 1,ip,53,d->scope_id) == 0) { + d->tcpstate = 2; + return 0; + } +- if ((errno == error_inprogress) || (errno == error_wouldblock)) { ++ if ((errno == EINPROGRESS) || (errno == EWOULDBLOCK)) { + d->tcpstate = 1; + return 0; + } +@@ -191,16 +194,16 @@ + return thistcp(d); + } + +-int dns_transmit_start(struct dns_transmit *d,char servers[64],int flagrecursive,char *q,char qtype[2],char localip[4]) ++int dns_transmit_start(struct dns_transmit *d,const char servers[256],int flagrecursive,const char *q,const char qtype[2],const char localip[16]) + { + unsigned int len; + + dns_transmit_free(d); +- errno = error_io; ++ errno = EIO; + + len = dns_domain_length(q); + d->querylen = len + 18; +- d->query = alloc(d->querylen); ++ d->query = malloc(d->querylen); + if (!d->query) return -1; + + uint16_pack_big(d->query,len + 16); +@@ -211,7 +214,7 @@ + + byte_copy(d->qtype,2,qtype); + d->servers = servers; +- byte_copy(d->localip,4,localip); ++ byte_copy(d->localip,16,localip); + + d->udploop = flagrecursive ? 1 : 0; + +@@ -236,19 +239,19 @@ + *deadline = d->deadline; + } + +-int dns_transmit_get(struct dns_transmit *d,iopause_fd *x,struct taia *when) ++int dns_transmit_get(struct dns_transmit *d,const iopause_fd *x,const struct taia *when) + { + char udpbuf[513]; + unsigned char ch; + int r; + int fd; + +- errno = error_io; ++ errno = EIO; + fd = d->s1 - 1; + + if (!x->revents) { + if (taia_less(when,&d->deadline)) return 0; +- errno = error_timeout; ++ errno = ETIMEDOUT; + if (d->tcpstate == 0) return nextudp(d); + return nexttcp(d); + } +@@ -260,7 +263,7 @@ + */ + r = recv(fd,udpbuf,sizeof udpbuf,0); + if (r <= 0) { +- if (d->udploop == 2) return 0; ++ if (errno == ECONNREFUSED) if (d->udploop == 2) return 0; + return nextudp(d); + } + if (r + 1 > sizeof udpbuf) return 0; +@@ -274,7 +277,7 @@ + socketfree(d); + + d->packetlen = r; +- d->packet = alloc(d->packetlen); ++ d->packet = malloc(d->packetlen); + if (!d->packet) { dns_transmit_free(d); return -1; } + byte_copy(d->packet,d->packetlen,udpbuf); + queryfree(d); +@@ -334,7 +337,7 @@ + d->packetlen += ch; + d->tcpstate = 5; + d->pos = 0; +- d->packet = alloc(d->packetlen); ++ d->packet = malloc(d->packetlen); + if (!d->packet) { dns_transmit_free(d); return -1; } + return 0; + } +diff -uNr ucspi-tcp-0.88.orig/dns_txt.c ucspi-tcp-0.88/dns_txt.c +--- ucspi-tcp-0.88.orig/dns_txt.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/dns_txt.c 2009-08-04 17:45:59.000000000 -0500 +@@ -3,7 +3,7 @@ + #include "byte.h" + #include "dns.h" + +-int dns_txt_packet(stralloc *out,char *buf,unsigned int len) ++int dns_txt_packet(stralloc *out,const char *buf,unsigned int len) + { + unsigned int pos; + char header[12]; +@@ -48,7 +48,7 @@ + + static char *q = 0; + +-int dns_txt(stralloc *out,stralloc *fqdn) ++int dns_txt(stralloc *out,const stralloc *fqdn) + { + if (!dns_domain_fromdot(&q,fqdn->s,fqdn->len)) return -1; + if (dns_resolve(q,DNS_T_TXT) == -1) return -1; +diff -uNr ucspi-tcp-0.88.orig/error.h ucspi-tcp-0.88/error.h +--- ucspi-tcp-0.88.orig/error.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/error.h 2009-08-04 17:45:59.000000000 -0500 +@@ -1,7 +1,7 @@ + #ifndef ERROR_H + #define ERROR_H + +-extern int errno; ++#include + + extern int error_intr; + extern int error_nomem; +diff -uNr ucspi-tcp-0.88.orig/finger@.1 ucspi-tcp-0.88/finger@.1 +--- ucspi-tcp-0.88.orig/finger@.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/finger@.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,45 @@ ++.TH finger@ 1 ++.SH NAME ++finger@ \- get user information from a host ++.SH SYNTAX ++.B finger@ ++[ ++.I host ++[ ++.I user ++] ++] ++.SH DESCRIPTION ++.B finger@ ++connects to TCP port 79 (Finger) on ++.IR host , ++sends ++.I user ++(with an extra CR) ++to ++.IR host , ++and prints any data it receives. ++It removes CR and converts unprintable characters to a visible format. ++Some computers respond to port 79 with information about ++.IR user . ++ ++If ++.I user ++is not supplied, ++.B finger@ ++sends a blank line to ++.IR host . ++Some computers respond with information about ++all the users who are logged in. ++ ++If ++.I host ++is not supplied, ++.B finger@ ++connects to the local host. ++.SH "SEE ALSO" ++addcr(1), ++cat(1), ++delcr(1), ++finger(1), ++tcpclient(1) +diff -uNr ucspi-tcp-0.88.orig/fixcr.1 ucspi-tcp-0.88/fixcr.1 +--- ucspi-tcp-0.88.orig/fixcr.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/fixcr.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,11 @@ ++.TH fixcr 1 ++.SH NAME ++fixcr \- make sure that there is a CR before each LF ++.SH SYNOPSIS ++.B fixcr ++.SH DESCRIPTION ++.B fixcr ++inserts CR at the end of each line of input where a CR is not already present. ++It does not insert CR at the end of a partial final line. ++.SH "SEE ALSO" ++addcr(1) +diff -uNr ucspi-tcp-0.88.orig/fmt_xlong.c ucspi-tcp-0.88/fmt_xlong.c +--- ucspi-tcp-0.88.orig/fmt_xlong.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/fmt_xlong.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,22 @@ ++#include "fmt.h" ++ ++char tohex(char num) { ++ if (num<10) ++ return num+'0'; ++ else if (num<16) ++ return num-10+'a'; ++ else ++ return -1; ++} ++ ++unsigned int fmt_xlong(register char *s,register unsigned long u) ++{ ++ register unsigned int len; register unsigned long q; ++ len = 1; q = u; ++ while (q > 15) { ++len; q /= 16; } ++ if (s) { ++ s += len; ++ do { *--s = tohex(u % 16); u /= 16; } while(u); /* handles u == 0 */ ++ } ++ return len; ++} +diff -uNr ucspi-tcp-0.88.orig/haveip6.h1 ucspi-tcp-0.88/haveip6.h1 +--- ucspi-tcp-0.88.orig/haveip6.h1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/haveip6.h1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1 @@ ++ +diff -uNr ucspi-tcp-0.88.orig/haveip6.h2 ucspi-tcp-0.88/haveip6.h2 +--- ucspi-tcp-0.88.orig/haveip6.h2 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/haveip6.h2 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1 @@ ++#define LIBC_HAS_IP6 1 +diff -uNr ucspi-tcp-0.88.orig/hier.c ucspi-tcp-0.88/hier.c +--- ucspi-tcp-0.88.orig/hier.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/hier.c 2009-08-04 17:45:59.000000000 -0500 +@@ -4,6 +4,9 @@ + { + h(auto_home,-1,-1,02755); + d(auto_home,"bin",-1,-1,02755); ++ d(auto_home,"man",-1,-1,02755); ++ d(auto_home,"man/man1",-1,-1,02755); ++ d(auto_home,"man/man5",-1,-1,02755); + + c(auto_home,"bin","tcpserver",-1,-1,0755); + c(auto_home,"bin","tcprules",-1,-1,0755); +@@ -22,4 +25,20 @@ + c(auto_home,"bin","delcr",-1,-1,0755); + c(auto_home,"bin","fixcrio",-1,-1,0755); + c(auto_home,"bin","rblsmtpd",-1,-1,0755); ++ ++ c(auto_home,"man/man1","tcpclient.1",-1,-1,0644); ++ c(auto_home,"man/man1","tcpserver.1",-1,-1,0644); ++ c(auto_home,"man/man1","tcprules.1",-1,-1,0644); ++ c(auto_home,"man/man1","tcprulescheck.1",-1,-1,0644); ++ c(auto_home,"man/man1","fixcr.1",-1,-1,0644); ++ c(auto_home,"man/man1","addcr.1",-1,-1,0644); ++ c(auto_home,"man/man1","delcr.1",-1,-1,0644); ++ c(auto_home,"man/man1","who@.1",-1,-1,0644); ++ c(auto_home,"man/man1","date@.1",-1,-1,0644); ++ c(auto_home,"man/man1","finger@.1",-1,-1,0644); ++ c(auto_home,"man/man1","http@.1",-1,-1,0644); ++ c(auto_home,"man/man1","mconnect.1",-1,-1,0644); ++ c(auto_home,"man/man1","argv0.1",-1,-1,0644); ++ c(auto_home,"man/man1","recordio.1",-1,-1,0644); ++ c(auto_home,"man/man5","tcp-environ.5",-1,-1,0644); + } +diff -uNr ucspi-tcp-0.88.orig/http@.1 ucspi-tcp-0.88/http@.1 +--- ucspi-tcp-0.88.orig/http@.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/http@.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,52 @@ ++.TH http@ 1 ++.SH NAME ++http@ \- get a web page from a host through HTTP ++.SH SYNTAX ++.B http@ ++[ ++.I host ++[ ++.I page ++[ ++.I port ++] ++] ++] ++.SH DESCRIPTION ++.B http@ ++connects to ++.I port ++on ++.IR host , ++sends ++.B GET /\fIpage ++(with an extra CR) ++to ++.IR host , ++and prints any data it receives, ++removing CR from the end of each line. ++ ++If ++.I port ++is not supplied, ++.B http@ ++uses port 80 (HTTP). ++ ++If ++.I page ++is not supplied, ++.B http@ ++sends ++.B GET / ++to ++.IR host . ++ ++If ++.I host ++is not supplied, ++.B http@ ++connects to the local host. ++.SH "SEE ALSO" ++addcr(1), ++delcr(1), ++tcpclient(1) +diff -uNr ucspi-tcp-0.88.orig/ip4.h ucspi-tcp-0.88/ip4.h +--- ucspi-tcp-0.88.orig/ip4.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/ip4.h 2009-08-04 17:45:59.000000000 -0500 +@@ -6,4 +6,6 @@ + + #define IP4_FMT 20 + ++extern const char ip4loopback[4]; /* = {127,0,0,1}; */ ++ + #endif +diff -uNr ucspi-tcp-0.88.orig/ip6.h ucspi-tcp-0.88/ip6.h +--- ucspi-tcp-0.88.orig/ip6.h 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/ip6.h 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,28 @@ ++#ifndef IP6_H ++#define IP6_H ++ ++#include "byte.h" ++ ++extern unsigned int scan_ip6(const char *src,char *ip); ++extern unsigned int fmt_ip6(char *dest,const char *ip); ++ ++extern unsigned int scan_ip6_flat(const char *src,char *); ++extern unsigned int fmt_ip6_flat(char *dest,const char *); ++ ++/* ++ ip6 address syntax: (h = hex digit), no leading '0' required ++ 1. hhhh:hhhh:hhhh:hhhh:hhhh:hhhh:hhhh:hhhh ++ 2. any number of 0000 may be abbreviated as "::", but only once ++ flat ip6 address syntax: ++ hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh ++ */ ++ ++#define IP6_FMT 40 ++ ++extern const unsigned char V4mappedprefix[12]; /*={0,0,0,0,0,0,0,0,0,0,0xff,0xff}; */ ++extern const unsigned char V6loopback[16]; /*={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; */ ++extern const unsigned char V6any[16]; /*={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; */ ++ ++#define ip6_isv4mapped(ip) (byte_equal(ip,12,V4mappedprefix)) ++ ++#endif +diff -uNr ucspi-tcp-0.88.orig/ip6_fmt.c ucspi-tcp-0.88/ip6_fmt.c +--- ucspi-tcp-0.88.orig/ip6_fmt.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/ip6_fmt.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,64 @@ ++#include "fmt.h" ++#include "byte.h" ++#include "ip4.h" ++#include "ip6.h" ++ ++unsigned int ip6_fmt(char *s,char ip[16]) ++{ ++ unsigned long len,temp, k, pos0=0,len0=0, pos1=0, compr=0; ++ ++ for (k=0; k<16; k+=2) { ++ if (ip[k]==0 && ip[k+1]==0) { ++ if (!compr) { ++ compr=1; ++ pos1=k; ++ } ++ if (k==14) { k=16; goto last; } ++ } else if (compr) { ++ last: ++ if ((temp=k-pos1) > len0) { ++ len0=temp; ++ pos0=pos1; ++ } ++ compr=0; ++ } ++ } ++ ++ for (len=0,k=0; k<16; k+=2) { ++ if (k==12 && ip6_isv4mapped(ip)) { ++ len += ip4_fmt(s,ip+12); ++ break; ++ } ++ if (pos0==k && len0) { ++ if (k==0) { ++len; if (s) *s++ = ':'; } ++ ++len; if (s) *s++ = ':'; ++ k += len0-2; ++ continue; ++ } ++ temp = ((unsigned long) (unsigned char) ip[k] << 8) + ++ (unsigned long) (unsigned char) ip[k+1]; ++ temp = fmt_xlong(s,temp); len += temp; if (s) s += temp; ++ if (k<14) { ++len; if (s) *s++ = ':'; } ++ } ++ ++ return len; ++} ++ ++static char tohex(char num) { ++ if (num<10) ++ return num+'0'; ++ else if (num<16) ++ return num-10+'a'; ++ else ++ return -1; ++} ++ ++unsigned int ip6_fmt_flat(char *s,char ip[16]) ++{ ++ int i; ++ for (i=0; i<16; i++) { ++ *s++=tohex((unsigned char)ip[i] >> 4); ++ *s++=tohex((unsigned char)ip[i] & 15); ++ } ++ return 32; ++} +diff -uNr ucspi-tcp-0.88.orig/mconnect.1 ucspi-tcp-0.88/mconnect.1 +--- ucspi-tcp-0.88.orig/mconnect.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/mconnect.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,36 @@ ++.TH mconnect 1 ++.SH NAME ++mconnect \- connect to the SMTP server on a host ++.SH SYNTAX ++.B mconnect ++[ ++.I host ++[ ++.I port ++] ++] ++.SH DESCRIPTION ++.B mconnect ++connects to ++.I port ++on ++.IR host . ++It sends its input to ++.IR host , ++adding a CR to each line. ++Meanwhile it prints anything it receives from ++.IR host . ++ ++If ++.I port ++is not supplied, ++.B mconnect ++uses port 25 (SMTP). ++ ++If ++.I host ++is not supplied, ++.B mconnect ++connects to the local host. ++.SH "SEE ALSO" ++tcpclient(1) +diff -uNr ucspi-tcp-0.88.orig/old-rules.c ucspi-tcp-0.88/old-rules.c +--- ucspi-tcp-0.88.orig/old-rules.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/old-rules.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,101 @@ ++#include "alloc.h" ++#include "stralloc.h" ++#include "open.h" ++#include "cdb.h" ++#include "rules.h" ++ ++stralloc rules_name = {0}; ++ ++static struct cdb c; ++ ++static int dorule(void (*callback)(char *,unsigned int)) ++{ ++ char *data; ++ unsigned int datalen; ++ ++ switch(cdb_find(&c,rules_name.s,rules_name.len)) { ++ case -1: return -1; ++ case 0: return 0; ++ } ++ ++ datalen = cdb_datalen(&c); ++ data = alloc(datalen); ++ if (!data) return -1; ++ if (cdb_read(&c,data,datalen,cdb_datapos(&c)) == -1) { ++ alloc_free(data); ++ return -1; ++ } ++ ++ callback(data,datalen); ++ alloc_free(data); ++ return 1; ++} ++ ++static int doit(void (*callback)(char *,unsigned int),char *ip,char *host,char *info) ++{ ++ int r; ++ ++ if (info) { ++ if (!stralloc_copys(&rules_name,info)) return -1; ++ if (!stralloc_cats(&rules_name,"@")) return -1; ++ if (!stralloc_cats(&rules_name,ip)) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ ++ if (host) { ++ if (!stralloc_copys(&rules_name,info)) return -1; ++ if (!stralloc_cats(&rules_name,"@=")) return -1; ++ if (!stralloc_cats(&rules_name,host)) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ } ++ } ++ ++ if (!stralloc_copys(&rules_name,ip)) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ ++ if (host) { ++ if (!stralloc_copys(&rules_name,"=")) return -1; ++ if (!stralloc_cats(&rules_name,host)) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ } ++ ++ if (!stralloc_copys(&rules_name,ip)) return -1; ++ while (rules_name.len > 0) { ++ if (ip[rules_name.len - 1] == '.' || ++ (ip[rules_name.len-1]==':' && rules_name.len>1)) { ++ r = dorule(callback); ++ if (r) return r; ++ } ++ --rules_name.len; ++ } ++ ++ if (host) { ++ while (*host) { ++ if (*host == '.') { ++ if (!stralloc_copys(&rules_name,"=")) return -1; ++ if (!stralloc_cats(&rules_name,host)) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ } ++ ++host; ++ } ++ if (!stralloc_copys(&rules_name,"=")) return -1; ++ r = dorule(callback); ++ if (r) return r; ++ } ++ ++ rules_name.len = 0; ++ return dorule(callback); ++} ++ ++int rules(void (*callback)(char *,unsigned int),int fd,char *ip,char *host,char *info) ++{ ++ int r; ++ cdb_init(&c,fd); ++ r = doit(callback,ip,host,info); ++ cdb_free(&c); ++ return r; ++} +diff -uNr ucspi-tcp-0.88.orig/pathexec.h ucspi-tcp-0.88/pathexec.h +--- ucspi-tcp-0.88.orig/pathexec.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/pathexec.h 2009-08-04 17:45:59.000000000 -0500 +@@ -2,7 +2,7 @@ + #define PATHEXEC_H + + extern void pathexec_run(char *,char **,char **); +-extern int pathexec_env(char *,char *); ++extern int pathexec_env(const char *,const char *); + extern void pathexec(char **); + + #endif +diff -uNr ucspi-tcp-0.88.orig/pathexec_env.c ucspi-tcp-0.88/pathexec_env.c +--- ucspi-tcp-0.88.orig/pathexec_env.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/pathexec_env.c 2009-08-04 17:45:59.000000000 -0500 +@@ -8,7 +8,7 @@ + static stralloc plus; + static stralloc tmp; + +-int pathexec_env(char *s,char *t) ++int pathexec_env(const char *s,const char *t) + { + if (!s) return 1; + if (!stralloc_copys(&tmp,s)) return 0; +@@ -22,7 +22,6 @@ + + void pathexec(char **argv) + { +- char *path; + char **e; + unsigned int elen; + unsigned int i; +diff -uNr ucspi-tcp-0.88.orig/rblsmtpd.c ucspi-tcp-0.88/rblsmtpd.c +--- ucspi-tcp-0.88.orig/rblsmtpd.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/rblsmtpd.c 2009-08-04 17:51:17.000000000 -0500 +@@ -25,26 +25,58 @@ + strerr_die1x(100,"rblsmtpd: usage: rblsmtpd [ -b ] [ -R ] [ -t timeout ] [ -r base ] [ -a base ] smtpd [ arg ... ]"); + } + ++char *tcp_proto; + char *ip_env; + static stralloc ip_reverse; + ++static inline char tohex(char c) { ++ return c>=10?c-10+'a':c+'0'; ++} ++ + void ip_init(void) + { + unsigned int i; + unsigned int j; ++ unsigned char remoteip[16]; ++ char hexval; + ++ tcp_proto = env_get("PROTO"); ++ if (!tcp_proto) tcp_proto = ""; + ip_env = env_get("TCPREMOTEIP"); + if (!ip_env) ip_env = ""; + + if (!stralloc_copys(&ip_reverse,"")) nomem(); + + i = str_len(ip_env); +- while (i) { +- for (j = i;j > 0;--j) if (ip_env[j - 1] == '.') break; +- if (!stralloc_catb(&ip_reverse,ip_env + j,i - j)) nomem(); +- if (!stralloc_cats(&ip_reverse,".")) nomem(); +- if (!j) break; +- i = j - 1; ++ if (str_diff(tcp_proto, "TCP6") != 0) ++ { ++ // IPv4 ++ while (i) { ++ for (j = i;j > 0;--j) if (ip_env[j - 1] == '.') break; ++ if (!stralloc_catb(&ip_reverse,ip_env + j,i - j)) nomem(); ++ if (!stralloc_cats(&ip_reverse,".")) nomem(); ++ if (!j) break; ++ i = j - 1; ++ } ++ } ++ else ++ { ++ // IPv6 ++ if ((i=scan_ip6(ip_env, remoteip))==0) ++ return; ++ ++ for (j=16; j>0; j--) ++ { ++ hexval=tohex(remoteip[j-1] & 15); ++ if(!stralloc_catb(&ip_reverse, &hexval, 1)) nomem(); ++ if(!stralloc_cats(&ip_reverse, ".")) nomem(); ++ ++ hexval=tohex(remoteip[j-1] >> 4); ++ if(!stralloc_catb(&ip_reverse, &hexval, 1)) nomem(); ++ if(!stralloc_cats(&ip_reverse, ".")) nomem(); ++ } ++ ++ if(!stralloc_cats(&ip_reverse, "ipv6.")) nomem(); + } + } + +@@ -190,7 +222,7 @@ + argv += optind; + if (!*argv) usage(); + +- if (flagwantdefaultrbl) rbl("rbl.maps.vix.com"); ++ if (flagwantdefaultrbl) rbl("zen.spamhaus.org"); + if (decision >= 2) rblsmtpd(); + + pathexec_run(*argv,argv,envp); +diff -uNr ucspi-tcp-0.88.orig/recordio.1 ucspi-tcp-0.88/recordio.1 +--- ucspi-tcp-0.88.orig/recordio.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/recordio.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,75 @@ ++.TH recordio 1 ++.SH NAME ++recordio \- record the input and output of a program ++.SH SYNTAX ++.B recordio ++.I program ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B recordio ++runs ++.I program ++with the given arguments. ++It prints lines to stderr ++showing the input and output of ++.IR program . ++ ++At the beginning of each line on stderr, ++.B recordio ++inserts the ++.I program ++process ID, ++along with ++.B < ++for input or ++.B > ++for output. ++At the end of each line it inserts a space, a plus sign, or [EOF]; ++a space indicates that there was a newline in the input or output, ++and [EOF] indicates the end of input or output. ++ ++.B recordio ++prints every packet of input and output immediately. ++It does not attempt to combine packets into coherent stderr lines. ++For example, ++ ++.EX ++ recordio sh -c 'cat /dev/fd/8 2>&1' > /dev/null ++.EE ++ ++could produce ++ ++.EX ++ 5135 > cat: /dev/fd/8: Bad file descriptor ++.br ++ 5135 > [EOF] ++.EE ++ ++or ++ ++.EX ++ 5135 > cat: + ++.br ++ 5135 > /dev/fd/8+ ++.br ++ 5135 > : + ++.br ++ 5135 > Bad file descriptor ++.br ++ 5135 > [EOF] ++.EE ++ ++.B recordio ++uses several lines for long packets ++to guarantee that each line is printed atomically to stderr. ++ ++.B recordio ++runs as a child of ++.IR program . ++It exits when it sees the end of ++.IR program 's ++output. ++.SH "SEE ALSO" ++tcpserver(1) +diff -uNr ucspi-tcp-0.88.orig/remoteinfo.h ucspi-tcp-0.88/remoteinfo.h +--- ucspi-tcp-0.88.orig/remoteinfo.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/remoteinfo.h 2009-08-04 17:45:59.000000000 -0500 +@@ -5,5 +5,6 @@ + #include "uint16.h" + + extern int remoteinfo(stralloc *,char *,uint16,char *,uint16,unsigned int); ++extern int remoteinfo6(stralloc *,char *,uint16,char *,uint16,unsigned int,uint32); + + #endif +diff -uNr ucspi-tcp-0.88.orig/remoteinfo6.c ucspi-tcp-0.88/remoteinfo6.c +--- ucspi-tcp-0.88.orig/remoteinfo6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/remoteinfo6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,98 @@ ++#include "fmt.h" ++#include "buffer.h" ++#include "socket.h" ++#include "error.h" ++#include "iopause.h" ++#include "timeoutconn.h" ++#include "remoteinfo.h" ++ ++static struct taia now; ++static struct taia deadline; ++ ++static int mywrite(int fd,char *buf,int len) ++{ ++ iopause_fd x; ++ ++ x.fd = fd; ++ x.events = IOPAUSE_WRITE; ++ for (;;) { ++ taia_now(&now); ++ iopause(&x,1,&deadline,&now); ++ if (x.revents) break; ++ if (taia_less(&deadline,&now)) { ++ errno = error_timeout; ++ return -1; ++ } ++ } ++ return write(fd,buf,len); ++} ++ ++static int myread(int fd,char *buf,int len) ++{ ++ iopause_fd x; ++ ++ x.fd = fd; ++ x.events = IOPAUSE_READ; ++ for (;;) { ++ taia_now(&now); ++ iopause(&x,1,&deadline,&now); ++ if (x.revents) break; ++ if (taia_less(&deadline,&now)) { ++ errno = error_timeout; ++ return -1; ++ } ++ } ++ return read(fd,buf,len); ++} ++ ++static int doit(stralloc *out,int s,char ipremote[16],uint16 portremote,char iplocal[16],uint16 portlocal,unsigned int timeout,uint32 netif) ++{ ++ buffer b; ++ char bspace[128]; ++ char strnum[FMT_ULONG]; ++ int numcolons; ++ char ch; ++ ++ if (socket_bind6(s,iplocal,0,netif) == -1) return -1; ++ if (timeoutconn6(s,ipremote,113,timeout,netif) == -1) return -1; ++ ++ buffer_init(&b,mywrite,s,bspace,sizeof bspace); ++ buffer_put(&b,strnum,fmt_ulong(strnum,portremote)); ++ buffer_put(&b," , ",3); ++ buffer_put(&b,strnum,fmt_ulong(strnum,portlocal)); ++ buffer_put(&b,"\r\n",2); ++ if (buffer_flush(&b) == -1) return -1; ++ ++ buffer_init(&b,myread,s,bspace,sizeof bspace); ++ numcolons = 0; ++ for (;;) { ++ if (buffer_get(&b,&ch,1) != 1) return -1; ++ if ((ch == ' ') || (ch == '\t') || (ch == '\r')) continue; ++ if (ch == '\n') return 0; ++ if (numcolons < 3) { ++ if (ch == ':') ++numcolons; ++ } ++ else { ++ if (!stralloc_append(out,&ch)) return -1; ++ if (out->len > 256) return 0; ++ } ++ } ++} ++ ++int remoteinfo6(stralloc *out,char ipremote[16],uint16 portremote,char iplocal[16],uint16 portlocal,unsigned int timeout,uint32 netif) ++{ ++ int s; ++ int r; ++ ++ if (!stralloc_copys(out,"")) return -1; ++ ++ taia_now(&now); ++ taia_uint(&deadline,timeout); ++ taia_add(&deadline,&now,&deadline); ++ ++ s = socket_tcp6(); ++ if (s == -1) return -1; ++ r = doit(out,s,ipremote,portremote,iplocal,portlocal,timeout,netif); ++ close(s); ++ return r; ++} +diff -uNr ucspi-tcp-0.88.orig/rules.c ucspi-tcp-0.88/rules.c +--- ucspi-tcp-0.88.orig/rules.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/rules.c 2009-08-04 17:45:59.000000000 -0500 +@@ -64,7 +64,7 @@ + + if (!stralloc_copys(&rules_name,ip)) return -1; + while (rules_name.len > 0) { +- if (ip[rules_name.len - 1] == '.') { ++ if (ip[rules_name.len - 1] == '.' || ip[rules_name.len - 1] == ':') { + r = dorule(callback); + if (r) return r; + } +diff -uNr ucspi-tcp-0.88.orig/scan_ip6.c ucspi-tcp-0.88/scan_ip6.c +--- ucspi-tcp-0.88.orig/scan_ip6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/scan_ip6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,87 @@ ++#include "scan.h" ++#include "ip4.h" ++#include "ip6.h" ++ ++/* ++ * IPv6 addresses are really ugly to parse. ++ * Syntax: (h = hex digit) ++ * 1. hhhh:hhhh:hhhh:hhhh:hhhh:hhhh:hhhh:hhhh ++ * 2. any number of 0000 may be abbreviated as "::", but only once ++ * 3. The last two words may be written as IPv4 address ++ */ ++ ++unsigned int scan_ip6(const char *s,char ip[16]) ++{ ++ unsigned int i; ++ unsigned int len=0; ++ unsigned long u; ++ ++ char suffix[16]; ++ int prefixlen=0; ++ int suffixlen=0; ++ ++ if ((i=ip4_scan((char*)s,ip+12))) { ++ for (len=0; len<12; ++len) ip[len]=V4mappedprefix[len]; ++ return i; ++ } ++ for (i=0; i<16; i++) ip[i]=0; ++ for (;;) { ++ if (*s == ':') { ++ len++; ++ if (s[1] == ':') { /* Found "::", skip to part 2 */ ++ s+=2; ++ len++; ++ break; ++ } ++ s++; ++ } ++ i = scan_xlong((char*)s,&u); ++ if (!i) return 0; ++ if (prefixlen==12 && s[i]=='.') { ++ /* the last 4 bytes may be written as IPv4 address */ ++ i=ip4_scan((char*)s,ip+12); ++ if (i) ++ return i+len; ++ else ++ return 0; ++ } ++ ip[prefixlen++] = (u >> 8); ++ ip[prefixlen++] = (u & 255); ++ s += i; len += i; ++ if (prefixlen==16) ++ return len; ++ } ++ ++/* part 2, after "::" */ ++ for (;;) { ++ if (*s == ':') { ++ if (suffixlen==0) ++ break; ++ s++; ++ len++; ++ } else if (suffixlen!=0) ++ break; ++ i = scan_xlong((char*)s,&u); ++ if (!i) { ++ len--; ++ break; ++ } ++ if (suffixlen+prefixlen<=12 && s[i]=='.') { ++ int j=ip4_scan((char*)s,suffix+suffixlen); ++ if (j) { ++ suffixlen+=4; ++ len+=j; ++ break; ++ } else ++ prefixlen=12-suffixlen; /* make end-of-loop test true */ ++ } ++ suffix[suffixlen++] = (u >> 8); ++ suffix[suffixlen++] = (u & 255); ++ s += i; len += i; ++ if (prefixlen+suffixlen==16) ++ break; ++ } ++ for (i=0; i='0' && c<='9') ++ return c-'0'; ++ else if (c>='A' && c<='F') ++ return c-'A'+10; ++ else if (c>='a' && c<='f') ++ return c-'a'+10; ++ return -1; ++} ++ ++unsigned int scan_xlong(char *src,unsigned long *dest) { ++ register const char *tmp=src; ++ register int l=0; ++ register unsigned char c; ++ while ((c=fromhex(*tmp))<16) { ++ l=(l<<4)+c; ++ ++tmp; ++ } ++ *dest=l; ++ return tmp-src; ++} +diff -uNr ucspi-tcp-0.88.orig/socket.h ucspi-tcp-0.88/socket.h +--- ucspi-tcp-0.88.orig/socket.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/socket.h 2009-08-04 17:45:59.000000000 -0500 +@@ -2,21 +2,52 @@ + #define SOCKET_H + + #include "uint16.h" ++#include "uint32.h" + + extern int socket_tcp(void); + extern int socket_udp(void); ++extern int socket_tcp6(void); ++extern int socket_udp6(void); + +-extern int socket_connect4(int,char *,uint16); ++extern int socket_connect4(int,const char *,uint16); ++extern int socket_connect6(int s,const char *ip,uint16 port,uint32 scope_id); + extern int socket_connected(int); +-extern int socket_bind4(int,char *,uint16); +-extern int socket_bind4_reuse(int,char *,uint16); ++extern int socket_bind4(int,const char *,uint16); ++extern int socket_bind4_reuse(int,const char *,uint16); ++extern int socket_bind6(int s,const char *ip,uint16 port,uint32 scope_id); ++extern int socket_bind6_reuse(int s,const char *ip,uint16 port,uint32 scope_id); + extern int socket_listen(int,int); + extern int socket_accept4(int,char *,uint16 *); ++extern int socket_accept6(int s,char *ip,uint16 *port,uint32 *scope_id); + extern int socket_recv4(int,char *,int,char *,uint16 *); +-extern int socket_send4(int,char *,int,char *,uint16); ++extern int socket_send4(int,const char *,int,const char *,uint16); ++extern int socket_recv6(int s,char *buf,unsigned int len,char *ip,uint16 *port,uint32 *scope_id); ++extern int socket_send6(int s,const char *buf,unsigned int len,const char *ip,uint16 port,uint32 scope_id); + extern int socket_local4(int,char *,uint16 *); + extern int socket_remote4(int,char *,uint16 *); ++extern int socket_local6(int s,char *ip,uint16 *port,uint32 *scope_id); ++extern int socket_remote6(int s,char *ip,uint16 *port,uint32 *scope_id); ++ ++/* enable sending udp packets to the broadcast address */ ++extern int socket_broadcast(int); ++/* join a multicast group on the given interface */ ++extern int socket_mcjoin4(int,char *,char *); ++extern int socket_mcjoin6(int,char *,int); ++/* leave a multicast group on the given interface */ ++extern int socket_mcleave4(int,char *); ++extern int socket_mcleave6(int,char *); ++/* set multicast TTL/hop count for outgoing packets */ ++extern int socket_mcttl4(int,char); ++extern int socket_mcttl6(int,char); ++/* enable multicast loopback */ ++extern int socket_mcloop4(int,char); ++extern int socket_mcloop6(int,char); ++ ++extern const char* socket_getifname(uint32 interface); ++extern uint32 socket_getifidx(const char *ifname); + + extern void socket_tryreservein(int,int); + ++extern int noipv6; ++ + #endif +diff -uNr ucspi-tcp-0.88.orig/socket_accept6.c ucspi-tcp-0.88/socket_accept6.c +--- ucspi-tcp-0.88.orig/socket_accept6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_accept6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,44 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_accept6(int s,char ip[16],uint16 *port,uint32 *scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++#else ++ struct sockaddr_in sa; ++#endif ++ unsigned int dummy = sizeof sa; ++ int fd; ++ ++ fd = accept(s,(struct sockaddr *) &sa,&dummy); ++ if (fd == -1) return -1; ++ ++#ifdef LIBC_HAS_IP6 ++ if (sa.sin6_family==AF_INET) { ++ struct sockaddr_in *sa4=(struct sockaddr_in*)&sa; ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa4->sin_addr); ++ uint16_unpack_big((char *) &sa4->sin_port,port); ++ return fd; ++ } ++ byte_copy(ip,16,(char *) &sa.sin6_addr); ++ uint16_unpack_big((char *) &sa.sin6_port,port); ++ if (scope_id) *scope_id=sa.sin6_scope_id; ++ ++ return fd; ++#else ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa.sin_addr); ++ uint16_unpack_big((char *) &sa.sin_port,port); ++ if (scope_id) *scope_id=0; ++ return fd; ++#endif ++} +diff -uNr ucspi-tcp-0.88.orig/socket_bind.c ucspi-tcp-0.88/socket_bind.c +--- ucspi-tcp-0.88.orig/socket_bind.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/socket_bind.c 2009-08-04 17:45:59.000000000 -0500 +@@ -5,7 +5,7 @@ + #include "byte.h" + #include "socket.h" + +-int socket_bind4(int s,char ip[4],uint16 port) ++int socket_bind4(int s,const char ip[4],uint16 port) + { + struct sockaddr_in sa; + +@@ -17,7 +17,7 @@ + return bind(s,(struct sockaddr *) &sa,sizeof sa); + } + +-int socket_bind4_reuse(int s,char ip[4],uint16 port) ++int socket_bind4_reuse(int s,const char ip[4],uint16 port) + { + int opt = 1; + setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof opt); +diff -uNr ucspi-tcp-0.88.orig/socket_bind6.c ucspi-tcp-0.88/socket_bind6.c +--- ucspi-tcp-0.88.orig/socket_bind6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_bind6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,45 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_bind6(int s,const char ip[16],uint16 port,uint32 scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++ ++ if (noipv6) { ++#endif ++ int i; ++ for (i=0; i<16; i++) ++ if (ip[i]!=0) break; ++ if (i==16 || ip6_isv4mapped(ip)) ++ return socket_bind4(s,ip+12,port); ++#ifdef LIBC_HAS_IP6 ++ } ++ byte_zero(&sa,sizeof sa); ++ sa.sin6_family = AF_INET6; ++ uint16_pack_big((char *) &sa.sin6_port,port); ++/* implicit: sa.sin6_flowinfo = 0; */ ++ byte_copy((char *) &sa.sin6_addr,16,ip); ++ sa.sin6_scope_id=scope_id; ++ ++ return bind(s,(struct sockaddr *) &sa,sizeof sa); ++#else ++ errno=error_proto; ++ return -1; ++#endif ++} ++ ++int socket_bind6_reuse(int s,const char ip[16],uint16 port,uint32 scope_id) ++{ ++ int opt = 1; ++ setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof opt); ++ return socket_bind6(s,ip,port,scope_id); ++} ++ +diff -uNr ucspi-tcp-0.88.orig/socket_conn.c ucspi-tcp-0.88/socket_conn.c +--- ucspi-tcp-0.88.orig/socket_conn.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/socket_conn.c 2009-08-04 17:45:59.000000000 -0500 +@@ -6,7 +6,7 @@ + #include "byte.h" + #include "socket.h" + +-int socket_connect4(int s,char ip[4],uint16 port) ++int socket_connect4(int s,const char ip[4],uint16 port) + { + struct sockaddr_in sa; + +diff -uNr ucspi-tcp-0.88.orig/socket_conn6.c ucspi-tcp-0.88/socket_conn6.c +--- ucspi-tcp-0.88.orig/socket_conn6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_conn6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,38 @@ ++#include ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "uint32.h" ++#include "ip4.h" ++ ++int socket_connect6(int s,const char ip[16],uint16 port,uint32 scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++ ++ if (noipv6) { ++#endif ++ if (ip6_isv4mapped(ip)) ++ return socket_connect4(s,ip+12,port); ++ if (byte_equal(ip,16,V6loopback)) ++ return socket_connect4(s,ip4loopback,port); ++#ifdef LIBC_HAS_IP6 ++ } ++ byte_zero(&sa,sizeof sa); ++ sa.sin6_family = PF_INET6; ++ uint16_pack_big((char *) &sa.sin6_port,port); ++ sa.sin6_flowinfo = 0; ++ sa.sin6_scope_id = scope_id; ++ byte_copy((char *) &sa.sin6_addr,16,ip); ++ ++ return connect(s,(struct sockaddr *) &sa,sizeof sa); ++#else ++ errno=EPROTONOSUPPORT; ++ return -1; ++#endif ++} +diff -uNr ucspi-tcp-0.88.orig/socket_getifidx.c ucspi-tcp-0.88/socket_getifidx.c +--- ucspi-tcp-0.88.orig/socket_getifidx.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_getifidx.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,8 @@ ++#include ++#include ++#include ++#include "socket.h" ++ ++uint32 socket_getifidx(const char* ifname) { ++ return if_nametoindex(ifname); ++} +diff -uNr ucspi-tcp-0.88.orig/socket_getifname.c ucspi-tcp-0.88/socket_getifname.c +--- ucspi-tcp-0.88.orig/socket_getifname.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_getifname.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,14 @@ ++#include ++#include ++#include ++#include "socket.h" ++ ++static char ifname[IFNAMSIZ]; ++ ++const char* socket_getifname(uint32 interface) { ++ char *tmp=if_indextoname(interface,ifname); ++ if (tmp) ++ return tmp; ++ else ++ return "[unknown]"; ++} +diff -uNr ucspi-tcp-0.88.orig/socket_ip4loopback.c ucspi-tcp-0.88/socket_ip4loopback.c +--- ucspi-tcp-0.88.orig/socket_ip4loopback.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_ip4loopback.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,2 @@ ++ ++const char ip4loopback[4] = {127,0,0,1}; +diff -uNr ucspi-tcp-0.88.orig/socket_local6.c ucspi-tcp-0.88/socket_local6.c +--- ucspi-tcp-0.88.orig/socket_local6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_local6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,39 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_local6(int s,char ip[16],uint16 *port,uint32 *scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++#else ++ struct sockaddr_in sa; ++#endif ++ unsigned int dummy = sizeof sa; ++ ++ if (getsockname(s,(struct sockaddr *) &sa,&dummy) == -1) return -1; ++#ifdef LIBC_HAS_IP6 ++ if (sa.sin6_family==AF_INET) { ++ struct sockaddr_in *sa4=(struct sockaddr_in*)&sa; ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa4->sin_addr); ++ uint16_unpack_big((char *) &sa4->sin_port,port); ++ return 0; ++ } ++ byte_copy(ip,16,(char *) &sa.sin6_addr); ++ uint16_unpack_big((char *) &sa.sin6_port,port); ++ if (scope_id) *scope_id=sa.sin6_scope_id; ++#else ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa.sin_addr); ++ uint16_unpack_big((char *) &sa.sin_port,port); ++ if (scope_id) *scope_id=0; ++#endif ++ return 0; ++} +diff -uNr ucspi-tcp-0.88.orig/socket_recv6.c ucspi-tcp-0.88/socket_recv6.c +--- ucspi-tcp-0.88.orig/socket_recv6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_recv6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,44 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_recv6(int s,char *buf,unsigned int len,char ip[16],uint16 *port,uint32 *scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++#else ++ struct sockaddr_in sa; ++#endif ++ unsigned int dummy = sizeof sa; ++ int r; ++ ++ byte_zero(&sa,dummy); ++ r = recvfrom(s,buf,len,0,(struct sockaddr *) &sa,&dummy); ++ if (r == -1) return -1; ++ ++#ifdef LIBC_HAS_IP6 ++ if (noipv6) { ++ struct sockaddr_in *sa4=(struct sockaddr_in *)&sa; ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa4->sin_addr); ++ uint16_unpack_big((char *) &sa4->sin_port,port); ++ return r; ++ } ++ byte_copy(ip,16,(char *) &sa.sin6_addr); ++ uint16_unpack_big((char *) &sa.sin6_port,port); ++ if (scope_id) *scope_id=sa.sin6_scope_id; ++#else ++ byte_copy(ip,12,(char *)V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa.sin_addr); ++ uint16_unpack_big((char *) &sa.sin_port,port); ++ if (scope_id) *scope_id=0; ++#endif ++ ++ return r; ++} +diff -uNr ucspi-tcp-0.88.orig/socket_remote6.c ucspi-tcp-0.88/socket_remote6.c +--- ucspi-tcp-0.88.orig/socket_remote6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_remote6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,39 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_remote6(int s,char ip[16],uint16 *port,uint32 *scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++#else ++ struct sockaddr_in sa; ++#endif ++ unsigned int dummy = sizeof sa; ++ ++ if (getpeername(s,(struct sockaddr *) &sa,&dummy) == -1) return -1; ++#ifdef LIBC_HAS_IP6 ++ if (sa.sin6_family==AF_INET) { ++ struct sockaddr_in *sa4=(struct sockaddr_in*)&sa; ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa4->sin_addr); ++ uint16_unpack_big((char *) &sa4->sin_port,port); ++ return 0; ++ } ++ byte_copy(ip,16,(char *) &sa.sin6_addr); ++ uint16_unpack_big((char *) &sa.sin6_port,port); ++ if (scope_id) *scope_id=sa.sin6_scope_id; ++#else ++ byte_copy(ip,12,V4mappedprefix); ++ byte_copy(ip+12,4,(char *) &sa.sin_addr); ++ uint16_unpack_big((char *) &sa.sin_port,port); ++ if (scope_id) *scope_id=0; ++#endif ++ return 0; ++} +diff -uNr ucspi-tcp-0.88.orig/socket_send6.c ucspi-tcp-0.88/socket_send6.c +--- ucspi-tcp-0.88.orig/socket_send6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_send6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,40 @@ ++#include ++#include ++#include ++#include ++#include "byte.h" ++#include "socket.h" ++#include "ip4.h" ++#include "ip6.h" ++#include "haveip6.h" ++#include "error.h" ++ ++int socket_send6(int s,const char *buf,unsigned int len,const char ip[16],uint16 port,uint32 scope_id) ++{ ++#ifdef LIBC_HAS_IP6 ++ struct sockaddr_in6 sa; ++#else ++ struct sockaddr_in sa; ++#endif ++ ++ byte_zero(&sa,sizeof sa); ++#ifdef LIBC_HAS_IP6 ++ if (noipv6) { ++#endif ++ if (ip6_isv4mapped(ip)) ++ return socket_send4(s,buf,len,ip+12,port); ++ if (byte_equal(ip,16,V6loopback)) ++ return socket_send4(s,buf,len,ip4loopback,port); ++#ifdef LIBC_HAS_IP6 ++ errno=error_proto; ++ return -1; ++ } ++ sa.sin6_family = AF_INET6; ++ uint16_pack_big((char *) &sa.sin6_port,port); ++ byte_copy((char *) &sa.sin6_addr,16,ip); ++ return sendto(s,buf,len,0,(struct sockaddr *) &sa,sizeof sa); ++#else ++ errno=error_proto; ++ return -1; ++#endif ++} +diff -uNr ucspi-tcp-0.88.orig/socket_tcp6.c ucspi-tcp-0.88/socket_tcp6.c +--- ucspi-tcp-0.88.orig/socket_tcp6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_tcp6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,44 @@ ++#include ++#include ++#include ++#include ++#include ++#include "ndelay.h" ++#include "socket.h" ++#include "haveip6.h" ++#include "error.h" ++ ++#ifdef LIBC_HAS_IP6 ++int noipv6=0; ++#else ++int noipv6=1; ++#endif ++ ++int socket_tcp6(void) ++{ ++#ifdef LIBC_HAS_IP6 ++ int s; ++ ++ if (noipv6) goto compat; ++ s = socket(PF_INET6,SOCK_STREAM,0); ++ if (s == -1) { ++ if (errno == EINVAL || errno == EAFNOSUPPORT) { ++compat: ++ s=socket(AF_INET,SOCK_STREAM,0); ++ noipv6=1; ++ if (s==-1) return -1; ++ } else ++ return -1; ++ } ++ if (ndelay_on(s) == -1) { close(s); return -1; } ++#ifdef IPV6_V6ONLY ++ { ++ int zero=0; ++ setsockopt(s,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&zero,sizeof(zero)); ++ } ++#endif ++ return s; ++#else ++ return socket_tcp(); ++#endif ++} +diff -uNr ucspi-tcp-0.88.orig/socket_udp6.c ucspi-tcp-0.88/socket_udp6.c +--- ucspi-tcp-0.88.orig/socket_udp6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_udp6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,38 @@ ++#include ++#include ++#include ++#include ++#include "haveip6.h" ++#include "socket.h" ++ ++#ifndef EAFNOSUPPORT ++#define EAFNOSUPPORT EINVAL ++#endif ++ ++int socket_udp6(void) ++{ ++#ifdef LIBC_HAS_IP6 ++ int s; ++ ++ if (noipv6) goto compat; ++ s = socket(PF_INET6,SOCK_DGRAM,0); ++ if (s == -1) { ++ if (errno == EINVAL || errno == EAFNOSUPPORT) { ++compat: ++ s=socket(AF_INET,SOCK_DGRAM,0); ++ noipv6=1; ++ if (s==-1) return -1; ++ } else ++ return -1; ++ } ++#ifdef IPV6_V6ONLY ++ { ++ int zero=0; ++ setsockopt(s,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&zero,sizeof(zero)); ++ } ++#endif ++ return s; ++#else ++ return socket_udp(); ++#endif ++} +diff -uNr ucspi-tcp-0.88.orig/socket_v4mappedprefix.c ucspi-tcp-0.88/socket_v4mappedprefix.c +--- ucspi-tcp-0.88.orig/socket_v4mappedprefix.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_v4mappedprefix.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,2 @@ ++ ++const unsigned char V4mappedprefix[12]={0,0,0,0,0,0,0,0,0,0,0xff,0xff}; +diff -uNr ucspi-tcp-0.88.orig/socket_v6any.c ucspi-tcp-0.88/socket_v6any.c +--- ucspi-tcp-0.88.orig/socket_v6any.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_v6any.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,2 @@ ++ ++const unsigned char V6any[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +diff -uNr ucspi-tcp-0.88.orig/socket_v6loopback.c ucspi-tcp-0.88/socket_v6loopback.c +--- ucspi-tcp-0.88.orig/socket_v6loopback.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/socket_v6loopback.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,2 @@ ++ ++const unsigned char V6loopback[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; +diff -uNr ucspi-tcp-0.88.orig/str.h ucspi-tcp-0.88/str.h +--- ucspi-tcp-0.88.orig/str.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/str.h 2009-08-04 17:45:59.000000000 -0500 +@@ -1,13 +1,13 @@ + #ifndef STR_H + #define STR_H + +-extern unsigned int str_copy(char *,char *); +-extern int str_diff(char *,char *); +-extern int str_diffn(char *,char *,unsigned int); +-extern unsigned int str_len(char *); +-extern unsigned int str_chr(char *,int); +-extern unsigned int str_rchr(char *,int); +-extern int str_start(char *,char *); ++extern unsigned int str_copy(char *,const char *); ++extern int str_diff(const char *,const char *); ++extern int str_diffn(const char *,const char *,unsigned int); ++extern unsigned int str_len(const char *); ++extern unsigned int str_chr(const char *,int); ++extern unsigned int str_rchr(const char *,int); ++extern int str_start(const char *,const char *); + + #define str_equal(s,t) (!str_diff((s),(t))) + +diff -uNr ucspi-tcp-0.88.orig/str_chr.c ucspi-tcp-0.88/str_chr.c +--- ucspi-tcp-0.88.orig/str_chr.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/str_chr.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,9 +1,9 @@ + #include "str.h" + +-unsigned int str_chr(register char *s,int c) ++unsigned int str_chr(register const char *s,int c) + { + register char ch; +- register char *t; ++ register const char *t; + + ch = c; + t = s; +diff -uNr ucspi-tcp-0.88.orig/str_diff.c ucspi-tcp-0.88/str_diff.c +--- ucspi-tcp-0.88.orig/str_diff.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/str_diff.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,6 +1,6 @@ + #include "str.h" + +-int str_diff(register char *s,register char *t) ++int str_diff(register const char *s,register const char *t) + { + register char x; + +diff -uNr ucspi-tcp-0.88.orig/str_len.c ucspi-tcp-0.88/str_len.c +--- ucspi-tcp-0.88.orig/str_len.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/str_len.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,8 +1,8 @@ + #include "str.h" + +-unsigned int str_len(char *s) ++unsigned int str_len(const char *s) + { +- register char *t; ++ register const char *t; + + t = s; + for (;;) { +diff -uNr ucspi-tcp-0.88.orig/str_start.c ucspi-tcp-0.88/str_start.c +--- ucspi-tcp-0.88.orig/str_start.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/str_start.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,6 +1,6 @@ + #include "str.h" + +-int str_start(register char *s,register char *t) ++int str_start(register const char *s,register const char *t) + { + register char x; + +diff -uNr ucspi-tcp-0.88.orig/stralloc.h ucspi-tcp-0.88/stralloc.h +--- ucspi-tcp-0.88.orig/stralloc.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/stralloc.h 2009-08-04 17:45:59.000000000 -0500 +@@ -9,18 +9,20 @@ + extern int stralloc_readyplus(stralloc *,unsigned int); + extern int stralloc_copy(stralloc *,stralloc *); + extern int stralloc_cat(stralloc *,stralloc *); +-extern int stralloc_copys(stralloc *,char *); +-extern int stralloc_cats(stralloc *,char *); +-extern int stralloc_copyb(stralloc *,char *,unsigned int); +-extern int stralloc_catb(stralloc *,char *,unsigned int); ++extern int stralloc_copys(stralloc *,const char *); ++extern int stralloc_cats(stralloc *,const char *); ++extern int stralloc_copyb(stralloc *,const char *,unsigned int); ++extern int stralloc_catb(stralloc *,const char *,unsigned int); + extern int stralloc_append(stralloc *,char *); /* beware: this takes a pointer to 1 char */ +-extern int stralloc_starts(stralloc *,char *); ++extern int stralloc_starts(stralloc *,const char *); + + #define stralloc_0(sa) stralloc_append(sa,"") + + extern int stralloc_catulong0(stralloc *,unsigned long,unsigned int); + extern int stralloc_catlong0(stralloc *,long,unsigned int); + ++extern void stralloc_free(stralloc *); ++ + #define stralloc_catlong(sa,l) (stralloc_catlong0((sa),(l),0)) + #define stralloc_catuint0(sa,i,n) (stralloc_catulong0((sa),(i),(n))) + #define stralloc_catint0(sa,i,n) (stralloc_catlong0((sa),(i),(n))) +diff -uNr ucspi-tcp-0.88.orig/stralloc_catb.c ucspi-tcp-0.88/stralloc_catb.c +--- ucspi-tcp-0.88.orig/stralloc_catb.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/stralloc_catb.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,7 +1,7 @@ + #include "stralloc.h" + #include "byte.h" + +-int stralloc_catb(stralloc *sa,char *s,unsigned int n) ++int stralloc_catb(stralloc *sa,const char *s,unsigned int n) + { + if (!sa->s) return stralloc_copyb(sa,s,n); + if (!stralloc_readyplus(sa,n + 1)) return 0; +diff -uNr ucspi-tcp-0.88.orig/stralloc_cats.c ucspi-tcp-0.88/stralloc_cats.c +--- ucspi-tcp-0.88.orig/stralloc_cats.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/stralloc_cats.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,7 +2,7 @@ + #include "str.h" + #include "stralloc.h" + +-int stralloc_cats(stralloc *sa,char *s) ++int stralloc_cats(stralloc *sa,const char *s) + { + return stralloc_catb(sa,s,str_len(s)); + } +diff -uNr ucspi-tcp-0.88.orig/stralloc_opyb.c ucspi-tcp-0.88/stralloc_opyb.c +--- ucspi-tcp-0.88.orig/stralloc_opyb.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/stralloc_opyb.c 2009-08-04 17:45:59.000000000 -0500 +@@ -1,7 +1,7 @@ + #include "stralloc.h" + #include "byte.h" + +-int stralloc_copyb(stralloc *sa,char *s,unsigned int n) ++int stralloc_copyb(stralloc *sa,const char *s,unsigned int n) + { + if (!stralloc_ready(sa,n + 1)) return 0; + byte_copy(sa->s,n,s); +diff -uNr ucspi-tcp-0.88.orig/stralloc_opys.c ucspi-tcp-0.88/stralloc_opys.c +--- ucspi-tcp-0.88.orig/stralloc_opys.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/stralloc_opys.c 2009-08-04 17:45:59.000000000 -0500 +@@ -2,7 +2,7 @@ + #include "str.h" + #include "stralloc.h" + +-int stralloc_copys(stralloc *sa,char *s) ++int stralloc_copys(stralloc *sa,const char *s) + { + return stralloc_copyb(sa,s,str_len(s)); + } +diff -uNr ucspi-tcp-0.88.orig/tcp-environ.5 ucspi-tcp-0.88/tcp-environ.5 +--- ucspi-tcp-0.88.orig/tcp-environ.5 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcp-environ.5 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,66 @@ ++.TH tcp-environ 5 ++.SH NAME ++tcp-environ \- TCP-related environment variables ++.SH DESCRIPTION ++The following environment variables ++describe a TCP connection. ++They are set up by ++.BR tcp-env , ++.BR tcpclient , ++and ++.BR tcpserver . ++Note that ++.BR TCPLOCALHOST , ++.BR TCPREMOTEHOST , ++and ++.B TCPREMOTEINFO ++can contain arbitrary characters. ++.TP 5 ++PROTO ++The string ++.BR TCP . ++.TP 5 ++TCPLOCALHOST ++The domain name of the local host, ++with uppercase letters converted to lowercase. ++If there is no currently available domain name ++for the local IP address, ++.B TCPLOCALHOST ++is not set. ++.TP 5 ++TCPLOCALIP ++The IP address of the local host, in dotted-decimal form. ++.TP 5 ++TCPLOCALPORT ++The local TCP port number, in decimal. ++.TP 5 ++TCPREMOTEHOST ++The domain name of the remote host, ++with uppercase letters converted to lowercase. ++If there is no currently available domain name ++for the remote IP address, ++.B TCPREMOTEHOST ++is not set. ++.TP 5 ++TCPREMOTEINFO ++A connection-specific string, perhaps a username, ++supplied by the remote host ++via 931/1413/IDENT/TAP. ++If the remote host did not supply connection information, ++.B TCPREMOTEINFO ++is not set. ++.TP 5 ++TCPREMOTEIP ++The IP address of the remote host. ++.TP 5 ++TCPREMOTEPORT ++The remote TCP port number. ++.TP 5 ++TCPINTERFACE ++The interface name ("eth0") for IPv6 connections using link-local ++addresses. ++.SH "SEE ALSO" ++tcpclient(1), ++tcpserver(1), ++tcp-env(1), ++tcp(4) +diff -uNr ucspi-tcp-0.88.orig/tcpcat.1 ucspi-tcp-0.88/tcpcat.1 +--- ucspi-tcp-0.88.orig/tcpcat.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcpcat.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,20 @@ ++.TH tcpcat 1 ++.SH NAME ++tcpcat \- print data from a TCP port ++.SH SYNTAX ++.B tcpcat ++.I host ++.I port ++.SH DESCRIPTION ++.B tcpcat ++connects to ++.I port ++on ++.I host ++and prints any data it receives. ++ ++.B tcpcat ++can be used to transfer binary data. ++It does no conversions. ++.SH "SEE ALSO" ++tcpclient(1) +diff -uNr ucspi-tcp-0.88.orig/tcpclient.1 ucspi-tcp-0.88/tcpclient.1 +--- ucspi-tcp-0.88.orig/tcpclient.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcpclient.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,173 @@ ++.TH tcpclient 1 ++.SH NAME ++tcpclient \- create an outgoing TCP connection ++.SH SYNOPSIS ++.B tcpclient ++[ ++.B \-46hHrRdDqQv ++] ++[ ++.B \-i\fIlocalip ++] ++[ ++.B \-p\fIlocalport ++] ++[ ++.B \-T\fItimeoutconn ++] ++[ ++.B \-l\fIlocalname ++] ++[ ++.B \-t\fItimeoutinfo ++] ++[ ++.B \-I\fIinterface ++] ++.I host ++.I port ++.I program ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B tcpclient ++attempts to connect to a TCP server. ++If it is successful, it runs ++.I program ++with the given arguments, ++with descriptor 6 reading from the network ++and descriptor 7 writing to the network. ++ ++The server's address is given by ++.I host ++and ++.IR port . ++.I host ++may be 0, referring to the local machine, ++or a dotted-decimal IP address, ++or a host name; ++if a host has several IP addresses, ++.B tcpclient ++tries each in turn. ++.I port ++may be a numeric port number ++or a port name. ++ ++.B tcpclient ++sets up several environment variables, ++as described in ++.B tcp-environ(5). ++.SH OPTIONS ++.TP ++.B \-i\fIlocalip ++Use ++.I localip ++as the IP address for the local side of the connection; ++quit if ++.I localip ++is not available. ++.TP ++.B \-p\fIlocalport ++Use ++.I localport ++as the port number for the local side of the connection; ++quit if ++.I localport ++is not available. ++.TP ++.B \-I\fIinterface ++Use ++.I interface ++as the local network interface. This is only defined for IPv6 sockets ++and needed if you use link-local IPv6 addresses. ++.TP ++.B \-T\fItimeoutconn ++Give up on the ++connection attempt ++after ++.I timeoutconn ++seconds. Default: 60. ++This timeout applies to each IP address tried. ++.TP ++.B \-d ++(Default.) ++Delay sending data for a fraction of a second whenever the ++remote host is responding slowly, ++to make better use of the network. ++.TP ++.B \-D ++Never delay sending data; ++enable TCP_NODELAY. ++This is appropriate for interactive connections. ++.TP ++.B \-q ++Quiet. ++Do not print any messages. ++.TP ++.B \-Q ++(Default.) ++Print error messages. ++.TP ++.B \-v ++Verbose. ++Print all available messages. ++.SH "DATA-GATHERING OPTIONS" ++.TP ++.B \-h ++(Default.) ++Look up the remote host name for ++.BR TCPREMOTEHOST . ++.TP ++.B \-H ++Do not look up the remote host name; ++unset ++.BR TCPREMOTEHOST . ++.TP ++.B \-l\fIlocalname ++Do not look up the local host name; ++use ++.I localname ++for ++.BR TCPLOCALHOST . ++.TP ++.B \-r ++(Default.) ++Attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-R ++Do not attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-t\fItimeoutinfo ++Give up on the ++.B TCPREMOTEINFO ++connection attempt ++after ++.I timeoutinfo ++seconds. Default: 26. ++.TP ++.B \-4 ++Fall back to IPv4 sockets. This is necessary for terminally broken ++systems like OpenBSD which will not let IPv6 sockets connect to ++V4-mapped IPv6 addresses. Please note that this also applies to DNS ++lookups, so you will have to use an DNS resolver with an IPv6 address to ++connect to IPv6 systems. Use \fBDNSCACHEIP\fR to set the DNS resolver ++IP dynamically. ++.TP ++.B \-6 ++Force IPv6 mode in UCSPI environment variables, even for ++IPv4 connections. This will set \fB$PROTO\fR to \fBTCP6\fR and put ++IPv4-mapped IPv6 addresses in \fBTCPLOCALIP\fR and \fBTCPREMOTEIP\fR. ++.SH "SEE ALSO" ++date@(1), ++finger@(1), ++http@(1), ++mconnect(1), ++tcpcat(1), ++tcpserver(1), ++who@(1), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/tcpclient.c ucspi-tcp-0.88/tcpclient.c +--- ucspi-tcp-0.88.orig/tcpclient.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/tcpclient.c 2009-08-04 17:45:59.000000000 -0500 +@@ -9,6 +9,7 @@ + #include "scan.h" + #include "str.h" + #include "ip4.h" ++#include "ip6.h" + #include "uint16.h" + #include "socket.h" + #include "fd.h" +@@ -20,6 +21,7 @@ + #include "timeoutconn.h" + #include "remoteinfo.h" + #include "dns.h" ++#include "byte.h" + + #define FATAL "tcpclient: fatal: " + #define CONNECT "tcpclient: unable to connect to " +@@ -31,27 +33,30 @@ + void usage(void) + { + strerr_die1x(100,"tcpclient: usage: tcpclient \ +-[ -hHrRdDqQv ] \ ++[ -46hHrRdDqQv ] \ + [ -i localip ] \ + [ -p localport ] \ + [ -T timeoutconn ] \ + [ -l localname ] \ + [ -t timeoutinfo ] \ ++[ -I interface ] \ + host port program"); + } + ++int forcev6 = 0; + int verbosity = 1; + int flagdelay = 1; + int flagremoteinfo = 1; + int flagremotehost = 1; + unsigned long itimeout = 26; + unsigned long ctimeout[2] = { 2, 58 }; ++uint32 netif = 0; + +-char iplocal[4] = { 0,0,0,0 }; ++char iplocal[16] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; + uint16 portlocal = 0; + char *forcelocal = 0; + +-char ipremote[4]; ++char ipremote[16]; + uint16 portremote; + + char *hostname; +@@ -61,12 +66,13 @@ + static stralloc tmp; + static stralloc fqdn; + char strnum[FMT_ULONG]; +-char ipstr[IP4_FMT]; ++char ipstr[IP6_FMT]; + + char seed[128]; + + main(int argc,char **argv) + { ++ int fakev4=0; + unsigned long u; + int opt; + char *x; +@@ -80,8 +86,10 @@ + close(7); + sig_ignore(sig_pipe); + +- while ((opt = getopt(argc,argv,"dDvqQhHrRi:p:t:T:l:")) != opteof) ++ while ((opt = getopt(argc,argv,"46dDvqQhHrRi:p:t:T:l:I:")) != opteof) + switch(opt) { ++ case '4': noipv6 = 1; break; ++ case '6': forcev6 = 1; break; + case 'd': flagdelay = 1; break; + case 'D': flagdelay = 0; break; + case 'v': verbosity = 2; break; +@@ -97,7 +105,8 @@ + if (optarg[j] == '+') ++j; + scan_ulong(optarg + j,&ctimeout[1]); + break; +- case 'i': if (!ip4_scan(optarg,iplocal)) usage(); break; ++ case 'i': if (!scan_ip6(optarg,iplocal)) usage(); break; ++ case 'I': netif=socket_getifidx(optarg); break; + case 'p': scan_ulong(optarg,&u); portlocal = u; break; + default: usage(); + } +@@ -108,8 +117,8 @@ + + hostname = *argv; + if (!hostname) usage(); +- if (str_equal(hostname,"")) hostname = "127.0.0.1"; +- if (str_equal(hostname,"0")) hostname = "127.0.0.1"; ++ if (!hostname[0] || str_equal(hostname,"0")) ++ hostname = (noipv6?"127.0.0.1":"::1"); + + x = *++argv; + if (!x) usage(); +@@ -127,33 +136,36 @@ + if (!*++argv) usage(); + + if (!stralloc_copys(&tmp,hostname)) nomem(); +- if (dns_ip4_qualify(&addresses,&fqdn,&tmp) == -1) ++ if (dns_ip6_qualify(&addresses,&fqdn,&tmp) == -1) + strerr_die4sys(111,FATAL,"temporarily unable to figure out IP address for ",hostname,": "); +- if (addresses.len < 4) ++ if (addresses.len < 16) + strerr_die3x(111,FATAL,"no IP address for ",hostname); + +- if (addresses.len == 4) { ++ if (addresses.len == 16) { + ctimeout[0] += ctimeout[1]; + ctimeout[1] = 0; + } + + for (cloop = 0;cloop < 2;++cloop) { + if (!stralloc_copys(&moreaddresses,"")) nomem(); +- for (j = 0;j + 4 <= addresses.len;j += 4) { +- s = socket_tcp(); ++ for (j = 0;j + 16 <= addresses.len;j += 4) { ++ s = socket_tcp6(); + if (s == -1) + strerr_die2sys(111,FATAL,"unable to create socket: "); +- if (socket_bind4(s,iplocal,portlocal) == -1) ++ if (socket_bind6(s,iplocal,portlocal,netif) == -1) + strerr_die2sys(111,FATAL,"unable to bind socket: "); +- if (timeoutconn(s,addresses.s + j,portremote,ctimeout[cloop]) == 0) ++ if (timeoutconn6(s,addresses.s + j,portremote,ctimeout[cloop],netif) == 0) + goto CONNECTED; + close(s); + if (!cloop && ctimeout[1] && (errno == error_timeout)) { +- if (!stralloc_catb(&moreaddresses,addresses.s + j,4)) nomem(); ++ if (!stralloc_catb(&moreaddresses,addresses.s + j,16)) nomem(); + } + else { + strnum[fmt_ulong(strnum,portremote)] = 0; +- ipstr[ip4_fmt(ipstr,addresses.s + j)] = 0; ++ if (ip6_isv4mapped(addresses.s+j)) ++ ipstr[ip4_fmt(ipstr,addresses.s + j + 12)] = 0; ++ else ++ ipstr[ip6_fmt(ipstr,addresses.s + j)] = 0; + strerr_warn5(CONNECT,ipstr," port ",strnum,": ",&strerr_sys); + } + } +@@ -169,37 +181,46 @@ + if (!flagdelay) + socket_tcpnodelay(s); /* if it fails, bummer */ + +- if (!pathexec_env("PROTO","TCP")) nomem(); +- +- if (socket_local4(s,iplocal,&portlocal) == -1) ++ if (socket_local6(s,iplocal,&portlocal,&netif) == -1) + strerr_die2sys(111,FATAL,"unable to get local address: "); + ++ if (!forcev6 && (ip6_isv4mapped(iplocal) || byte_equal(iplocal,16,V6any))) ++ fakev4=1; ++ ++ if (!pathexec_env("PROTO",fakev4?"TCP":"TCP6")) nomem(); ++ + strnum[fmt_ulong(strnum,portlocal)] = 0; + if (!pathexec_env("TCPLOCALPORT",strnum)) nomem(); +- ipstr[ip4_fmt(ipstr,iplocal)] = 0; ++ if (fakev4) ++ ipstr[ip4_fmt(ipstr,iplocal+12)] = 0; ++ else ++ ipstr[ip6_fmt(ipstr,iplocal)] = 0; + if (!pathexec_env("TCPLOCALIP",ipstr)) nomem(); + + x = forcelocal; + if (!x) +- if (dns_name4(&tmp,iplocal) == 0) { ++ if (dns_name6(&tmp,iplocal) == 0) { + if (!stralloc_0(&tmp)) nomem(); + x = tmp.s; + } + if (!pathexec_env("TCPLOCALHOST",x)) nomem(); + +- if (socket_remote4(s,ipremote,&portremote) == -1) ++ if (socket_remote6(s,ipremote,&portremote,&netif) == -1) + strerr_die2sys(111,FATAL,"unable to get remote address: "); + + strnum[fmt_ulong(strnum,portremote)] = 0; + if (!pathexec_env("TCPREMOTEPORT",strnum)) nomem(); +- ipstr[ip4_fmt(ipstr,ipremote)] = 0; ++ if (fakev4) ++ ipstr[ip4_fmt(ipstr,ipremote+12)] = 0; ++ else ++ ipstr[ip6_fmt(ipstr,ipremote)] = 0; + if (!pathexec_env("TCPREMOTEIP",ipstr)) nomem(); + if (verbosity >= 2) + strerr_warn4("tcpclient: connected to ",ipstr," port ",strnum,0); + + x = 0; + if (flagremotehost) +- if (dns_name4(&tmp,ipremote) == 0) { ++ if (dns_name6(&tmp,ipremote) == 0) { + if (!stralloc_0(&tmp)) nomem(); + x = tmp.s; + } +@@ -207,7 +228,7 @@ + + x = 0; + if (flagremoteinfo) +- if (remoteinfo(&tmp,ipremote,portremote,iplocal,portlocal,itimeout) == 0) { ++ if (remoteinfo6(&tmp,ipremote,portremote,iplocal,portlocal,itimeout,netif) == 0) { + if (!stralloc_0(&tmp)) nomem(); + x = tmp.s; + } +diff -uNr ucspi-tcp-0.88.orig/tcprules.1 ucspi-tcp-0.88/tcprules.1 +--- ucspi-tcp-0.88.orig/tcprules.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcprules.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,221 @@ ++.TH tcprules 1 ++.SH NAME ++tcprules \- compile rules for tcpserver ++.SH SYNOPSIS ++.B tcprules ++.I rules.cdb ++.I rules.tmp ++.SH OVERVIEW ++.B tcpserver ++optionally follows rules to decide whether a TCP connection is acceptable. ++For example, a rule of ++ ++.EX ++ 18.23.0.32:deny ++.EE ++ ++prohibits connections from IP address 18.23.0.32. ++ ++.B tcprules ++reads rules from its standard input ++and writes them into ++.I rules.cdb ++in a binary format suited ++for quick access by ++.BR tcpserver . ++ ++.B tcprules ++can be used while ++.B tcpserver ++is running: ++it ensures that ++.I rules.cdb ++is updated atomically. ++It does this by first writing the rules to ++.I rules.tmp ++and then moving ++.I rules.tmp ++on top of ++.IR rules.cdb . ++If ++.I rules.tmp ++already exists, it is destroyed. ++The directories containing ++.I rules.cdb ++and ++.I rules.tmp ++must be writable to ++.BR tcprules ; ++they must also be on the same filesystem. ++ ++If there is a problem with the input, ++.B tcprules ++complains and leaves ++.I rules.cdb ++alone. ++ ++The binary ++.I rules.cdb ++format is portable across machines. ++.SH "RULE FORMAT" ++A rule takes up one line. ++A file containing rules ++may also contain comments: lines beginning with # are ignored. ++ ++Each rule contains an ++.BR address , ++a colon, ++and a list of ++.BR instructions , ++with no extra spaces. ++When ++.B tcpserver ++receives a connection from that address, ++it follows the instructions. ++.SH "ADDRESSES" ++.B tcpserver ++starts by looking for a rule with address ++.IR TCPREMOTEINFO\fB@\fITCPREMOTEIP . ++If it doesn't find one, or if ++.I TCPREMOTEINFO ++is not set, it tries the address ++.IR TCPREMOTEIP . ++If that doesn't work, it tries shorter and shorter prefixes of ++.I TCPREMOTEIP ++ending with a dot. ++If none of them work, it tries the empty string. ++ ++For example, here are some rules: ++ ++.EX ++ joe@127.0.0.1:first ++.br ++ 18.23.0.32:second ++.br ++ 127.:third ++.br ++ :fourth ++.br ++ ::1:fifth ++.EE ++ ++If ++.I TCPREMOTEIP ++is ++.BR 10.119.75.38 , ++.B tcpserver ++will follow the ++.B fourth ++instructions. ++ ++If ++.I TCPREMOTEIP ++is ++.BR ::1 , ++.B tcpserver ++will follow the ++.B fifth ++instructions. Note that you cannot detect IPv4 mapped addresses by ++matching "::ffff", as those addresses will be converted to IPv4 before ++looking at the rules. ++ ++If ++.I TCPREMOTEIP ++is ++.BR 18.23.0.32 , ++.B tcpserver ++will follow the ++.B second ++instructions. ++ ++If ++.I TCPREMOTEINFO ++is ++.B bill ++and ++.I TCPREMOTEIP ++is ++.BR 127.0.0.1 , ++.B tcpserver ++will follow the ++.B third ++instructions. ++ ++If ++.I TCPREMOTEINFO ++is ++.B joe ++and ++.I TCPREMOTEIP ++is ++.BR 127.0.0.1 , ++.B tcpserver ++will follow the ++.B first ++instructions. ++.SH "ADDRESS RANGES" ++.B tcprules ++treats ++.B 1.2.3.37-53:ins ++as an abbreviation ++for the rules ++.BR 1.2.3.37:ins , ++.BR 1.2.3.38:ins , ++and so on up through ++.BR 1.2.3.53:ins . ++Similarly, ++.BR 10.2-3.:ins ++is an abbreviation for ++.B 10.2.:ins ++and ++.BR 10.3.:ins . ++.SH "INSTRUCTIONS" ++The instructions in a rule must begin with either ++.B allow ++or ++.BR deny . ++.B deny ++tells ++.B tcpserver ++to drop the connection without running anything. ++For example, the rule ++ ++.EX ++ :deny ++.EE ++ ++tells ++.B tcpserver ++to drop all connections that aren't handled by more specific rules. ++ ++The instructions may continue with some environment variables, ++in the format ++.IR ,VAR="VALUE" . ++.B tcpserver ++adds ++.I VAR=VALUE ++to the current environment. ++For example, ++ ++.EX ++ 10.0.:allow,RELAYCLIENT="@fix.me" ++.EE ++ ++adds ++.B RELAYCLIENT=@fix.me ++to the environment. ++The quotes here may be replaced by any repeated character: ++ ++.EX ++ 10.0.:allow,RELAYCLIENT=/@fix.me/ ++.EE ++ ++Any number of variables may be listed: ++ ++.EX ++ 127.0.0.1:allow,RELAYCLIENT="",TCPLOCALHOST="movie.edu" ++.EE ++.SH "SEE ALSO" ++tcprulescheck(1), ++tcpserver(1), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/tcprules.c ucspi-tcp-0.88/tcprules.c +--- ucspi-tcp-0.88.orig/tcprules.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/tcprules.c 2009-08-04 17:45:59.000000000 -0500 +@@ -123,8 +123,15 @@ + } + line.len = len; /* for die_bad() */ + +- colon = byte_chr(x,len,':'); +- if (colon == len) continue; ++ colon = 0; ++ for (;;) { ++ int tmp; ++ tmp = byte_chr(x + colon,len - colon,':'); ++ colon += tmp; ++ if (colon == len) continue; ++ if (byte_equal(x+colon+1,4,"deny") || byte_equal(x+colon+1,5,"allow")) break; ++ ++colon; ++ } + + if (!stralloc_copyb(&address,x,colon)) nomem(); + if (!stralloc_copys(&data,"")) nomem(); +diff -uNr ucspi-tcp-0.88.orig/tcprulescheck.1 ucspi-tcp-0.88/tcprulescheck.1 +--- ucspi-tcp-0.88.orig/tcprulescheck.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcprulescheck.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,25 @@ ++.TH tcprulescheck 1 ++.SH NAME ++tcprulescheck \- try out rules for tcpserver ++.SH SYNTAX ++.B tcprulescheck ++.I rules.cdb ++.I tcpremoteip ++[ ++.I tcpremoteinfo ++] ++.SH DESCRIPTION ++.B tcprulescheck ++says what ++.B tcpserver ++will do with a connection from ++IP address ++.IR tcpremoteip , ++following the rules compiled into ++.I rules.cdb ++by ++.BR tcprules . ++.SH "SEE ALSO" ++tcprules(1), ++tcpserver(1), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/tcpserver.1 ucspi-tcp-0.88/tcpserver.1 +--- ucspi-tcp-0.88.orig/tcpserver.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tcpserver.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,266 @@ ++.TH tcpserver 1 ++.SH NAME ++tcpserver \- accept incoming TCP connections ++.SH SYNOPSIS ++.B tcpserver ++[ ++.B \-146jpPhHrRoOdDqQv ++] ++[ ++.B \-c\fIlimit ++] ++[ ++.B \-x\fIrules.cdb ++] ++[ ++.B \-B\fIbanner ++] ++[ ++.B \-g\fIgid ++] ++[ ++.B \-u\fIuid ++] ++[ ++.B \-b\fIbacklog ++] ++[ ++.B \-l\fIlocalname ++] ++[ ++.B \-t\fItimeout ++] ++[ ++.B \-I\fIinterface ++] ++.I host ++.I port ++.I program ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B tcpserver ++waits for connections from TCP clients. ++For each connection, it runs ++.I program ++with the given arguments, ++with descriptor 0 reading from the network ++and descriptor 1 writing to the network. ++ ++The server's address is given by ++.I host ++and ++.IR port . ++.I host ++can be 0, allowing connections from any host; ++or a particular IP address, ++allowing connections only to that address; ++or a host name, allowing connections to the first IP address ++for that host. ++.I port ++may be a numeric port number ++or a port name. ++If ++.I port ++is 0, ++.B tcpserver ++will choose a free port. ++ ++.B tcpserver ++sets up several environment variables, ++as described in ++.B tcp-environ(5). ++ ++.B tcpserver ++exits when it receives SIGTERM. ++.SH "OPTIONS" ++.TP ++.B \-c\fIlimit ++Do not handle more than ++.I limit ++simultaneous connections. ++If there are ++.I limit ++simultaneous copies of ++.I program ++running, defer acceptance of a new connection ++until one copy finishes. ++.I limit ++must be a positive integer. ++Default: 40. ++.TP ++.B \-x\fIrules.cdb ++Follow the rules compiled into ++.I rules.cdb ++by ++.BR tcprules . ++These rules may specify setting environment variables ++or rejecting connections from bad sources. ++ ++.B tcpserver ++does not read ++.I rules.cdb ++into memory; ++you can rerun ++.B tcprules ++to change ++.BR tcpserver 's ++behavior on the fly. ++.TP ++.B \-B\fIbanner ++Write ++.I banner ++to the network immediately after each connection is made. ++.B tcpserver ++writes ++.I banner ++before looking up ++.BR TCPREMOTEHOST , ++before looking up ++.BR TCPREMOTEINFO , ++and before checking ++.IR rules.cdb . ++ ++This feature can be used to reduce latency in protocols ++where the client waits for a greeting from the server. ++.TP ++.B \-g\fIgid ++Switch group ID to ++.I gid ++after preparing to receive connections. ++.I gid ++must be a positive integer. ++.TP ++.B \-u\fIuid ++Switch user ID to ++.I uid ++after preparing to receive connections. ++.I uid ++must be a positive integer. ++.TP ++.B \-1 ++After preparing to receive connections, ++print the local port number to standard output. ++.TP ++.B \-4 ++Fall back to IPv4 sockets. This is necessary for terminally broken ++systems like OpenBSD which will not let IPv6 sockets connect to ++V4-mapped IPv6 addresses. Please note that this also applies to DNS ++lookups, so you will have to use an DNS resolver with an IPv6 address to ++accept IPv6 connections. Use \fBDNSCACHEIP\fR to set the DNS resolver ++IP dynamically. ++.TP ++.B \-6 ++Force IPv6 mode in UCSPI environment variables, even for ++IPv4 connections. This will set \fB$PROTO\fR to \fBTCP6\fR and put ++IPv4-mapped IPv6 addresses in \fBTCPLOCALIP\fR and \fBTCPREMOTEIP\fR. ++.TP ++.B \-I\fIinterface ++Bind to the network interface ++.I interface ++("eth0" on Linux, for example). This is only defined and needed for ++IPv6 link-local addresses. ++.TP ++.B \-b\fIbacklog ++Allow up to ++.I backlog ++simultaneous SYN_RECEIVEDs. ++Default: 20. ++On some systems, ++.I backlog ++is silently limited to 5. ++See ++.BR listen (2) ++for more details. ++.TP ++.B \-o ++Leave IP options alone. ++If the client is sending packets along an IP source route, ++send packets back along the same route. ++.TP ++.B \-O ++(Default.) ++Kill IP options. ++A client can still use source routing to connect and to send data, ++but packets will be sent back along the default route. ++.TP ++.B \-d ++(Default.) ++Delay sending data for a fraction of a second whenever the ++remote host is responding slowly, ++to make better use of the network. ++.TP ++.B \-D ++Never delay sending data; ++enable TCP_NODELAY. ++This is appropriate for interactive connections. ++.TP ++.B \-q ++Quiet. ++Do not print any messages. ++.TP ++.B \-Q ++(Default.) ++Print error messages. ++.TP ++.B \-v ++Verbose. ++Print all available messages. ++.SH "DATA-GATHERING OPTIONS" ++.TP ++.B \-p ++Paranoid. ++After looking up the remote host name, ++look up the IP addresses for that name, ++and make sure one of them matches ++.BR TCPREMOTEIP . ++If none of them do, ++unset ++.BR TCPREMOTEHOST . ++.TP ++.B \-P ++(Default.) ++Not paranoid. ++.TP ++.B \-h ++(Default.) ++Look up the remote host name and set ++.BR TCPREMOTEHOST . ++.TP ++.B \-H ++Do not look up the remote host name. ++.TP ++.B \-l\fIlocalname ++Do not look up the local host name; ++use ++.I localname ++for ++.BR TCPLOCALHOST . ++.TP ++.B \-r ++(Default.) ++Attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-R ++Do not attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-t\fItimeout ++Give up on the ++.B TCPREMOTEINFO ++connection attempt ++after ++.I timeout ++seconds. Default: 26. ++.SH "SEE ALSO" ++argv0(1), ++fixcr(1), ++recordio(1), ++tcpclient(1), ++tcprules(1), ++listen(2), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/tcpserver.c ucspi-tcp-0.88/tcpserver.c +--- ucspi-tcp-0.88.orig/tcpserver.c 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/tcpserver.c 2009-08-04 17:45:59.000000000 -0500 +@@ -7,6 +7,7 @@ + #include "fmt.h" + #include "scan.h" + #include "ip4.h" ++#include "ip6.h" + #include "fd.h" + #include "exit.h" + #include "env.h" +@@ -28,6 +29,7 @@ + #include "sig.h" + #include "dns.h" + ++int forcev6 = 0; + int verbosity = 1; + int flagkillopts = 1; + int flagdelay = 1; +@@ -36,20 +38,21 @@ + int flagremotehost = 1; + int flagparanoid = 0; + unsigned long timeout = 26; ++uint32 netif = 0; + + static stralloc tcpremoteinfo; + + uint16 localport; + char localportstr[FMT_ULONG]; +-char localip[4]; +-char localipstr[IP4_FMT]; ++char localip[16]; ++char localipstr[IP6_FMT]; + static stralloc localhostsa; + char *localhost = 0; + + uint16 remoteport; + char remoteportstr[FMT_ULONG]; +-char remoteip[4]; +-char remoteipstr[IP4_FMT]; ++char remoteip[16]; ++char remoteipstr[IP6_FMT]; + static stralloc remotehostsa; + char *remotehost = 0; + +@@ -96,12 +99,12 @@ + if (ch < 33) ch = '?'; + if (ch > 126) ch = '?'; + if (ch == '%') ch = '?'; /* logger stupidity */ +- if (ch == ':') ch = '?'; ++/* if (ch == ':') ch = '?'; */ + append(&ch); + } + cats("..."); + } +-void env(char *s,char *t) ++void env(const char *s,const char *t) + { + if (!pathexec_env(s,t)) drop_nomem(); + } +@@ -135,9 +138,16 @@ + + void doit(int t) + { ++ int fakev4=0; + int j; ++ uint32 scope_id; + +- remoteipstr[ip4_fmt(remoteipstr,remoteip)] = 0; ++ if (!forcev6 && ip6_isv4mapped(remoteip)) ++ fakev4=1; ++ if (fakev4) ++ remoteipstr[ip4_fmt(remoteipstr,remoteip+12)] = 0; ++ else ++ remoteipstr[ip6_fmt(remoteipstr,remoteip)] = 0; + + if (verbosity >= 2) { + strnum[fmt_ulong(strnum,getpid())] = 0; +@@ -155,30 +165,40 @@ + strerr_die2sys(111,DROP,"unable to print banner: "); + } + +- if (socket_local4(t,localip,&localport) == -1) ++ if (socket_local6(t,localip,&localport,&scope_id) == -1) + strerr_die2sys(111,DROP,"unable to get local address: "); + +- localipstr[ip4_fmt(localipstr,localip)] = 0; ++ if (fakev4) ++ localipstr[ip4_fmt(localipstr,localip+12)] = 0; ++ else ++ localipstr[ip6_fmt(localipstr,localip)] = 0; + remoteportstr[fmt_ulong(remoteportstr,remoteport)] = 0; + + if (!localhost) +- if (dns_name4(&localhostsa,localip) == 0) ++ if (dns_name6(&localhostsa,localip) == 0) + if (localhostsa.len) { + if (!stralloc_0(&localhostsa)) drop_nomem(); + localhost = localhostsa.s; + } +- env("PROTO","TCP"); ++ env("PROTO",fakev4?"TCP":"TCP6"); + env("TCPLOCALIP",localipstr); ++ localipstr[ip6_fmt(localipstr,localip)]=0; ++ env("TCP6LOCALIP",localipstr); ++ + env("TCPLOCALPORT",localportstr); ++ env("TCP6LOCALPORT",localportstr); + env("TCPLOCALHOST",localhost); ++ env("TCP6LOCALHOST",localhost); ++ if (!fakev4 && scope_id) ++ env("TCP6INTERFACE",socket_getifname(scope_id)); + + if (flagremotehost) +- if (dns_name4(&remotehostsa,remoteip) == 0) ++ if (dns_name6(&remotehostsa,remoteip) == 0) + if (remotehostsa.len) { + if (flagparanoid) +- if (dns_ip4(&tmp,&remotehostsa) == 0) +- for (j = 0;j + 4 <= tmp.len;j += 4) +- if (byte_equal(remoteip,4,tmp.s + j)) { ++ if (dns_ip6(&tmp,&remotehostsa) == 0) ++ for (j = 0;j + 16 <= tmp.len;j += 16) ++ if (byte_equal(remoteip,16,tmp.s + j)) { + flagparanoid = 0; + break; + } +@@ -188,15 +208,20 @@ + } + } + env("TCPREMOTEIP",remoteipstr); ++ remoteipstr[ip6_fmt(remoteipstr,remoteip)]=0; ++ env("TCP6REMOTEIP",remoteipstr); + env("TCPREMOTEPORT",remoteportstr); ++ env("TCP6REMOTEPORT",remoteportstr); + env("TCPREMOTEHOST",remotehost); ++ env("TCP6REMOTEHOST",remotehost); + + if (flagremoteinfo) { +- if (remoteinfo(&tcpremoteinfo,remoteip,remoteport,localip,localport,timeout) == -1) ++ if (remoteinfo6(&tcpremoteinfo,remoteip,remoteport,localip,localport,timeout,netif) == -1) + flagremoteinfo = 0; + if (!stralloc_0(&tcpremoteinfo)) drop_nomem(); + } + env("TCPREMOTEINFO",flagremoteinfo ? tcpremoteinfo.s : 0); ++ env("TCP6REMOTEINFO",flagremoteinfo ? tcpremoteinfo.s : 0); + + if (fnrules) { + int fdrules; +@@ -206,7 +231,15 @@ + if (!flagallownorules) drop_rules(); + } + else { +- if (rules(found,fdrules,remoteipstr,remotehost,flagremoteinfo ? tcpremoteinfo.s : 0) == -1) drop_rules(); ++ int fakev4=0; ++ char* temp; ++ if (!forcev6 && ip6_isv4mapped(remoteip)) ++ fakev4=1; ++ if (fakev4) ++ temp=remoteipstr+7; ++ else ++ temp=remoteipstr; ++ if (rules(found,fdrules,temp,remotehost,flagremoteinfo ? tcpremoteinfo.s : 0) == -1) drop_rules(); + close(fdrules); + } + } +@@ -240,7 +273,7 @@ + { + strerr_warn1("\ + tcpserver: usage: tcpserver \ +-[ -1UXpPhHrRoOdDqQv ] \ ++[ -461UXpPhHrRoOdDqQv ] \ + [ -c limit ] \ + [ -x rules.cdb ] \ + [ -B banner ] \ +@@ -249,6 +282,7 @@ + [ -b backlog ] \ + [ -l localname ] \ + [ -t timeout ] \ ++[ -I interface ] \ + host port program",0); + _exit(100); + } +@@ -299,8 +333,8 @@ + unsigned long u; + int s; + int t; +- +- while ((opt = getopt(argc,argv,"dDvqQhHrR1UXx:t:u:g:l:b:B:c:pPoO")) != opteof) ++ ++ while ((opt = getopt(argc,argv,"46dDvqQhHrR1UXx:t:u:g:l:b:B:c:I:pPoO")) != opteof) + switch(opt) { + case 'b': scan_ulong(optarg,&backlog); break; + case 'c': scan_ulong(optarg,&limit); break; +@@ -325,7 +359,10 @@ + x = env_get("GID"); if (x) scan_ulong(x,&gid); break; + case 'u': scan_ulong(optarg,&uid); break; + case 'g': scan_ulong(optarg,&gid); break; ++ case 'I': netif=socket_getifidx(optarg); break; + case '1': flag1 = 1; break; ++ case '4': noipv6 = 1; break; ++ case '6': forcev6 = 1; break; + case 'l': localhost = optarg; break; + default: usage(); + } +@@ -337,8 +374,7 @@ + + hostname = *argv++; + if (!hostname) usage(); +- if (str_equal(hostname,"")) hostname = "0.0.0.0"; +- if (str_equal(hostname,"0")) hostname = "0.0.0.0"; ++ if (str_equal(hostname,"")) hostname = "0"; + + x = *argv++; + if (!x) usage(); +@@ -348,7 +384,7 @@ + se = getservbyname(x,"tcp"); + if (!se) + strerr_die3x(111,FATAL,"unable to figure out port number for ",x); +- localport = ntohs(se->s_port); ++ uint16_unpack_big((char*)&se->s_port,&localport); + } + + if (!*argv) usage(); +@@ -358,20 +394,26 @@ + sig_catch(sig_term,sigterm); + sig_ignore(sig_pipe); + +- if (!stralloc_copys(&tmp,hostname)) +- strerr_die2x(111,FATAL,"out of memory"); +- if (dns_ip4_qualify(&addresses,&fqdn,&tmp) == -1) +- strerr_die4sys(111,FATAL,"temporarily unable to figure out IP address for ",hostname,": "); +- if (addresses.len < 4) +- strerr_die3x(111,FATAL,"no IP address for ",hostname); +- byte_copy(localip,4,addresses.s); ++ if (str_equal(hostname,"0")) { ++ byte_zero(localip,sizeof localip); ++ } else { ++ if (!stralloc_copys(&tmp,hostname)) ++ strerr_die2x(111,FATAL,"out of memory"); ++ if (dns_ip6_qualify(&addresses,&fqdn,&tmp) == -1) ++ strerr_die4sys(111,FATAL,"temporarily unable to figure out IP address for ",hostname,": "); ++ if (addresses.len < 16) ++ strerr_die3x(111,FATAL,"no IP address for ",hostname); ++ byte_copy(localip,16,addresses.s); ++ if (ip6_isv4mapped(localip)) ++ noipv6=1; ++ } + +- s = socket_tcp(); ++ s = socket_tcp6(); + if (s == -1) + strerr_die2sys(111,FATAL,"unable to create socket: "); +- if (socket_bind4_reuse(s,localip,localport) == -1) ++ if (socket_bind6_reuse(s,localip,localport,netif) == -1) + strerr_die2sys(111,FATAL,"unable to bind: "); +- if (socket_local4(s,localip,&localport) == -1) ++ if (socket_local6(s,localip,&localport,&netif) == -1) + strerr_die2sys(111,FATAL,"unable to get local address: "); + if (socket_listen(s,backlog) == -1) + strerr_die2sys(111,FATAL,"unable to listen: "); +@@ -399,7 +441,7 @@ + while (numchildren >= limit) sig_pause(); + + sig_unblock(sig_child); +- t = socket_accept4(s,remoteip,&remoteport); ++ t = socket_accept6(s,remoteip,&remoteport,&netif); + sig_block(sig_child); + + if (t == -1) continue; +diff -uNr ucspi-tcp-0.88.orig/timeoutconn.h ucspi-tcp-0.88/timeoutconn.h +--- ucspi-tcp-0.88.orig/timeoutconn.h 2009-08-04 15:19:16.000000000 -0500 ++++ ucspi-tcp-0.88/timeoutconn.h 2009-08-04 17:45:59.000000000 -0500 +@@ -2,7 +2,9 @@ + #define TIMEOUTCONN_H + + #include "uint16.h" ++#include "uint32.h" + + extern int timeoutconn(int,char *,uint16,unsigned int); ++extern int timeoutconn6(int,char *,uint16,unsigned int,uint32); + + #endif +diff -uNr ucspi-tcp-0.88.orig/timeoutconn6.c ucspi-tcp-0.88/timeoutconn6.c +--- ucspi-tcp-0.88.orig/timeoutconn6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/timeoutconn6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,34 @@ ++#include "ndelay.h" ++#include "socket.h" ++#include "iopause.h" ++#include "error.h" ++#include "timeoutconn.h" ++ ++int timeoutconn6(int s,char ip[16],uint16 port,unsigned int timeout,uint32 netif) ++{ ++ struct taia now; ++ struct taia deadline; ++ iopause_fd x; ++ ++ if (socket_connect6(s,ip,port,netif) == -1) { ++ if ((errno != error_wouldblock) && (errno != error_inprogress)) return -1; ++ x.fd = s; ++ x.events = IOPAUSE_WRITE; ++ taia_now(&now); ++ taia_uint(&deadline,timeout); ++ taia_add(&deadline,&now,&deadline); ++ for (;;) { ++ taia_now(&now); ++ iopause(&x,1,&deadline,&now); ++ if (x.revents) break; ++ if (taia_less(&deadline,&now)) { ++ errno = error_timeout; /* note that connect attempt is continuing */ ++ return -1; ++ } ++ } ++ if (!socket_connected(s)) return -1; ++ } ++ ++ if (ndelay_off(s) == -1) return -1; ++ return 0; ++} +diff -uNr ucspi-tcp-0.88.orig/tryip6.c ucspi-tcp-0.88/tryip6.c +--- ucspi-tcp-0.88.orig/tryip6.c 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/tryip6.c 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,8 @@ ++#include ++#include ++#include ++ ++main() { ++ struct sockaddr_in6 sa; ++ sa.sin6_family = PF_INET6; ++} +diff -uNr ucspi-tcp-0.88.orig/usr/local/man/man1/tcpclient.1 ucspi-tcp-0.88/usr/local/man/man1/tcpclient.1 +--- ucspi-tcp-0.88.orig/usr/local/man/man1/tcpclient.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/usr/local/man/man1/tcpclient.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,173 @@ ++.TH tcpclient 1 ++.SH NAME ++tcpclient \- create an outgoing TCP connection ++.SH SYNOPSIS ++.B tcpclient ++[ ++.B \-46hHrRdDqQv ++] ++[ ++.B \-i\fIlocalip ++] ++[ ++.B \-p\fIlocalport ++] ++[ ++.B \-T\fItimeoutconn ++] ++[ ++.B \-l\fIlocalname ++] ++[ ++.B \-t\fItimeoutinfo ++] ++[ ++.B \-I\fIinterface ++] ++.I host ++.I port ++.I program ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B tcpclient ++attempts to connect to a TCP server. ++If it is successful, it runs ++.I program ++with the given arguments, ++with descriptor 6 reading from the network ++and descriptor 7 writing to the network. ++ ++The server's address is given by ++.I host ++and ++.IR port . ++.I host ++may be 0, referring to the local machine, ++or a dotted-decimal IP address, ++or a host name; ++if a host has several IP addresses, ++.B tcpclient ++tries each in turn. ++.I port ++may be a numeric port number ++or a port name. ++ ++.B tcpclient ++sets up several environment variables, ++as described in ++.B tcp-environ(5). ++.SH OPTIONS ++.TP ++.B \-i\fIlocalip ++Use ++.I localip ++as the IP address for the local side of the connection; ++quit if ++.I localip ++is not available. ++.TP ++.B \-p\fIlocalport ++Use ++.I localport ++as the port number for the local side of the connection; ++quit if ++.I localport ++is not available. ++.TP ++.B \-I\fIinterface ++Use ++.I interface ++as the local network interface. This is only defined for IPv6 sockets ++and needed if you use link-local IPv6 addresses. ++.TP ++.B \-T\fItimeoutconn ++Give up on the ++connection attempt ++after ++.I timeoutconn ++seconds. Default: 60. ++This timeout applies to each IP address tried. ++.TP ++.B \-d ++(Default.) ++Delay sending data for a fraction of a second whenever the ++remote host is responding slowly, ++to make better use of the network. ++.TP ++.B \-D ++Never delay sending data; ++enable TCP_NODELAY. ++This is appropriate for interactive connections. ++.TP ++.B \-q ++Quiet. ++Do not print any messages. ++.TP ++.B \-Q ++(Default.) ++Print error messages. ++.TP ++.B \-v ++Verbose. ++Print all available messages. ++.SH "DATA-GATHERING OPTIONS" ++.TP ++.B \-h ++(Default.) ++Look up the remote host name for ++.BR TCPREMOTEHOST . ++.TP ++.B \-H ++Do not look up the remote host name; ++unset ++.BR TCPREMOTEHOST . ++.TP ++.B \-l\fIlocalname ++Do not look up the local host name; ++use ++.I localname ++for ++.BR TCPLOCALHOST . ++.TP ++.B \-r ++(Default.) ++Attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-R ++Do not attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-t\fItimeoutinfo ++Give up on the ++.B TCPREMOTEINFO ++connection attempt ++after ++.I timeoutinfo ++seconds. Default: 26. ++.TP ++.B \-4 ++Fall back to IPv4 sockets. This is necessary for terminally broken ++systems like OpenBSD which will not let IPv6 sockets connect to ++V4-mapped IPv6 addresses. Please note that this also applies to DNS ++lookups, so you will have to use an DNS resolver with an IPv6 address to ++connect to IPv6 systems. Use \fBDNSCACHEIP\fR to set the DNS resolver ++IP dynamically. ++.TP ++.B \-6 ++Force IPv6 mode in UCSPI environment variables, even for ++IPv4 connections. This will set \fB$PROTO\fR to \fBTCP6\fR and put ++IPv4-mapped IPv6 addresses in \fBTCPLOCALIP\fR and \fBTCPREMOTEIP\fR. ++.SH "SEE ALSO" ++date@(1), ++finger@(1), ++http@(1), ++mconnect(1), ++tcpcat(1), ++tcpserver(1), ++who@(1), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/usr/local/man/man1/tcpserver.1 ucspi-tcp-0.88/usr/local/man/man1/tcpserver.1 +--- ucspi-tcp-0.88.orig/usr/local/man/man1/tcpserver.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/usr/local/man/man1/tcpserver.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,266 @@ ++.TH tcpserver 1 ++.SH NAME ++tcpserver \- accept incoming TCP connections ++.SH SYNOPSIS ++.B tcpserver ++[ ++.B \-146jpPhHrRoOdDqQv ++] ++[ ++.B \-c\fIlimit ++] ++[ ++.B \-x\fIrules.cdb ++] ++[ ++.B \-B\fIbanner ++] ++[ ++.B \-g\fIgid ++] ++[ ++.B \-u\fIuid ++] ++[ ++.B \-b\fIbacklog ++] ++[ ++.B \-l\fIlocalname ++] ++[ ++.B \-t\fItimeout ++] ++[ ++.B \-I\fIinterface ++] ++.I host ++.I port ++.I program ++[ ++.I arg ... ++] ++.SH DESCRIPTION ++.B tcpserver ++waits for connections from TCP clients. ++For each connection, it runs ++.I program ++with the given arguments, ++with descriptor 0 reading from the network ++and descriptor 1 writing to the network. ++ ++The server's address is given by ++.I host ++and ++.IR port . ++.I host ++can be 0, allowing connections from any host; ++or a particular IP address, ++allowing connections only to that address; ++or a host name, allowing connections to the first IP address ++for that host. ++.I port ++may be a numeric port number ++or a port name. ++If ++.I port ++is 0, ++.B tcpserver ++will choose a free port. ++ ++.B tcpserver ++sets up several environment variables, ++as described in ++.B tcp-environ(5). ++ ++.B tcpserver ++exits when it receives SIGTERM. ++.SH "OPTIONS" ++.TP ++.B \-c\fIlimit ++Do not handle more than ++.I limit ++simultaneous connections. ++If there are ++.I limit ++simultaneous copies of ++.I program ++running, defer acceptance of a new connection ++until one copy finishes. ++.I limit ++must be a positive integer. ++Default: 40. ++.TP ++.B \-x\fIrules.cdb ++Follow the rules compiled into ++.I rules.cdb ++by ++.BR tcprules . ++These rules may specify setting environment variables ++or rejecting connections from bad sources. ++ ++.B tcpserver ++does not read ++.I rules.cdb ++into memory; ++you can rerun ++.B tcprules ++to change ++.BR tcpserver 's ++behavior on the fly. ++.TP ++.B \-B\fIbanner ++Write ++.I banner ++to the network immediately after each connection is made. ++.B tcpserver ++writes ++.I banner ++before looking up ++.BR TCPREMOTEHOST , ++before looking up ++.BR TCPREMOTEINFO , ++and before checking ++.IR rules.cdb . ++ ++This feature can be used to reduce latency in protocols ++where the client waits for a greeting from the server. ++.TP ++.B \-g\fIgid ++Switch group ID to ++.I gid ++after preparing to receive connections. ++.I gid ++must be a positive integer. ++.TP ++.B \-u\fIuid ++Switch user ID to ++.I uid ++after preparing to receive connections. ++.I uid ++must be a positive integer. ++.TP ++.B \-1 ++After preparing to receive connections, ++print the local port number to standard output. ++.TP ++.B \-4 ++Fall back to IPv4 sockets. This is necessary for terminally broken ++systems like OpenBSD which will not let IPv6 sockets connect to ++V4-mapped IPv6 addresses. Please note that this also applies to DNS ++lookups, so you will have to use an DNS resolver with an IPv6 address to ++accept IPv6 connections. Use \fBDNSCACHEIP\fR to set the DNS resolver ++IP dynamically. ++.TP ++.B \-6 ++Force IPv6 mode in UCSPI environment variables, even for ++IPv4 connections. This will set \fB$PROTO\fR to \fBTCP6\fR and put ++IPv4-mapped IPv6 addresses in \fBTCPLOCALIP\fR and \fBTCPREMOTEIP\fR. ++.TP ++.B \-I\fIinterface ++Bind to the network interface ++.I interface ++("eth0" on Linux, for example). This is only defined and needed for ++IPv6 link-local addresses. ++.TP ++.B \-b\fIbacklog ++Allow up to ++.I backlog ++simultaneous SYN_RECEIVEDs. ++Default: 20. ++On some systems, ++.I backlog ++is silently limited to 5. ++See ++.BR listen (2) ++for more details. ++.TP ++.B \-o ++Leave IP options alone. ++If the client is sending packets along an IP source route, ++send packets back along the same route. ++.TP ++.B \-O ++(Default.) ++Kill IP options. ++A client can still use source routing to connect and to send data, ++but packets will be sent back along the default route. ++.TP ++.B \-d ++(Default.) ++Delay sending data for a fraction of a second whenever the ++remote host is responding slowly, ++to make better use of the network. ++.TP ++.B \-D ++Never delay sending data; ++enable TCP_NODELAY. ++This is appropriate for interactive connections. ++.TP ++.B \-q ++Quiet. ++Do not print any messages. ++.TP ++.B \-Q ++(Default.) ++Print error messages. ++.TP ++.B \-v ++Verbose. ++Print all available messages. ++.SH "DATA-GATHERING OPTIONS" ++.TP ++.B \-p ++Paranoid. ++After looking up the remote host name, ++look up the IP addresses for that name, ++and make sure one of them matches ++.BR TCPREMOTEIP . ++If none of them do, ++unset ++.BR TCPREMOTEHOST . ++.TP ++.B \-P ++(Default.) ++Not paranoid. ++.TP ++.B \-h ++(Default.) ++Look up the remote host name and set ++.BR TCPREMOTEHOST . ++.TP ++.B \-H ++Do not look up the remote host name. ++.TP ++.B \-l\fIlocalname ++Do not look up the local host name; ++use ++.I localname ++for ++.BR TCPLOCALHOST . ++.TP ++.B \-r ++(Default.) ++Attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-R ++Do not attempt to obtain ++.B TCPREMOTEINFO ++from the remote host. ++.TP ++.B \-t\fItimeout ++Give up on the ++.B TCPREMOTEINFO ++connection attempt ++after ++.I timeout ++seconds. Default: 26. ++.SH "SEE ALSO" ++argv0(1), ++fixcr(1), ++recordio(1), ++tcpclient(1), ++tcprules(1), ++listen(2), ++tcp-environ(5) +diff -uNr ucspi-tcp-0.88.orig/who@.1 ucspi-tcp-0.88/who@.1 +--- ucspi-tcp-0.88.orig/who@.1 1969-12-31 18:00:00.000000000 -0600 ++++ ucspi-tcp-0.88/who@.1 2009-08-04 17:45:59.000000000 -0500 +@@ -0,0 +1,32 @@ ++.TH who@ 1 ++.SH NAME ++who@ \- print list of active users on a host ++.SH SYNTAX ++.B who@ ++[ ++.I host ++] ++.SH DESCRIPTION ++.B who@ ++connects to TCP port 11 (Systat) on ++.I host ++and prints any data it receives. ++It removes CR and converts unprintable characters to a visible format. ++ ++If ++.I host ++is not supplied, ++.B who@ ++connects to the local host. ++ ++Some computers respond to port 11 with a list of active users. ++For example, they may be running ++ ++.EX ++ tcpserver 0 11 who & ++.EE ++.SH "SEE ALSO" ++cat(1), ++delcr(1), ++tcpclient(1), ++tcpserver(1) diff --git a/talimatname/genel/u/udevil/talimat b/talimatname/genel/u/udevil/talimat new file mode 100644 index 000000000..05d291e1c --- /dev/null +++ b/talimatname/genel/u/udevil/talimat @@ -0,0 +1,18 @@ +# Tanım: Çıkarılabilir aygıtları,ISO dosyalarını,nfs://, smb://, ftp://, ssh:// ve WebDAV URL'lerini ve tmpfs/ramfs dosya sistemlerini bağlayın ve çıkarın. +# URL: http://ignorantguru.github.com/udevil +# Paketçi: milisarge +# Gerekler: glib intltool + +isim=udevil +surum=0.4.4 +devir=2 +kaynak=(https://github.com/IgnorantGuru/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) +derle() { + cd udevil-$surum + ./configure --prefix=/usr \ + --disable-systemd \ + --with-setfacl-prog=/bin/setfacl + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/u/udisks/talimat b/talimatname/genel/u/udisks/talimat new file mode 100644 index 000000000..9a04c870c --- /dev/null +++ b/talimatname/genel/u/udisks/talimat @@ -0,0 +1,20 @@ +# Tanım: Disk Yönetimi Hizmeti +# URL: http://www.freedesktop.org/wiki/Software/udisks +# Paketçi: milisarge +# Gerekler: acl libgudev dbus-glib libatasmart lvm2 parted polkit sg3-utils docbook-xsl + +isim=udisks +surum=1.0.5 +devir=2 + +kaynak=( http://hal.freedesktop.org/releases/$isim-$surum.tar.gz) + +derle() { +cd udisks-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--localstatedir=/var \ +--libexecdir=/usr/lib/udisks +make +make DESTDIR=$PKG profiledir=/etc/bash_completion.d install +} diff --git a/talimatname/genel/u/udisks2/talimat b/talimatname/genel/u/udisks2/talimat new file mode 100644 index 000000000..f1135694b --- /dev/null +++ b/talimatname/genel/u/udisks2/talimat @@ -0,0 +1,22 @@ +# Tanım: Diskler ve depolama aygıtlarına erişmek ve bunları değiştirmek için uygulama, araçlar ve kitaplıklar. +# URL: http://www.freedesktop.org/wiki/Software/udisks +# Paketçi: milisarge +# Gerekler: acl libgudev expat libatasmart libxslt polkit gobject-introspection docbook-xsl + +isim=udisks2 +surum=2.1.6 +devir=1 + +kaynak=(http://udisks.freedesktop.org/releases/udisks-$surum.tar.bz2 + udisk2-2.1.5-policy-1.patch) + +derle() { +cd udisks-$surum +patch -Np1 -i ../udisk2-2.1.5-policy-1.patch +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--localstatedir=/var \ +--disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/u/udisks2/udisk2-2.1.5-policy-1.patch b/talimatname/genel/u/udisks2/udisk2-2.1.5-policy-1.patch new file mode 100644 index 000000000..d49b3ce68 --- /dev/null +++ b/talimatname/genel/u/udisks2/udisk2-2.1.5-policy-1.patch @@ -0,0 +1,76 @@ +diff -Naur udisks-2.1.5/data/org.freedesktop.udisks2.policy.in udisks-2.1.5-new/data/org.freedesktop.udisks2.policy.in +--- udisks-2.1.5/data/org.freedesktop.udisks2.policy.in 2015-02-11 06:13:54.000000000 +0000 ++++ udisks-2.1.5-new/data/org.freedesktop.udisks2.policy.in 2015-05-16 19:27:42.510039412 +0000 +@@ -16,8 +16,8 @@ + <_description>Mount a filesystem + <_message>Authentication is required to mount the filesystem + +- auth_admin +- auth_admin ++ yes ++ no + yes + + +@@ -27,9 +27,9 @@ + <_description>Mount a filesystem on a system device + <_message>Authentication is required to mount the filesystem + +- auth_admin +- auth_admin +- auth_admin_keep ++ yes ++ no ++ yes + + + +@@ -38,9 +38,9 @@ + <_description>Mount a filesystem from a device plugged into another seat + <_message>Authentication is required to mount the filesystem + +- auth_admin ++ yes + auth_admin +- auth_admin_keep ++ yes + + + +@@ -49,9 +49,9 @@ + <_description>Mount/unmount filesystems defined in the fstab file with the x-udisks-auth option + <_message>Authentication is required to mount/unmount the filesystem + +- auth_admin +- auth_admin +- auth_admin_keep ++ yes ++ no ++ yes + + + +@@ -98,9 +98,9 @@ + <_description>Unlock an encrypted device plugged into another seat + <_message>Authentication is required to unlock an encrypted device + +- auth_admin +- auth_admin +- auth_admin_keep ++ yes ++ no ++ yes + + + +@@ -258,8 +258,8 @@ + <_description>Eject media + <_message>Authentication is required to eject media + +- auth_admin +- auth_admin ++ yes ++ no + yes + + diff --git a/talimatname/genel/u/ufsutils/talimat b/talimatname/genel/u/ufsutils/talimat new file mode 100644 index 000000000..a81ffc8ec --- /dev/null +++ b/talimatname/genel/u/ufsutils/talimat @@ -0,0 +1,32 @@ +# Tanım: UFS dosya sistemini yönetmek için kullanılan yardımcı programlar, çoğunlukla BSD'de veya türemiş işletim sistemlerinde kullanılır. +# URL: https://packages.debian.org/sid/ufsutils +# Paketçi: milisarge +# Gerekler: libbsd libedit + +isim=ufsutils +surum=8.2 +devir=1 +kaynak=(https://mirrors.kernel.org/debian/pool/main/u/ufsutils/ufsutils_8.2.orig.tar.gz + https://mirrors.kernel.org/debian/pool/main/u/ufsutils/ufsutils_8.2-3.debian.tar.gz) + +derle() { +unset MAKEFLAGS +cd ${isim}-${surum} + for i in ../debian/patches/*.patch;do patch -p1 -i ${i};done + + sed -e "s:sbin/growfs::" -i Makefile + sed -e "s:^\(prefix = \)\(.*\):\1${EPREFIX}usr:" \ + -e "s:^\(libdir = \$(exec_prefix)\/\)\(.*\):\1$(get_libdir):" \ + -i "Makefile.common" + make -C ../${isim}-${surum} + + install -d ${PKG}/usr/bin + install -d ${PKG}/usr/lib + install -d ${PKG}/usr/share/man/man8 + install -d ${PKG}/usr/share/licenses/${isim} + install -d ${PKG}/usr/share/doc/${isim} + make DESTDIR=${PKG} prefix=/usr sbindir=/usr/bin install + install -Dm644 ../debian/copyright ${PKG}/usr/share/licenses/${isim}/COPYRIGHT + install -m644 ../debian/TODO ${PKG}/usr/share/doc/${isim} + install -Dm644 ../debian/changelog ${PKG}/usr/share/doc/${isim}/ChangeLog +} diff --git a/talimatname/genel/u/uget/talimat b/talimatname/genel/u/uget/talimat new file mode 100644 index 000000000..8a1156f5a --- /dev/null +++ b/talimatname/genel/u/uget/talimat @@ -0,0 +1,17 @@ +# Tanım: UGet, Linux için En İyi İndirme Yöneticisi. +# URL: http://ugetdm.com/ +# Paketçi: milisarge +# Gerekler: libnotify gtk3 gstreamer1 curl hicolor-icon-theme xdg-utils + +isim=uget +surum=2.0.9 +devir=1 + +kaynak=(http://downloads.sourceforge.net/urlget/$isim-$surum.tar.gz) +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/u/uhttpmock/talimat b/talimatname/genel/u/uhttpmock/talimat new file mode 100644 index 000000000..3ab3758e1 --- /dev/null +++ b/talimatname/genel/u/uhttpmock/talimat @@ -0,0 +1,18 @@ +# Tanım: Uhttpmock paketi, HTTP veya HTTPS kullanan web hizmeti API'larını alay etmek için bir kütüphane içerir. +# URL: https://github.com/Distrotech/uhttpmock +# Paketçi: yasarciv67@gmail.com +# Gerekler: libsoup gobject-introspection vala gtk-doc + +isim=uhttpmock +surum=0.5.0 +devir=1 + +kaynak=(http://tecnocode.co.uk/downloads/$isim/$isim-$surum.tar.xz) + +derle() { + cd ${isim}-$surum + ./configure --prefix=/usr \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/u/ulib/talimat b/talimatname/genel/u/ulib/talimat new file mode 100644 index 000000000..4e82a5f29 --- /dev/null +++ b/talimatname/genel/u/ulib/talimat @@ -0,0 +1,27 @@ +# Tanım: Sade ve hızlı c++ uygulama geliştirme çatısı +# URL: https://github.com/stefanocasazza/ULib +# Paketçi: milisarge +# Gerekler: sqlite libzip + +isim=ulib +surum=1.4.2 +devir=1 +kaynak=(https://github.com/stefanocasazza/ULib/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "${SRC}/ULib-${surum}" + ./configure \ + --enable-debug \ + --with-sqlite3 \ + --with-ipv6 \ + --with-userver-ipc \ + --with-userver-udp \ + --enable-HPS \ + --enable-load-balance \ + --enable-zip \ + --enable-http2 \ + --sysconfdir=/etc \ + --prefix=/usr + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/u/umurmur/talimat b/talimatname/genel/u/umurmur/talimat new file mode 100644 index 000000000..e1c6443d9 --- /dev/null +++ b/talimatname/genel/u/umurmur/talimat @@ -0,0 +1,28 @@ +# Tanım: Minimalist Mumble sunucusu +# URL: https://github.com/umurmur/umurmur +# Paketçi: Cihan_Alkan +# Gerekler: mbedtls libconfig protobuf-c cmake +# Grup: ağ + +isim=umurmur +surum=0.2.17 +devir=1 + +kaynak=(https://github.com/umurmur/umurmur/archive/${surum}.tar.gz::$isim-$surum.tar.gz + umurmur.sysusers) + +derle() { + cd $isim-$surum + mkdir build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DSSL=mbedtls + make + cd $SRC/${isim}-${surum} + make -C build DESTDIR="${PKG}" install + install -Dm 644 "${PKG}/usr/etc/umurmur.conf" -t "${PKG}/etc/umurmur" + rm -r "${PKG}/usr/etc" + install -Dm 644 LICENSE -t "${PKG}/usr/share/licenses/${isim}" + install -Dm 644 "${SRC}/umurmur.sysusers" "${PKG}/usr/lib/sysusers.d/umurmur.conf" +} diff --git a/talimatname/genel/u/umurmur/umurmur.sysusers b/talimatname/genel/u/umurmur/umurmur.sysusers new file mode 100644 index 000000000..1d5cd511d --- /dev/null +++ b/talimatname/genel/u/umurmur/umurmur.sysusers @@ -0,0 +1 @@ +u umurmur - - - diff --git a/talimatname/genel/u/unco/talimat b/talimatname/genel/u/unco/talimat new file mode 100644 index 000000000..74a387299 --- /dev/null +++ b/talimatname/genel/u/unco/talimat @@ -0,0 +1,27 @@ +# Tanım: verilen komutları geri işletme-tarihçe +# URL: https://github.com/kazuho/unco +# Paketçi: milisarge +# Gerekler: cmake + +isim=unco +hesap=kazuho +surum=0.2.0 +devir=1 +kaynak=() + +derle() { + + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/$hesap/$isim $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + + cmake -DCMAKE_INSTALL_PREFIX=/usr . + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/u/unison/talimat b/talimatname/genel/u/unison/talimat new file mode 100644 index 000000000..36b841495 --- /dev/null +++ b/talimatname/genel/u/unison/talimat @@ -0,0 +1,28 @@ +# Tanım: Dosya Yedekleme-Eşitleme Uygulaması +# URL: http://www.cis.upenn.edu/~bcpierce/unison/ +# Paketçi: milisarge +# Gerekler: ocaml + +isim=unison +surum=git +devir=1 +kaynak=() + +derle() { + cd $DERLEME_KAYNAKDIZIN + + if cd $isim; then + git pull + make clean + else + git clone git://github.com/bcpierce00/$isim $isim + cd $isim + fi + + cd src + + CFLAGS="" + make -j1 THREADS=true + install -Dm755 unison $PKG/usr/bin/unison + install -Dm755 unison-fsmonitor $PKG/usr/bin/unison-fsmonitor +} diff --git a/talimatname/genel/u/unixodbc/talimat b/talimatname/genel/u/unixodbc/talimat new file mode 100644 index 000000000..6f92aedb1 --- /dev/null +++ b/talimatname/genel/u/unixodbc/talimat @@ -0,0 +1,22 @@ +# Tanım: Uygulama geliştiricilerine Veri Kaynaklarına erişmek için öngörülebilir bir API sağlama +# URL: http://www.unixodbc.org/ +# Paketçi: milisarge +# Gerekler: + +isim=unixodbc +surum=2.3.4 +devir=1 + +kaynak=(ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-$surum.tar.gz) +derle() { +cd unixODBC-$surum +./configure --prefix=/usr --sysconfdir=/etc/unixODBC \ +--enable-gui=no +make +make DESTDIR=$PKG install +find doc -name "Makefile*" -delete +chmod 644 doc/{lst,ProgrammerManual/Tutorial}/* + +install -m755 -d /usr/share/doc/unixODBC-$surum +cp -R doc/* /usr/share/doc/unixODBC-$surum +} diff --git a/talimatname/genel/u/unpaper/talimat b/talimatname/genel/u/unpaper/talimat new file mode 100644 index 000000000..3ffcdf548 --- /dev/null +++ b/talimatname/genel/u/unpaper/talimat @@ -0,0 +1,20 @@ +# Tanım: Taranmış sayfalar için post-processing aracı +# URL: https://github.com/Flameeyes/unpaper +# Paketçi: Cihan_Alkan +# Gerekler: ffmpeg libxslt +# Grup: ofis_duzenleyici + +isim=unpaper +surum=6.1 +devir=1 +kaynak=(https://github.com/Flameeyes/unpaper/archive/unpaper-$surum.tar.gz) + +derle() { + cd unpaper-unpaper-$surum + aclocal + automake --add-missing + autoconf + ./configure --prefix=/usr + make + make install DESTDIR="$PKG" +} diff --git a/talimatname/genel/u/unrar/talimat b/talimatname/genel/u/unrar/talimat new file mode 100644 index 000000000..5921c4723 --- /dev/null +++ b/talimatname/genel/u/unrar/talimat @@ -0,0 +1,23 @@ +# Tanım: RAR arşivlerinden dosyaları ayıklamak için kullanılan RAR çıkarma yardımcı programı. +# URL: http://www.rarlab.com/ +# Paketçi: milisarge +# Gerekler: + +isim=unrar +surum=5.3.9 +devir=1 + +kaynak=( +http://www.rarlab.com/rar/unrarsrc-$surum.tar.gz +) + +derle() { +cd $isim +make -f makefile +install -Dm755 unrar $PKG/usr/bin/unrar + +# doc & license +mkdir -p $PKG/usr/share/doc/$isim-$surum +install -m644 {license.txt,readme.txt} \ +$PKG/usr/share/doc/$isim-$surum +} diff --git a/talimatname/genel/u/unshield/talimat b/talimatname/genel/u/unshield/talimat new file mode 100644 index 000000000..6908218db --- /dev/null +++ b/talimatname/genel/u/unshield/talimat @@ -0,0 +1,22 @@ +# Tanım: InstallShield yükleyicilerinden CAB dosyalarını ayıklar +# URL: https://github.com/twogood/unshield +# Paketçi: Cihan_Alkan +# Gerekler: cmake +# Grup: sistem + +isim=unshield +surum=1.4.2 +devir=1 +kaynak=(https://github.com/twogood/unshield/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd "$SRC"/${isim}-${surum} + cmake \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + . + make + make DESTDIR="$PKG" install + install -D -m644 LICENSE "$PKG"/usr/share/licenses/unshield/LICENSE +} diff --git a/talimatname/genel/u/unzip/talimat b/talimatname/genel/u/unzip/talimat new file mode 100644 index 000000000..6e6ad268a --- /dev/null +++ b/talimatname/genel/u/unzip/talimat @@ -0,0 +1,28 @@ +# Tanım: PKZIP tarafından yapılanlar gibi .zip arşivlerini açar. +# URL: http://www.info-zip.org +# Paketçi: milisarge +# Gerekler: + +isim=unzip +surum=6.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/infozip/unzip60.tar.gz) + + +derle() { + cd $isim${version/./} + export CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DACORN_FTYPE_NFS \ + -DWILD_STOP_AT_DIR -DLARGE_FILE_SUPPORT -DUNICODE_SUPPORT \ + -DUNICODE_WCHAR -DUTF8_MAYBE_NATIVE -DNO_LCHMOD -DDATE_FORMAT=DF_YMD \ + -DUSE_BZIP2 -DNATIVE" + case `uname -m` in + x86_64) + make -f unix/Makefile LOCAL_UNZIP="$CFLAGS" prefix=/usr \ + LF2="" D_USE_BZ2=-DUSE_BZIP2 L_BZ2=-lbz2 unzips;; + i?86) + make -f unix/Makefile \ + LOCAL_UNZIP=-D_FILE_OFFSET_BITS=64 linux;; + esac + make -f unix/Makefile prefix=$PKG/usr MANDIR=$PKG/usr/share/man/man1 install +} diff --git a/talimatname/genel/u/upower/fix-critical-action.patch b/talimatname/genel/u/upower/fix-critical-action.patch new file mode 100644 index 000000000..6afe9b7a9 --- /dev/null +++ b/talimatname/genel/u/upower/fix-critical-action.patch @@ -0,0 +1,28 @@ +From 28cee8e2845b094488c337c4ecfa84ada0b6be60 Mon Sep 17 00:00:00 2001 +From: Martin Pitt +Date: Tue, 23 Feb 2016 09:51:07 +0100 +Subject: daemon: fix get_critical_action() + +Fix copy&paste error from e7e9156f that called the wrong _complete_ function +for up_daemon_get_critical_action(). + +https://bugs.freedesktop.org/show_bug.cgi?id=94262 + +diff --git a/src/up-daemon.c b/src/up-daemon.c +index be14cbe..e95f904 100644 +--- a/src/up-daemon.c ++++ b/src/up-daemon.c +@@ -435,8 +435,8 @@ up_daemon_get_critical_action (UpExportedDaemon *skeleton, + GDBusMethodInvocation *invocation, + UpDaemon *daemon) + { +- up_exported_daemon_complete_get_display_device (skeleton, invocation, +- up_backend_get_critical_action (daemon->priv->backend)); ++ up_exported_daemon_complete_get_critical_action (skeleton, invocation, ++ up_backend_get_critical_action (daemon->priv->backend)); + return TRUE; + } + +-- +cgit v0.10.2 + diff --git a/talimatname/genel/u/upower/talimat b/talimatname/genel/u/upower/talimat new file mode 100644 index 000000000..04ca13efc --- /dev/null +++ b/talimatname/genel/u/upower/talimat @@ -0,0 +1,22 @@ +# Tanım: UPower, güç aygıtlarını numaralandırmak, aygıt olaylarını dinlemek ve geçmişi ve istatistikleri sorgulamak için bir soyutlamadır. +# URL: http://upower.freedesktop.org +# Paketçi: yasarciv milisarge +# Gerekler: dbus-glib libusb intltool polkit gobject-introspection libgudev pm-utils + +isim=upower +surum=0.99.4 +devir=1 +kaynak=(http://$isim.freedesktop.org/releases/$isim-$surum.tar.xz + fix-critical-action.patch) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --enable-deprecated \ + --localstatedir=/var \ + --disable-static + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/u/urbanterror/talimat b/talimatname/genel/u/urbanterror/talimat new file mode 100644 index 000000000..f41cee4c4 --- /dev/null +++ b/talimatname/genel/u/urbanterror/talimat @@ -0,0 +1,41 @@ +# Tanım: Quake 3 Motoruna dayalı bir takım tabanlı taktik atıcı +# URL: http://www.urbanterror.info +# Paketçi: Cihan_Alkan +# Gerekler: sdl openal xorg-mesa +# Grup: oyun + +isim=urbanterror +surum=4.3.2 +devir=1 +kaynak=(http://www.happyurtday.com/releases/4x/UrbanTerror${surum//.}_full.zip + https://github.com/Barbatos/ioq3-for-UrbanTerror-4/releases/download/release-4.3.2-hotfix/Quake3-UrT-Ded.x86_64 + https://github.com/Barbatos/ioq3-for-UrbanTerror-4/releases/download/release-4.3.2-hotfix/Quake3-UrT.x86_64 + urbanterror.sh + urbanterror-server.sh + urbanterror.desktop + urbanterror.png) + +derle() { + + install -d "${PKG}/opt/urbanterror" + + cd "${PKG}/opt/urbanterror" + + # Copy patched binaries. + install -m755 "${SRC}/Quake3-UrT.x86_64" urbanterror + install -m755 "${SRC}/Quake3-UrT-Ded.x86_64" urbanterror-ded + + # Copy data + cp -r "${SRC}/UrbanTerror43/q3ut4" "${PKG}/opt/urbanterror/q3ut4" + install -Dm644 "${SRC}/UrbanTerror43/q3ut4/readme43.txt" "${PKG}/usr/share/licenses/${isim}/LICENSE" + echo -e "\nseta cl_cURLLib \"/usr/lib/libcurl.so.4\"" >> "${PKG}/opt/urbanterror/q3ut4/autoexec.cfg" + + # Copy desktop launcher. + install -Dm644 "${SRC}/urbanterror.desktop" "${PKG}/usr/share/applications/urbanterror.desktop" + install -Dm644 "${SRC}/urbanterror.png" "${PKG}/usr/share/pixmaps/urbanterror.png" + + # Copy launch scripts. + install -Dm755 "${SRC}/urbanterror.sh" "${PKG}/usr/bin/urbanterror" + install -Dm755 "${SRC}/urbanterror-server.sh" "${PKG}/usr/bin/urbanterror-server" + +} diff --git a/talimatname/genel/u/urbanterror/urbanterror-server.sh b/talimatname/genel/u/urbanterror/urbanterror-server.sh new file mode 100644 index 000000000..8d3f14959 --- /dev/null +++ b/talimatname/genel/u/urbanterror/urbanterror-server.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cd /opt/urbanterror/ +exec ./urbanterror-ded "$@" diff --git a/talimatname/genel/u/urbanterror/urbanterror.desktop b/talimatname/genel/u/urbanterror/urbanterror.desktop new file mode 100644 index 000000000..f4d359dfa --- /dev/null +++ b/talimatname/genel/u/urbanterror/urbanterror.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Urban Terror +Type=Application +Categories=Game; +Terminal=false +Exec=urbanterror +Icon=urbanterror diff --git a/talimatname/genel/u/urbanterror/urbanterror.png b/talimatname/genel/u/urbanterror/urbanterror.png new file mode 100644 index 0000000000000000000000000000000000000000..df596c29b29e9fbaaad36f05b45457b0202267fa GIT binary patch literal 41721 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�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 +Subject: Use Debian’s uthash +Forwarded: no + +Remove upstream’s vendored copy of uthash. +--- a/include/urweb/types_cpp.h ++++ b/include/urweb/types_cpp.h +@@ -123,7 +123,7 @@ typedef struct { + // Caching + + #include +-#include "uthash.h" ++#include + + typedef struct uw_Sqlcache_Value { + char *result; +--- a/src/c/urweb.c ++++ b/src/c/urweb.c +@@ -22,7 +22,7 @@ + + #include "types.h" + +-#include "uthash.h" ++#include + + uw_unit uw_unit_v = 0; + +--- a/include/urweb/uthash.h ++++ /dev/null +@@ -1,963 +0,0 @@ +-/* +-Copyright (c) 2003-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ +-All rights reserved. +- +-Redistribution and use in source and binary forms, with or without +-modification, are permitted provided that the following conditions are met: +- +- * Redistributions of source code must retain the above copyright +- notice, this list of conditions and the following disclaimer. +- +-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-*/ +- +-#ifndef UTHASH_H +-#define UTHASH_H +- +-#include /* memcmp,strlen */ +-#include /* ptrdiff_t */ +-#include /* exit() */ +- +-/* These macros use decltype or the earlier __typeof GNU extension. +- As decltype is only available in newer compilers (VS2010 or gcc 4.3+ +- when compiling c++ source) this code uses whatever method is needed +- or, for VS2008 where neither is available, uses casting workarounds. */ +-#if defined(_MSC_VER) /* MS compiler */ +-#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ +-#define DECLTYPE(x) (decltype(x)) +-#else /* VS2008 or older (or VS2010 in C mode) */ +-#define NO_DECLTYPE +-#define DECLTYPE(x) +-#endif +-#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__) +-#define NO_DECLTYPE +-#define DECLTYPE(x) +-#else /* GNU, Sun and other compilers */ +-#define DECLTYPE(x) (__typeof(x)) +-#endif +- +-#ifdef NO_DECLTYPE +-#define DECLTYPE_ASSIGN(dst,src) \ +-do { \ +- char **_da_dst = (char**)(&(dst)); \ +- *_da_dst = (char*)(src); \ +-} while(0) +-#else +-#define DECLTYPE_ASSIGN(dst,src) \ +-do { \ +- (dst) = DECLTYPE(dst)(src); \ +-} while(0) +-#endif +- +-/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */ +-#if defined (_WIN32) +-#if defined(_MSC_VER) && _MSC_VER >= 1600 +-#include +-#elif defined(__WATCOMC__) +-#include +-#else +-typedef unsigned int uint32_t; +-typedef unsigned char uint8_t; +-#endif +-#else +-#include +-#endif +- +-#define UTHASH_VERSION 1.9.9 +- +-#ifndef uthash_fatal +-#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ +-#endif +-#ifndef uthash_malloc +-#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ +-#endif +-#ifndef uthash_free +-#define uthash_free(ptr,sz) free(ptr) /* free fcn */ +-#endif +- +-#ifndef uthash_noexpand_fyi +-#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ +-#endif +-#ifndef uthash_expand_fyi +-#define uthash_expand_fyi(tbl) /* can be defined to log expands */ +-#endif +- +-/* initial number of buckets */ +-#define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */ +-#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */ +-#define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */ +- +-/* calculate the element whose hash handle address is hhe */ +-#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) +- +-#define HASH_FIND(hh,head,keyptr,keylen,out) \ +-do { \ +- out=NULL; \ +- if (head != NULL) { \ +- unsigned _hf_bkt,_hf_hashv; \ +- HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ +- if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv) != 0) { \ +- HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ +- keyptr,keylen,out); \ +- } \ +- } \ +-} while (0) +- +-#ifdef HASH_BLOOM +-#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM) +-#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL) +-#define HASH_BLOOM_MAKE(tbl) \ +-do { \ +- (tbl)->bloom_nbits = HASH_BLOOM; \ +- (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ +- if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ +- memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ +- (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ +-} while (0) +- +-#define HASH_BLOOM_FREE(tbl) \ +-do { \ +- uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ +-} while (0) +- +-#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U))) +-#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U))) +- +-#define HASH_BLOOM_ADD(tbl,hashv) \ +- HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U))) +- +-#define HASH_BLOOM_TEST(tbl,hashv) \ +- HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U))) +- +-#else +-#define HASH_BLOOM_MAKE(tbl) +-#define HASH_BLOOM_FREE(tbl) +-#define HASH_BLOOM_ADD(tbl,hashv) +-#define HASH_BLOOM_TEST(tbl,hashv) (1) +-#define HASH_BLOOM_BYTELEN 0U +-#endif +- +-#define HASH_MAKE_TABLE(hh,head) \ +-do { \ +- (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ +- sizeof(UT_hash_table)); \ +- if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ +- memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ +- (head)->hh.tbl->tail = &((head)->hh); \ +- (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ +- (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ +- (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ +- (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ +- HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ +- if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ +- memset((head)->hh.tbl->buckets, 0, \ +- HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ +- HASH_BLOOM_MAKE((head)->hh.tbl); \ +- (head)->hh.tbl->signature = HASH_SIGNATURE; \ +-} while(0) +- +-#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ +- HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add) +- +-#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \ +-do { \ +- replaced=NULL; \ +- HASH_FIND(hh,head,&((add)->fieldname),keylen_in,replaced); \ +- if (replaced!=NULL) { \ +- HASH_DELETE(hh,head,replaced); \ +- } \ +- HASH_ADD(hh,head,fieldname,keylen_in,add); \ +-} while(0) +- +-#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ +-do { \ +- unsigned _ha_bkt; \ +- (add)->hh.next = NULL; \ +- (add)->hh.key = (char*)(keyptr); \ +- (add)->hh.keylen = (unsigned)(keylen_in); \ +- if (!(head)) { \ +- head = (add); \ +- (head)->hh.prev = NULL; \ +- HASH_MAKE_TABLE(hh,head); \ +- } else { \ +- (head)->hh.tbl->tail->next = (add); \ +- (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ +- (head)->hh.tbl->tail = &((add)->hh); \ +- } \ +- (head)->hh.tbl->num_items++; \ +- (add)->hh.tbl = (head)->hh.tbl; \ +- HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ +- (add)->hh.hashv, _ha_bkt); \ +- HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ +- HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \ +- HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \ +- HASH_FSCK(hh,head); \ +-} while(0) +- +-#define HASH_TO_BKT( hashv, num_bkts, bkt ) \ +-do { \ +- bkt = ((hashv) & ((num_bkts) - 1U)); \ +-} while(0) +- +-/* delete "delptr" from the hash table. +- * "the usual" patch-up process for the app-order doubly-linked-list. +- * The use of _hd_hh_del below deserves special explanation. +- * These used to be expressed using (delptr) but that led to a bug +- * if someone used the same symbol for the head and deletee, like +- * HASH_DELETE(hh,users,users); +- * We want that to work, but by changing the head (users) below +- * we were forfeiting our ability to further refer to the deletee (users) +- * in the patch-up process. Solution: use scratch space to +- * copy the deletee pointer, then the latter references are via that +- * scratch pointer rather than through the repointed (users) symbol. +- */ +-#define HASH_DELETE(hh,head,delptr) \ +-do { \ +- struct UT_hash_handle *_hd_hh_del; \ +- if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \ +- uthash_free((head)->hh.tbl->buckets, \ +- (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ +- HASH_BLOOM_FREE((head)->hh.tbl); \ +- uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ +- head = NULL; \ +- } else { \ +- unsigned _hd_bkt; \ +- _hd_hh_del = &((delptr)->hh); \ +- if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \ +- (head)->hh.tbl->tail = \ +- (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \ +- (head)->hh.tbl->hho); \ +- } \ +- if ((delptr)->hh.prev != NULL) { \ +- ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \ +- (head)->hh.tbl->hho))->next = (delptr)->hh.next; \ +- } else { \ +- DECLTYPE_ASSIGN(head,(delptr)->hh.next); \ +- } \ +- if (_hd_hh_del->next != NULL) { \ +- ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next + \ +- (head)->hh.tbl->hho))->prev = \ +- _hd_hh_del->prev; \ +- } \ +- HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ +- HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ +- (head)->hh.tbl->num_items--; \ +- } \ +- HASH_FSCK(hh,head); \ +-} while (0) +- +- +-/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ +-#define HASH_FIND_STR(head,findstr,out) \ +- HASH_FIND(hh,head,findstr,(unsigned)strlen(findstr),out) +-#define HASH_ADD_STR(head,strfield,add) \ +- HASH_ADD(hh,head,strfield[0],(unsigned int)strlen(add->strfield),add) +-#define HASH_REPLACE_STR(head,strfield,add,replaced) \ +- HASH_REPLACE(hh,head,strfield[0],(unsigned)strlen(add->strfield),add,replaced) +-#define HASH_FIND_INT(head,findint,out) \ +- HASH_FIND(hh,head,findint,sizeof(int),out) +-#define HASH_ADD_INT(head,intfield,add) \ +- HASH_ADD(hh,head,intfield,sizeof(int),add) +-#define HASH_REPLACE_INT(head,intfield,add,replaced) \ +- HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced) +-#define HASH_FIND_PTR(head,findptr,out) \ +- HASH_FIND(hh,head,findptr,sizeof(void *),out) +-#define HASH_ADD_PTR(head,ptrfield,add) \ +- HASH_ADD(hh,head,ptrfield,sizeof(void *),add) +-#define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \ +- HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced) +-#define HASH_DEL(head,delptr) \ +- HASH_DELETE(hh,head,delptr) +- +-/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. +- * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. +- */ +-#ifdef HASH_DEBUG +-#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) +-#define HASH_FSCK(hh,head) \ +-do { \ +- struct UT_hash_handle *_thh; \ +- if (head) { \ +- unsigned _bkt_i; \ +- unsigned _count; \ +- char *_prev; \ +- _count = 0; \ +- for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ +- unsigned _bkt_count = 0; \ +- _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ +- _prev = NULL; \ +- while (_thh) { \ +- if (_prev != (char*)(_thh->hh_prev)) { \ +- HASH_OOPS("invalid hh_prev %p, actual %p\n", \ +- _thh->hh_prev, _prev ); \ +- } \ +- _bkt_count++; \ +- _prev = (char*)(_thh); \ +- _thh = _thh->hh_next; \ +- } \ +- _count += _bkt_count; \ +- if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ +- HASH_OOPS("invalid bucket count %u, actual %u\n", \ +- (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ +- } \ +- } \ +- if (_count != (head)->hh.tbl->num_items) { \ +- HASH_OOPS("invalid hh item count %u, actual %u\n", \ +- (head)->hh.tbl->num_items, _count ); \ +- } \ +- /* traverse hh in app order; check next/prev integrity, count */ \ +- _count = 0; \ +- _prev = NULL; \ +- _thh = &(head)->hh; \ +- while (_thh) { \ +- _count++; \ +- if (_prev !=(char*)(_thh->prev)) { \ +- HASH_OOPS("invalid prev %p, actual %p\n", \ +- _thh->prev, _prev ); \ +- } \ +- _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ +- _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \ +- (head)->hh.tbl->hho) : NULL ); \ +- } \ +- if (_count != (head)->hh.tbl->num_items) { \ +- HASH_OOPS("invalid app item count %u, actual %u\n", \ +- (head)->hh.tbl->num_items, _count ); \ +- } \ +- } \ +-} while (0) +-#else +-#define HASH_FSCK(hh,head) +-#endif +- +-/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to +- * the descriptor to which this macro is defined for tuning the hash function. +- * The app can #include to get the prototype for write(2). */ +-#ifdef HASH_EMIT_KEYS +-#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ +-do { \ +- unsigned _klen = fieldlen; \ +- write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ +- write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \ +-} while (0) +-#else +-#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) +-#endif +- +-/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ +-#ifdef HASH_FUNCTION +-#define HASH_FCN HASH_FUNCTION +-#else +-#define HASH_FCN HASH_JEN +-#endif +- +-/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */ +-#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned _hb_keylen=(unsigned)keylen; \ +- const unsigned char *_hb_key=(const unsigned char*)(key); \ +- (hashv) = 0; \ +- while (_hb_keylen-- != 0U) { \ +- (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \ +- } \ +- bkt = (hashv) & (num_bkts-1U); \ +-} while (0) +- +- +-/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at +- * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ +-#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned _sx_i; \ +- const unsigned char *_hs_key=(const unsigned char*)(key); \ +- hashv = 0; \ +- for(_sx_i=0; _sx_i < keylen; _sx_i++) { \ +- hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ +- } \ +- bkt = hashv & (num_bkts-1U); \ +-} while (0) +-/* FNV-1a variation */ +-#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned _fn_i; \ +- const unsigned char *_hf_key=(const unsigned char*)(key); \ +- hashv = 2166136261U; \ +- for(_fn_i=0; _fn_i < keylen; _fn_i++) { \ +- hashv = hashv ^ _hf_key[_fn_i]; \ +- hashv = hashv * 16777619U; \ +- } \ +- bkt = hashv & (num_bkts-1U); \ +-} while(0) +- +-#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned _ho_i; \ +- const unsigned char *_ho_key=(const unsigned char*)(key); \ +- hashv = 0; \ +- for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ +- hashv += _ho_key[_ho_i]; \ +- hashv += (hashv << 10); \ +- hashv ^= (hashv >> 6); \ +- } \ +- hashv += (hashv << 3); \ +- hashv ^= (hashv >> 11); \ +- hashv += (hashv << 15); \ +- bkt = hashv & (num_bkts-1U); \ +-} while(0) +- +-#define HASH_JEN_MIX(a,b,c) \ +-do { \ +- a -= b; a -= c; a ^= ( c >> 13 ); \ +- b -= c; b -= a; b ^= ( a << 8 ); \ +- c -= a; c -= b; c ^= ( b >> 13 ); \ +- a -= b; a -= c; a ^= ( c >> 12 ); \ +- b -= c; b -= a; b ^= ( a << 16 ); \ +- c -= a; c -= b; c ^= ( b >> 5 ); \ +- a -= b; a -= c; a ^= ( c >> 3 ); \ +- b -= c; b -= a; b ^= ( a << 10 ); \ +- c -= a; c -= b; c ^= ( b >> 15 ); \ +-} while (0) +- +-#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned _hj_i,_hj_j,_hj_k; \ +- unsigned const char *_hj_key=(unsigned const char*)(key); \ +- hashv = 0xfeedbeefu; \ +- _hj_i = _hj_j = 0x9e3779b9u; \ +- _hj_k = (unsigned)(keylen); \ +- while (_hj_k >= 12U) { \ +- _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ +- + ( (unsigned)_hj_key[2] << 16 ) \ +- + ( (unsigned)_hj_key[3] << 24 ) ); \ +- _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ +- + ( (unsigned)_hj_key[6] << 16 ) \ +- + ( (unsigned)_hj_key[7] << 24 ) ); \ +- hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ +- + ( (unsigned)_hj_key[10] << 16 ) \ +- + ( (unsigned)_hj_key[11] << 24 ) ); \ +- \ +- HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ +- \ +- _hj_key += 12; \ +- _hj_k -= 12U; \ +- } \ +- hashv += (unsigned)(keylen); \ +- switch ( _hj_k ) { \ +- case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \ +- case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \ +- case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \ +- case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \ +- case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \ +- case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \ +- case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \ +- case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \ +- case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \ +- case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \ +- case 1: _hj_i += _hj_key[0]; \ +- } \ +- HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ +- bkt = hashv & (num_bkts-1U); \ +-} while(0) +- +-/* The Paul Hsieh hash function */ +-#undef get16bits +-#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ +- || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) +-#define get16bits(d) (*((const uint16_t *) (d))) +-#endif +- +-#if !defined (get16bits) +-#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ +- +(uint32_t)(((const uint8_t *)(d))[0]) ) +-#endif +-#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- unsigned const char *_sfh_key=(unsigned const char*)(key); \ +- uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \ +- \ +- unsigned _sfh_rem = _sfh_len & 3U; \ +- _sfh_len >>= 2; \ +- hashv = 0xcafebabeu; \ +- \ +- /* Main loop */ \ +- for (;_sfh_len > 0U; _sfh_len--) { \ +- hashv += get16bits (_sfh_key); \ +- _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \ +- hashv = (hashv << 16) ^ _sfh_tmp; \ +- _sfh_key += 2U*sizeof (uint16_t); \ +- hashv += hashv >> 11; \ +- } \ +- \ +- /* Handle end cases */ \ +- switch (_sfh_rem) { \ +- case 3: hashv += get16bits (_sfh_key); \ +- hashv ^= hashv << 16; \ +- hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \ +- hashv += hashv >> 11; \ +- break; \ +- case 2: hashv += get16bits (_sfh_key); \ +- hashv ^= hashv << 11; \ +- hashv += hashv >> 17; \ +- break; \ +- case 1: hashv += *_sfh_key; \ +- hashv ^= hashv << 10; \ +- hashv += hashv >> 1; \ +- } \ +- \ +- /* Force "avalanching" of final 127 bits */ \ +- hashv ^= hashv << 3; \ +- hashv += hashv >> 5; \ +- hashv ^= hashv << 4; \ +- hashv += hashv >> 17; \ +- hashv ^= hashv << 25; \ +- hashv += hashv >> 6; \ +- bkt = hashv & (num_bkts-1U); \ +-} while(0) +- +-#ifdef HASH_USING_NO_STRICT_ALIASING +-/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads. +- * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. +- * MurmurHash uses the faster approach only on CPU's where we know it's safe. +- * +- * Note the preprocessor built-in defines can be emitted using: +- * +- * gcc -m64 -dM -E - < /dev/null (on gcc) +- * cc -## a.c (where a.c is a simple test file) (Sun Studio) +- */ +-#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86)) +-#define MUR_GETBLOCK(p,i) p[i] +-#else /* non intel */ +-#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL) +-#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL) +-#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL) +-#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL) +-#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL)) +-#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__)) +-#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24)) +-#define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16)) +-#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8)) +-#else /* assume little endian non-intel */ +-#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24)) +-#define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16)) +-#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8)) +-#endif +-#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \ +- (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \ +- (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \ +- MUR_ONE_THREE(p)))) +-#endif +-#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +-#define MUR_FMIX(_h) \ +-do { \ +- _h ^= _h >> 16; \ +- _h *= 0x85ebca6bu; \ +- _h ^= _h >> 13; \ +- _h *= 0xc2b2ae35u; \ +- _h ^= _h >> 16; \ +-} while(0) +- +-#define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \ +-do { \ +- const uint8_t *_mur_data = (const uint8_t*)(key); \ +- const int _mur_nblocks = (int)(keylen) / 4; \ +- uint32_t _mur_h1 = 0xf88D5353u; \ +- uint32_t _mur_c1 = 0xcc9e2d51u; \ +- uint32_t _mur_c2 = 0x1b873593u; \ +- uint32_t _mur_k1 = 0; \ +- const uint8_t *_mur_tail; \ +- const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \ +- int _mur_i; \ +- for(_mur_i = -_mur_nblocks; _mur_i!=0; _mur_i++) { \ +- _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \ +- _mur_k1 *= _mur_c1; \ +- _mur_k1 = MUR_ROTL32(_mur_k1,15); \ +- _mur_k1 *= _mur_c2; \ +- \ +- _mur_h1 ^= _mur_k1; \ +- _mur_h1 = MUR_ROTL32(_mur_h1,13); \ +- _mur_h1 = (_mur_h1*5U) + 0xe6546b64u; \ +- } \ +- _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4)); \ +- _mur_k1=0; \ +- switch((keylen) & 3U) { \ +- case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \ +- case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8; /* FALLTHROUGH */ \ +- case 1: _mur_k1 ^= (uint32_t)_mur_tail[0]; \ +- _mur_k1 *= _mur_c1; \ +- _mur_k1 = MUR_ROTL32(_mur_k1,15); \ +- _mur_k1 *= _mur_c2; \ +- _mur_h1 ^= _mur_k1; \ +- } \ +- _mur_h1 ^= (uint32_t)(keylen); \ +- MUR_FMIX(_mur_h1); \ +- hashv = _mur_h1; \ +- bkt = hashv & (num_bkts-1U); \ +-} while(0) +-#endif /* HASH_USING_NO_STRICT_ALIASING */ +- +-/* key comparison function; return 0 if keys equal */ +-#define HASH_KEYCMP(a,b,len) memcmp(a,b,(unsigned long)(len)) +- +-/* iterate over items in a known bucket to find desired item */ +-#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ +-do { \ +- if (head.hh_head != NULL) { DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); } \ +- else { out=NULL; } \ +- while (out != NULL) { \ +- if ((out)->hh.keylen == (keylen_in)) { \ +- if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) { break; } \ +- } \ +- if ((out)->hh.hh_next != NULL) { DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); } \ +- else { out = NULL; } \ +- } \ +-} while(0) +- +-/* add an item to a bucket */ +-#define HASH_ADD_TO_BKT(head,addhh) \ +-do { \ +- head.count++; \ +- (addhh)->hh_next = head.hh_head; \ +- (addhh)->hh_prev = NULL; \ +- if (head.hh_head != NULL) { (head).hh_head->hh_prev = (addhh); } \ +- (head).hh_head=addhh; \ +- if ((head.count >= ((head.expand_mult+1U) * HASH_BKT_CAPACITY_THRESH)) \ +- && ((addhh)->tbl->noexpand != 1U)) { \ +- HASH_EXPAND_BUCKETS((addhh)->tbl); \ +- } \ +-} while(0) +- +-/* remove an item from a given bucket */ +-#define HASH_DEL_IN_BKT(hh,head,hh_del) \ +- (head).count--; \ +- if ((head).hh_head == hh_del) { \ +- (head).hh_head = hh_del->hh_next; \ +- } \ +- if (hh_del->hh_prev) { \ +- hh_del->hh_prev->hh_next = hh_del->hh_next; \ +- } \ +- if (hh_del->hh_next) { \ +- hh_del->hh_next->hh_prev = hh_del->hh_prev; \ +- } +- +-/* Bucket expansion has the effect of doubling the number of buckets +- * and redistributing the items into the new buckets. Ideally the +- * items will distribute more or less evenly into the new buckets +- * (the extent to which this is true is a measure of the quality of +- * the hash function as it applies to the key domain). +- * +- * With the items distributed into more buckets, the chain length +- * (item count) in each bucket is reduced. Thus by expanding buckets +- * the hash keeps a bound on the chain length. This bounded chain +- * length is the essence of how a hash provides constant time lookup. +- * +- * The calculation of tbl->ideal_chain_maxlen below deserves some +- * explanation. First, keep in mind that we're calculating the ideal +- * maximum chain length based on the *new* (doubled) bucket count. +- * In fractions this is just n/b (n=number of items,b=new num buckets). +- * Since the ideal chain length is an integer, we want to calculate +- * ceil(n/b). We don't depend on floating point arithmetic in this +- * hash, so to calculate ceil(n/b) with integers we could write +- * +- * ceil(n/b) = (n/b) + ((n%b)?1:0) +- * +- * and in fact a previous version of this hash did just that. +- * But now we have improved things a bit by recognizing that b is +- * always a power of two. We keep its base 2 log handy (call it lb), +- * so now we can write this with a bit shift and logical AND: +- * +- * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) +- * +- */ +-#define HASH_EXPAND_BUCKETS(tbl) \ +-do { \ +- unsigned _he_bkt; \ +- unsigned _he_bkt_i; \ +- struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ +- UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ +- _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ +- 2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ +- if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ +- memset(_he_new_buckets, 0, \ +- 2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ +- tbl->ideal_chain_maxlen = \ +- (tbl->num_items >> (tbl->log2_num_buckets+1U)) + \ +- (((tbl->num_items & ((tbl->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \ +- tbl->nonideal_items = 0; \ +- for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ +- { \ +- _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ +- while (_he_thh != NULL) { \ +- _he_hh_nxt = _he_thh->hh_next; \ +- HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2U, _he_bkt); \ +- _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ +- if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ +- tbl->nonideal_items++; \ +- _he_newbkt->expand_mult = _he_newbkt->count / \ +- tbl->ideal_chain_maxlen; \ +- } \ +- _he_thh->hh_prev = NULL; \ +- _he_thh->hh_next = _he_newbkt->hh_head; \ +- if (_he_newbkt->hh_head != NULL) { _he_newbkt->hh_head->hh_prev = \ +- _he_thh; } \ +- _he_newbkt->hh_head = _he_thh; \ +- _he_thh = _he_hh_nxt; \ +- } \ +- } \ +- uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ +- tbl->num_buckets *= 2U; \ +- tbl->log2_num_buckets++; \ +- tbl->buckets = _he_new_buckets; \ +- tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ +- (tbl->ineff_expands+1U) : 0U; \ +- if (tbl->ineff_expands > 1U) { \ +- tbl->noexpand=1; \ +- uthash_noexpand_fyi(tbl); \ +- } \ +- uthash_expand_fyi(tbl); \ +-} while(0) +- +- +-/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ +-/* Note that HASH_SORT assumes the hash handle name to be hh. +- * HASH_SRT was added to allow the hash handle name to be passed in. */ +-#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) +-#define HASH_SRT(hh,head,cmpfcn) \ +-do { \ +- unsigned _hs_i; \ +- unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ +- struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ +- if (head != NULL) { \ +- _hs_insize = 1; \ +- _hs_looping = 1; \ +- _hs_list = &((head)->hh); \ +- while (_hs_looping != 0U) { \ +- _hs_p = _hs_list; \ +- _hs_list = NULL; \ +- _hs_tail = NULL; \ +- _hs_nmerges = 0; \ +- while (_hs_p != NULL) { \ +- _hs_nmerges++; \ +- _hs_q = _hs_p; \ +- _hs_psize = 0; \ +- for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ +- _hs_psize++; \ +- _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ +- ((void*)((char*)(_hs_q->next) + \ +- (head)->hh.tbl->hho)) : NULL); \ +- if (! (_hs_q) ) { break; } \ +- } \ +- _hs_qsize = _hs_insize; \ +- while ((_hs_psize > 0U) || ((_hs_qsize > 0U) && (_hs_q != NULL))) {\ +- if (_hs_psize == 0U) { \ +- _hs_e = _hs_q; \ +- _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ +- ((void*)((char*)(_hs_q->next) + \ +- (head)->hh.tbl->hho)) : NULL); \ +- _hs_qsize--; \ +- } else if ( (_hs_qsize == 0U) || (_hs_q == NULL) ) { \ +- _hs_e = _hs_p; \ +- if (_hs_p != NULL){ \ +- _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ? \ +- ((void*)((char*)(_hs_p->next) + \ +- (head)->hh.tbl->hho)) : NULL); \ +- } \ +- _hs_psize--; \ +- } else if (( \ +- cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ +- DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ +- ) <= 0) { \ +- _hs_e = _hs_p; \ +- if (_hs_p != NULL){ \ +- _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ? \ +- ((void*)((char*)(_hs_p->next) + \ +- (head)->hh.tbl->hho)) : NULL); \ +- } \ +- _hs_psize--; \ +- } else { \ +- _hs_e = _hs_q; \ +- _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ? \ +- ((void*)((char*)(_hs_q->next) + \ +- (head)->hh.tbl->hho)) : NULL); \ +- _hs_qsize--; \ +- } \ +- if ( _hs_tail != NULL ) { \ +- _hs_tail->next = ((_hs_e != NULL) ? \ +- ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ +- } else { \ +- _hs_list = _hs_e; \ +- } \ +- if (_hs_e != NULL) { \ +- _hs_e->prev = ((_hs_tail != NULL) ? \ +- ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ +- } \ +- _hs_tail = _hs_e; \ +- } \ +- _hs_p = _hs_q; \ +- } \ +- if (_hs_tail != NULL){ \ +- _hs_tail->next = NULL; \ +- } \ +- if ( _hs_nmerges <= 1U ) { \ +- _hs_looping=0; \ +- (head)->hh.tbl->tail = _hs_tail; \ +- DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ +- } \ +- _hs_insize *= 2U; \ +- } \ +- HASH_FSCK(hh,head); \ +- } \ +-} while (0) +- +-/* This function selects items from one hash into another hash. +- * The end result is that the selected items have dual presence +- * in both hashes. There is no copy of the items made; rather +- * they are added into the new hash through a secondary hash +- * hash handle that must be present in the structure. */ +-#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ +-do { \ +- unsigned _src_bkt, _dst_bkt; \ +- void *_last_elt=NULL, *_elt; \ +- UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ +- ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ +- if (src != NULL) { \ +- for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ +- for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ +- _src_hh != NULL; \ +- _src_hh = _src_hh->hh_next) { \ +- _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ +- if (cond(_elt)) { \ +- _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ +- _dst_hh->key = _src_hh->key; \ +- _dst_hh->keylen = _src_hh->keylen; \ +- _dst_hh->hashv = _src_hh->hashv; \ +- _dst_hh->prev = _last_elt; \ +- _dst_hh->next = NULL; \ +- if (_last_elt_hh != NULL) { _last_elt_hh->next = _elt; } \ +- if (dst == NULL) { \ +- DECLTYPE_ASSIGN(dst,_elt); \ +- HASH_MAKE_TABLE(hh_dst,dst); \ +- } else { \ +- _dst_hh->tbl = (dst)->hh_dst.tbl; \ +- } \ +- HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ +- HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ +- (dst)->hh_dst.tbl->num_items++; \ +- _last_elt = _elt; \ +- _last_elt_hh = _dst_hh; \ +- } \ +- } \ +- } \ +- } \ +- HASH_FSCK(hh_dst,dst); \ +-} while (0) +- +-#define HASH_CLEAR(hh,head) \ +-do { \ +- if (head != NULL) { \ +- uthash_free((head)->hh.tbl->buckets, \ +- (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ +- HASH_BLOOM_FREE((head)->hh.tbl); \ +- uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ +- (head)=NULL; \ +- } \ +-} while(0) +- +-#define HASH_OVERHEAD(hh,head) \ +- ((head != NULL) ? ( \ +- (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \ +- ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \ +- sizeof(UT_hash_table) + \ +- (HASH_BLOOM_BYTELEN))) : 0U) +- +-#ifdef NO_DECLTYPE +-#define HASH_ITER(hh,head,el,tmp) \ +-for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \ +- (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL))) +-#else +-#define HASH_ITER(hh,head,el,tmp) \ +-for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \ +- (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL))) +-#endif +- +-/* obtain a count of items in the hash */ +-#define HASH_COUNT(head) HASH_CNT(hh,head) +-#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U) +- +-typedef struct UT_hash_bucket { +- struct UT_hash_handle *hh_head; +- unsigned count; +- +- /* expand_mult is normally set to 0. In this situation, the max chain length +- * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If +- * the bucket's chain exceeds this length, bucket expansion is triggered). +- * However, setting expand_mult to a non-zero value delays bucket expansion +- * (that would be triggered by additions to this particular bucket) +- * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. +- * (The multiplier is simply expand_mult+1). The whole idea of this +- * multiplier is to reduce bucket expansions, since they are expensive, in +- * situations where we know that a particular bucket tends to be overused. +- * It is better to let its chain length grow to a longer yet-still-bounded +- * value, than to do an O(n) bucket expansion too often. +- */ +- unsigned expand_mult; +- +-} UT_hash_bucket; +- +-/* random signature used only to find hash tables in external analysis */ +-#define HASH_SIGNATURE 0xa0111fe1u +-#define HASH_BLOOM_SIGNATURE 0xb12220f2u +- +-typedef struct UT_hash_table { +- UT_hash_bucket *buckets; +- unsigned num_buckets, log2_num_buckets; +- unsigned num_items; +- struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ +- ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ +- +- /* in an ideal situation (all buckets used equally), no bucket would have +- * more than ceil(#items/#buckets) items. that's the ideal chain length. */ +- unsigned ideal_chain_maxlen; +- +- /* nonideal_items is the number of items in the hash whose chain position +- * exceeds the ideal chain maxlen. these items pay the penalty for an uneven +- * hash distribution; reaching them in a chain traversal takes >ideal steps */ +- unsigned nonideal_items; +- +- /* ineffective expands occur when a bucket doubling was performed, but +- * afterward, more than half the items in the hash had nonideal chain +- * positions. If this happens on two consecutive expansions we inhibit any +- * further expansion, as it's not helping; this happens when the hash +- * function isn't a good fit for the key domain. When expansion is inhibited +- * the hash will still work, albeit no longer in constant time. */ +- unsigned ineff_expands, noexpand; +- +- uint32_t signature; /* used only to find hash tables in external analysis */ +-#ifdef HASH_BLOOM +- uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ +- uint8_t *bloom_bv; +- uint8_t bloom_nbits; +-#endif +- +-} UT_hash_table; +- +-typedef struct UT_hash_handle { +- struct UT_hash_table *tbl; +- void *prev; /* prev element in app order */ +- void *next; /* next element in app order */ +- struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ +- struct UT_hash_handle *hh_next; /* next hh in bucket order */ +- void *key; /* ptr to enclosing struct's key */ +- unsigned keylen; /* enclosing struct's key len */ +- unsigned hashv; /* result of hash-fcn(key) */ +-} UT_hash_handle; +- +-#endif /* UTHASH_H */ diff --git a/talimatname/genel/u/usbutils/talimat b/talimatname/genel/u/usbutils/talimat new file mode 100644 index 000000000..28df24ca1 --- /dev/null +++ b/talimatname/genel/u/usbutils/talimat @@ -0,0 +1,22 @@ +# Tanım: USB Aygıt Yardımcı Programları +# URL: http://downloads.sourceforge.net/linux-usb/ +# Paketçi: milisarge +# Gerekler: libusb-compat + +isim=usbutils +surum=008 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/utils/usb/usbutils/usbutils-$surum.tar.xz) + +derle() { +cd $isim-$surum +sed -i '/^usbids/ s:usb.ids:hwdata/&:' lsusb.py +./configure --prefix=/usr \ +--datadir=/usr/share/hwdata \ +--disable-zlib \ +--datadir=/usr/share/misc +mkdir -p $PKG/usr/share/hwdata +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/u/usbutils/usbutils.kur-kos b/talimatname/genel/u/usbutils/usbutils.kur-kos new file mode 100644 index 000000000..64b2dc56f --- /dev/null +++ b/talimatname/genel/u/usbutils/usbutils.kur-kos @@ -0,0 +1 @@ +wget http://www.linux-usb.org/usb.ids -O usr/share/hwdata/usb.ids diff --git a/talimatname/genel/u/uthash/talimat b/talimatname/genel/u/uthash/talimat new file mode 100644 index 000000000..53a59c3c2 --- /dev/null +++ b/talimatname/genel/u/uthash/talimat @@ -0,0 +1,17 @@ +# Tanım: Karma tabloların ve bağlı bir listenin C önişlemci uygulamaları +# URL: https://troydhanson.github.io/uthash/ +# Paketçi: milisarge +# Gerekler: + +isim=uthash +surum=2.0.2 +devir=1 +kaynak=(https://github.com/troydhanson/uthash/archive/v$surum.tar.gz) + +derle() { + cd "${SRC}/${isim}-${surum}/src" + install -dm755 "${PKG}"/usr/include/ + for h in *.h; do + install -m 644 ${h} "${PKG}"/usr/include/ + done +} diff --git a/talimatname/genel/u/utox/talimat b/talimatname/genel/u/utox/talimat new file mode 100644 index 000000000..ba4d70375 --- /dev/null +++ b/talimatname/genel/u/utox/talimat @@ -0,0 +1,16 @@ +# Tanım: Hafif Tox istemcisi +# URL: https://github.com/GrayHatter/uTox +# Paketçi: milisarge +# Gerekler: gtk3 toxcore openal v4l-utils xorg-libxrender dbus hicolor-icon-theme xorg-fontconfig desktop-file-utils xorg-libxext xorg-libxrender filter_audio + +isim=utox +_isim=uTox +surum=0.9.4 +devir=1 +kaynak=(https://github.com/GrayHatter/$_name/archive/v$surum/$isim-$surum.tar.gz) + +derle() { + cd $_name-$surum + make + make PREFIX=/usr DESTDIR=$PKG install +} diff --git a/talimatname/genel/u/uwebsockets/talimat b/talimatname/genel/u/uwebsockets/talimat new file mode 100644 index 000000000..5bbcb7703 --- /dev/null +++ b/talimatname/genel/u/uwebsockets/talimat @@ -0,0 +1,18 @@ +# Tanım: uWS etkin,hafif websocket kütüphanesi +# URL: https://github.com/uWebSockets/uWebSockets +# Paketçi: milisarge +# Gerekler: + +isim=uwebsockets +surum=0.14.6 +devir=1 +kaynak=(https://github.com/uNetworking/uWebSockets/archive/v${surum}.tar.gz::uWebSockets-${surum}.tar.gz) + +derle() { + cd uWebSockets-${surum} + make + mkdir -p "${PKG}/usr/lib" + mv "${SRC}/uWebSockets-${surum}/libuWS.so" "${PKG}/usr/lib" + mkdir -p "${PKG}/usr/include/uWS" + mv "${SRC}/uWebSockets-${surum}/src/"*.h "${PKG}/usr/include/uWS" +} diff --git a/talimatname/genel/u/uyap/product_logo_32.xpm b/talimatname/genel/u/uyap/product_logo_32.xpm new file mode 100644 index 000000000..cd43fd6db --- /dev/null +++ b/talimatname/genel/u/uyap/product_logo_32.xpm @@ -0,0 +1,209 @@ +/* XPM */ +static char *product_logo___[] = { +/* columns rows colors chars-per-pixel */ +"32 32 171 2", +" c #171615", +". c #222120", +"X c #292827", +"o c #2B2A29", +"O c #373635", +"+ c #3F3E3D", +"@ c #434342", +"# c #484746", +"$ c #494847", +"% c #4C4C4B", +"& c #525250", +"* c #585756", +"= c #5E5D5C", +"- c #605F5F", +"; c #61605F", +": c #636261", +"> c #6C6B6B", +", c #706F6E", +"< c #70706F", +"1 c #727271", +"2 c #7C7B7B", +"3 c #851C1A", +"4 c #8A1E1C", +"5 c #911F1D", +"6 c #9E1D1B", +"7 c #A20504", +"8 c #AB0606", +"9 c #A60D0C", +"0 c #AC1615", +"q c #A31C1A", +"w c #AC1C1C", +"e c #B31D1E", +"r c #B81F1F", +"t c #9A211F", +"y c #A3201F", +"u c #AB201F", +"i c #B41F20", +"p c #BA1E20", +"a c #A32220", +"s c #AA2220", +"d c #B32121", +"f c #BB2022", +"g c #BB2929", +"h c #B53232", +"j c #BA3636", +"k c #BD3E3E", +"l c #C31618", +"z c #C01B1D", +"x c #CF1B1F", +"c c #C21E21", +"v c #CC1F23", +"b c #D31F23", +"n c #C32022", +"m c #CB2023", +"M c #D52427", +"N c #D82228", +"B c #D22F33", +"V c #C53A3C", +"C c #DB3E42", +"Z c #B14443", +"A c #BD4242", +"S c #BF4F4F", +"D c #BF4F53", +"F c #BB5C5B", +"G c #BD6D6F", +"H c #DB494C", +"J c #C95656", +"K c #C45D5D", +"L c #CD5B5C", +"P c #DF5255", +"I c #D45458", +"U c #DA5458", +"Y c #D25B5D", +"T c #E04C51", +"R c #E15559", +"E c #E3595E", +"W c #D05F60", +"Q c #E55D61", +"! c #C56464", +"~ c #C96464", +"^ c #C56A68", +"/ c #CD686A", +"( c #D36364", +") c #D66769", +"_ c #D76D6E", +"` c #DD6C6E", +"' c #C57474", +"] c #CE7374", +"[ c #D17777", +"{ c #D97374", +"} c #DC7A7B", +"| c #E66165", +" . c #EA6165", +".. c #E56568", +"X. c #E96A6E", +"o. c #E66E72", +"O. c #EB6D71", +"+. c #EA7176", +"@. c #EC767A", +"#. c #E37B7D", +"$. c #EC7A7E", +"%. c #F07A7D", +"&. c #D67F81", +"*. c #E57E80", +"=. c #ED7D81", +"-. c #868585", +";. c #898787", +":. c #888887", +">. c #8C8B8B", +",. c #908F8F", +"<. c #8F908F", +"1. c #8F9190", +"2. c #949494", +"3. c #9C9D9C", +"4. c #A5A5A4", +"5. c #A8A8A7", +"6. c #A6A9A9", +"7. c #ADACAB", +"8. c #AFB1B0", +"9. c #B4B3B3", +"0. c #B8B7B7", +"q. c #B7BAB9", +"w. c #BEBEBD", +"e. c #CD8280", +"r. c #D28080", +"t. c #DB8284", +"y. c #DB8788", +"u. c #D78C8C", +"i. c #DA8B8B", +"p. c #D69B9A", +"a. c #E38285", +"s. c #EF8386", +"d. c #E78B8E", +"f. c #EC8A8D", +"g. c #F18689", +"h. c #F28A8D", +"j. c #E98F92", +"k. c #F38D91", +"l. c #EF9396", +"z. c #E99698", +"x. c #E79899", +"c. c #F19093", +"v. c #E89FA0", +"b. c #DFA8A8", +"n. c #C0BFBF", +"m. c #EFA2A4", +"M. c #EDA6A8", +"N. c #F1A3A6", +"B. c #E5B5B5", +"V. c #ECB6B7", +"C. c #E4BFBF", +"Z. c #ECBFBF", +"A. c #F3B1B3", +"S. c #C2C1C1", +"D. c #C9C9C8", +"F. c #CED0D0", +"G. c #DADADA", +"H. c #EAC5C4", +"J. c #F5C2C3", +"K. c #F4DADA", +"L. c #F9DDDE", +"P. c #E3E3E3", +"I. c #F5E3E3", +"U. c #FAE7E8", +"Y. c #F6EBEB", +"T. c #FBEDED", +"R. c #F6F6F6", +"E. c #FAF5F6", +"W. c #F7F8F8", +"Q. c #FEFEFE", +"!. c None", +/* pixels */ +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.} *.#.{ !.!.!.!.!.!.!.!.!.!.!.!.!.!.", +"!.!.!.!.!.!.!.!.!.!.!.t.k.h.g.s.=.%.%.%.) !.!.!.!.!.!.!.!.!.!.!.", +"!.!.!.!.!.!.!.!.' d.f.f.s.=.$.$.$.@.+.+.O.X...D !.!.!.!.!.!.!.!.", +"!.!.!.!.!.!.!.t.c.f.l.N.A.J.J.N.l.=.X.X.X...| .I !.!.!.!.!.!.!.", +"!.!.!.!.!.!.d.f.f.L.E.Q.Q.Q.Q.Q.Q.T.J.| ..| Q E E C !.!.!.!.!.!.", +"!.!.!.!.!.d.f.m.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.L.o.E E R T N b !.!.!.!.!.", +"!.!.!.!.&.f.M.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.T...R P M b b c !.!.!.!.", +"!.!.!.G f.j.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.K.H M b b b b w !.!.!.", +"!.!.!.a.a.U.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.M.x b b b b v !.!.!.", +"!.!.!.a.z.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.U.B v v v v v !.!.!.", +"!.!.] #.V.8.G.Q.Q.9.7.7.>.>.>.P.Q.Q.9.> : - 3.U v v v v v p !.!.", +"!.!.#.` I.>.D.Q.Q.2.>.:., 2.-.# P.2.@ > > > 6.` v v v v v m !.!.", +"!.!.} ( Q.:.D.Q.Q.2.;.-.;.Q.Q.2 1 + 4.3.>.;.q.x.l n n n n m !.!.", +"!.! { Y Q.-.n.Q.Q.>.-.>.<.Q.Q.1 % O 5.> = = 3.v.l n n n n n e !.", +"!./ _ Y E.3.1 9.5.& S.w.7.9.2. S.; @ 5.7.7.F.} z n n n n n p !.", +"!.~ ) Y Z.Q.,.< 1 0.Q.:.= # $ 4.Q.Q.: $ # @ 1.Y c n n n n n p !.", +"!.F ( Y y.Q.Q.R.W.Q.Q.W.R.W.W.Q.Q.Q.Q.W.W.W.Y.V f f f f f f i !.", +"!.!.W L ( T.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.H.f f f f f f f i !.", +"!.!.L J J i.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.g r f f f f f f d !.", +"!.!.Z k d 8 B.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.J r r e e d d d d s !.", +"!.!.!.d d d d B.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.~ d e j i.[ 0 e d d s !.", +"!.!.!.s d d d 8 r.Y.Q.Q.Q.Q.Q.Q.Q.Q.K.k w w ] Q.Q.Q.W.A e d s !.", +"!.!.!.!.d s s s w h K b.E.Q.Q.I.u.S d w w ! Q.G.* < Q.E.9 s s !.", +"!.!.!.!.6 s s s s s u 0 7 7 7 9 w s s s w H.W.# o . 2 Q.! w y !.", +"!.!.!.!.!.y s s s s s s s s s s s s s s u H.R.# o X : Q.^ w y !.", +"!.!.!.!.!.!.y s s s s s s s s s s s s s q e.Q.7.% % Q.Q.q s y !.", +"!.!.!.!.!.!.!.t s a a a a a a a a a a a a q p.Q.W.Q.Q.F q a t !.", +"!.!.!.!.!.!.!.!.3 t a a a a a a a a a a a a q ' C.B.Z q a a !.!.", +"!.!.!.!.!.!.!.!.!.!.!.5 a a a a a a a a a a a 6 6 6 y a a 5 !.!.", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.5 t t t t t t t t t t t t t 4 !.!.!.", +"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!." +}; diff --git a/talimatname/genel/u/uyap/talimat b/talimatname/genel/u/uyap/talimat new file mode 100644 index 000000000..fddf149c0 --- /dev/null +++ b/talimatname/genel/u/uyap/talimat @@ -0,0 +1,92 @@ +# Tanım: Uyap Belge Düzenleyici +# URL: uyap.gov.tr +# Paketçi: Cihan_Alkan +# Gerekler: openjdk akiskart opensc innoextract + +isim=uyap +surum=4.1.10 +devir=1 +kaynak=(http://www.uyap.gov.tr/destek/uyap.zip::${isim}-${surum}.zip + uyap-editor.png + product_logo_32.xpm) + +derle() { + +innoextract $SRC/UKI_V4.1.10/UKI_V4.1.10.exe + + mkdir -p $PKG/opt/uki + cp -r app/*.jar /$PKG/opt/uki/ + +# Başlatıcı +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Version=1.0 +Type=Application +Name=Uyap Document Editor +Name[tr]=Uyap Belge Düzenleyici +Comment=Uyap Document Editor +Comment[tr]=Uyap Belge Düzenleyici +GenericName=Metin Düzenleyici +TryExec=uyap +Exec=uyap %U +Terminal=false +Icon=uyap-editor +Categories=TextEditor;Office; +StartupNotify=true +Actions=Window;Document; +MimeType=application/udf; +EOF + +# Bin Dosyası +mkdir -pv $PKG/usr/bin && +cat > $PKG/usr/bin/$isim << "EOF" && +java -Xmx512m -Duser.language=tr -Duser.region=TR -cp .:/opt/uki/editor_lib2.jar:/opt/uki/editor_lib.jar:/opt/uki/editor_laf.jar:/opt/uki/jai_hvl.jar:/opt/uki/editor_utility.jar:/opt/uki/jdom.jar:/opt/uki/updater.jar tr.com.havelsan.uyap.system.editor.common.WPAppManager "getNewWPInstance" "EDITOR_TYPE_DOCUMENT" "$1" "$2" +EOF + +# Uyap Menü +mkdir -pv $PKG/usr/share/menu && +cat > $PKG/usr/share/menu/$isim.menu << "EOF" && +?package(uyap):needs="x11" \ + section="Office" \ + hints="Metin Düzenleyici" \ + title="Uyap Belge Düzenleyici" \ + icon="/opt/uki/product_logo_32.xpm" \ + command="/usr/bin/uyap" +EOF + +# Uyap Mime +mkdir -pv $PKG/usr/share/mime/packages && +cat > $PKG/usr/share/mime/packages/udf.xml << "EOF" && + + + + Uyap Document File + Uyap Belge Dosyası + UDF + Uyap Document File + + + + + + Uyap Template File + Uyap Şablon Dosyası + USF + Uyap Template File + + + + +EOF + + # Icon Stuff + SRC_LOC="$SRC/" + DEST_LOC="$PKG/usr/share/icons/hicolor" + for i in 16 32 48 128 256 + do + install -Dm644 "$SRC_LOC"/uyap-editor.png "$DEST_LOC/${i}x${i}/apps/uyap-editor.png" + done + install -m644 "$SRC/product_logo_32.xpm" "$PKG/opt/uki/product_logo_32.xpm" + chmod +x $PKG/usr/bin/uyap +} diff --git a/talimatname/genel/u/uyap/uyap-editor.png b/talimatname/genel/u/uyap/uyap-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..66b0167507a68863d5087d5045d01d25a3883e2a GIT binary patch literal 10872 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/v/vice/talimat b/talimatname/genel/v/vice/talimat new file mode 100644 index 000000000..369ddc348 --- /dev/null +++ b/talimatname/genel/v/vice/talimat @@ -0,0 +1,54 @@ +# Tanım: VICE Commodore emülatörü +# URL: http://www.viceteam.org/ +# Paketçi: milisarge +# Gerekler: gtk2 giflib lame libpng libjpeg-turbo xorg-libxdamage xorg-libsm vte xorg-libxxf86vm xorg-fontconfig xorg-font-util libpcap libnet sdl xmlto texi2html zlib + +isim=vice +surum=2.4 +devir=2 +kaynak=(http://downloads.sourceforge.net/project/vice-emu/releases/vice-$surum.tar.gz + vice-2.4-no-fc-cache.patch + vice-2.4-64bit.patch + vice-2.4-giflib.patch + vice-2.4-x11video.patch + vice-2.4-zlib-1.2.7.patch + vice-2.4-texi2html.patch + vice-2.4-vice.texi.patch + vice.desktop + icons.tar.gz + vice) + +derle() { + cd vice-$surum + patch -p1 < $SRC/vice-2.4-no-fc-cache.patch || return + patch -p1 < $SRC/vice-2.4-64bit.patch || return + patch -p1 < $SRC/vice-2.4-giflib.patch || return + patch -p1 < $SRC/vice-2.4-x11video.patch || return + patch -p1 < $SRC/vice-2.4-zlib-1.2.7.patch || return + patch -p1 < $SRC/vice-2.4-vice.texi.patch || return + patch -p1 < $SRC/vice-2.4-texi2html.patch || exit + + ./configure \ + --prefix=/usr \ + --enable-ethernet \ + --enable-fullscreen \ + --disable-ffmpeg \ + --with-sdlsound + + make + + mkdir -p $PKG/usr/bin + cp $SRC/vice $PKG/usr/bin + chmod a+x $PKG/usr/bin/vice + mkdir -p $PKG/usr/share/applications + cp $SRC/vice.desktop $PKG/usr/share/applications/ + ICONSIZES="48 32 24 22 16" + for i in $ICONSIZES; do + mkdir -p $PKG/usr/share/icons/hicolor/$i\x$i/apps; + cp $SRC/$isim-$i.png $PKG/usr/share/icons/hicolor/$i\x$i/apps; + done; + cp $SRC/$isim.png $PKG/usr/share/applications/ + + + make DESTDIR=$PKG install + } diff --git a/talimatname/genel/v/vice/vice b/talimatname/genel/v/vice/vice new file mode 100644 index 000000000..dd98d21f4 --- /dev/null +++ b/talimatname/genel/v/vice/vice @@ -0,0 +1,28 @@ +#!/bin/sh + +dialog --title "VICE" \ + --menu "VICE is an emulator for Commodore\n\ +computers. It emulates the C64, the C128,\n\ +the VIC20, almost all PET models, the PLUS4\n\ +and the CBM-II.\n\\n\ +Choose the emulator you like to run:" 24 60 6 \ + "x64" "- C64 emulator" \ + "x64dtv" "- C64 Direct-to-TV (DTV) emulator" \ + "x128" "- C128 emulator" \ + "xvic" "- VIC20 emulator" \ + "xpet" "- PET emulator" \ + "xplus4" "- PLUS4 emulator" \ + "xcbm2" "- CBM-II emulator" 2> /tmp/menu.tmp.$$ + +retval=$? +choice=`cat /tmp/menu.tmp.$$` +rm -f /tmp/menu.tmp.$$ + +case $retval in + 0) + $choice;; + 1) + ;; + 255) + ;; +esac diff --git a/talimatname/genel/v/vice/vice-2.4-64bit.patch b/talimatname/genel/v/vice/vice-2.4-64bit.patch new file mode 100644 index 000000000..b78ea51bc --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-64bit.patch @@ -0,0 +1,129 @@ +diff -Naur vice-2.3.21.orig/doc/vice.guide vice-2.3.21/doc/vice.guide +--- vice-2.3.21.orig/doc/vice.guide 2012-08-06 00:41:54.000000000 +0200 ++++ vice-2.3.21/doc/vice.guide 2012-08-06 09:44:36.288562655 +0200 +@@ -1292,7 +1292,7 @@ + `Directory' resource, which is a colon (`:')-separated search path + list, like the UNIX `PATH' environment variable. The default value is + +- PREFIX/lib/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU ++ PREFIX/lib64/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU + + Where `PREFIX' is the installation prefix (usually `/usr/local'), `EMU' + is the name of the emulated machine (`C64', `C64DTV', `C128', `PET', +@@ -1306,12 +1306,12 @@ + + then the value will be + +- /usr/local/lib/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 ++ /usr/local/lib64/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 + + And system files will be searched for under the following directories, + in the specified order: + +- 1. `/usr/local/lib/VICE/C64' ++ 1. `/usr/local/lib64/VICE/C64' + + 2. `$HOME/.vice/C64' + +@@ -4010,7 +4010,7 @@ + where: + + * `LIBDIR' is the VICE installation directory (usually +- `/usr/local/lib/vice', `/usr/lib/vice' or `/opt/vice/lib'); ++ `/usr/local/lib64/vice', `/usr/lib64/vice' or `/opt/vice/lib'); + + * `EMUID' is the emulation identification string (`C64', + `C128', `VIC20' or `PET'); +diff -Naur vice-2.3.21.orig/doc/vice.texi vice-2.3.21/doc/vice.texi +--- vice-2.3.21.orig/doc/vice.texi 2012-07-24 04:08:09.000000000 +0200 ++++ vice-2.3.21/doc/vice.texi 2012-08-06 09:44:36.291562619 +0200 +@@ -1364,7 +1364,7 @@ + default value is + + @example +-PREFIX/lib/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU ++PREFIX/lib64/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU + @end example + + Where @code{PREFIX} is the installation prefix (usually +@@ -1383,7 +1383,7 @@ + then the value will be + + @example +-/usr/local/lib/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 ++/usr/local/lib64/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 + @end example + + And system files will be searched for under the following directories, +@@ -1391,7 +1391,7 @@ + + @enumerate 1 + @item +-@code{/usr/local/lib/VICE/C64} ++@code{/usr/local/lib64/VICE/C64} + @item + @code{$HOME/.vice/C64} + @item +diff -Naur vice-2.3.21.orig/doc/vice.txt vice-2.3.21/doc/vice.txt +--- vice-2.3.21.orig/doc/vice.txt 2012-08-06 02:23:21.000000000 +0200 ++++ vice-2.3.21/doc/vice.txt 2012-08-06 09:44:36.296562563 +0200 +@@ -1056,7 +1056,7 @@ + `Directory' resource, which is a colon (`:')-separated search path + list, like the UNIX `PATH' environment variable. The default value is + +-PREFIX/lib/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU ++PREFIX/lib64/vice/EMU:$HOME/.vice/EMU:BOOTPATH/EMU + + Where `PREFIX' is the installation prefix (usually `/usr/local'), `EMU' + is the name of the emulated machine (`C64', `C64DTV', `C128', `PET', +@@ -1070,12 +1070,12 @@ + + then the value will be + +-/usr/local/lib/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 ++/usr/local/lib64/vice/C64:$HOME/.vice/C64:/usr/local/bin/C64 + + And system files will be searched for under the following directories, + in the specified order: + +-1. `/usr/local/lib/VICE/C64' ++1. `/usr/local/lib64/VICE/C64' + + 2. `$HOME/.vice/C64' + +diff -Naur vice-2.3.21.orig/INSTALL vice-2.3.21/INSTALL +--- vice-2.3.21.orig/INSTALL 2011-01-29 14:17:50.000000000 +0100 ++++ vice-2.3.21/INSTALL 2012-08-06 09:44:36.299562529 +0200 +@@ -301,7 +301,7 @@ + + make install + +- The binaries and support files will all go under PREFIX/lib/vice. ++ The binaries and support files will all go under PREFIX/lib64/vice. + You must of course have write permissions for the directories where + VICE is to be installed. Normally only the system administrator + has write access to /usr/local, the default PREFIX. Either ask +diff -Naur vice-2.3.21.orig/src/arch/sdl/archdep_unix.h vice-2.3.21/src/arch/sdl/archdep_unix.h +--- vice-2.3.21.orig/src/arch/sdl/archdep_unix.h 2011-07-21 05:10:28.000000000 +0200 ++++ vice-2.3.21/src/arch/sdl/archdep_unix.h 2012-08-06 09:42:11.970323196 +0200 +@@ -88,7 +88,7 @@ + #ifdef __NetBSD__ + #define LIBDIR PREFIX "/share/vice" + #else +-#define LIBDIR PREFIX "/lib/vice" ++#define LIBDIR PREFIX "/lib64/vice" + #endif + + #if defined(__FreeBSD__) || defined(__NetBSD__) +diff -Naur vice-2.3.21.orig/src/arch/unix/archdep.h vice-2.3.21/src/arch/unix/archdep.h +--- vice-2.3.21.orig/src/arch/unix/archdep.h 2010-10-06 18:17:43.000000000 +0200 ++++ vice-2.3.21/src/arch/unix/archdep.h 2012-08-06 09:42:46.474902531 +0200 +@@ -127,7 +127,7 @@ + #ifdef __NetBSD__ + #define LIBDIR PREFIX "/share/vice" + #else +-#define LIBDIR PREFIX "/lib/vice" ++#define LIBDIR PREFIX "/lib64/vice" + #endif + + #if defined(__FreeBSD__) || defined(__NetBSD__) diff --git a/talimatname/genel/v/vice/vice-2.4-giflib.patch b/talimatname/genel/v/vice/vice-2.4-giflib.patch new file mode 100644 index 000000000..939060232 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-giflib.patch @@ -0,0 +1,38 @@ +--- a/src/gfxoutputdrv/gifdrv.c 2012-07-25 23:46:05.000000000 +0000 ++++ b/src/gfxoutputdrv/gifdrv.c 2014-06-01 11:48:40.493722851 +0000 +@@ -114,7 +114,7 @@ static int gifdrv_open(screenshot_t *scr + if (EGifPutScreenDesc(sdata->fd, screenshot->width, screenshot->height, 8, 0, gif_colors) == GIF_ERROR || + EGifPutImageDesc(sdata->fd, 0, 0, screenshot->width, screenshot->height, 0, NULL) == GIF_ERROR) + { +- EGifCloseFile(sdata->fd); ++ EGifCloseFile(sdata->fd, NULL); + VICE_FreeMapObject(gif_colors); + lib_free(sdata->data); + lib_free(sdata->ext_filename); +@@ -145,7 +145,7 @@ static int gifdrv_close(screenshot_t *sc + + sdata = screenshot->gfxoutputdrv_data; + +- EGifCloseFile(sdata->fd); ++ EGifCloseFile(sdata->fd, NULL); + VICE_FreeMapObject(gif_colors); + + /* for some reason giflib will create a file with unexpected +@@ -184,7 +184,7 @@ static char *gifdrv_memmap_ext_filename; + + static int gifdrv_close_memmap(void) + { +- EGifCloseFile(gifdrv_memmap_fd); ++ EGifCloseFile(gifdrv_memmap_fd, NULL); + VICE_FreeMapObject(gif_colors); + lib_free(gifdrv_memmap_ext_filename); + +@@ -231,7 +231,7 @@ static int gifdrv_open_memmap(const char + if (EGifPutScreenDesc(gifdrv_memmap_fd, x_size, y_size, 8, 0, gif_colors) == GIF_ERROR || + EGifPutImageDesc(gifdrv_memmap_fd, 0, 0, x_size, y_size, 0, NULL) == GIF_ERROR) + { +- EGifCloseFile(gifdrv_memmap_fd); ++ EGifCloseFile(gifdrv_memmap_fd, NULL); + VICE_FreeMapObject(gif_colors); + lib_free(gifdrv_memmap_ext_filename); + return -1; diff --git a/talimatname/genel/v/vice/vice-2.4-no-fc-cache.patch b/talimatname/genel/v/vice/vice-2.4-no-fc-cache.patch new file mode 100644 index 000000000..b7a6babeb --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-no-fc-cache.patch @@ -0,0 +1,15 @@ +--- a/configure.in 2011-02-19 23:07:05.000000000 +0100 ++++ b/configure.in 2012-08-06 13:18:46.000000000 +0200 +@@ -1990,12 +1990,7 @@ + + fi + +-AC_PATH_PROGS(FCCACHE, fc-cache, false) +-if test x"$FCCACHE" = "xfalse"; then + AM_CONDITIONAL(HAVE_FC_CACHE, false) +-else +- AM_CONDITIONAL(HAVE_FC_CACHE, true) +-fi + + if test x"$is_amigaos4" = "xyes"; then + if test x"$enable_sdlui" != "xyes"; then diff --git a/talimatname/genel/v/vice/vice-2.4-notexi-notxt.patch b/talimatname/genel/v/vice/vice-2.4-notexi-notxt.patch new file mode 100644 index 000000000..58121b702 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-notexi-notxt.patch @@ -0,0 +1,28 @@ +--- a/doc/Makefile.am 2012-10-20 01:32:30.000000000 +0200 ++++ b/doc/Makefile.am 2012-11-03 18:29:03.000000000 +0100 +@@ -79,19 +79,6 @@ + $(srcdir)/fixdox.sh txt $(builddir)/vice.txt + rm -f vicetmp.txt + +-$(builddir)/vice.pdf: $(srcdir)/vice.texi +-if BUILD_PDF +- sed 's/@heading NO WARRANTY/@center NO WARRANTY/g' <$(srcdir)/vice.texi >vicepdf.texi +- $(TEXI2DVI) -q --clean --pdf -o $(builddir)/vice.pdf vicepdf.texi +- rm -f vicepdf.texi +- +-PDF_DEPS=$(builddir)/vice.pdf +-else +- touch $(builddir)/vice.pdf +- +-PDF_DEPS= +-endif +- + $(builddir)/vice.guide: $(srcdir)/vice.texi + if BUILD_AMIGAGUIDE + $(srcdir)/texi2guide.sh $(MAKEGUIDE) $(builddir)/vice.guide $(srcdir)/vice.texi +@@ -148,4 +135,4 @@ + touch $(builddir)/vice.info + $(MAKEINFO) -o $(builddir)/vice.info --no-split $(srcdir)/vice.texi + +-INFO_DEPS = $(builddir)/vice.txt $(builddir)/vice.info $(PDF_DEPS) $(GUIDE_DEPS) $(HLP_DEPS) $(CHM_DEPS) $(IPF_DEPS) ++INFO_DEPS = $(builddir)/vice.info $(PDF_DEPS) $(GUIDE_DEPS) $(HLP_DEPS) $(CHM_DEPS) $(IPF_DEPS) diff --git a/talimatname/genel/v/vice/vice-2.4-texi2html.patch b/talimatname/genel/v/vice/vice-2.4-texi2html.patch new file mode 100644 index 000000000..c5f7276a5 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-texi2html.patch @@ -0,0 +1,22 @@ +--- a/doc/html/texi2html 2015-11-10 12:22:49.310067806 -0800 ++++ b/doc/html/texi2html 2015-11-10 12:22:18.750067582 -0800 +@@ -1557,17 +1557,13 @@ + $level--; # here we start at 0 + if ($isim =~ /^appendix/) { + # appendix style +- if (defined(@appendix_sec_num)) { +- &incr_sec_num($level, @appendix_sec_num); +- } else { ++ { + @appendix_sec_num = ('A', 0, 0, 0); + } + return(join('.', @appendix_sec_num[0..$level])); + } else { + # normal style +- if (defined(@normal_sec_num)) { +- &incr_sec_num($level, @normal_sec_num); +- } else { ++ { + @normal_sec_num = (1, 0, 0, 0); + } + return(join('.', @normal_sec_num[0..$level])); diff --git a/talimatname/genel/v/vice/vice-2.4-vice.texi.patch b/talimatname/genel/v/vice/vice-2.4-vice.texi.patch new file mode 100644 index 000000000..4a1cf5f83 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-vice.texi.patch @@ -0,0 +1,10 @@ +--- a/doc/vice.texi 2015-11-12 10:36:35.670036048 -0800 ++++ b/doc/vice.texi 2015-11-12 10:36:17.240035913 -0800 +@@ -8243,6 +8243,7 @@ + @item -Crtcextpal + Use an external palette (file) + @cindex -Crtcpalette ++@item -Crtcpalette + @itemx -Crtcpalette NAME + Specify @code{NAME} as the palette file (@code{CrtcPaletteFile}). + @cindex -Crtcfulldevice diff --git a/talimatname/genel/v/vice/vice-2.4-x11video.patch b/talimatname/genel/v/vice/vice-2.4-x11video.patch new file mode 100644 index 000000000..423688ba9 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-x11video.patch @@ -0,0 +1,11 @@ +--- a/src/arch/unix/x11/xaw/x11video.c 2012-10-28 22:26:24.000000000 +0100 ++++ b/src/arch/unix/x11/xaw/x11video.c 2012-11-03 18:54:08.000000000 +0100 +@@ -60,6 +60,8 @@ + #include + #include + #include ++#include ++#include + + #include + #include diff --git a/talimatname/genel/v/vice/vice-2.4-zlib-1.2.7.patch b/talimatname/genel/v/vice/vice-2.4-zlib-1.2.7.patch new file mode 100644 index 000000000..f41c8afc5 --- /dev/null +++ b/talimatname/genel/v/vice/vice-2.4-zlib-1.2.7.patch @@ -0,0 +1,37 @@ +--- a/src/zfile.c 2012-10-13 14:53:16.000000000 +0200 ++++ b/src/zfile.c 2012-11-03 18:47:40.000000000 +0100 +@@ -198,10 +198,10 @@ + do { + char buf[256]; + +- len = gzread(fdsrc, (void *)buf, 256); ++ len = gzread((gzFile)fdsrc, (void *)buf, 256); + if (len > 0) { + if (fwrite((void *)buf, 1, (size_t)len, fddest) < len) { +- gzclose(fdsrc); ++ gzclose((gzFile)fdsrc); + fclose(fddest); + ioutil_remove(tmp_name); + lib_free(tmp_name); +@@ -210,7 +210,7 @@ + } + } while (len > 0); + +- gzclose(fdsrc); ++ gzclose((gzFile)fdsrc); + fclose(fddest); + + return tmp_name; +@@ -779,10 +779,10 @@ + char buf[256]; + len = fread((void *)buf, 256, 1, fdsrc); + if (len > 0) +- gzwrite(fddest, (void *)buf, (unsigned int)len); ++ gzwrite((gzFile)fddest, (void *)buf, (unsigned int)len); + } while (len > 0); + +- gzclose(fddest); ++ gzclose((gzFile)fddest); + fclose(fdsrc); + + archdep_file_set_gzip(dest); diff --git a/talimatname/genel/v/vice/vice.desktop b/talimatname/genel/v/vice/vice.desktop new file mode 100644 index 000000000..129049fd2 --- /dev/null +++ b/talimatname/genel/v/vice/vice.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=VICE +Comment=Emulator for Commodore's 8-bit computers +Exec=vice +Terminal=true +Type=Application +Categories=Game;Emulator; +Icon=/usr/share/applications/vice.png diff --git a/talimatname/genel/v/vid-stab/talimat b/talimatname/genel/v/vid-stab/talimat new file mode 100644 index 000000000..8727a442f --- /dev/null +++ b/talimatname/genel/v/vid-stab/talimat @@ -0,0 +1,23 @@ +# Tanım: Video dengeleme kitaplığı +# URL: http://public.hronopik.de/vid.stab +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: cmake git + +isim=vid-stab +surum=1.1 +devir=1 + +kaynak=() + +derle() { + + git clone https://github.com/georgmartius/vid.stab.git + + cd vid.stab + mkdir build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/v/viewnior/talimat b/talimatname/genel/v/viewnior/talimat new file mode 100644 index 000000000..8a4a1dc66 --- /dev/null +++ b/talimatname/genel/v/viewnior/talimat @@ -0,0 +1,17 @@ +# Tanım: Hızlı ve basit GTK+ resim görüntüleyici +# URL: http://xsisqox.github.io/Viewnior/ +# Paketçi: milisarge +# Gerekler: glib gtk2 gnome-common shared-mime-info exiv2 + +isim=viewnior +surum=1.6 +devir=1 +kaynak=(https://github.com/xsisqox/Viewnior/archive/$isim-$surum.tar.gz) + +derle() { + cd Viewnior-$isim-$surum + ./autogen.sh + ./configure + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/v/vile/talimat b/talimatname/genel/v/vile/talimat new file mode 100644 index 000000000..0cf896c27 --- /dev/null +++ b/talimatname/genel/v/vile/talimat @@ -0,0 +1,16 @@ +# Tanım: VI Emacs gibi - başka bir tam özellikli vi klonu +# URL: http://invisible-island.net/vile/ +# Paketçi: milisarge +# Gerekler: reflex + +isim=vile +surum=9.8 +devir=1 +kaynak=(ftp://invisible-island.net/vile/$isim.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --with-perl + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/v/vim/talimat b/talimatname/genel/v/vim/talimat new file mode 100644 index 000000000..526d45480 --- /dev/null +++ b/talimatname/genel/v/vim/talimat @@ -0,0 +1,46 @@ +# Tanım: The Vim package contains a powerful text editor. +# URL: http://www.vim.org/ +# Paketçi: milisarge +# Gerekler: + +isim=vim +surum=7.4 +devir=1 + +kaynak=(ftp://ftp.vim.org/pub/vim/unix/vim-$surum.tar.bz2 + vim-7.4-locale-1.patch) +derle() +{ +vimv="vim${version/./}" +cd $vimv +patch -Np1 -i $SRC/vim-7.4-locale-1.patch +echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h + +./configure --prefix=/usr --enable-multibyte \ + --enable-gui=no --with-x=no \ + --disable-gpm + +make +mkdir -p $PKG/usr/share/locale + +make DESTDIR=$PKG DEST_HELP=$PKG/usr/share/doc/vim-$surum \ +LANGSUBLOC=/usr/share/locale install + +ln -sv vim $PKG/usr/bin/vi +for L in $PKG/usr/share/man/{,*/}man1/vim.1; do + ln -sv vim.1 $(dirname $L)/vi.1 +done + +mkdir $PKG/etc + +cat > $PKG/etc/vimrc << "EOF" +" Begin /etc/vimrc +set background=dark +set ruler +set nocompatible +set backspace=2 +syntax on + +" End /etc/vimrc +EOF +} diff --git a/talimatname/genel/v/vim/vim-7.4-locale-1.patch b/talimatname/genel/v/vim/vim-7.4-locale-1.patch new file mode 100644 index 000000000..c77e86628 --- /dev/null +++ b/talimatname/genel/v/vim/vim-7.4-locale-1.patch @@ -0,0 +1,11 @@ +--- vim74/src/main.c.original 2014-06-17 17:24:55.000000000 +0200 ++++ vim74/src/main.c 2014-06-17 17:25:44.000000000 +0200 +@@ -1563,7 +1563,7 @@ + if (p != NULL && *p != NUL) + { + vim_snprintf((char *)NameBuff, MAXPATHL, "%s/lang", p); +- bindtextdomain(VIMPACKAGE, (char *)NameBuff); ++ bindtextdomain(VIMPACKAGE, "/usr/share/locale"); + } + if (mustfree) + vim_free(p); diff --git a/talimatname/genel/v/vimb/talimat b/talimatname/genel/v/vimb/talimat new file mode 100644 index 000000000..55d984301 --- /dev/null +++ b/talimatname/genel/v/vimb/talimat @@ -0,0 +1,17 @@ +# Tanım: Vim benzeri tarayıcı +# URL: http://fanglingsu.github.io/vimb +# Paketçi: Cihan_Alkan +# Gerekler: webkit2gtk3 +# Grup: ağ + +isim=vimb +surum=3.1.0 +devir=1 +kaynak=(https://github.com/fanglingsu/vimb/archive/3.1.0.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + make DEXTENSIONDIR=/usr/lib/vimb V=1 DESTDIR="$PKG" PREFIX="/usr" + make DEXTENSIONDIR=/usr/lib/vimb V=1 DESTDIR="$PKG" PREFIX="/usr" install + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" +} diff --git a/talimatname/genel/v/vino/talimat b/talimatname/genel/v/vino/talimat new file mode 100644 index 000000000..1c96fdebb --- /dev/null +++ b/talimatname/genel/v/vino/talimat @@ -0,0 +1,17 @@ +# Tanım: GNOME masaüstü için bir VNC sunucusu +# URL: http://www.gnome.org +# Paketçi: yasarciv67@gmail.com +# Gerekler: gconf libsoup telepathy-glib desktop-file-utils libnotify desktop-file-utils + +isim=vino +surum=3.22.0 +devir=1 + +kaynak=(http://download.gnome.org/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum +./configure --prefix=/usr --sysconfdir=/etc + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/v/vino/vino.kur-kos b/talimatname/genel/v/vino/vino.kur-kos new file mode 100644 index 000000000..7b04491d7 --- /dev/null +++ b/talimatname/genel/v/vino/vino.kur-kos @@ -0,0 +1,2 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas +update-desktop-database -q diff --git a/talimatname/genel/v/virtualbox-cli/talimat b/talimatname/genel/v/virtualbox-cli/talimat new file mode 100644 index 000000000..51a441551 --- /dev/null +++ b/talimatname/genel/v/virtualbox-cli/talimat @@ -0,0 +1,49 @@ +# Tanım: VirtualBox, güçlü bir 32 ve 64 bit sanallaştırma ürünüdür +# URL: http://virtualbox.org +# Paketçi: milisarge +# Gerekler: + +builddevir=104815 +isim=virtualbox-cli +surum=5.0.12 +devir=1 + +[ "`uname -m`" == "i686" ] && _ARCH=x86 +[ "`uname -m`" == "x86_64" ] && _ARCH=amd64 + +kaynak=(http://download.virtualbox.org/virtualbox/${surum}/VirtualBox-${surum}-${buildrelease}-Linux_${_ARCH}.run) + +derle() { +sh VirtualBox-${surum}-${buildrelease}-Linux_${_ARCH}.run --target vb --keep --noexec +cd vb +tar xfj VirtualBox.tar.bz2 +cd src/vboxhost/ + +KERNELRELEASE=`uname -r` + +KERN_DIR=/usr/src/linux-${KERNELRELEASE%.*} make + +mkdir -p $PKG/lib/modules/${KERNELRELEASE}/kernel/drivers/zzzz +for i in *.ko +do + install -D -m0644 $i \ + $PKG/lib/modules/${KERNELRELEASE}/kernel/drivers/zzzz/$i +done +mkdir -p $PKG/etc/sysconfig/modules.d +cat > $PKG/etc/sysconfig/modules.d/virtualbox.conf << "EOF" +vboxdrv +vboxnetadp +vboxnetflt +vboxpci +EOF +# post-install autogen +cat > $PKGMK_ROOT/$isim.post-install << "EOF" +. lib/lsb/init-functions +log_success_msg "update modules population" +EOF +echo "depmod $KERNELRELEASE" >> $PKGMK_ROOT/$isim.post-install +cat >> $PKGMK_ROOT/$isim.post-install << "EOF" +log_warning_msg "${WARNING}Check the file /etc/sysconfig/modules.d/virtualbox.conf ${NORMAL}" +log_warning_msg "${WARNING}Reboot if you want the modules being automatically loaded${NORMAL}" +EOF +} diff --git a/talimatname/genel/v/virtualbox-cli/talimat~ b/talimatname/genel/v/virtualbox-cli/talimat~ new file mode 100644 index 000000000..5b172a8e3 --- /dev/null +++ b/talimatname/genel/v/virtualbox-cli/talimat~ @@ -0,0 +1,48 @@ +# Tanım: VirtualBox is a powerfull 32 and 64 bits virtualization product +# URL: http://virtualbox.org +# Paketçi: tnut at nutyx dot org + +builddevir=102546 +isim=virtualbox-cli +surum=5.0.4 +devir=2 + +[ "`uname -m`" == "i686" ] && _ARCH=x86 +[ "`uname -m`" == "x86_64" ] && _ARCH=amd64 + +kaynak=(http://download.virtualbox.org/virtualbox/${surum}/VirtualBox-${surum}-${buildrelease}-Linux_${_ARCH}.run) + +derle() { +sh VirtualBox-${surum}-${buildrelease}-Linux_${_ARCH}.run --target vb --keep --noexec +cd vb +tar xfj VirtualBox.tar.bz2 +cd src/vboxhost/ + +KERNELRELEASE=`uname -r` + +KERN_DIR=/usr/src/linux-${KERNELRELEASE%.*} make + +mkdir -p $PKG/lib/modules/${KERNELRELEASE}/kernel/drivers/zzzz +for i in *.ko +do + install -D -m0644 $i \ + $PKG/lib/modules/${KERNELRELEASE}/kernel/drivers/zzzz/$i +done +mkdir -p $PKG/etc/sysconfig/modules.d +cat > $PKG/etc/sysconfig/modules.d/virtualbox.conf << "EOF" +vboxdrv +vboxnetadp +vboxnetflt +vboxpci +EOF +# post-install autogen +cat > $PKGMK_ROOT/$isim.post-install << "EOF" +. lib/lsb/init-functions +log_success_msg "update modules population" +EOF +echo "depmod $KERNELRELEASE" >> $PKGMK_ROOT/$isim.post-install +cat >> $PKGMK_ROOT/$isim.post-install << "EOF" +log_warning_msg "${WARNING}Check the file /etc/modprobe.d/virtualbox.conf ${NORMAL}" +log_warning_msg "${WARNING}Reboot if you want the modules being automatically loaded${NORMAL}" +EOF +} diff --git a/talimatname/genel/v/virtualbox-cli/virtualbox-cli.kos-kur b/talimatname/genel/v/virtualbox-cli/virtualbox-cli.kos-kur new file mode 100644 index 000000000..c345d6f32 --- /dev/null +++ b/talimatname/genel/v/virtualbox-cli/virtualbox-cli.kos-kur @@ -0,0 +1,5 @@ +. lib/lsb/init-functions +if [ -z "`cards list|grep kernel-lts\ `" ]; then + log_warning_msg "${WARNING}kernel-lts${NORMAL} is not installed" + log_warning_msg "${WARNING}Either recompile the 'virtualbox-cli' package with your kernel, either using the kernel 'kernel-LTS" +fi diff --git a/talimatname/genel/v/virtualbox/talimat b/talimatname/genel/v/virtualbox/talimat new file mode 100644 index 000000000..d7e25f18a --- /dev/null +++ b/talimatname/genel/v/virtualbox/talimat @@ -0,0 +1,58 @@ +# Tanım: VirtualBox, güçlü bir 32 ve 64 bit sanallaştırma ürünüdür +# URL: http://virtualbox.org +# Paketçi: milisarge +# Gerekler: virtualbox-cli sdl + +isim=virtualbox +surum=5.0.12 +devir=1 +_isim=Oracle_VM_VirtualBox_Extension_Pack +_devir=104815 + +DOSYAIZLEME_YOKSAY="evet" +MD5SUM_YOKSAY="evet" + + +[ "`uname -m`" == "i686" ] && _ARCH=x86 +[ "`uname -m`" == "x86_64" ] && _ARCH=amd64 + +kaynak=(http://download.virtualbox.org/virtualbox/$surum/VirtualBox-${surum}-${_release}-Linux_${_ARCH}.run + http://download.virtualbox.org/virtualbox/$surum/${_name}-${surum}-${_release}.vbox-extpack + virtualbox.60-vboxdrv.rules) + +derle() { + sh VirtualBox-${surum}-${_release}-Linux_${_ARCH}.run --keep --noexec --target $SRC/ + mkdir -p $PKG/opt/VirtualBox $PKG/etc/vbox $PKG/usr/bin $PKG/etc/udev/rules.d/ \ + $PKG/usr/share/applications/ $PKG/usr/share/pixmaps/ + cd $PKG/opt/VirtualBox + tar xfj $SRC/VirtualBox.tar.bz2 + rm -Rf $PKG/opt/VirtualBox/sdk + for i in VirtualBox VBoxManage VBoxSDL VBoxHeadless + do ln -s /opt/VirtualBox/VBox.sh $PKG/usr/bin/$i + done + cd components + for i in VBoxDDU.so VBoxREM.so VBoxRT.so VBoxVMM.so VBoxXPCOM.so + do ln -s ../$i . + done + ln -s /opt/VirtualBox/rdesktop-vrdp $PKG/usr/bin/rdesktop-vrdp + mv $PKG/opt/VirtualBox/VBox.png $PKG/usr/share/pixmaps/VBox.png + mv $PKG/opt/VirtualBox/virtualbox.desktop $PKG/usr/share/applications/virtualbox.desktop + chmod +s $PKG/opt/VirtualBox/{VirtualBox,VBoxSDL,VBoxHeadless} + + mkdir -p $PKG/etc/udev/rules.d + cp $SRC/virtualbox.60-vboxdrv.rules $PKG/etc/udev/rules.d/60-vboxdrv.rules + + echo "# VirtualBox installation directory" > \ + $PKG/etc/vbox/vbox.cfg + echo "INSTALL_DIR="\"/opt/VirtualBox\" >> \ + $PKG/etc/vbox/vbox.cfg + + install -D -m 644 $SRC/${_name}-$surum-${_release}.vbox-extpack \ + $PKG/opt/VirtualBox/ExtensionPacks/${_name}-$surum-${_release}.vbox-extpack + mkdir -p $PKG/etc/ld.so.conf.d + echo /opt/VirtualBox > $PKG/etc/ld.so.conf.d/virtualbox.conf + # Icon + ln -s VBox.png $PKG/usr/share/pixmaps/virtualbox.png + # Source code files obsolet + rm -r $PKG/opt/VirtualBox/src +} diff --git a/talimatname/genel/v/virtualbox/virtualbox.60-vboxdrv.rules b/talimatname/genel/v/virtualbox/virtualbox.60-vboxdrv.rules new file mode 100644 index 000000000..f8b7cdf0a --- /dev/null +++ b/talimatname/genel/v/virtualbox/virtualbox.60-vboxdrv.rules @@ -0,0 +1,8 @@ +KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600" +KERNEL=="vboxdrvu", NAME="vboxdrvu", OWNER="root", GROUP="root", MODE="0666" +KERNEL=="vboxnetctl", NAME="vboxnetctl", OWNER="root", GROUP="root", MODE="0600" + +SUBSYSTEM=="usb_device", ACTION=="add", RUN+="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers" +SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers" +SUBSYSTEM=="usb_device", ACTION=="remove", RUN+="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor" +SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor" diff --git a/talimatname/genel/v/virtualbox/virtualbox.kur-kos b/talimatname/genel/v/virtualbox/virtualbox.kur-kos new file mode 100644 index 000000000..0dd5c32c5 --- /dev/null +++ b/talimatname/genel/v/virtualbox/virtualbox.kur-kos @@ -0,0 +1,13 @@ +echo "For USB 2.0 facility, on the console: + +# VBoxManage extpack install /opt/VirtualBox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack-* + +To remove USB 2.0 Oracle extensions before an update: + +# VBoxManage list extpacks +# VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack" +# VBoxManage extpack cleanup + +Then you can install the new version as above. No need to reboot. + +Enjoy it :)" diff --git a/talimatname/genel/v/virtualbox/virtualbox.okubeni b/talimatname/genel/v/virtualbox/virtualbox.okubeni new file mode 100644 index 000000000..c877dd8a9 --- /dev/null +++ b/talimatname/genel/v/virtualbox/virtualbox.okubeni @@ -0,0 +1,13 @@ +For USB 2.0 facility, on the console: + +# VBoxManage extpack install /opt/VirtualBox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack-* + +To remove USB 2.0 Oracle extensions before an update: + +# VBoxManage list extpacks +# VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack" +# VBoxManage extpack cleanup + +Then you can install the new version as above. No need to reboot. + +Enjoy it :) diff --git a/talimatname/genel/v/virtualgl/talimat b/talimatname/genel/v/virtualgl/talimat new file mode 100644 index 000000000..81472b981 --- /dev/null +++ b/talimatname/genel/v/virtualgl/talimat @@ -0,0 +1,28 @@ +# Tanım: opengl kullanan bir uygulamadan opengl ekran kartına 3d komut iletir +# URL: http://virtualgl.org +# Paketçi: milisarge +# Gerekler: xorg-libxv xorg-glu libjpeg-turbo xorg-xcb-util-keysyms + +isim=virtualgl +surum=2.5.2 +devir=1 +kaynak=(https://github.com/VirtualGL/$isim/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + + cmake . \ + -DCMAKE_BINARY_DIR=/usr \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_DEFAULT_LIBDIR=lib \ + -DCMAKE_SYSTEM_PROCESSOR=x86_64 + + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share + + rm -rf $PKG/usr/bin/.vglrun.vars64 + + mv $PKG/usr/bin/glxinfo $PKG/usr/bin/vglxinfo +} diff --git a/talimatname/genel/v/vlc/lua53_compat.patch b/talimatname/genel/v/vlc/lua53_compat.patch new file mode 100644 index 000000000..aeff7b2fd --- /dev/null +++ b/talimatname/genel/v/vlc/lua53_compat.patch @@ -0,0 +1,30 @@ +commit 41caaa08cde60c4fec4bf2e5f9610e2a1b9e6a23 +Author: Vinson Lee +Date: Thu Feb 5 14:48:53 2015 -0800 + + lua: Define LUA_COMPAT_APIINTCASTS for Lua >= 5.3.0 compatibility. + + In Lua 5.3.0, luaL_checkint was deprecated. + + This patch fixes this build error with Lua 5.3.0. + + lua/demux.c: In function ‘vlclua_demux_peek’: + lua/demux.c:55:5: error: implicit declaration of function ‘luaL_checkint’ [-Werror=implicit-function-declaration] + int n = luaL_checkint( L, 1 ); + ^ + + Signed-off-by: Vinson Lee + Signed-off-by: Jean-Baptiste Kempf + +diff --git a/modules/lua/vlc.h b/modules/lua/vlc.h +index efd94f1..85c7fc1 100644 +--- a/modules/lua/vlc.h ++++ b/modules/lua/vlc.h +@@ -38,6 +38,7 @@ + #include + #include + ++#define LUA_COMPAT_APIINTCASTS + #define LUA_COMPAT_MODULE + #include /* Low level lua C API */ + #include /* Higher level C API */ diff --git a/talimatname/genel/v/vlc/talimat b/talimatname/genel/v/vlc/talimat new file mode 100644 index 000000000..51e2dc1c5 --- /dev/null +++ b/talimatname/genel/v/vlc/talimat @@ -0,0 +1,56 @@ +# Tanım: VLC, özgür ve açık kaynak kodlu, platformlar arası, bir ortam oynatıcı ve çatıdır. +# URL: http://www.videolan.org/vlc/ +# Paketçi: milisarge +# Gerekler: opus libssh2 qt5 x264 flac libmad glib dbus libupnp libvlc libidn librsvg alsa-lib xorg-libxinerama xorg-libxpm libvpx libcdio vcdimager live libdvdcss libdvdread libdvdnav libogg libtheora lame faac libvorbis ffmpeg28 faad2 liba52 libmpeg2 libmpcdec fribidi lua libdv speex + +isim=vlc +surum=2.2.8 +devir=1 + +kaynak=(https://download.videolan.org/${isim}/${surum}/${isim}-${surum}.tar.xz + lua53_compat.patch) + +derle() { + + cd $isim-$surum + sed -i -e 's:truetype/freefont:TTF:g' modules/text_renderer/freetype.c + sed -i -e 's:truetype/ttf-dejavu:TTF:g' modules/visualization/projectm.cpp + patch -p1 < "${SRC}/lua53_compat.patch" + + sed -i 's/^Exec=/Name[tr]=VLC Medya Oynatıcı \ +GenericName[tr]=Medya Oynatıcı \ +Comment[tr]=Multimedya akışlarınızı okur,yakalar,yayınlar \ +&/' $SRC/$isim-$surum/share/vlc.desktop.in + + sed -i '/seems to be moved/s/^/#/' autotools/ltmain.sh + export PKG_CONFIG_PATH="/usr/lib/ffmpeg2.8/pkgconfig" + export CXXFLAGS+=" -std=c++11" + export LUAC=/usr/bin/luac + export LUA_LIBS="`pkg-config --libs lua`" + export RCC=/usr/bin/rcc-qt5 + + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --disable-rpath \ + --enable-faad \ + --enable-nls \ + --enable-lirc \ + --enable-ncurses \ + --enable-realrtsp \ + --enable-aa \ + --enable-vcdx \ + --enable-upnp \ + --enable-bluray \ + --enable-opus \ + --enable-sftp + sed -i '/354/s/.*/#define QT_XMAS_JOKE_DAY 666/' $SRC/$isim-$surum/modules/gui/qt4/qt4.hpp + sed -i -e 's/\'--owner=root'\>//g' share/Makefile + sed -i -e 's/\'--group=root'\>//g' share/Makefile + make + make DESTDIR=$PKG install + for res in 16 32 48 128; do + install -Dm 644 "${SRC}/vlc-${surum}/share/icons/${res}x${res}/vlc.png" \ + "${PKG}/usr/share/icons/hicolor/${res}x${res}/apps/vlc.png" + done + +} diff --git a/talimatname/genel/v/vlc/vlc.kur-kos b/talimatname/genel/v/vlc/vlc.kur-kos new file mode 100644 index 000000000..91f401b98 --- /dev/null +++ b/talimatname/genel/v/vlc/vlc.kur-kos @@ -0,0 +1,9 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null +/usr/lib/vlc/vlc-cache-gen -f /usr/lib/vlc/plugins + +cp /usr/bin/vlc /usr/bin/vlc-backup + +needle=$(objdump -d /usr/bin/vlc | grep euid | tail -1 | awk '{print "\\x"$2"\\x"$3"\\x"$4"\\x"$5"\\x"$6;}') + +sed -ir "s/$needle/\xb8\x01\x00\x00\x00/" /usr/bin/vlc + diff --git a/talimatname/genel/v/vmware/Makefile b/talimatname/genel/v/vmware/Makefile new file mode 100644 index 000000000..4b5899215 --- /dev/null +++ b/talimatname/genel/v/vmware/Makefile @@ -0,0 +1,24 @@ +#!/usr/bin/make -f + +MODULES = \ + vmmon \ + vmnet \ + #vmblock \ + #vmci \ + #vsock + +all: $(foreach m, $(MODULES), $m.ko) + +%.ko: % + $(MAKE) KVERSION=$(KVERSION) VM_KBUILD=yes -C $*-only + +$(MODULES): %: + cp -r $(SRCDIR)/$*-only $*-only + +vsock.ko: vmci.ko + +clean: + rm -rf $(MODULES) + rm -rf $(foreach m, $(MODULES), $m-only) + rm -f $(foreach m, $(MODULES), $m.ko) + rm -f $(foreach m, $(MODULES), $m.o) diff --git a/talimatname/genel/v/vmware/bootstrap b/talimatname/genel/v/vmware/bootstrap new file mode 100644 index 000000000..981b82191 --- /dev/null +++ b/talimatname/genel/v/vmware/bootstrap @@ -0,0 +1,11 @@ +PREFIX="/usr" +BINDIR="/usr/bin" +SBINDIR="/usr/sbin" +LIBDIR="/usr/lib" +DATADIR="/usr/share" +SYSCONFDIR="/etc" +DOCDIR="/usr/share/doc" +MANDIR="/usr/share/man" +INCLUDEDIR="/usr/include" +INITDIR="" +INITSCRIPTDIR="/usr/lib/systemd/scripts" diff --git a/talimatname/genel/v/vmware/config b/talimatname/genel/v/vmware/config new file mode 100644 index 000000000..cab1f3338 --- /dev/null +++ b/talimatname/genel/v/vmware/config @@ -0,0 +1,25 @@ +.encoding = "UTF-8" +VMCI_CONFED = "yes" +NETWORKING = "yes" +VMBLOCK_CONFED = "yes" +authd.fullpath = "/usr/bin/vmware-authd" +gksu.rootMethod = "su" +VSOCK_CONFED = "yes" +libdir = "/usr/lib/vmware" +bindir = "/usr/bin" +vmware.fullpath = "/usr/bin/vmware" +vix.libdir = "/usr/lib/vmware-vix" +installerDefaults.componentDownloadEnabled = "no" +installerDefaults.autoSoftwareUpdateEnabled.epoch = "4641104763" +vix.config.version = "1" +player.product.version = "14.0.0" +installerDefaults.dataCollectionEnabled.epoch = "7910652514" +installerDefaults.dataCollectionEnabled = "no" +installerDefaults.transferVersion = "1" +installerDefaults.autoSoftwareUpdateEnabled = "no" +product.buildNumber = "6661328" +authd.client.port = "902" +authd.proxy.nfc = "vmware-hostd:ha-nfc" +product.version = "14.0.0" +workstation.product.version = "14.0.0" +product.name = "VMware Workstation" diff --git a/talimatname/genel/v/vmware/config.xml b/talimatname/genel/v/vmware/config.xml new file mode 100644 index 000000000..68f851ad7 --- /dev/null +++ b/talimatname/genel/v/vmware/config.xml @@ -0,0 +1,880 @@ + + + + + ./ + + + /etc/vmware/ + + + /usr/lib/vmware + + + + + + + + + + + + + + + + + + + + + + + + 32 + + + ws + + + + false + + 128 + + + + + + + + + /var/log/vmware/ + + + hostd + + + true + + + false + + + + + + + + Hostd + + + local4 + + + /var/run/vmware/hostdLogHeader.txt + + + + + + + + + + + verbose + + + + + + + + + + + + + false + + + + SoapAdapter.HTTPService + info + false + + + + TCP + error + false + + + + + + + + + + + /etc/vmware/ssl/rui.key + + + /etc/vmware/ssl/rui.crt + + + + + + + /vmimages + + + + + + + + + + + + + + + + + + + + ./ + + + 2 + 32 + 2 + 12 + 2048 + 8 + 600 + 256 + hostd + + + + + + + + + + + + + + + + + + + + + false + /usr/lib/vmware + + + + + + + + + + + + + + + 128 + + + + + + + + + + + + + true + + + false + + + + + + + + 104857600 + + 524288 + + 1000 + + + + + + + + + + + + + + + + /etc/vmware/hostd/dispatcher.xml + + + /etc/vmware/hostd/tagExtractor.xml + + + + + libvimsvc.so + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + true + + hostsvc solo + + + + libhostsvc.so + + + vfc + 0 + 30 + + + + + + + + + + + + + + + + + false + + + /etc/vmware/hostd/mockup-host-config.xml + + /etc/vmware/hostd/vmResources.xml + + + + + + + + + /etc/vmware/service/ + + + + + + + + + + + + + + + 120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /etc/vmware/netmap.conf + + + + + false + 5 + 100 + 30 + + + + libvmsvc.so + + false + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + vimsvc + + + + libvcsvc.so + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hostsvc + + + + libsolo.so + + false + + + + /etc/vmware/hostd/environments.xml + + + /etc/vmware/hostd/vmInventory.xml + + + + + + + + + /etc/vmware/hostd/env/provisioningPolicy.xml + + + /etc/vmware/hostd/hwInfo.xml + + + + + + + + + + + + + + + + + + 8307 + + + + + + + false + + + + + + + + + verbose + + + + + + + + + + + + + disklib + 0 + + + + + + + + + + + + /usr/lib/vmware/hostd/docroot/ + /usr/lib/vmware/hostd/cgi-bin/ + + + + + + + + + + + false + + + true + ha-dynamic-type-manager-python + soap-stdio + + /usr/bin/sh + -l + -c + /usr/bin/python -m PyVmomiServer -g --loglevel info -s PyVmomiServer + + + + + false + ha-dynamic-type-manager-vapi + soap-http + + 8088 + /usr/bin/sh + -l + -c + /sbin/vapid -s vapid + + + + + true + ha-dynamic-type-manager-local-cli + vmware-cli + + /usr/lib/vmware/esxcli + + + + + + + + + + hostsvc + + + + + libproxysvc.so + + + /etc/vmware/hostd/proxy.xml + + /etc/vmware/rhttpproxy/endpoints.conf + hostsvc + + + + + libstatssvc.so + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libpartitionsvc.so + false + + + + libinternalsvc.so + hostsvc + + + + + libnfcsvc.so + true + + false + + + + + false + libsnmpsvc.so + + + + libblklistsvc.so + false + + + + + + libcimsvc.so + false + 40 + 90 + + + + libdirectorysvc.so + false + + false + + + + + libvdisksvc.so + false + + false + + + + + libvslmsvc.so + false + + false + + + + + libhttpnfcsvc.so + false + + false + + proxysvc + + + + libovfmgrsvc.so + true + + + + libdynsvc.so + false + true + + + + libguestsvc.so + false + + + + libhbrsvc.so + false + + + false + + vmsvc + + + + libcbrcsvc.so + false + + + + libhostspecsvc.so + false + + + + + + + + + + + \ No newline at end of file diff --git a/talimatname/genel/v/vmware/datastores.xml b/talimatname/genel/v/vmware/datastores.xml new file mode 100644 index 000000000..a457a9524 --- /dev/null +++ b/talimatname/genel/v/vmware/datastores.xml @@ -0,0 +1,16 @@ + + + <_length>1 + <_type>hostd.host.LocalDatastoreEntry[] + + <_type>hostd.host.LocalDatastoreEntry + 1 + standard + /var/lib/vmware/Shared VMs + + + + <_length>0 + <_type>hostd.host.NasDatastoreEntry[] + + \ No newline at end of file diff --git a/talimatname/genel/v/vmware/environments.xml b/talimatname/genel/v/vmware/environments.xml new file mode 100644 index 000000000..57a099d3a --- /dev/null +++ b/talimatname/genel/v/vmware/environments.xml @@ -0,0 +1,46 @@ + + + /etc/vmware/hostd/env/ws-hw3.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw3.xml + + + /etc/vmware/hostd/env/ws-hw4.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw4.xml + + + /etc/vmware/hostd/env/ws-hw6.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw6.xml + + + /etc/vmware/hostd/env/ws-hw7.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw7.xml + + + /etc/vmware/hostd/env/ws-hw8.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw8.xml + + + /etc/vmware/hostd/env/ws-hw9.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw9.xml + + + /etc/vmware/hostd/env/ws-hw10.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw10.xml + + + /etc/vmware/hostd/env/ws-hw11.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw11.xml + + + /etc/vmware/hostd/env/ws-hw12.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw12.xml + + + /etc/vmware/hostd/env/ws-hw13.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw13.xml + + + /etc/vmware/hostd/env/ws-hw14.xml + /etc/vmware/hostd/env/vmconfigoption-ws-hw14.xml + + diff --git a/talimatname/genel/v/vmware/pam.d-vmware-authd b/talimatname/genel/v/vmware/pam.d-vmware-authd new file mode 100644 index 000000000..44391264e --- /dev/null +++ b/talimatname/genel/v/vmware/pam.d-vmware-authd @@ -0,0 +1,5 @@ +#%PAM-1.0 +auth required pam_unix.so +account required pam_unix.so +password required pam_permit.so +session required pam_unix.so diff --git a/talimatname/genel/v/vmware/proxy.xml b/talimatname/genel/v/vmware/proxy.xml new file mode 100644 index 000000000..d9ab50398 --- /dev/null +++ b/talimatname/genel/v/vmware/proxy.xml @@ -0,0 +1,50 @@ + + -1 + 443 + + <_length>7 + <_type>vim.ProxyService.EndpointSpec[] + + <_type>vim.ProxyService.NamedPipeServiceSpec + httpAndHttps + /var/run/vmware/proxy-webserver + / + + + <_type>vim.ProxyService.LocalServiceSpec + httpsWithRedirect + 8307 + /sdk + + + <_type>vim.ProxyService.LocalServiceSpec + httpsWithRedirect + 8308 + /ui + + + <_type>vim.ProxyService.NamedPipeServiceSpec + httpsOnly + /var/run/vmware/proxy-vpxa + /vpxa + + + <_type>vim.ProxyService.NamedPipeServiceSpec + httpsWithRedirect + /var/run/vmware/proxy-mob + /mob + + + <_type>vim.ProxyService.LocalServiceSpec + httpAndHttps + 12001 + /ha-nfc + + + <_type>vim.ProxyService.LocalServiceSpec + httpAndHttps + 12000 + /nfc + + + diff --git a/talimatname/genel/v/vmware/talimat b/talimatname/genel/v/vmware/talimat new file mode 100644 index 000000000..152e1d98d --- /dev/null +++ b/talimatname/genel/v/vmware/talimat @@ -0,0 +1,234 @@ +# Tanım: Vmware sanal makine uygulaması +# URL: https://www.vmware.com/products/workstation-for-linux.html +# Paketçi: milisarge +# Gerekler: sqlite3 xorg-app +# Grup: sistem + +isim=vmware +surum=14.1.1 +devir=1 +_derlemeno=7528167 +_surum=${surum}_${_derlemeno} +kaynak=(https://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-${_surum/_/-}.x86_64.bundle + vmware-vix-bootstrap + config + bootstrap + pam.d-vmware-authd + vmware-environment.sh + config.xml + datastores.xml + environments.xml + proxy.xml + Makefile + vmmon.patch + vmnet.patch) + +derle() { + extracted_dir="$SRC/extracted" + + [[ -d "$extracted_dir" ]] && rm -r "$extracted_dir" + + bash $(readlink -f "$SRC/VMware-Workstation-Full-${_surum/_/-}.x86_64.bundle") --extract "$extracted_dir" + local vmware_installer_version=$(cat "$SRC/extracted/vmware-installer/manifest.xml" | grep -oPm1 "(?<=)[^<]+") + + mkdir -p \ + "$PKG/etc"/{cups,pam.d,modprobe.d,profile.d,thnuclnt,vmware} \ + "$PKG/usr"/{share,bin} \ + "$PKG/usr/include/vmware-vix" \ + "$PKG/usr/lib"/{vmware/{setup,lib/libvmware-vim-cmd.so},vmware-vix,vmware-ovftool,vmware-installer/"$vmware_installer_version",cups/filter,modules-load.d} \ + "$PKG/usr/share"/{doc/vmware-vix,licenses/"$isim"} \ + "$PKG/var/lib/vmware/Shared VMs" + + cd "$SRC/extracted" + + cp -r \ + vmware-workstation/share/* \ + vmware-workstation/man \ + vmware-network-editor-ui/share/* \ + vmware-player-app/share/* \ + "$PKG/usr/share" + + cp -r \ + vmware-workstation/bin/* \ + vmware-vmx/{,s}bin/* \ + vmware-vix-core/bin/* \ + vmware-vprobe/bin/* \ + vmware-workstation-server/{vmware-hostd,vmware-vim-cmd,vmware-wssc-adminTool} \ + vmware-network-editor-ui/bin/* \ + vmware-player-app/bin/* \ + "$PKG/usr/bin" + + cp -r \ + vmware-workstation/lib/* \ + vmware-player-app/lib/* \ + vmware-vmx/{lib/*,roms} \ + vmware-vprobe/lib/* \ + vmware-workstation-server/{bin,lib,hostd} \ + vmware-usbarbitrator/bin \ + vmware-network-editor/lib \ + "$PKG/usr/lib/vmware" + + cp -r \ + vmware-player-setup/vmware-config \ + "$PKG/usr/lib/vmware/setup" + + cp -rL \ + vmware-workstation-server/config/etc/vmware/* \ + vmware-workstation-server/etc/vmware/* \ + "$SRC"/{bootstrap,config} \ + "$PKG/etc/vmware" + + cp -r \ + vmware-vix-lib-Workstation1400/lib/Workstation-14.0.0 \ + vmware-vix-core/{lib/*,vixwrapper-config.txt} \ + "$PKG/usr/lib/vmware-vix" + cp vmware-vix-core/vix-perl.tar.nogz "$PKG/usr/lib/vmware-vix/vix-perl.tar.gz" + + cp -r \ + vmware-vix-core/doc/* \ + "$PKG/usr/share/doc/vmware-vix" + + cp -r \ + vmware-ovftool/* \ + "$PKG/usr/lib/vmware-ovftool" + + cp -r \ + vmware-installer/{python,sopython,vmis,vmis-launcher,vmware-installer,vmware-installer.py} \ + "$PKG/usr/lib/vmware-installer/$vmware_installer_version" + + cp -r \ + vmware-player-app/etc/cups/* \ + "$PKG/etc/cups" + cp -r \ + vmware-player-app/extras/.thnumod \ + "$PKG/etc/thnuclnt" + cp -r \ + vmware-player-app/extras/thnucups \ + "$PKG/usr/lib/cups/filter" + + cp -r \ + vmware-vix-core/include/* \ + "$PKG/usr/include/vmware-vix" + + install -Dm 644 "vmware-workstation/doc/EULA" "$PKG/usr/share/licenses/$isim/VMware Workstation - EULA.txt" + install -Dm 644 "vmware-workstation/doc"/*open_source_licenses.txt "$PKG/usr/share/licenses/$isim" + mv "$PKG/usr/lib/vmware-ovftool/vmware.eula" "$PKG/usr/share/licenses/$isim/VMware OVF Tool component for Linux - EULA.txt" + rm "$PKG/usr/lib/vmware-ovftool"/{vmware-eula.rtf,open_source_licenses.txt,manifest.xml} + + install -Dm 644 "vmware-vmx/etc/modprobe.d/modprobe-vmware-fuse.conf" "$PKG/etc/modprobe.d/vmware-fuse.conf" + + install -Dm 644 vmware-player-app/lib/isoimages/tools-key.pub "$PKG/usr/lib/vmware/isoimages/tools-key.pub" + + install -Dm 644 vmware-vmx/extra/modules.xml "$PKG/usr/lib/vmware/modules/modules.xml" + install -Dm 644 vmware-installer/bootstrap "$PKG/etc/vmware-installer/bootstrap" + install -Dm 644 "$SRC/vmware-vix-bootstrap" "$PKG/etc/vmware-vix/bootstrap" + + for hostd_file in config datastores environments proxy; do + install -Dm 644 "$SRC/$hostd_file.xml" "$PKG/etc/vmware/hostd/$hostd_file.xml" + done + + install -Dm 644 "$SRC/pam.d-vmware-authd" "$PKG/etc/pam.d/vmware-authd" + + echo -e "vmw_vmci\nvmmon" > "$PKG/usr/lib/modules-load.d/vmware.conf" + + chmod +x \ + "$PKG/usr/bin"/* \ + "$PKG/usr/lib/vmware/bin"/* \ + "$PKG/usr/lib/vmware/setup"/* \ + "$PKG/usr/lib/vmware/lib"/libvmware-gksu.so/gksu-run-helper \ + "$PKG/usr/lib/vmware-ovftool"/{ovftool,ovftool.bin} \ + "$PKG/usr/lib/vmware-installer/$vmware_installer_version"/{vmware-installer,vmis-launcher} \ + "$PKG/usr/lib/cups/filter"/* \ + "$PKG/usr/lib/vmware-vix/setup"/* \ + "$PKG/etc/thnuclnt/.thnumod" + + chmod -R 600 "$PKG/etc/vmware/ssl" + chmod +s \ + "$PKG/usr/bin"/vmware-authd \ + "$PKG/usr/lib/vmware/bin"/{vmware-vmx,vmware-vmx-debug,vmware-vmx-stats} + + # Add symlinks the installer would create. + + for link in \ + licenseTool \ + vmplayer \ + vmware \ + vmware-app-control \ + vmware-enter-serial \ + vmware-fuseUI \ + vmware-gksu \ + vmware-hostd \ + vmware-modconfig \ + vmware-modconfig-console \ + vmware-mount \ + vmware-netcfg \ + vmware-tray \ + vmware-vim-cmd \ + vmware-vmblock-fuse \ + vmware-vprobe \ + vmware-wssc-adminTool \ + vmware-zenity + do + ln -s /usr/lib/vmware/bin/appLoader "$PKG/usr/lib/vmware/bin/$link" + done + + for link in \ + vmware-mount \ + vmware-usbarbitrator + do + ln -s /usr/lib/vmware/bin/$link "$PKG/usr/bin/$link" + done + + ln -s /usr/lib/vmware/icu "$PKG/etc/vmware/icu" + ln -s /usr/lib/vmware/lib/diskLibWrapper.so/diskLibWrapper.so "$PKG/usr/lib/diskLibWrapper.so" + ln -s /usr/lib/vmware/lib/libvmware-hostd.so/libvmware-hostd.so "$PKG/usr/lib/vmware/lib/libvmware-vim-cmd.so/libvmware-vim-cmd.so" + ln -s /usr/lib/vmware-ovftool/ovftool "$PKG/usr/bin/ovftool" + ln -s /usr/lib/vmware-vix/libvixAllProducts.so "$PKG/usr/lib/libvixAllProducts.so" + + # Replace placeholder "variables" with real paths. + + for file in \ + gtk-3.0/gdk-pixbuf.loaders + do + sed -i 's,@@LIBCONF_DIR@@,/usr/lib/vmware/libconf,g' "$PKG/usr/lib/vmware/libconf/etc/$file" + done + + sed -i 's,@@BINARY@@,/usr/bin/vmware,' "$PKG/usr/share/applications/vmware-workstation.desktop" + sed -i 's,@@BINARY@@,/usr/bin/vmplayer,' "$PKG/usr/share/applications/vmware-player.desktop" + sed -i 's,@@BINARY@@,/usr/bin/vmware-netcfg,' "$PKG/usr/share/applications/vmware-netcfg.desktop" + + sed -i 's,@@AUTHD_PORT@@,902,' "$PKG/usr/lib/vmware/hostd/docroot/client/clients.xml" + + sed \ + -e "s/@@VERSION@@/$vmware_installer_version/" \ + -e "s,@@VMWARE_INSTALLER@@,/usr/lib/vmware-installer/$vmware_installer_version," \ + -i "$PKG/etc/vmware-installer/bootstrap" + + # Patch up the VMware kernel sources + + dkms_dir="$PKG/usr/src/$isim-$_surum" + + install -Dm 644 "$SRC/Makefile" "$dkms_dir/Makefile" + + for module in vmmon vmnet; do # vmblock vmci vsock + tar -xf "vmware-vmx/lib/modules/source/$module.tar" -C "$dkms_dir" + patch -p2 --read-only=ignore --directory="$dkms_dir/$module-only" < "$SRC/$module.patch" + done + + rm -r "$PKG/usr/lib/vmware/modules/source" + + local database_filename="$PKG/etc/vmware-installer/database" + echo -n "" > "$database_filename" + + sqlite3 "$database_filename" "CREATE TABLE settings(key VARCHAR PRIMARY KEY, value VARCHAR NOT NULL, component_name VARCHAR NOT NULL);" + sqlite3 "$database_filename" "INSERT INTO settings(key,value,component_name) VALUES('db.schemaVersion','2','vmware-installer');" + sqlite3 "$database_filename" "CREATE TABLE components(id INTEGER PRIMARY KEY, name VARCHAR NOT NULL, version VARCHAR NOT NULL, buildNumber INTEGER NOT NULL, component_core_id INTEGER NOT NULL, longName VARCHAR NOT NULL, description VARCHAR, type INTEGER NOT NULL);" + + # Define some environment variables for VMware and remove the tests about kernel modules + install -Dm 644 "$SRC/vmware-environment.sh" "$PKG/etc/conf.d/vmware" + for program in vmware vmplayer vmware-netcfg vmware-tray; do + sed -e '/export PRODUCT_NAME/asource /etc/conf.d/vmware' \ + -e 's/if "$BINDIR"\/vmware-modconfig --appname=.*/if true ||/' \ + -i "$PKG/usr/bin/$program" + done +} diff --git a/talimatname/genel/v/vmware/vmmon.patch b/talimatname/genel/v/vmware/vmmon.patch new file mode 100644 index 000000000..d69f3135c --- /dev/null +++ b/talimatname/genel/v/vmware/vmmon.patch @@ -0,0 +1,16 @@ +diff --git a/vmmon/Makefile b/vmmon/Makefile +index de8162e..6124a71 100644 +--- a/vmmon/Makefile ++++ b/vmmon/Makefile +@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared + endif + + ++ifdef KVERSION ++VM_UNAME = $(KVERSION) ++else + VM_UNAME = $(shell uname -r) ++endif + + # Header directory for the running kernel + ifdef LINUXINCLUDE diff --git a/talimatname/genel/v/vmware/vmnet.patch b/talimatname/genel/v/vmware/vmnet.patch new file mode 100644 index 000000000..d2c620705 --- /dev/null +++ b/talimatname/genel/v/vmware/vmnet.patch @@ -0,0 +1,16 @@ +diff --git a/vmnet/Makefile b/vmnet/Makefile +index 459846e..cd29652 100644 +--- a/vmnet/Makefile ++++ b/vmnet/Makefile +@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared + endif + + ++ifdef KVERSION ++VM_UNAME = $(KVERSION) ++else + VM_UNAME = $(shell uname -r) ++endif + + # Header directory for the running kernel + ifdef LINUXINCLUDE diff --git a/talimatname/genel/v/vmware/vmware-environment.sh b/talimatname/genel/v/vmware/vmware-environment.sh new file mode 100644 index 000000000..a6f550a61 --- /dev/null +++ b/talimatname/genel/v/vmware/vmware-environment.sh @@ -0,0 +1,9 @@ +# Uncomment the line below if you have a problem of incompatible libraries +#export VMWARE_USE_SHIPPED_LIBS=yes + +# Uncomment and fill the line below to change GTK theme +#export GTK_THEME="" + + +# Avoid an issue with some keyboard layouts using iBus +export GTK_IM_MODULE_FILE=/dev/null diff --git a/talimatname/genel/v/vmware/vmware-vix-bootstrap b/talimatname/genel/v/vmware/vmware-vix-bootstrap new file mode 100644 index 000000000..425074de8 --- /dev/null +++ b/talimatname/genel/v/vmware/vmware-vix-bootstrap @@ -0,0 +1,2 @@ +BINDIR="/usr/bin" + diff --git a/talimatname/genel/v/vmware/vmware.kur-kos b/talimatname/genel/v/vmware/vmware.kur-kos new file mode 100644 index 000000000..011454eda --- /dev/null +++ b/talimatname/genel/v/vmware/vmware.kur-kos @@ -0,0 +1,16 @@ +#!/bin/sh +mkdir -p /lib/modules/$(uname -r)/extra +[ -f /sources/milis.git/ayarlar/moduller/vmci.ko ] && cp /sources/milis.git/ayarlar/moduller/vmci.ko /lib/modules/$(uname -r)/extra/ +cd /usr/src/vmware-14* +[ -f /usr/src/linux-$(uname -r)/vmlinux ] && mv /usr/src/linux-$(uname -r)/vmlinux /opt +make KVERSION=$(uname -r) VM_KBUILD=yes -C vmmon-only +cp vmmon-only/vmmon.ko /lib/modules/$(uname -r)/extra/ + +make KVERSION=$(uname -r) VM_KBUILD=yes -C vmnet-only +cp vmnet-only/vmnet.ko /lib/modules/$(uname -r)/extra/ + +[ -f /opt/vmlinux ] && mv /opt/vmlinux /usr/src/linux-$(uname -r)/ +depmod +modprobe vmmon +modprobe vmnet +[ -f /lib/modules/$(uname -r)/extra/vmci.ko ] && modprobe vmci diff --git a/talimatname/genel/v/vokoscreen/desktop_file.patch b/talimatname/genel/v/vokoscreen/desktop_file.patch new file mode 100644 index 000000000..88541c0c0 --- /dev/null +++ b/talimatname/genel/v/vokoscreen/desktop_file.patch @@ -0,0 +1,15 @@ +--- a/applications/vokoscreen.desktop 2015-05-27 12:13:34.206233690 -0500 ++++ b/applications/vokoscreen.desktop 2015-05-27 12:16:02.223851764 -0500 +@@ -1,10 +1,10 @@ + [Desktop Entry] +-Comment=screencast ++Comment=An easy to use screencast creator + Exec=vokoscreen + Icon=vokoscreen + Name=vokoscreen + StartupNotify=false + Terminal=false + Type=Application +-Categories=AudioVideo;Recorder; ++Categories=AudioVideo;Recorder;Qt; + Keywords=Audio;Video;Recorder;Screencast; diff --git a/talimatname/genel/v/vokoscreen/fix_lrelease.patch b/talimatname/genel/v/vokoscreen/fix_lrelease.patch new file mode 100644 index 000000000..462bb819c --- /dev/null +++ b/talimatname/genel/v/vokoscreen/fix_lrelease.patch @@ -0,0 +1,12 @@ +diff -uprNEBZ --suppress-blank-empty a/vokoscreen.pro b/vokoscreen.pro +--- a/vokoscreen.pro 2016-04-19 04:48:55.000000000 -0500 ++++ b/vokoscreen.pro 2016-04-21 15:56:08.404677703 -0500 +@@ -27,7 +27,7 @@ TRANSLATIONS = $$files(language/vokoscre + !isEmpty(TRANSLATIONS) { + isEmpty(QMAKE_LRELEASE) { + win32: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe +- else: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease-qt5 ++ else: QMAKE_LRELEASE = $$[QT_INSTALL_PREFIX]/bin/lrelease-qt5 + } + isEmpty(TS_DIR):TS_DIR = language + TSQM.name = lrelease-qt5 ${QMAKE_FILE_IN} diff --git a/talimatname/genel/v/vokoscreen/talimat b/talimatname/genel/v/vokoscreen/talimat new file mode 100644 index 000000000..94fd548d9 --- /dev/null +++ b/talimatname/genel/v/vokoscreen/talimat @@ -0,0 +1,37 @@ +# Tanım: Kolay ekran çekim uygulaması +# URL: http://linuxecke.volkoh.de/vokoscreen/vokoscreen.html +# Paketçi: milisarge +# Gerekler: xorg-libxrandr v4l-utils qt5 ffmpeg lame lsof pulseaudio xdg-utils +# Grup: medya + +isim=vokoscreen +_surum=2.5.7-beta +surum=${_surum/-/.} +devir=1 + +kaynak=(https://github.com/vkohaupt/${isim}/archive/${_surum}.tar.gz::$isim-$surum.tar.gz + desktop_file.patch + fix_lrelease.patch) + +derle() { + + cd "${SRC}"/${isim}-${_surum} + + patch -Np1 < ../fix_lrelease.patch + patch -Np1 < ../desktop_file.patch + + sed -i 's/^Exec=/Name[tr]=Vokoscreen \ +GenericName[tr]=Ekran Kaydedici \ +Comment[tr]=Kullanımı kolay bir ekran kaydedici \ +&/' applications/$isim.desktop + + mkdir -p "${SRC}"/build + cd "${SRC}"/build + qmake-qt5 ../${isim}-${_surum} \ + QMAKE_CFLAGS="${CFLAGS}" \ + QMAKE_CXXFLAGS="${CXXFLAGS}" \ + CONFIG+=release \ + CONFIG+=c++14 + make + make INSTALL_ROOT="${PKG}" install +} diff --git a/talimatname/genel/v/vpnc/talimat b/talimatname/genel/v/vpnc/talimat new file mode 100644 index 000000000..a790cdb3e --- /dev/null +++ b/talimatname/genel/v/vpnc/talimat @@ -0,0 +1,17 @@ +# Tanım: Cisco vpn konsantratörü için istemci +# URL: https://www.unix-ag.uni-kl.de/~massar/vpnc/ +# Paketçi: milisarge +# Gerekler: libgcrypt + +isim=vpnc +surum=0.5.3 +devir=1 +kaynak=(https://www.unix-ag.uni-kl.de/~massar/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + make + make DESTDIR=$PKG PREFIX=/usr MANDIR=/usr/share/man install + install -Dm755 vpnc-script $PKG/etc/vpnc/vpnc-script +} diff --git a/talimatname/genel/v/vte/talimat b/talimatname/genel/v/vte/talimat new file mode 100644 index 000000000..07a11f90e --- /dev/null +++ b/talimatname/genel/v/vte/talimat @@ -0,0 +1,21 @@ +# Tanım: Vte, GTK+ 2 için bir terminal emülatörü widget'ı uygulayan bir kitaplık (libvte) +# URL: http://developer.gnome.org/arch/gnome/widgets/vte.html +# Paketçi: milisarge +# Gerekler: gtk2 intltool gobject-introspection + +isim=vte +surum=0.28.2 +devir=1 + +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { +# build package +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/libexec/vte \ +--disable-static +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/v/vte3/talimat b/talimatname/genel/v/vte3/talimat new file mode 100644 index 000000000..4cc19f9c6 --- /dev/null +++ b/talimatname/genel/v/vte3/talimat @@ -0,0 +1,24 @@ +# Tanım: Vte GTK+3 için bir terminal emülatörü widget'ı uygulayan bir kitaplıktır +# URL: http://developer.gnome.org/arch/gnome/widgets/vte.html +# Paketçi: milisarge +# Gerekler: gtk3 perl-xml-parser python-gtk gobject-introspection pcre2 +# GRup: kütüphane + +isim=vte3 +surum=0.52.2 +devir=1 +_isim=vte +kaynak=(http://ftp.gnome.org/pub/gnome/sources/${_isim}/${surum%.*}/${_isim}-$surum.tar.xz) + +derle() { + cd ${_isim}-$surum + ./configure --prefix=/usr\ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/$isim \ + --enable-introspection \ + --with-xft2 \ + --with-pangox + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/v/vue/talimat b/talimatname/genel/v/vue/talimat new file mode 100644 index 000000000..3290d8c45 --- /dev/null +++ b/talimatname/genel/v/vue/talimat @@ -0,0 +1,48 @@ +# Tanım: Görsel Kavram Ortamı +# URL: https://github.com/VUE/VUE +# Paketçi: Cihan Alkan +# Gerekler: desktop-file-utils openjdk +# Grup: bilimsel + +isim=vue +surum=3.3.0 +devir=1 + +kaynak=(https://github.com/VUE/VUE/releases/download/$surum/VUE.jar +https://aur.archlinux.org/cgit/aur.git/plain/vue.png?h=vue) + +derle() { +install -Dm755 VUE.jar $PKG/opt/$isim/VUE.jar + +# Bin Dosyası +mkdir -pv $PKG/usr/bin && +cat > $PKG/usr/bin/vue << "EOF" && +#!/bin/sh + +exec java -jar /opt/vue/VUE.jar +EOF + +chmod 755 $PKG/usr/bin/vue +chmod +x $PKG/usr/bin/vue + +# desktop Dosyası +mkdir -pv $PKG/usr/share/applications && +cat > $PKG/usr/share/applications/vue.desktop << "EOF" && +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=VUE +Comment=Görsel Kavram Ortamı +Exec=vue +Icon=/opt/vue/vue.png +Categories=Office; +Terminal=false + +EOF + + + install -Dm644 vue.png?h=vue $PKG/opt/$isim/vue.png + + update-desktop-database -q + +} diff --git a/talimatname/genel/v/vuurmuur/talimat b/talimatname/genel/v/vuurmuur/talimat new file mode 100644 index 000000000..c3a27bc17 --- /dev/null +++ b/talimatname/genel/v/vuurmuur/talimat @@ -0,0 +1,178 @@ +# Tanım: iptables ayarlamaları için güçlü bir arayüz uygulaması +# URL: http://www.vuurmuur.org +# Paketçi: milisarge +# Gerekler: libnetfilter_log iptables libjpeg-turbo + +isim=vuurmuur +_isim=Vuurmuur +surum=0.8rc2 +devir=1 +kaynak=(ftp://ftp.vuurmuur.org/releases/$surum/$_name-$surum.tar.gz) + +derle() { + + + cd Vuurmuur-$surum + chown -R root:root . + for file in libvuurmuur vuurmuur vuurmuur_conf ; do + tar xfvz $file-$surum.tar.gz + done + chown -R root:root . + CFLAGS="$SLKCFLAGS" \ + cd libvuurmuur-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc + make + mkdir -p $PKG/usr/lib + ( cd src/.libs/ + for file in libvuurmuur.a libvuurmuur.so.0.6.0 ; do + cat $file > $PKG/usr/lib/$file + done + ) + #replace "installed=no" "installed=yes" -- $PKG/usr/lib/libvuurmuur.la + mkdir -p $PKG/usr/include + ( cd src + #strip --strip-unneeded vuurmuur.h + cat vuurmuur.h > $PKG/usr/include/vuurmuur.h + ) + + cd $PKG/usr/lib + ln -s libvuurmuur.so.0.6.0 libvuurmuur.so.0 + ln -s libvuurmuur.so.0.6.0 libvuurmuur.so + + + + cd $SRC/Vuurmuur-$surum/vuurmuur-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --with-libvuurmuur-includes=$PKG/usr/include \ + --with-libvuurmuur-libraries=$PKG/usr/lib + make + mkdir -p $PKG/usr/bin + for file in vuurmuur vuurmuur_log vuurmuur_script ; do + ( cd $file + strip --strip-unneeded $file + cat $file > $PKG/usr/bin/$file + chmod 755 $PKG/usr/bin/$file + ) + done + mkdir -p $PKG/etc/rc.d/init.d + mkdir -p $PKG/etc/logrotate.d + ( cd scripts + cat rc.vuurmuur > $PKG/etc/rc.d/init.d/vuurmuur + cat vuurmuur-logrotate > $PKG/etc/logrotate.d/vuurmuur + ) + #replace "VUURMUUR_LOCATION=/usr/local/bin" "VUURMUUR_LOCATION=/usr/bin" -- $PKG/etc/rc.d/init.d/vuurmuur + chmod +x $PKG/etc/rc.d/init.d/vuurmuur + + mkdir -p $PKG/usr/man/ru/man8 + mkdir -p $PKG/usr/man/man8 + ( cd man/en + for file in vuurmuur.8 vuurmuur_log.8 vuurmuur_script.8 ; do + cat $file > $PKG/usr/man/man8/$file + done + ) + ( cd man/ru + for file in vuurmuur.8 vuurmuur_log.8 vuurmuur_script.8 ; do + cat $file > $PKG/usr/man/ru/man8/$file + done + ) + mkdir -p $PKG/usr/share/vuurmuur/scripts + ( cd scripts + cat vuurmuur-config-setup.sh > $PKG/usr/share/vuurmuur/scripts/vuurmuur-config-setup.sh + chmod 755 $PKG/usr/share/vuurmuur/scripts/vuurmuur-config-setup.sh + ) + mkdir -p $PKG/usr/share/vuurmuur/config + mkdir -p -m 700 $PKG/etc/vuurmuur + ( cd config + cat config.conf.sample > $PKG/usr/share/vuurmuur/config/config.conf.sample + cat config.conf.sample > $PKG/etc/vuurmuur/config.conf + chmod 600 $PKG/etc/vuurmuur/config.conf + ) + + mkdir -p $PKG/usr/share/vuurmuur/services + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/services + ( cd services ; + LIST=" cvs imaps pop3 smtp upnp + dns irc msn pop3s socks usermin + ftp jabber mysql pptp squid-proxy vnc + http ldap news razor ssh webmin + https lisa ntp rdp syslog whois + ident pcanywhere rsync telnet windowsmedia + imap ping samba traceroute" + for file in $LIST ; do + cat $file > $PKG/usr/share/vuurmuur/services/$file + cat $file > $PKG/etc/vuurmuur/textdir/services/$file + chmod 600 $PKG/etc/vuurmuur/textdir/services/$file + done + ) + + + + cd $SRC/Vuurmuur-$surum/vuurmuur_conf-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --with-libvuurmuur-includes=$PKG/usr/include \ + --with-libvuurmuur-libraries=$PKG/usr/lib + make + mkdir -p $PKG/usr/bin + ( cd src + cat vuurmuur_conf > $PKG/usr/bin/vuurmuur_conf + chmod 755 $PKG/usr/bin/vuurmuur_conf + ) + ( cd po + for lang in de fr nb nl no ru en@boldquot pt_BR en@quot ; do + mkdir -p $PKG/usr/share/locale/$lang/LC_MESSAGES + cat $lang.gmo > $PKG/usr/share/locale/$lang/LC_MESSAGES/vuurmuur_conf.mo + done + ) + mkdir -p $PKG/usr/share/vuurmuur/help + ( cd help + for file in vuurmuur-fr.hlp vuurmuur-ru.UTF-8.hlp vuurmuur-ru.hlp vuurmuur.hlp ; do + cat $file > $PKG/usr/share/vuurmuur/help/$file + done + ) + ( cd man/en + for file in vuurmuur_conf.8 ; do + cat $file > $PKG/usr/man/man8/$file + done + ) + ( cd man/ru + for file in vuurmuur_conf.8 ; do + cat $file > $PKG/usr/man/ru/man8/$file + done + ) + mkdir -p $PKG/usr/share/vuurmuur/scripts + ( cd scripts + cat vuurmuur-searchlog.sh > $PKG/usr/share/vuurmuur/scripts/vuurmuur-searchlog.sh + chmod 755 $PKG/usr/share/vuurmuur/scripts/vuurmuur-searchlog.sh + ) + mkdir -p $PKG/usr/share/vuurmuur/config + mkdir -p -m 700 $PKG/etc/vuurmuur + ( cd config + cat vuurmuur_conf.conf.sample > $PKG/usr/share/vuurmuur/config/vuurmuur_conf.conf.sample + cat vuurmuur_conf.conf.sample > $PKG/etc/vuurmuur/vuurmuur_conf.conf + ) + + + cd $SRC/Vuurmuur-$surum/installer/zones + ( for zone in dmz inet lan vpn ; do + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/zones/$zone/networks + cat $SRC/Vuurmuur-$surum/installer/zones/$zone/zone.config > $PKG/etc/vuurmuur/textdir/zones/$zone/zone.config + done + ) + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/zones/inet/networks/internet/groups + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/zones/inet/networks/internet/hosts + cat $SRC/Vuurmuur-$surum/installer/zones/inet/networks/internet/network.config > $PKG/etc/vuurmuur/textdir/zones/inet/networks/internet/network.config + mkdir -p -m 700 $PKG/etc/vuurmuur/plugins + touch $PKG/etc/vuurmuur/plugins/textdir.conf + chmod 600 $PKG/etc/vuurmuur/plugins/textdir.conf + echo "LOCATION=\"/etc/vuurmuur/textdir\"" > $PKG/etc/vuurmuur/plugins/textdir.conf + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/zones + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/interfaces + mkdir -p -m 700 $PKG/etc/vuurmuur/textdir/rules + +} diff --git a/talimatname/genel/w/w3af/talimat b/talimatname/genel/w/w3af/talimat new file mode 100644 index 000000000..ff9340b2c --- /dev/null +++ b/talimatname/genel/w/w3af/talimat @@ -0,0 +1,44 @@ +# Tanım: Web Uygulama Atak ve Denetim Aracı. +# URL: http://w3af.sourceforge.net/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: python-pip python-gtksourceview2 python-yaml python-gtk gtk2 sqlite libxml2 libxslt yaml + +isim=w3af +surum=1.6.54 +devir=1 +kaynak=(https://github.com/andresriancho/w3af/archive/${surum}.tar.gz + w3af.desktop) + + +derle() { + cd "$SRC/w3af-$surum" + + # Enforce python2 + sed -i -e 's|#!\s*/usr/bin/python[^\d.]*$|#!/usr/bin/python2|' \ + -e 's|#!\s*/usr/bin/env python[^\d.]*$|#!/usr/bin/env python2|' \ + $(find . -name '*.py') w3af_{console,gui} + + # Remove dependency checks. + sed -i 's/dependency_check()/#&/' w3af_{console,gui} + + mkdir -p "$PKG/usr/bin" + mkdir -p "$PKG/usr/share/w3af" + mkdir -p "$PKG/usr/share/applications" + + cp --no-preserve=ownership -a * "$PKG/usr/share/w3af" + + install -Dm644 "$SRC/w3af.desktop" "$PKG/usr/share/applications" + + cat > "$PKG/usr/bin/w3af" << EOF +#!/bin/sh +exec python2 /usr/share/w3af/w3af_console "\$@" +EOF + + cat > "$PKG/usr/bin/w3af-gui" << EOF +#!/bin/sh +exec python2 /usr/share/w3af/w3af_gui "\$@" +EOF + + chmod +x "$PKG/usr/share/w3af"/w3af_{console,gui} \ + "$PKG/usr/bin"/{w3af,w3af-gui} +} diff --git a/talimatname/genel/w/w3af/w3af.desktop b/talimatname/genel/w/w3af/w3af.desktop new file mode 100644 index 000000000..75ffd3aea --- /dev/null +++ b/talimatname/genel/w/w3af/w3af.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=/usr/bin/w3af-gui +Icon=/usr/share/w3af/core/ui/gui/data/w3af_icon.png +Type=Application +Terminal=false +MultipleArgs=false +Name=w3af +GenericName=w3af +StartupNotify=false +Categories=Application;Network; diff --git a/talimatname/genel/w/w3af/w3af.kur-kos b/talimatname/genel/w/w3af/w3af.kur-kos new file mode 100644 index 000000000..e0b367596 --- /dev/null +++ b/talimatname/genel/w/w3af/w3af.kur-kos @@ -0,0 +1,3 @@ +#!/bin/sh + +pip2 install -r /usr/share/w3af/w3af/tests/requirements.txt \ No newline at end of file diff --git a/talimatname/genel/w/w3m/talimat b/talimatname/genel/w/w3m/talimat new file mode 100644 index 000000000..de38a72df --- /dev/null +++ b/talimatname/genel/w/w3m/talimat @@ -0,0 +1,31 @@ +# Tanım: w3m öncelikli olarak bir sayfalıyıcıdır. Ayrıca konsol tabanlı tarayıcı altyapılarında kullanılabilir. +# URL: http://w3m.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: gc imlib2 gtk2 gdk-pixbuf + +isim=w3m +surum=0.5.3 +devir=1 +kaynak=(http://downloads.sourceforge.net/w3m/w3m-0.5.3.tar.gz + http://www.linuxfromscratch.org/patches/downloads/w3m/w3m-0.5.3-bdwgc72-1.patch ) + +derle() { + +cd $isim-$surum + +patch -Np1 -i $SRC/w3m-0.5.3-bdwgc72-1.patch +sed -i 's/file_handle/file_foo/' istream.{c,h} +sed -i 's#gdk-pixbuf-xlib-2.0#& x11#' configure + +./configure --prefix=/usr --sysconfdir=/etc + +make + +make DESTDIR=$PKG install +install -v -m644 -D doc/keymap.default $PKG/etc/w3m/keymap +install -v -m644 doc/menu.default $PKG/etc/w3m/menu +install -v -m755 -d $PKG/usr/share/doc/w3m-0.5.3 +install -v -m644 doc/{HISTORY,READ*,keymap.*,menu.*,*.html} \ + $PKG/usr/share/doc/w3m-0.5.3 + +} diff --git a/talimatname/genel/w/wavpack/talimat b/talimatname/genel/w/wavpack/talimat new file mode 100644 index 000000000..a61a483ba --- /dev/null +++ b/talimatname/genel/w/wavpack/talimat @@ -0,0 +1,20 @@ +# Tanım: Kayıpsız, kayıplı ve melez sıkıştırma modlu ses sıkıştırma formatı +# URL: http://www.wavpack.com/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: + +isim=wavpack +surum=4.75.0 +devir=1 + +kaynak=(http://www.wavpack.com/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--enable-mmx \ +--enable-static=no +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/w/wayland-protocols/talimat b/talimatname/genel/w/wayland-protocols/talimat new file mode 100644 index 000000000..05d100956 --- /dev/null +++ b/talimatname/genel/w/wayland-protocols/talimat @@ -0,0 +1,19 @@ +# Tanım: Genişletilmiş Wayland protokollerinin özellikleri +# URL: https://wayland.freedesktop.org/ +# Paketçi: Cihan Alkan +# Gerekler: wayland +# Grup: kütüphane + +isim=wayland-protocols +surum=1.12 +devir=1 +kaynak=(https://wayland.freedesktop.org/releases/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install + install -Dm 644 COPYING "$PKG/usr/share/licenses/$isim/COPYING" +} diff --git a/talimatname/genel/w/wayland/talimat b/talimatname/genel/w/wayland/talimat new file mode 100644 index 000000000..05b8b83c3 --- /dev/null +++ b/talimatname/genel/w/wayland/talimat @@ -0,0 +1,18 @@ +# Tanım: Bir bilgisayar görüntüleme sunucusu protokolü +# URL: http://wayland.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: libffi doxygen xmlto docbook-xml libxslt + +isim=wayland +devir=1 +surum=1.14.0 +kaynak=( http://wayland.freedesktop.org/releases/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ + --disable-static \ + --disable-documentation +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/w/wbar/talimat b/talimatname/genel/w/wbar/talimat new file mode 100644 index 000000000..4e43837a9 --- /dev/null +++ b/talimatname/genel/w/wbar/talimat @@ -0,0 +1,21 @@ +# Tanım: Basit ve son derece özelleştirilebilir hızlı başlatma aracı. +# URL: http://code.google.com/p/wbar +# Paketçi: milisarge +# Gerekler: libglade imlib2 + +isim=wbar +surum=2.3.4 +devir=1 + +kaynak=(https://wbar.googlecode.com/files/wbar-$surum.tgz ) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --exec_prefix=/usr \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/w/wcgbrowser/talimat b/talimatname/genel/w/wcgbrowser/talimat new file mode 100644 index 000000000..630e7e8d3 --- /dev/null +++ b/talimatname/genel/w/wcgbrowser/talimat @@ -0,0 +1,29 @@ +# Tanım: Kiosk sistemleri için bir web tarayıcısı. +# URL: http://www.alandmoore.com/wcgbrowser/wcgbrowser.html +# Paketçi: Cihan_Alkan +# Gerekler: python3-yaml python3-qt5 qt5-webkit +# Grup: ağ + +isim=wcgbrowser +surum=0.2 +devir=1 +kaynak=() + +derle() { + adres="https://github.com/alandmoore/wcgbrowser" + git_indir ${adres} ${isim} + cd $SRC/${isim} + + # Wcgbrowser başlatma komut dosyasındaki yolu düzeltin + sed -i 's|/usr/local|/usr|' wcgbrowser + + # Dizinleri oluştur + install -dm755 "${PKG}"/usr/share/doc/"${isim}"/examples + + # Dosyaları kopyala + install -D -m644 browser.py "${PKG}"/usr/share/"${isim}"/browser.py + install -D -m755 wcgbrowser "${PKG}"/usr/bin/wcgbrowser + install -D -m644 wcgbrowser.yaml "${PKG}"/etc/wcgbrowser.yaml + install -D -m644 README.rst "${PKG}"/usr/share/doc/"${isim}"/README.rst + install -m644 examples/* "${PKG}"/usr/share/doc/"${isim}"/examples/ +} diff --git a/talimatname/genel/w/weather/talimat b/talimatname/genel/w/weather/talimat new file mode 100644 index 000000000..1104c95ae --- /dev/null +++ b/talimatname/genel/w/weather/talimat @@ -0,0 +1,38 @@ +# Tanım: METAR verilerinden hava durumu tahminlerini gösteren CLI aracı +# URL: http://fungi.yuggoth.org/weather/ +# Paketçi: milisarge +# Gerekler: python + +isim=weather +surum=2.0 +devir=1 + +kaynak=(http://fungi.yuggoth.org/weather/src/$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + sed -i 's|env python|env python2|' * + + # set up correlation sets + sed -i 's| else: default_setpath = ".:~/.weather|&:/usr/share/weather-util|' weather.py + + install -Dm644 airports "$PKG/usr/share/weather-util/airports" + install -Dm644 places "$PKG/usr/share/weather-util/places" + install -Dm644 stations "$PKG/usr/share/weather-util/stations" + install -Dm644 zctas "$PKG/usr/share/weather-util/zctas" + install -Dm644 zones "$PKG/usr/share/weather-util/zones" + + _python_path=$(python2 -c "import sys ; print [p for p in sys.path if p.startswith('/usr/lib/python2.')][0]") + install -Dm755 weather "$PKG/usr/bin/weather-report" + install -Dm644 weather.py "$PKG/$_python_path/weather.py" + + install -Dm644 weatherrc "$PKG/etc/weatherrc" + + install -Dm644 weather.1 "$PKG/usr/share/man/man1/weather.1" + install -Dm644 weatherrc.5 "$PKG/usr/share/man/man5/weatherrc.5" + + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/BSD2" +} + + + diff --git a/talimatname/genel/w/webkit2gtk3/talimat b/talimatname/genel/w/webkit2gtk3/talimat new file mode 100644 index 000000000..e53cbc322 --- /dev/null +++ b/talimatname/genel/w/webkit2gtk3/talimat @@ -0,0 +1,31 @@ +# Tanım: Taşınabilir web oluşturma motoru WebKit'in GTK+ 2 ve 3 platformlarına bağlantı noktası. +# URL: http://webkitgtk.org/ +# Paketçi: milisarge +# Gerekler: enchant cmake gstreamer1-plugins-base xorg-libxt gtk2 gtk3 hunspell icu libgudev libsecret libsoup libwebp xorg-mesa ruby sqlite geoclue gobject-introspection hicolor-icon-theme llvm harfbuzz libnotify + +isim=webkit2gtk3 +surum=2.17.4 +devir=2 + +kaynak=(http://webkitgtk.org/releases/webkitgtk-$surum.tar.xz) +derle() { +cd webkitgtk-$surum +sed -e 's/“/\"/' -e 's/”/\"/' \ + -i Source/WebCore/xml/XMLViewer.{css,js} + +mkdir -vp build +cd build + +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_SKIP_RPATH=ON \ + -DPORT=GTK \ + -DUSE_LIBHYPHEN=OFF \ + -DLIB_INSTALL_DIR=/usr/lib \ + -DENABLE_MINIBROWSER=ON \ + -Wno-dev .. + +make || make -j1 +make DESTDIR=$PKG install || make -j1 DESTDIR=$PKG install + +} diff --git a/talimatname/genel/w/webkitfltk/talimat b/talimatname/genel/w/webkitfltk/talimat new file mode 100644 index 000000000..631195c91 --- /dev/null +++ b/talimatname/genel/w/webkitfltk/talimat @@ -0,0 +1,25 @@ +# Tanım: Webkit Portu, Fltk 1.3'e +# URL: https://github.com/clbr/webkitfltk +# Paketçi: milisarge +# Gerekler: zlib libpng libjpeg-turbo libxml2 sqlite freetype xorg-fontconfig xorg-libxcursor cairo openssl curl icu harfbuzz fltk1 git ruby + +isim=webkitfltk +surum=0.5.1 +devir=1 + +kaynak=(https://sourceforge.net/projects/fifth-browser/files/v0.5/${isim}-${surum}.txz + https://github.com/clbr/webkitfltk/commit/6db7be57eb6f633d63fb90397adb21c6247ab410.patch + https://github.com/clbr/webkitfltk/commit/83626b77fc7d8fae005fd4575dd85dbb0f243081.patch) + +derle() { + cd "${isim}-${surum}" + patch -p1 -i $SRC/6db7be57eb6f633d63fb90397adb21c6247ab410.patch + patch -p1 -i $SRC/83626b77fc7d8fae005fd4575dd85dbb0f243081.patch + make -j1 -C Source/bmalloc/bmalloc + make -j1 -C Source/WTF/wtf + make -j1 -C Source/JavaScriptCore gen + make -j1 -C Source/JavaScriptCore + make -j1 -C Source/WebCore + make -j1 -C Source/WebKit/fltk + make -C Source/WebKit/fltk install DESTDIR="${PKG}" +} diff --git a/talimatname/genel/w/webkitgtk2/icu59.patch b/talimatname/genel/w/webkitgtk2/icu59.patch new file mode 100644 index 000000000..39ff89ee6 --- /dev/null +++ b/talimatname/genel/w/webkitgtk2/icu59.patch @@ -0,0 +1,38 @@ +--- webkitgtk-2.16.1/Source/JavaScriptCore/API/JSStringRef.h.orig 2017-02-20 17:20:08.000000000 +0100 ++++ webkitgtk-2.16.1/Source/JavaScriptCore/API/JSStringRef.h 2017-04-22 14:35:00.926530142 +0200 +@@ -32,6 +32,7 @@ + #include + #endif + #include /* for size_t */ ++#include + + #ifdef __cplusplus + extern "C" { +@@ -46,7 +47,7 @@ + character. As with all scalar types, endianness depends on the underlying + architecture. + */ +- typedef unsigned short JSChar; ++ typedef char16_t JSChar; + #else + typedef wchar_t JSChar; + #endif +--- webkitgtk-2.16.1/Source/WebKit2/Shared/API/c/WKString.h.orig 2017-02-20 17:20:17.000000000 +0100 ++++ webkitgtk-2.16.1/Source/WebKit2/Shared/API/c/WKString.h 2017-04-22 14:35:56.853196170 +0200 +@@ -28,6 +28,7 @@ + + #include + #include ++#include + + #ifndef __cplusplus + #include +@@ -39,7 +40,7 @@ + + #if !defined(WIN32) && !defined(_WIN32) \ + && !((defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__linux__)) /* RVCT */ +- typedef unsigned short WKChar; ++ typedef char16_t WKChar; + #else + typedef wchar_t WKChar; + #endif diff --git a/talimatname/genel/w/webkitgtk2/talimat b/talimatname/genel/w/webkitgtk2/talimat new file mode 100644 index 000000000..eab17a41d --- /dev/null +++ b/talimatname/genel/w/webkitgtk2/talimat @@ -0,0 +1,39 @@ +# Tanım: WebKitGTK+, WebKit rendering motorunun tam özellikli bir portudur +# URL: http://webkitgtk.org/ +# Paketçi: milisarge +# Gerekler: libwebp libsecret geoclue gperf gtk2 dbus gstreamer1-plugins-base icu enchant libsoup libxslt xorg-libxt ruby + +isim=webkitgtk2 +surum=2.4.11 +devir=2 +kaynak=(http://webkitgtk.org/releases/webkitgtk-$surum.tar.xz + webkitgtk-2.4.9-abs.patch + icu59.patch) + +derle() { + cd webkitgtk-$surum + patch -Np1 -i ../webkitgtk-2.4.9-abs.patch + patch -Np1 -i ../icu59.patch + install -d build + cd build + CXXFLAGS+=" -fno-delete-null-pointer-checks" + CFLAGS+=" -fno-delete-null-pointer-checks" + + ../configure \ + --prefix=/usr \ + --disable-geolocation \ + --disable-gtk-doc-html \ + --disable-silent-rules \ + --enable-video \ + --enable-jit \ + --libexecdir=/usr/lib/webkitgtk2 \ + --with-gtk=2.0 \ + --disable-webkit2 \ + --disable-gtk-doc + + sed -i 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make -j1 DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/w/webkitgtk2/webkitgtk-2.4.9-abs.patch b/talimatname/genel/w/webkitgtk2/webkitgtk-2.4.9-abs.patch new file mode 100644 index 000000000..9a1c5f990 --- /dev/null +++ b/talimatname/genel/w/webkitgtk2/webkitgtk-2.4.9-abs.patch @@ -0,0 +1,26 @@ +diff -Nur webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/GtkClickCounter.cpp webkitgtk-2.4.9/Source/WebCore/platform/gtk/GtkClickCounter.cpp +--- webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/GtkClickCounter.cpp 2015-05-20 03:03:24.000000000 -0600 ++++ webkitgtk-2.4.9/Source/WebCore/platform/gtk/GtkClickCounter.cpp 2016-02-07 11:30:42.392686308 -0700 +@@ -85,8 +85,8 @@ + guint32 eventTime = getEventTime(event); + + if ((event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) +- || ((abs(buttonEvent->x - m_previousClickPoint.x()) < doubleClickDistance) +- && (abs(buttonEvent->y - m_previousClickPoint.y()) < doubleClickDistance) ++ || ((fabs(buttonEvent->x - m_previousClickPoint.x()) < doubleClickDistance) ++ && (fabs(buttonEvent->y - m_previousClickPoint.y()) < doubleClickDistance) + && (eventTime - m_previousClickTime < static_cast(doubleClickTime)) + && (buttonEvent->button == m_previousClickButton))) + m_currentClickCount++; +diff -Nur webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp webkitgtk-2.4.9/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp +--- webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2015-05-20 03:03:24.000000000 -0600 ++++ webkitgtk-2.4.9/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2016-02-07 11:49:36.384691005 -0700 +@@ -659,7 +659,7 @@ + if (!std::isfinite(time)) + return String::fromUTF8(_("indefinite time")); + +- int seconds = static_cast(abs(time)); ++ int seconds = static_cast(fabs(time)); + int days = seconds / (60 * 60 * 24); + int hours = seconds / (60 * 60); + int minutes = (seconds / 60) % 60; diff --git a/talimatname/genel/w/webkitgtk3/icu59.patch b/talimatname/genel/w/webkitgtk3/icu59.patch new file mode 100644 index 000000000..39ff89ee6 --- /dev/null +++ b/talimatname/genel/w/webkitgtk3/icu59.patch @@ -0,0 +1,38 @@ +--- webkitgtk-2.16.1/Source/JavaScriptCore/API/JSStringRef.h.orig 2017-02-20 17:20:08.000000000 +0100 ++++ webkitgtk-2.16.1/Source/JavaScriptCore/API/JSStringRef.h 2017-04-22 14:35:00.926530142 +0200 +@@ -32,6 +32,7 @@ + #include + #endif + #include /* for size_t */ ++#include + + #ifdef __cplusplus + extern "C" { +@@ -46,7 +47,7 @@ + character. As with all scalar types, endianness depends on the underlying + architecture. + */ +- typedef unsigned short JSChar; ++ typedef char16_t JSChar; + #else + typedef wchar_t JSChar; + #endif +--- webkitgtk-2.16.1/Source/WebKit2/Shared/API/c/WKString.h.orig 2017-02-20 17:20:17.000000000 +0100 ++++ webkitgtk-2.16.1/Source/WebKit2/Shared/API/c/WKString.h 2017-04-22 14:35:56.853196170 +0200 +@@ -28,6 +28,7 @@ + + #include + #include ++#include + + #ifndef __cplusplus + #include +@@ -39,7 +40,7 @@ + + #if !defined(WIN32) && !defined(_WIN32) \ + && !((defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__linux__)) /* RVCT */ +- typedef unsigned short WKChar; ++ typedef char16_t WKChar; + #else + typedef wchar_t WKChar; + #endif diff --git a/talimatname/genel/w/webkitgtk3/talimat b/talimatname/genel/w/webkitgtk3/talimat new file mode 100644 index 000000000..f32b441b4 --- /dev/null +++ b/talimatname/genel/w/webkitgtk3/talimat @@ -0,0 +1,38 @@ +# Tanım: Web Tarayıcıları için küçük, verimli ve hızlı render motoru. +# URL: http://www.webkitgtk.org/ +# Paketçi: milisarge +# Gerekler: libwebp libsecret geoclue gperf gtk2 gtk3 curl dbus gstreamer1-plugins-base icu enchant libsoup libxslt xorg-libxt ruby + +isim=webkitgtk3 +surum=2.4.11 +devir=2 +kaynak=(http://webkitgtk.org/releases/webkitgtk-$surum.tar.xz + webkitgtk-2.4.9-abs.patch + icu59.patch) + +derle() { + cd webkitgtk-$surum + patch -Np1 -i ../webkitgtk-2.4.9-abs.patch + patch -Np1 -i ../icu59.patch + install -d build + cd build + CXXFLAGS+=" -fno-delete-null-pointer-checks" + CFLAGS+=" -fno-delete-null-pointer-checks" + + ../configure \ + --prefix=/usr \ + --disable-geolocation \ + --disable-gtk-doc-html \ + --disable-silent-rules \ + --enable-video \ + --enable-jit \ + --libexecdir=/usr/lib/webkitgtk3 \ + --enable-introspection \ + --disable-gtk-doc + + sed -i 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool + + make + make -j1 DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/w/webkitgtk3/webkitgtk-2.4.9-abs.patch b/talimatname/genel/w/webkitgtk3/webkitgtk-2.4.9-abs.patch new file mode 100644 index 000000000..9a1c5f990 --- /dev/null +++ b/talimatname/genel/w/webkitgtk3/webkitgtk-2.4.9-abs.patch @@ -0,0 +1,26 @@ +diff -Nur webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/GtkClickCounter.cpp webkitgtk-2.4.9/Source/WebCore/platform/gtk/GtkClickCounter.cpp +--- webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/GtkClickCounter.cpp 2015-05-20 03:03:24.000000000 -0600 ++++ webkitgtk-2.4.9/Source/WebCore/platform/gtk/GtkClickCounter.cpp 2016-02-07 11:30:42.392686308 -0700 +@@ -85,8 +85,8 @@ + guint32 eventTime = getEventTime(event); + + if ((event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) +- || ((abs(buttonEvent->x - m_previousClickPoint.x()) < doubleClickDistance) +- && (abs(buttonEvent->y - m_previousClickPoint.y()) < doubleClickDistance) ++ || ((fabs(buttonEvent->x - m_previousClickPoint.x()) < doubleClickDistance) ++ && (fabs(buttonEvent->y - m_previousClickPoint.y()) < doubleClickDistance) + && (eventTime - m_previousClickTime < static_cast(doubleClickTime)) + && (buttonEvent->button == m_previousClickButton))) + m_currentClickCount++; +diff -Nur webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp webkitgtk-2.4.9/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp +--- webkitgtk-2.4.9.orig/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2015-05-20 03:03:24.000000000 -0600 ++++ webkitgtk-2.4.9/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp 2016-02-07 11:49:36.384691005 -0700 +@@ -659,7 +659,7 @@ + if (!std::isfinite(time)) + return String::fromUTF8(_("indefinite time")); + +- int seconds = static_cast(abs(time)); ++ int seconds = static_cast(fabs(time)); + int days = seconds / (60 * 60 * 24); + int hours = seconds / (60 * 60); + int minutes = (seconds / 60) % 60; diff --git a/talimatname/genel/w/websocketd/talimat b/talimatname/genel/w/websocketd/talimat new file mode 100644 index 000000000..390485646 --- /dev/null +++ b/talimatname/genel/w/websocketd/talimat @@ -0,0 +1,16 @@ +# Tanım: Inetd gibi ama WebSockets için. STDIO / STDOUT kullanan herhangi bir uygulamayı bir WebSocket sunucusuna çevirin. +# URL: https://github.com/joewalnes/websocketd +# Paketçi: Cihan_Alkan +# Gerekler: +# Grup: + + +isim=websocketd +surum=0.2.12 +devir=1 +kaynak=(https://github.com/joewalnes/websocketd/releases/download/v${surum}/websocketd-${surum}-linux_amd64.zip) + +derle() { + install -Dm755 "${isim}" "${PKG}/usr/bin/${isim}" + install -Dm644 LICENSE "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/w/websocketpp/talimat b/talimatname/genel/w/websocketpp/talimat new file mode 100644 index 000000000..055bdc812 --- /dev/null +++ b/talimatname/genel/w/websocketpp/talimat @@ -0,0 +1,21 @@ +# Tanım: C ++/Boost Asio tabanlı websocket istemcisi/sunucu kitaplığı +# URL: http://www.zaphoyd.com/websocketpp/ +# Paketçi: milisarge +# Gerekler: cmake boost scons + +isim=websocketpp +surum=0.7.0 +devir=1 +kaynak=(https://github.com/zaphoyd/${isim}/archive/${surum}.tar.gz::${isim}-${surum}.tar.gz) + +derle() { + cd ${isim}-${surum} + WSPP_ENABLE_CPP11=1 \ + BOOST_LIBS=/usr/lib \ + BOOST_INCLUDES=/usr/include/boost \ + scons "${MAKEFLAGS}" + (cd build + cmake -DCMAKE_INSTALL_PREFIX=/usr .. + ) + make -C build DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/w/webtorrent-desktop/talimat b/talimatname/genel/w/webtorrent-desktop/talimat new file mode 100644 index 000000000..a98decbd9 --- /dev/null +++ b/talimatname/genel/w/webtorrent-desktop/talimat @@ -0,0 +1,23 @@ +# Tanım: Torrent istemci tarayıcısı +# URL: https://webtorrent.io/desktop +# Paketçi: Cihan_Alkan +# Gerekler: gconf +# Grup: ağ + +isim=webtorrent-desktop +surum=0.18.0 +devir=1 +kaynak=(https://github.com/feross/${isim}/releases/download/v${surum}/WebTorrent-v${surum}-linux.zip + ${isim}.desktop) + +derle() { + install -dm755 "${PKG}/usr/share" + install -dm755 "${PKG}/usr/bin" + + cp -a "WebTorrent-linux-x64" "${PKG}/usr/share/${isim}" + ln -s "/usr/share/${isim}/WebTorrent" "${PKG}/usr/bin/${isim}" + + install -Dm644 "${isim}.desktop" "${PKG}/usr/share/applications/${isim}.desktop" + install -Dm644 "WebTorrent-linux-x64/resources/app.asar.unpacked/static/WebTorrent.png" "${PKG}/usr/share/icons/hicolor/256x256/apps/${isim}.png" + install -Dm644 "WebTorrent-linux-x64/LICENSE" "${PKG}/usr/share/licenses/${isim}/LICENSE" +} diff --git a/talimatname/genel/w/webtorrent-desktop/webtorrent-desktop.desktop b/talimatname/genel/w/webtorrent-desktop/webtorrent-desktop.desktop new file mode 100644 index 000000000..8c010a542 --- /dev/null +++ b/talimatname/genel/w/webtorrent-desktop/webtorrent-desktop.desktop @@ -0,0 +1,33 @@ +[Desktop Entry] +Name=WebTorrent +Version=1.0 +GenericName=BitTorrent Client +X-GNOME-FullName=WebTorrent +Comment=BitTorrent üzerinden dosyaları indirin ve paylaşın +Encoding=UTF-8 +Type=Application +Icon=webtorrent-desktop +Terminal=false +Path=/usr/share/webtorrent-desktop +Exec=/usr/bin/webtorrent-desktop %U +TryExec=/usr/bin/webtorrent-desktop +StartupNotify=false +Categories=Network;FileTransfer;P2P; +MimeType=application/x-bittorrent;x-scheme-handler/magnet;x-scheme-handler/stream-magnet; + +Actions=CreateNewTorrent;OpenTorrentFile;OpenTorrentAddress; + +[Desktop Action CreateNewTorrent] +Name=Yeni Torrent Oluştur... +Exec=/usr/bin/webtorrent-desktop -n +Path=/usr/share/webtorrent-desktop + +[Desktop Action OpenTorrentFile] +Name=Torrent Dosyası Aç... +Exec=/usr/bin/webtorrent-desktop -o +Path=/usr/share/webtorrent-desktop + +[Desktop Action OpenTorrentAddress] +Name=Torrent Adresi Aç... +Exec=/usr/bin/webtorrent-desktop -u +Path=/usr/share/webtorrent-desktop diff --git a/talimatname/genel/w/weechat/talimat b/talimatname/genel/w/weechat/talimat new file mode 100644 index 000000000..ae381e474 --- /dev/null +++ b/talimatname/genel/w/weechat/talimat @@ -0,0 +1,23 @@ +# Tanım: Hızlı, hafif ve genişletilebilir IRC istemcisi (curses UI) +# URL: http://www.weechat.org/ +# Paketçi: Cihan_Alkan +# Gerekler: gnutls libgcrypt asciidoc highlight cmake python lua tcl ruby aspell +# Grup: ağ + +isim=weechat +surum=2.0.1 +devir=1 +kaynak=(https://www.weechat.org/files/src/$isim-$surum.tar.xz) + +derle() { + mkdir build + cd build + cmake -Wno-dev "${SRC}/$isim-$surum" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DPYTHON_EXECUTABLE=/usr/bin/python2 \ + -DPYTHON_LIBRARY=/usr/lib/libpython2.7.so \ + -DENABLE_MAN=ON \ + -DENABLE_DOC=ON + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/w/weka/talimat b/talimatname/genel/w/weka/talimat new file mode 100644 index 000000000..f4c6c0bc6 --- /dev/null +++ b/talimatname/genel/w/weka/talimat @@ -0,0 +1,26 @@ +# Tanım: A collection of machine learning algorithms for data mining tasks +# URL: http://www.cs.waikato.ac.nz/ml/weka/ +# Paketçi: milisarge +# Gerekler: openjdk unzip +# Grup: geliştirme + +isim=weka +surum=3.8.2 +devir=1 +kaynak=(http://downloads.sourceforge.net/sourceforge/weka/weka-${surum//./-}.zip + weka.sh + weka.desktop) + +derle() { + cd $SRC/$isim-${surum//./-} + unzip weka.jar -d $SRC/$isim-${surum//./-} + # install jar file + mkdir -p $PKG/usr/share/java/$isim + install -m644 weka.jar $PKG/usr/share/java/$isim/weka.jar + # setup for freedesktop icons and shell script + mkdir -p $PKG/usr/share/{applications,pixmaps} + mkdir -p $PKG/usr/bin + install -m644 weka/gui/weka_icon_new_48.png $PKG/usr/share/pixmaps/weka.png + install -m644 $SRC/weka.desktop $PKG/usr/share/applications/weka.desktop + install -m755 $SRC/weka.sh $PKG/usr/bin/weka +} diff --git a/talimatname/genel/w/weka/weka.desktop b/talimatname/genel/w/weka/weka.desktop new file mode 100644 index 000000000..8162dedee --- /dev/null +++ b/talimatname/genel/w/weka/weka.desktop @@ -0,0 +1,19 @@ +[Desktop Entry] +Encoding=UTF-8 +Categories=Development;Science;Math;Database;Java; +Name=Weka +Comment=A data mining and machine learning toolkit +Comment[de]=Werkzeuge für Datenfilterung und Lernen durch Maschine +Comment[en]=A data mining and machine learning toolkit +Comment[es]=Herramientas para minería de datos y aprendizaje de máquinas +Comment[fr]=Outils pour l'extraction de connaissances a partir des données +Comment[it]=Attrezzi per l'estrazione di dati ed imparare di macchina +Comment[pt]=Ferramentas para a extração de dados e a aprendizagem de máquina +Comment[tr]=Veri Madenciliği ve Makina Öğrenme Aracı +Icon=weka.png +TryExec=/usr/bin/weka +Exec=/usr/bin/weka +URL=http://www.cs.waikato.ac.nz/ml/weka/ +StartupNotify=false +Terminal=false +Type=Application diff --git a/talimatname/genel/w/weka/weka.sh b/talimatname/genel/w/weka/weka.sh new file mode 100644 index 000000000..d18250d94 --- /dev/null +++ b/talimatname/genel/w/weka/weka.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +# Note: the '-Xmx2g' flag is used to set the maximum memory that the java +# program is allowed. When working with large data sets, this number may need +# to be increased based on how much memory you wish to allow weka to have. +# Specifying command line arguments will override the defaults shown here. +# Example: '-Xmx4g' +DEFAULT_ARGS='-Xms32m -Xmx2g' + +if [ $# -gt 0 ]; then + ARGS="$@" +else + ARGS="$DEFAULT_ARGS" +fi + +java $ARGS -jar /usr/share/java/weka/weka.jar diff --git a/talimatname/genel/w/wfuzz/talimat b/talimatname/genel/w/wfuzz/talimat new file mode 100644 index 000000000..dec193d18 --- /dev/null +++ b/talimatname/genel/w/wfuzz/talimat @@ -0,0 +1,31 @@ +# Tanım: Web uygulamalarındaki link verilmeyen kaynakları deneme/yanılma (fuzzer) yolu ile bulan araç. +# URL: https://github.com/xmendez/wfuzz +# Paketçi: ayakar +# Gerekler: python-pip python-pyxml python-lxml + +isim=wfuzz +surum=2.1.5 +devir=1 +kaynak=(https://github.com/xmendez/$isim/archive/v$surum.tar.gz) + +derle() { + cd "$SRC/$isim-$surum" + + mkdir -p "$PKG/usr/bin" + mkdir -p "$PKG/usr/share/$isim" + + install -Dm644 README "$PKG/usr/share/doc/$isim/README" + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + + rm LICENSE README README.md setup.py + + cp -a * "$PKG/usr/share/$isim" + + cat > "$PKG/usr/bin/$isim" << EOF +#!/bin/sh +cd /usr/share/$isim +exec python2 $isim.py "\$@" +EOF + + chmod a+x $PKG/usr/bin/$isim +} diff --git a/talimatname/genel/w/whatsapp-desktop/talimat b/talimatname/genel/w/whatsapp-desktop/talimat new file mode 100644 index 000000000..34638b483 --- /dev/null +++ b/talimatname/genel/w/whatsapp-desktop/talimat @@ -0,0 +1,25 @@ +# Tanım: Resmi olmayan whatsapp web masaüstü istemcisi. Elektron ile inşa edildi. +# URL: https://github.com/Enrico204/Whatsapp-Desktop +# Paketçi: Cihan Alkan +# Gerekler: libnotify gconf gtk2 +# Grup: ağ + + +isim=whatsapp-desktop +surum=0.4.0 +devir=1 +kaynak=(https://github.com/Enrico204/Whatsapp-Desktop/releases/download/v0.4.0/WhatsApp-linux-x64.tar.gz + whatsapp-desktop.desktop + whatsapp-desktop.png) + +derle() { + install -d "$PKG"/opt + cp -R "$SRC"/WhatsApp-linux-x64 "$PKG"/opt/Whatsapp + + install -d "$PKG"/usr/bin + ln -sf ../../opt/Whatsapp/WhatsApp "$PKG"/usr/bin/Whatsapp + + install -D -m644 "./whatsapp-desktop.desktop" "${PKG}/usr/share/applications/whatsapp-desktop.desktop" + install -D -m644 "./whatsapp-desktop.png" "${PKG}/usr/share/pixmaps/whatsapp-desktop.png" +} + diff --git a/talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.desktop b/talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.desktop new file mode 100644 index 000000000..a54879087 --- /dev/null +++ b/talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=WhatsApp Desktop +Icon=whatsapp-desktop +Exec=Whatsapp +Comment=WhatsApp for Desktop +Name[tr]=WhatsApp Masaüstü Uygulaması +Comment[tr]=Bilgisayarlar için WhatsApp +Categories=Network;Chat; +Terminal=false +StartupNotify=true diff --git a/talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.png b/talimatname/genel/w/whatsapp-desktop/whatsapp-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8f90613a69df87ff03cced18adc1981bddfe71 GIT binary patch literal 12363 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 JYb1?B{|Dp6))fE% literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/whatsie/talimat b/talimatname/genel/w/whatsie/talimat new file mode 100644 index 000000000..a0a3fee16 --- /dev/null +++ b/talimatname/genel/w/whatsie/talimat @@ -0,0 +1,21 @@ +# Tanım: A simple & beautiful desktop client for WhatsApp Web. +# URL: https://github.com/gsantner/whatsie +# Paketçi: kadanur +# Gerekler: desktop-file-utils gconf gtk2 gvfs hicolor-icon-theme libgcrypt libgudev libnotify xorg-libxtst nss python xdg-utils + +isim=whatsie +surum=2.1.0 +devir=1 +kaynak=(https://github.com/gsantner/whatsie/releases/download/v2.1.0/$isim-$surum-linux-amd64.deb) + +derle() { + ar x $isim-$surum-linux-amd64.deb + bsdtar -xf data.tar.gz -C "$PKG/" + mkdir -p "$PKG/usr/bin/" + ln -s /opt/$isim/$isim "$PKG/usr/bin/$isim" + cd $PKG + for d in $(find . -type d); do + chmod 755 $d + done + +} diff --git a/talimatname/genel/w/whois/talimat b/talimatname/genel/w/whois/talimat new file mode 100644 index 000000000..e9a2a08ef --- /dev/null +++ b/talimatname/genel/w/whois/talimat @@ -0,0 +1,19 @@ +# Tanım: Dizin hizmetini sorgulayan istemci tarafı uygulaması +# URL: http://ftp.debian.org/debian/pool/main/w/whois +# Paketçi: milisarge +# Gerekler: + +isim=whois +surum=5.2.16 +devir=1 + +kaynak=(ftp://ftp.debian.org/debian/pool/main/w/$isim/${isim}_$surum.tar.xz) + + +derle() { +cd $isim-$surum +make prefix=/usr +make prefix=/usr BASEDIR=$PKG install-whois +make prefix=/usr BASEDIR=$PKG install-mkpasswd +make prefix=/usr BASEDIR=$PKG install-pos +} diff --git a/talimatname/genel/w/wicd/talimat b/talimatname/genel/w/wicd/talimat new file mode 100644 index 000000000..8f6fe4726 --- /dev/null +++ b/talimatname/genel/w/wicd/talimat @@ -0,0 +1,36 @@ +# Tanım: Linux için kablolu ve kablosuz ağ yöneticisi +# URL: http://wicd.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: python-gtk wpa-supplicant dbus-python wireless-tools dhcpcd + +isim=wicd +surum=1.7.2.4 +devir=1 + +kaynak=( http://launchpad.net/wicd/1.7/$surum/+download/$isim-$surum.tar.gz \ + http://downloads.nutyx.org/files/patchs/$isim/dbus_string_fix.patch wicd.rc) +derle() { +unset MAKEFLAGS +cd $isim-$surum +patch -Np0 -i ../dbus_string_fix.patch +sed -i '/wpath.logrotate\|wpath.systemd/d' setup.py +python setup.py configure --no-install-kde \ + --no-install-acpi \ + --no-install-pmutils \ + --no-install-init \ + --no-install-docs + +# Hack sinon les locales s'installent pas +mkdir -p translations/ast/LC_MESSAGES +for i in zh_CN zh_HK zh_TW bg ca da de cs \ +el fa en eo es fi et eu fr gl he id hr hu \ +ja it ka kk ko lt lv ml nb nl nn pl pt ro \ +ru sk sl te sr sv tr uk vi ast ar_EG pt_BR +do msgfmt po/$i.po -o translations/$i/LC_MESSAGES/wicd.mo +done + +python setup.py install --optimize=1 --root=$PKG +cp scripts/wicd $PKG/usr/bin/wicd +install -m 0744 -D $SRC/wicd.rc $PKG/etc/rc.d/wicd +echo "NotShowIn=KDE" >> $PKG/etc/xdg/autostart/wicd-tray.desktop +} diff --git a/talimatname/genel/w/wicd/wicd.rc b/talimatname/genel/w/wicd/wicd.rc new file mode 100644 index 000000000..60ce6fd34 --- /dev/null +++ b/talimatname/genel/w/wicd/wicd.rc @@ -0,0 +1,23 @@ +#!/bin/sh +# +# /etc/rc.d/wicd: start/stop wicd daemon +# + +case $1 in +start) + /usr/bin/wicd + ;; +stop) + kill $(cat /var/run/wicd/wicd.pid) + ;; +restart) + $0 stop + $0 start + ;; +*) + echo "usage: $0 [start|stop|restart]" + exit 1 + ;; +esac + +# End of file diff --git a/talimatname/genel/w/widgetci/talimat b/talimatname/genel/w/widgetci/talimat new file mode 100644 index 000000000..e13711cb4 --- /dev/null +++ b/talimatname/genel/w/widgetci/talimat @@ -0,0 +1,35 @@ +# Tanım: Bir Widget Yönetimi Uygulaması +# URL: https://github.com/eminfedar/widgetci +# Paketçi: Cihan_Alkan +# Gerekler: qt5 +# Grup: geliştirme + +isim=widgetci +surum=1.0.0 +devir=1 +kaynak=(https://github.com/eminfedar/widgetci/archive/v$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum/$isim + qmake-qt5 Widgetci.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug + make + mkdir -p $PKG/usr/bin + mkdir -p $PKG/usr/share/applications + mkdir -p $PKG/usr/share/pixmaps + # mkdir -p $PKG/usr/share/$isim/locale + +# Başlatıcı +cat > $PKG/usr/share/applications/$isim.desktop << "EOF" && +[Desktop Entry] +Name=Widgetçi +Comment=Widget Yönetimi Uygulaması +Exec=Widgetci +Icon=widgetci +NoDisplay=false +Categories=System;MX-Maintenance; +Type=Application +EOF + + mv Widgetci $PKG/usr/bin/ + mv img/icon.png $PKG/usr/share/pixmaps/$isim.png +} diff --git a/talimatname/genel/w/wifite/talimat b/talimatname/genel/w/wifite/talimat new file mode 100644 index 000000000..0a5129660 --- /dev/null +++ b/talimatname/genel/w/wifite/talimat @@ -0,0 +1,15 @@ +# Tanım: Aynı anda birden fazla WEP ve WPA şifreli ağa saldırmak için kullanılan bir araç +# URL: https://github.com/derv82/wifite +# Paketçi: milisarge +# Gerekler: python aircrack-ng + +isim=wifite +surum=git +devir=1 +kaynak=(https://raw.github.com/derv82/wifite/master/wifite.py) + +derle() { + sed -e 's|usr/bin/python$|/usr/bin/env python2|g' -i wifite.py + chmod +x wifite.py + install -Dm 755 wifite.py $PKG/usr/bin/$isim +} diff --git a/talimatname/genel/w/wildmidi/talimat b/talimatname/genel/w/wildmidi/talimat new file mode 100644 index 000000000..26516eec2 --- /dev/null +++ b/talimatname/genel/w/wildmidi/talimat @@ -0,0 +1,20 @@ +# Tanım: Açık Kaynaklı MIDI Synthesizer +# URL: https://www.mindwerks.net/projects/wildmidi/ +# Paketçi: Cihan_Alkan +# Gerekler: alsa-lib cmake +# Grup: + + +isim=wildmidi +surum=0.4.2 +devir=1 +kaynak=(https://github.com/psi29a/wildmidi/archive/wildmidi-${surum}.tar.gz) + +derle() { + + mkdir build + cd build + cmake -D CMAKE_INSTALL_PREFIX=/usr ../$isim-$isim-$surum + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/w/wireguard-kernel/talimat b/talimatname/genel/w/wireguard-kernel/talimat new file mode 100644 index 000000000..dcb1f330f --- /dev/null +++ b/talimatname/genel/w/wireguard-kernel/talimat @@ -0,0 +1,26 @@ +# Tanım: Kernel modül destekli ileri seviye güvenli vpn uygulaması +# URL: https://www.wireguard.com +# Paketçi: milisarge +# Gerekler: libmnl kernel +# Grup: güvenlik + +isim=wireguard-kernel +surum=0.0.20180531 +devir=1 +kaynak=(https://git.zx2c4.com/WireGuard/snapshot/WireGuard-$surum.tar.xz::WireGuard-$surum.tar.xz) + +kernel_surum=$(ls /lib/modules/) +derle() { + cd "WireGuard-$surum" + unset LDFLAGS + mv /lib/modules/${kernel_surum}/build/vmlinux /lib/modules/${kernel_surum}/build/vmlinux.tmp + make -C src/ \ + KERNELDIR=/lib/modules/${kernel_surum}/build module + cd "src" + local module + for module in *.ko; do + install -v -D -m644 ${module} \ + "$PKG/lib/modules/$kernel_surum/extra/${module}" + done + mv /lib/modules/${kernel_surum}/build/vmlinux.tmp /lib/modules/${kernel_surum}/build/vmlinux +} diff --git a/talimatname/genel/w/wireguard-kernel/wireguard-kernel.hash b/talimatname/genel/w/wireguard-kernel/wireguard-kernel.hash new file mode 100644 index 000000000..9e50f3983 --- /dev/null +++ b/talimatname/genel/w/wireguard-kernel/wireguard-kernel.hash @@ -0,0 +1 @@ +c3a394256cf3cc2dce75dcb299f54969f74d4076a351b61972f10fb3e69191756c0c32552a5acc7e0cd5919c248f12035e6a33f15e43fdad64c6cf1230511ee3 WireGuard-0.0.20171101.tar.xz diff --git a/talimatname/genel/w/wireguard-kernel/wireguard-kernel.kur-kos b/talimatname/genel/w/wireguard-kernel/wireguard-kernel.kur-kos new file mode 100644 index 000000000..aa02caad3 --- /dev/null +++ b/talimatname/genel/w/wireguard-kernel/wireguard-kernel.kur-kos @@ -0,0 +1,2 @@ +depmod +modprobe wireguard diff --git a/talimatname/genel/w/wireguard-tools/talimat b/talimatname/genel/w/wireguard-tools/talimat new file mode 100644 index 000000000..deccbe9c2 --- /dev/null +++ b/talimatname/genel/w/wireguard-tools/talimat @@ -0,0 +1,23 @@ +# Tanım: Kernel modül destekli ileri seviye güvenli vpn uygulaması araçları +# URL: https://www.wireguard.com +# Paketçi: milisarge +# Gerekler: libmnl +# Grup: güvenlik + +isim=wireguard-tools +surum=0.0.20180531 +devir=1 +kaynak=(https://git.zx2c4.com/WireGuard/snapshot/WireGuard-$surum.tar.xz::WireGuard-$surum.tar.xz) + +derle() { + cd "WireGuard-$surum" + mkdir -p "$PKG"/usr/share/wireguard + make -C src/tools \ + DESTDIR="$PKG" \ + WITH_BASHCOMPLETION=yes \ + WITH_WGQUICK=yes \ + WITH_SYSTEMDUNITS=no \ + install + find contrib/examples -name '.gitignore' -delete + cp -rf $SRC/WireGuard-$surum/contrib/examples "$PKG"/usr/share/wireguard/ +} diff --git a/talimatname/genel/w/wireguard-tools/wireguard-tools.hash b/talimatname/genel/w/wireguard-tools/wireguard-tools.hash new file mode 100644 index 000000000..9e50f3983 --- /dev/null +++ b/talimatname/genel/w/wireguard-tools/wireguard-tools.hash @@ -0,0 +1 @@ +c3a394256cf3cc2dce75dcb299f54969f74d4076a351b61972f10fb3e69191756c0c32552a5acc7e0cd5919c248f12035e6a33f15e43fdad64c6cf1230511ee3 WireGuard-0.0.20171101.tar.xz diff --git a/talimatname/genel/w/wireless-tools/talimat b/talimatname/genel/w/wireless-tools/talimat new file mode 100644 index 000000000..bc93b93b3 --- /dev/null +++ b/talimatname/genel/w/wireless-tools/talimat @@ -0,0 +1,17 @@ +# Tanım: Kablosuz Uzantıları değiştirmeye izin veren araçlar +# URL: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=wireless-tools +surum=29 +devir=1 + +kaynak=( http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.$surum.tar.gz) + +derle() { +cd wireless_tools.$surum +make +mkdir -p $PKG/usr/{sbin,lib,include,share/man} +make PREFIX=$PKG/usr INSTALL_MAN=$PKG/usr/share/man install +} diff --git a/talimatname/genel/w/wireshark/talimat b/talimatname/genel/w/wireshark/talimat new file mode 100644 index 000000000..aa9a62a45 --- /dev/null +++ b/talimatname/genel/w/wireshark/talimat @@ -0,0 +1,31 @@ +# Tanım: Wireshark dünyanın önde gelen ve yaygın olarak kullanılan ağ protokol analizörüdür. +# URL: http://www.wireshark.org +# Paketçi: milisarge +# Gerekler: gtk3 libpcap pcre +# Grup : güvenlik + +isim=wireshark +surum=2.5.1 +devir=1 +kaynak=(http://www.$isim.org/download/src/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/man \ + --with-plugins=/usr/lib/$isim/plugins \ + --enable-snmp \ + --disable-gcry \ + --without-krb5 \ + --with-qt4=no \ + --with-gtk=3 + + make + make DESTDIR=$PKG install + + chown -v root:wireshark $PKG/usr/bin/{tshark,dumpcap} && + chmod -v 6550 $PKG/usr/bin/{tshark,dumpcap} + + install -Dm755 $SRC/$isim-$surum/.libs/wireshark-gtk ${PKG}/usr/bin/wireshark-gtk + install -Dm644 wireshark-gtk.desktop ${PKG}/usr/share/applications/wireshark-gtk.desktop +} diff --git a/talimatname/genel/w/wireshark/wireshark.kur-kos b/talimatname/genel/w/wireshark/wireshark.kur-kos new file mode 100644 index 000000000..ada543c14 --- /dev/null +++ b/talimatname/genel/w/wireshark/wireshark.kur-kos @@ -0,0 +1,16 @@ +xdg-icon-resource forceupdate --theme hicolor &> /dev/null +update-mime-database usr/share/mime &>/dev/null + + +getent group wireshark >/dev/null 2>&1 || groupadd -g 150 wireshark &>/dev/null + + setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap + echo "NOTE: Wiresharkı normal kullanıcı olarak çalıştırmak için wireshark grubuna kendiniz girmelisiniz" + +getent group wireshark >/dev/null 2>&1 || groupadd -g 150 wireshark &>/dev/null + + setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap + +if getent group wireshark >/dev/null 2>&1; then + groupdel wireshark + fi diff --git a/talimatname/genel/w/wmctrl/talimat b/talimatname/genel/w/wmctrl/talimat new file mode 100644 index 000000000..ef2c5a95c --- /dev/null +++ b/talimatname/genel/w/wmctrl/talimat @@ -0,0 +1,20 @@ +# Tanım: EWMH uyumlu pencere yöneticisi yönetimi +# URL: http://tripie.sweb.cz/utils/wmctrl/ +# Paketçi: milisarge +# Gerekler: glib xorg-libxmu +# Grup: sistem + +isim=wmctrl +surum=1.07 +devir=1 +kaynak=(http://tripie.sweb.cz/utils/wmctrl/dist/wmctrl-1.07.tar.gz + http://archive.debian.org/debian/pool/main/w/wmctrl/wmctrl_1.07-6.diff.gz) + +derle() { + cd $isim-$surum + gunzip $SRC/wmctrl_$surum-6.diff.gz + patch -p1 -i "$SRC/wmctrl_$surum-6.diff" + ./configure --bindir="$PKG/usr/bin" --mandir="$PKG/usr/share/man" + make + make install +} diff --git a/talimatname/genel/w/wmfs2/talimat b/talimatname/genel/w/wmfs2/talimat new file mode 100644 index 000000000..596500ff4 --- /dev/null +++ b/talimatname/genel/w/wmfs2/talimat @@ -0,0 +1,26 @@ +# Tanım: X için hafif ve son derece yapılandırılabilir döşeme penceresi yöneticisi +# URL: http://wmfs.info/ +# Paketçi: milisarge +# Gerekler: xorg-libxft, xorg-libx11, imlib2, + +isim=wmfs2 +surum=git +devir=1 +kaynak=() + +derle() { + if cd $DERLEME_KAYNAKDIZIN/wmfs ; then + git pull + else + git clone git://github.com/xorg62/wmfs.git $DERLEME_KAYNAKDIZIN/wmfs + fi + + cp -r $DERLEME_KAYNAKDIZIN/wmfs $SRC/ && cd $SRC/wmfs + + ./configure --prefix /usr \ + --xdg-config-dir /etc/xdg \ + --man-prefix /usr/share/man \ + --without-xinerama + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/w/woeusb/talimat b/talimatname/genel/w/woeusb/talimat new file mode 100644 index 000000000..6bae014ce --- /dev/null +++ b/talimatname/genel/w/woeusb/talimat @@ -0,0 +1,28 @@ +# Tanım: Windows DVD'sinden veya bir iso dosyasından Windows USB bellek kurulum aracı oluşturma programı +# URL: https://github.com/slacka/WoeUSB +# Paketçi: Cihan_Alkan +# Gerekler: wxgtk grub libnotify parted ntfs-3g p7zip +# Grup: + +isim=woeusb +surum=3.2.1 +devir=1 + +kaynak=(trad.mo) + + +derle() { + git_indir https://github.com/slacka/WoeUSB.git $isim +cd $isim + autoreconf --force --install + autoconf + ./configure + make + make DESTDIR="$PKG/" prefix="/usr/" install +mkdir $PKG/usr/share/woeusb/locale/tr +mkdir $PKG/usr/share/woeusb/locale/tr/LC_MESSAGES + +cp $SRC/trad.mo $PKG/usr/share/woeusb/locale/tr/LC_MESSAGES/ +echo "Comment[tr_TR]=Windows DVD'sinden veya bir iso dosyasından Windows USB bellek kurulum aracı oluşturma programı" >> $PKG/usr/share//applications/woeusbgui.desktop + +} diff --git a/talimatname/genel/w/woeusb/trad.mo b/talimatname/genel/w/woeusb/trad.mo new file mode 100644 index 0000000000000000000000000000000000000000..7804067aa534fbdd64ae090d7374fb26769b4a4d GIT binary patch literal 3137 zcmds2&yOQV6>gFR60?v^2qB7sczf6+3)8kIOGxA_8$3U}W36|_vOT*yIYgAZ%XZ=F zDyyn`OmC$80l5Srfyjk9AhaS92j{>6=4Q_&5)xOWC@^>sQ^!d-Vk)j^Ly3;X zAj3LUF*oE!oE$faB|TU!Ztm{WO|H0MlGvPjmL^_eM?9u}=C3xq?QUV4 z8X8KO6I!hi7uYv+$c@FCuC4SJ%GOAmmzeWx4e5!$a}^Xbk_>cK*UF_*?&Fy&F$uLK zI?@wRA3+D4nF=YX&ndNhkjgdqOm~~ToxS}Y)prl*ZoSi~@AeK}$3ZvJ*yV>jS0j>% z6z~VZGfcS*Ja2DzHg|BmzR_$odk0`jjb?9myW6G4UWe+`u6KIP&HYxrL+$-ed#}4) zCh8&*aQPwe8!W?bIK|vCAuYT+K(Z_d$(Tm$kRxdk7l)w3DAE&8<_nU-q*lYFS9HaK zMRPz(yEU?4bA9C8q*kd+r_=IKrDbh~739&MV-k7td3__;Ty6zhh^RzLOt5W?E`F&-`LbLt2MvFXxZm}1 zZ`^aut7a)NI)USxTa~RlTNE1vB533?GzpP(zR_$}(t6&QR)>OCF(T=*;kHYs!T4?sP|bN}x~>J-@VQfV{#qw0SR) zb7=ILwY1;eAnQalh8EO+#Hkkam>F_^><}5kdS8u|o~j~VxTK>9S@90tDSGOP4en|V zWdWLz+n{aqFJU8W#$j=!MpMmG+b?zaL>m|0wnGtz8|l!7Jzb+xd#@L68orEPxP{KE z(aY8K^|1PCxc(EWR%_K)e_UO!R&g-wfSGUQhn{OO>%txy$)Y~AsnN}5tF=v=TB2*O zM;?Y~RsQplb_o(xj&yRP)M9FwBDZ0Wv!qs>&Tm$*QbR7Kc%{1j#Tww#?dI+6Gym7i z)ew8w@-IBP(TyrMl~v*3A>z`Xw-%{tYV{F^26J5)8`gLklkO*WBicbE(jFZePW|U?gRK(U!&nU93Ta=-P|(V>Lg< zB+Z!b8OIk#oce5W1Vf~ufsLDTCmK93e|H{w) zho;%bevB7@A@RsNf|=rdlSA&~$z;Ni#eD02?aNR8Ep0Ov9591|OM)FX9xwA3+)7O< z)5K?T{$Md1Ck#^;r4tJz2s!adiG#j!uM3*xK>x{BVwplV iYQYYkuK}?P${dy(=p~hKwAeY%F9+RX5S)J{g8u{knblkX literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/worker/ornek-ayar_by_frusen b/talimatname/genel/w/worker/ornek-ayar_by_frusen new file mode 100644 index 000000000..4329914a9 --- /dev/null +++ b/talimatname/genel/w/worker/ornek-ayar_by_frusen @@ -0,0 +1,6841 @@ +workerconfig 3.8.2; +global { + lang = "builtin"; + rows = 4; + columns = 7; + cachesize = 50; + listersets { + left { + hbartop = false; + hbarheight = 12; + vbarleft = false; + vbarwidth = 12; + showheader = true; + displaysets { + permission; + size; + name; + type; + owner; + modtime; + destination; + } + } + right { + hbartop = false; + hbarheight = 12; + vbarleft = true; + vbarwidth = 12; + showheader = true; + displaysets { + permission; + size; + name; + type; + owner; + modtime; + destination; + } + } + } + terminal = "xterm -e %s"; + ownerstyle = style1; + usestringfordirsize = false; + timesets { + date = style1; + datestring = "%d %b %Y"; + datesubstitution = true; + time = style1; + timestring = "%H:%M:%S"; + datebeforetime = true; + } + palette { + 0 = 200,198,193; + 1 = 0,0,0; + 2 = 255,255,255; + 3 = 0,85,187; + 4 = 204,34,0; + 5 = 50,180,20; + 6 = 119,0,119; + 7 = 238,170,68; + } + layout { + buttonsvertical = false; + listviewsvertical = false; + listviewweight = 5; + weighttoactive = false; + } + mouseconf { + selectbutton = 1; + activatebutton = 2; + scrollbutton = 3; + activatemod { + } + scrollmod { + mod = shift; + } + contextmod { + } + selectmethod = normal; + } + saveworkerstateonexit = true; + volumemanager { + mountcommand = ""; + unmountcommand = ""; + fstabfile = ""; + mtabfile = ""; + partfile = ""; + requestaction = true; + ejectcommand = ""; + closetraycommand = ""; + } + useversionstringcompare = true; + useextendedregex = true; +} +colors { + statebar = 2,3; + sellvbar = 2,4; + unsellvbar = 1,0; + seldir = 2,3; + unseldir = 3,2; + selfile = 2,1; + unselfile = 1,2; + clockbar = 1,0; + selactdir = 2,7; + unselactdir = 1,7; + selactfile = 2,7; + unselactfile = 1,7; + requester = 1,0; + lvheader = 1,0; + lvbg = 2; + labelcolors { + color { + name = "1"; + normal = 4,2; + active = 4,7; + } + color { + name = "2"; + normal = 5,2; + active = 5,7; + } + color { + name = "3"; + normal = 6,2; + active = 6,7; + } + color { + name = "marked"; + normal = 4,2; + active = 4,7; + } + } + faces { + face { + name = "textview-bg"; + color = 2; + } + face { + name = "textview-fg"; + color = 1; + } + face { + name = "textview-highlight-bg"; + color = 0; + } + } +} +startup { + left = "."; + right = ""; +} +fonts { + globalfont = "fixed"; + buttonfont = "fixed"; + leftfont = "fixed"; + rightfont = "fixed"; + textviewfont = "fixed"; +} +xftfonts { + globalfont = "Sans-10"; + buttonfont = "Sans-10"; + leftfont = "Sans-10"; + rightfont = "Sans-10"; + textviewfont = "Sans-10"; +} +clockbarsets { + modus = timespace; + updatetime = 1; + program = ""; +} +pathjumpallowdirs { +} +paths { + path { + position = 0; + title = "$HOME"; + color = 1,0; + path = "$HOME"; + shortkeys { + normal { + key = "1"; + } + } + } + path { + position = 1; + title = "/"; + color = 1,0; + path = "/"; + shortkeys { + normal { + key = "2"; + } + } + } + path { + position = 2; + title = "/tmp"; + color = 1,0; + path = "/tmp"; + shortkeys { + normal { + key = "3"; + } + } + } +} +hotkeys { + hotkey { + title = "Parent"; + shortkeys { + normal { + key = "Left"; + } + } + commands { + ParentDirOp { + } + } + } + hotkey { + title = "GoDir"; + shortkeys { + normal { + key = "Right"; + } + } + commands { + EnterDirOp { + dir = ""; + mode = active; + } + } + } + hotkey { + title = "Up"; + shortkeys { + normal { + key = "Up"; + } + } + commands { + RowUp { + } + } + } + hotkey { + title = "Down"; + shortkeys { + normal { + key = "Down"; + } + } + commands { + RowDown { + } + } + } + hotkey { + title = "Top"; + shortkeys { + normal { + key = "Home"; + } + } + commands { + FirstRow { + } + } + } + hotkey { + title = "End"; + shortkeys { + normal { + key = "End"; + } + } + commands { + LastRow { + } + } + } + hotkey { + title = "Page up"; + shortkeys { + normal { + key = "Prior"; + } + } + commands { + PageUp { + } + } + } + hotkey { + title = "Page down"; + shortkeys { + normal { + key = "Next"; + } + } + commands { + PageDown { + } + } + } + hotkey { + title = "Select"; + shortkeys { + normal { + key = "Insert"; + } + } + commands { + SelectOp { + } + } + } + hotkey { + title = "Main"; + shortkeys { + normal { + key = "Return"; + } + } + commands { + SimDDOp { + } + } + } + hotkey { + title = "LeftListerOptions"; + shortkeys { + normal { + key = "F1"; + mod = mod1; + } + } + commands { + ChangeListerSetOp { + mode = left; + } + } + } + hotkey { + title = "RightListerOptions"; + shortkeys { + normal { + key = "F2"; + mod = mod1; + } + } + commands { + ChangeListerSetOp { + mode = right; + } + } + } + hotkey { + title = "ListerToLeft"; + shortkeys { + normal { + key = "Left"; + mod = control; + } + } + commands { + ScrollListerOp { + mode = left; + } + } + } + hotkey { + title = "ListerToRight"; + shortkeys { + normal { + key = "Right"; + mod = control; + } + } + commands { + ScrollListerOp { + mode = right; + } + } + } + hotkey { + title = "Start"; + shortkeys { + double { + key = "x"; + mod = control; + key = "x"; + mod = control; + } + } + commands { + StartProgOp { + start = terminalwait; + viewstr = ""; + global = true; + inbackground = false; + dontcd = false; + } + } + } + hotkey { + title = "Search entry"; + shortkeys { + normal { + key = "s"; + mod = control; + } + } + commands { + SearchEntryOp { + ignorecase = true; + reversesearch = false; + } + } + } + hotkey { + title = "Edit path"; + shortkeys { + normal { + key = "Return"; + mod = control; + } + } + commands { + EnterPathOp { + mode = current; + } + } + } + hotkey { + title = "Edit other path"; + shortkeys { + normal { + key = "Return"; + mod = control; + mod = shift; + } + } + commands { + EnterPathOp { + mode = other; + } + } + } + hotkey { + title = "Switch"; + shortkeys { + normal { + key = "Tab"; + } + } + commands { + SwitchListerOp { + } + } + } + hotkey { + title = "image mode"; + shortkeys { + normal { + key = "b"; + mod = control; + } + } + commands { + ToggleListermodeOp { + mode = "ShowImageMode"; + } + } + } + hotkey { + title = "info mode"; + shortkeys { + normal { + key = "i"; + mod = control; + } + } + commands { + ToggleListermodeOp { + mode = "InformationMode"; + } + } + } + hotkey { + title = "Hidden"; + shortkeys { + normal { + key = "asciicircum"; + } + } + commands { + ChangeHiddenFlag { + hiddenfiles = toggle; + } + } + } + hotkey { + title = "pattern unselect"; + shortkeys { + normal { + key = "KP_Divide"; + mod = shift; + } + } + commands { + FilterUnSelectOp { + filter = "*"; + } + } + } + hotkey { + title = "Enter VFS"; + shortkeys { + normal { + key = "Return"; + mod = shift; + } + } + commands { + EnterDirOp { + dir = "{F}#"; + mode = special; + } + } + } + hotkey { + title = "Open context menu"; + shortkeys { + normal { + key = "space"; + mod = control; + } + } + commands { + OpenContextMenuOp { + } + } + } + hotkey { + title = "Change file label"; + shortkeys { + normal { + key = "l"; + mod = mod1; + } + } + commands { + ChangeLabelOp { + askforlabel = true; + label = "marked"; + } + } + } + hotkey { + title = "New tab"; + shortkeys { + normal { + key = "t"; + mod = control; + } + } + commands { + ModifyTabsOp { + tabaction = newtab; + } + } + } + hotkey { + title = "Close tab"; + shortkeys { + normal { + key = "w"; + mod = control; + } + } + commands { + ModifyTabsOp { + tabaction = closecurrenttab; + } + } + } + hotkey { + title = "Next tab"; + shortkeys { + normal { + key = "Next"; + mod = control; + } + } + commands { + ModifyTabsOp { + tabaction = nexttab; + } + } + } + hotkey { + title = "Prev tab"; + shortkeys { + normal { + key = "Prior"; + mod = control; + } + } + commands { + ModifyTabsOp { + tabaction = prevtab; + } + } + } + hotkey { + title = "80% Layout"; + shortkeys { + double { + key = "l"; + mod = control; + key = "1"; + } + } + commands { + ChangeLayoutOp { + buttonsvertical = false; + listviewsvertical = false; + listviewweight = 8; + weighttoactive = false; + } + } + } + hotkey { + title = "Horizontal layout"; + shortkeys { + double { + key = "l"; + mod = control; + key = "2"; + } + } + commands { + ChangeLayoutOp { + buttonsvertical = false; + listviewsvertical = true; + listviewweight = 5; + weighttoactive = false; + statebar; + listviews; + buttons; + listviews; + clockbar; + } + } + } + hotkey { + title = "Path->other side in new tab"; + shortkeys { + normal { + key = "o"; + mod = mod1; + } + } + commands { + SwitchListerOp { + } + ModifyTabsOp { + tabaction = newtab; + } + EnterDirOp { + dir = "{p}"; + mode = special; + } + SwitchListerOp { + } + } + } + hotkey { + title = "active entry->other side in new tab"; + shortkeys { + normal { + key = "O"; + mod = shift; + mod = mod1; + } + } + commands { + SwitchListerOp { + } + ModifyTabsOp { + tabaction = newtab; + } + SwitchListerOp { + } + EnterDirOp { + dir = ""; + mode = active2other; + } + } + } + hotkey { + title = "Volume manager"; + shortkeys { + normal { + key = "v"; + mod = mod1; + } + } + commands { + VolumeManagerOp { + } + } + } + hotkey { + title = "Text view mode"; + shortkeys { + normal { + key = "v"; + mod = control; + } + } + commands { + ToggleListermodeOp { + mode = "TextViewMode"; + } + } + } + hotkey { + title = "Path jump"; + shortkeys { + normal { + key = "slash"; + } + normal { + key = "slash"; + mod = shift; + } + } + commands { + PathJumpOp { + } + } + } + hotkey { + title = "Center active row"; + shortkeys { + double { + key = "l"; + mod = control; + key = "l"; + mod = control; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "recenter_top_bottom"; + } + } + } + hotkey { + title = "Command menu"; + shortkeys { + normal { + key = "F1"; + } + } + commands { + CommandMenuOp { + } + } + } + hotkey { + title = "select pagedown"; + shortkeys { + normal { + key = "Next"; + mod = shift; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "selectentry pagedown"; + } + } + } + hotkey { + title = "select pageup"; + shortkeys { + normal { + key = "Prior"; + mod = shift; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "selectentry -p"; + } + } + } + hotkey { + title = "select 1 up"; + shortkeys { + normal { + key = "Up"; + mod = shift; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "selectentry -1"; + } + } + } + hotkey { + title = "select 1 down"; + shortkeys { + normal { + key = "Down"; + mod = shift; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "selectentry 1"; + } + } + } +} +buttons { + button { + position = 0; + title = "F3 - View"; + color = 1,0; + shortkeys { + normal { + key = "F3"; + } + } + commands { + ShowAction { + } + } + } + button { + position = 1; + title = "Show pics"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "display {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 2; + title = "F4 - Edit"; + color = 1,0; + shortkeys { + normal { + key = "F4"; + } + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "{scripts}/xeditor {A}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 3; + title = "HexEdit"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "khexedit {f}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 4; + title = "F5 - Copy"; + color = 1,0; + shortkeys { + normal { + key = "F5"; + } + } + commands { + CopyOp { + followsymlinks = false; + move = false; + rename = false; + samedir = false; + requestdest = false; + requestflags = false; + overwrite = normal; + preserveattr = true; + } + } + } + button { + position = 5; + title = "Copy++"; + color = 1,0; + shortkeys { + normal { + key = "F5"; + mod = shift; + } + } + commands { + CopyOp { + followsymlinks = false; + move = false; + rename = false; + samedir = false; + requestdest = false; + requestflags = true; + overwrite = normal; + preserveattr = true; + } + } + } + button { + position = 6; + title = "F6 - Move"; + color = 1,0; + shortkeys { + normal { + key = "F6"; + } + } + commands { + CopyOp { + followsymlinks = false; + move = true; + rename = false; + samedir = false; + requestdest = false; + requestflags = false; + overwrite = normal; + preserveattr = true; + } + } + } + button { + position = 7; + title = "Move++"; + color = 1,0; + shortkeys { + normal { + key = "F6"; + mod = shift; + } + } + commands { + CopyOp { + followsymlinks = false; + move = true; + rename = false; + samedir = false; + requestdest = false; + requestflags = true; + overwrite = normal; + preserveattr = true; + } + } + } + button { + position = 8; + title = "Rename"; + color = 1,0; + shortkeys { + } + commands { + RenameOp { + } + } + } + button { + position = 9; + title = "Ptrn Rename"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{Rs{Enter a Match *[Pattern]* for Renaming.|The leading or trailing * wild card portions of|file names will be retained and the matching literal|string portion of *[Pattern]* will be replaced:}{*{uf}*}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(1)"; + iflabel = "CANCEL"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "{Rs{Enter Replacement [*]String[*] for \"{top 1}\":}{{top 1}}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(2)"; + iflabel = "CANCEL"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "{scripts}/aa.pattern_rename.sh {p} {top 1} {top 2} {uA}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + ScriptOp { + type = end; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "CANCEL"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "echo \"-- Pattern Rename Cancelled --\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = end; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + } + } + button { + position = 10; + title = "F7 - New dir"; + color = 1,0; + shortkeys { + normal { + key = "F7"; + } + } + commands { + MakeDirOp { + } + } + } + button { + position = 12; + title = "F8 - DELETE"; + color = 1,0; + shortkeys { + normal { + key = "Delete"; + } + normal { + key = "F8"; + } + } + commands { + DeleteOp { + alsoactive = false; + } + } + } + button { + position = 14; + title = "All"; + color = 1,0; + shortkeys { + normal { + key = "KP_Add"; + } + } + commands { + SelectAllOp { + } + } + } + button { + position = 15; + title = "None"; + color = 1,0; + shortkeys { + normal { + key = "KP_Subtract"; + } + } + commands { + SelectNoneOp { + } + } + } + button { + position = 16; + title = "Invert selection"; + color = 1,0; + shortkeys { + normal { + key = "KP_Multiply"; + } + } + commands { + FilterSelectOp { + filter = "*"; + } + } + } + button { + position = 17; + title = "Pattern select"; + color = 1,0; + shortkeys { + normal { + key = "KP_Divide"; + } + } + commands { + FilterSelectOp { + filter = "*"; + } + } + } + button { + position = 18; + title = "Start prog"; + color = 1,0; + shortkeys { + } + commands { + StartProgOp { + start = normal; + viewstr = ""; + global = false; + inbackground = false; + dontcd = false; + } + } + } + button { + position = 19; + title = "Start prog++"; + color = 1,0; + shortkeys { + } + commands { + StartProgOp { + start = normal; + viewstr = ""; + global = false; + inbackground = false; + dontcd = false; + } + } + } + button { + position = 20; + title = "Duplicate"; + color = 1,0; + shortkeys { + } + commands { + CopyOp { + followsymlinks = false; + move = false; + rename = true; + samedir = true; + requestdest = false; + requestflags = false; + overwrite = normal; + preserveattr = true; + } + } + } + button { + position = 22; + title = "Reload"; + color = 1,0; + shortkeys { + normal { + key = "r"; + mod = control; + } + } + commands { + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 23; + title = "Full reload"; + color = 1,0; + shortkeys { + } + commands { + ReloadOp { + mode = current; + resetdirsizes = true; + keepfiletypes = false; + } + } + } + button { + position = 24; + title = "Find file"; + color = 1,0; + shortkeys { + normal { + key = "f"; + mod = control; + } + normal { + key = "question"; + mod = control; + mod = shift; + } + normal { + key = "question"; + mod = shift; + mod = mod1; + } + normal { + key = "question"; + mod = shift; + } + } + commands { + SearchOp { + editcommand = "{scripts}/xeditor -line {l} {f}"; + showprevresults = false; + } + } + } + button { + position = 25; + title = "Find History"; + color = 1,0; + shortkeys { + normal { + key = "h"; + mod = control; + } + } + commands { + SearchOp { + editcommand = "{scripts}/xeditor -line {l} {f}"; + showprevresults = true; + } + } + } + button { + position = 26; + title = "Dirsize"; + color = 1,0; + shortkeys { + } + commands { + DirSizeOp { + } + } + } + button { + position = 28; + title = "change filter"; + color = 1,0; + shortkeys { + } + commands { + SetFilterOp { + requestflags = true; + mode = include; + filter = "*"; + bookmarklabel = ""; + bookmarkfilter = showall; + optionmode = set; + changefilters = true; + changebookmarks = false; + querylabel = false; + } + } + } + button { + position = 29; + title = "Toggle bookmark filter"; + color = 1,0; + shortkeys { + normal { + key = "d"; + mod = control; + } + } + commands { + SetFilterOp { + requestflags = false; + mode = include; + filter = ""; + bookmarklabel = ""; + bookmarkfilter = showall; + optionmode = invert; + changefilters = false; + changebookmarks = true; + querylabel = true; + } + } + } + button { + position = 30; + title = "Hidden"; + color = 1,0; + shortkeys { + } + commands { + ChangeHiddenFlag { + hiddenfiles = toggle; + } + } + } + button { + position = 32; + title = "Symlink"; + color = 1,0; + shortkeys { + double { + key = "x"; + mod = control; + key = "s"; + } + } + commands { + CreateSymlinkOp { + samedir = false; + relative = false; + requestflags = true; + } + } + } + button { + position = 33; + title = "Change Symlink"; + color = 1,0; + shortkeys { + double { + key = "x"; + mod = control; + key = "s"; + mod = control; + } + } + commands { + ChangeSymlinkOp { + } + } + } + button { + position = 34; + title = "CHMOD"; + color = 1,0; + shortkeys { + double { + key = "x"; + mod = control; + key = "c"; + } + } + commands { + ChModOp { + onfiles = true; + ondirs = true; + recursive = false; + requestflags = true; + } + } + } + button { + position = 35; + title = "CHOWN"; + color = 1,0; + shortkeys { + double { + key = "x"; + mod = control; + key = "o"; + } + } + commands { + ChOwnOp { + onfiles = true; + ondirs = true; + recursive = false; + requestflags = true; + } + } + } + button { + position = 36; + title = "Bookmarks"; + color = 1,0; + shortkeys { + normal { + key = "b"; + mod = mod1; + } + normal { + key = "backslash"; + mod = control; + } + } + commands { + DirBookmarkOp { + } + } + } + button { + position = 37; + title = "Path jump"; + color = 1,0; + shortkeys { + } + commands { + PathJumpOp { + } + } + } + button { + position = 38; + title = "XTerm"; + color = 1,0; + shortkeys { + normal { + key = "e"; + mod = control; + } + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "lxterminal"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 40; + title = "Quit"; + color = 1,0; + shortkeys { + normal { + key = "q"; + mod = mod1; + } + } + commands { + QuitOp { + mode = quick; + } + } + } + button { + position = 48; + title = "Change time"; + color = 1,0; + shortkeys { + } + commands { + ChTimeOp { + onfiles = true; + ondirs = false; + recursive = false; + requestflags = true; + } + } + } + button { + position = 56; + title = "create TAR->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar -cvf \"{op}/{Rs{Enter archive name:|(will be created in the other side)}}\" {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 57; + title = "unpack TAR->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar -xvf {F} -C {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 58; + title = "unpack TGZ->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "gzip -cd {F} | tar -xvf - -C {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 59; + title = "unpack TBZ2->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "bzip2 -cd {F} | tar -xvf - -C {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 60; + title = "create RAR->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "rar a -r -m5 {op}/{Rs{Enter archive name:|(will be created in the other side)}{.rar}} {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 61; + title = "test RAR"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "rar t {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 62; + title = "create ZIP->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "zip -r -9 {op}/{Rs{Enter archive name:|(will be created in the other side)}{.zip}} {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 63; + title = "test ZIP"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "unzip -t {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 64; + title = "create LHA->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "lha a \"{op}/{Rs{Enter archive name:|(will be created in the other side)}}\" {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 65; + title = "test LHA"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "lha t {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 66; + title = "create 7ZIP->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "7za a -ms=on {op}/{Rs{Enter archive name:|(will be created in the other side)}{{ufE}.7z}} {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 67; + title = "test 7ZIP"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "7za t {F}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 68; + title = "GZIP"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "gzip -v {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 69; + title = "GUNZIP"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "gunzip -v {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 70; + title = "show TAR"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar -tvf {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 72; + title = "show TGZ"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "gzip -cd {F} | tar -tvf -"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 73; + title = "show TBZ2"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "bzip2 -cd {F} | tar -tvf -"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 74; + title = "unpack RAR->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "rar x {F} {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 75; + title = "show RAR"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "rar l {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 76; + title = "unpack ZIP->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "unzip {F} -d {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 77; + title = "show ZIP"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "unzip -l {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 78; + title = "unpack LHA->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "lha xw={op} {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 79; + title = "show LHA"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "lha l {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 80; + title = "unpack 7ZIP->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "7za x -o \"{op}\" {F}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 81; + title = "show 7ZIP"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "7za l {F}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 82; + title = "BZIP2"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "bzip2 -v {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 83; + title = "BUNZIP2"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "bunzip2 -v {F}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 84; + title = "EasyArchive"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar -cvf {p}/{uf}.tar {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 85; + title = "EasyArchive->"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar -cvf \"{op}/{uf}.tar\" {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 86; + title = "TGZ->SubDir"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "mkdir \"{p}/{ufE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "gzip -cd {uF} | tar -xvf - -C \"{p}/{fE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 87; + title = "TBZ2->SubDir"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "mkdir \"{p}/{ufE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "bzip2 -cd {uF} | tar -xvf - -C \"{p}/{fE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 88; + title = "RAR->SubDir"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "mkdir \"{p}/{ufE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "rar x {uF} {p}/{fE}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 90; + title = "ZIP->SubDir"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "mkdir \"{p}/{ufE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "unzip \"{uf}\" -d \"{p}/{fE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 92; + title = "LHA->SubDir"; + color = 2,3; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = normal; + com = "mkdir \"{p}/{ufE}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "lha xw=\"{p}/{ufE}\" \"{f}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = true; + } + } + } + button { + position = 94; + title = "create T7Z->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "tar cvf - {a} | 7za a -si -ms=on \"{op}/{Rs{Enter archive name:|(will be created in the other side)}{.tar.7z}}\""; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 95; + title = "unpack T7Z->"; + color = 1,7; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "7za x -so {F} | tar vxf - -C {op}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = other; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 96; + title = "clone GZ->BZ2"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "gunzip -c {uF} | bzip2 > {FE}.bz2"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 97; + title = "clone BZ2->GZ"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "bunzip2 -c {uF} | gzip > {FE}.gz"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 112; + title = "Edit (MC)"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminal; + com = "mcedit {F}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 114; + title = "Edit new file"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "{scripts}/xeditor {Rs{Enter filename:}{}}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 116; + title = "DirCacheList"; + color = 1,0; + shortkeys { + normal { + key = "Return"; + mod = mod1; + } + } + commands { + ShowDirCacheOp { + } + } + } + button { + position = 118; + title = "Path->Other side"; + color = 1,0; + shortkeys { + normal { + key = "o"; + mod = control; + } + } + commands { + Path2OSideOp { + } + } + } + button { + position = 119; + title = "Active->Other side"; + color = 1,0; + shortkeys { + normal { + key = "O"; + mod = control; + mod = shift; + } + } + commands { + EnterDirOp { + dir = ""; + mode = active2other; + } + } + } + button { + position = 120; + title = "Panel 1 vs 2"; + color = 1,0; + shortkeys { + normal { + key = "u"; + mod = control; + } + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{p}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "{op}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + EnterDirOp { + dir = "{top 2}"; + mode = special; + } + SwitchListerOp { + } + EnterDirOp { + dir = "{top 1}"; + mode = special; + } + } + } + button { + position = 122; + title = "Flatten Dir"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "flatten_dir"; + } + } + } + button { + position = 124; + title = "Worker"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "worker {lp} {rp}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 125; + title = "rootWorker"; + color = 2,4; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "su -c worker"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 126; + title = "FTP"; + color = 1,0; + shortkeys { + } + commands { + GoFTPOp { + requestflags = true; + dontenterftp = false; + hostname = ""; + username = ""; + password = ""; + alwaysstorepw = false; + avfsmodule = "ftp"; + } + } + } + button { + position = 128; + title = "GIMP"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "gimp {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 130; + title = "ShortkeyList"; + color = 1,0; + shortkeys { + } + commands { + ShortkeyFromListOp { + } + } + } + button { + position = 136; + title = "Sizesort"; + color = 1,0; + shortkeys { + } + commands { + SetSortmodeOp { + sortby = size; + sortflag = reverse; + } + } + } + button { + position = 137; + title = "Typesort"; + color = 1,0; + shortkeys { + } + commands { + SetSortmodeOp { + sortby = type; + } + } + } + button { + position = 138; + title = "Namesort"; + color = 1,0; + shortkeys { + normal { + key = "n"; + mod = mod1; + } + } + commands { + SetSortmodeOp { + sortby = name; + } + } + } + button { + position = 139; + title = "Timesort"; + color = 1,0; + shortkeys { + normal { + key = "t"; + mod = mod1; + } + } + commands { + SetSortmodeOp { + sortby = modtime; + sortflag = reverse; + } + } + } + button { + position = 140; + title = "Symlink abs"; + color = 1,0; + shortkeys { + } + commands { + ChangeSymlinkOp { + mode = makeabsolute; + } + } + } + button { + position = 141; + title = "Symlink rel"; + color = 1,0; + shortkeys { + } + commands { + ChangeSymlinkOp { + mode = makerelative; + } + } + } + button { + position = 144; + title = "Volume manager"; + color = 1,0; + shortkeys { + } + commands { + VolumeManagerOp { + } + } + } + button { + position = 146; + title = "Go Symlink"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "echo {F} | python -c \"import os,sys; print os.path.realpath( sys.stdin.readlines()[0].rstrip( '\\\\n' ) )\""; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + EnterDirOp { + dir = "{pop 0}"; + mode = special; + } + } + } + button { + position = 150; + title = "Selected to vdir"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "vdir_from_selected"; + } + } + } + button { + position = 152; + title = "Add from other side"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "vdir_add_selected_from_other_side"; + } + } + } + button { + position = 168; + title = "git clone"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git clone {uf} {f}-cloned"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 169; + title = "bare clone"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git clone --bare {uf} {f}-cloned"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 170; + title = "mark4commit"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git update-index {f}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 171; + title = "add"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git add {a}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 172; + title = "status"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git status"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 173; + title = "branch"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git branch"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 174; + title = "DIFF"; + color = 2,3; + shortkeys { + } + commands { + } + } + button { + position = 180; + title = "Check gpg signature"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "gpg --verify {uf} {fE}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 182; + title = "git gui"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "git gui"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 184; + title = "commit"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git commit"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 185; + title = "commit -a"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "git commit -a"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 188; + title = "diff other"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "diff -u {uF} {op}/{f}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 189; + title = "diff othersel"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "diff -u {f} {oF}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 196; + title = "gitk"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "gitk"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 197; + title = "gitk --all"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "gitk --all"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 198; + title = "diff"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminal; + com = "git diff 2>&1 | less"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 199; + title = "diff entry"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminal; + com = "git diff {f} 2>&1 | less"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 202; + title = "Dir-diff other"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "diff -upNr {uf} {op}/{f}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 203; + title = "Dir-diff othersel"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "diff -upNr {f} {oF}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + } + } + button { + position = 224; + title = "to lower"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{f}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Changing filenames to lower"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "echo {top 0} | tr [A-Z] [a-z]"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "( \"{top 0}\" != \"{top 1}\" ) && ( ?{test -e \"{p}/{top 1}\"} != 0 )"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {pop 1}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 225; + title = "to lower (rec)"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = settings; + pushuseoutput = false; + dodebug = false; + wpurecursive = true; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{F}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Changing filenames to lower"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "dirname {top 0} | tr -d '\\\\n' ; echo -n / ; basename {top 0} | tr [A-Z] [a-z]"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "( \"{top 0}\" != \"{top 1}\" ) && ( ?{test -e {top 1}} != 0 )"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {pop 1}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 226; + title = "to upper"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{f}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Changing filenames to upper"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "echo {top 0} | tr [a-z] [A-Z]"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "( \"{top 0}\" != \"{top 1}\" ) && ( ?{test -e \"{p}/{top 1}\"} != 0 )"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {pop 1}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 227; + title = "to upper (rec)"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = settings; + pushuseoutput = false; + dodebug = false; + wpurecursive = true; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{F}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Changing filenames to upper"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "dirname {top 0} | tr -d '\\\\n' ; echo -n / ; basename {top 0} | tr [a-z] [A-Z]"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "( \"{top 0}\" != \"{top 1}\" ) && ( ?{test -e {top 1}} != 0 )"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {pop 1}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 230; + title = "JPEGOptim"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = true; + start = terminalwait; + com = "jpegoptim -t {A}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 231; + title = "JPEGOptim variable"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = true; + start = terminalwait; + com = "jpegoptim -t -m{Rs{Quality:|0-100}{75}} {A}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 232; + title = "Go to prev dir"; + color = 1,0; + shortkeys { + normal { + key = "BackSpace"; + } + } + commands { + ScriptOp { + type = evalcommand; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + commandstring = "go_to_previous_dir"; + } + } + } + button { + position = 234; + title = "CD->ogg"; + color = 4,2; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "{scripts}/cd2ogg.sh {Rs{Insert AudioCd tracks to be converted to ogg format||The volume will be normalized||Example: \"1 3 6\" to rip-normalize-encode tracks 1,3,6}{}}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 236; + title = "CD->mp3"; + color = 4,2; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "{scripts}/cd2mp3.sh {Rs{Insert AudioCd tracks to be converted to mp3 format||The bitrate is 256kb|The volume will be normalized|Example: \"1 3 6\" to rip-normalize-encode tracks 1,3,6}{}}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 238; + title = "Change extension"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "{Rs{Enter new extension (without dot):}{}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(4) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{uf}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{fE}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Changing suffix"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "( \"{top 0}\" != \"{top 1}\" ) && ( ?{test -e \"{p}/{top 1}.{top 4}\"} != 0 )"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = pop; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {pop 1}.{top 4}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 240; + title = "Numbering"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "{Rs{Begin of numbering:}{1}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "\"{top 4}\" == \"\""; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 5; + pushstring = "{Rs{String between filename and numbering:}{}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{f}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(1) == true"; + iflabel = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{pop 1}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + iftest = "true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Enumerate"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "?{test -e \"{p}/{top 0}{top 5}{top 4}\"} != 0"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + iftest = "true"; + iflabel = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {top 0} {pop 0}{top 5}{top 4}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 244; + title = "Image->png"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "convert -quality 100 {uf} {fE}.png"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 245; + title = "Image->jpg"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "convert {uf} {fE}.jpg"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 248; + title = "CD->wav"; + color = 4,2; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "{scripts}/cd2wav.sh {Rs{Insert AudioCd tracks to be converted to wav format||The volume will be normalized||Example: \"1 3 6\" to rip-normalize-encode tracks 1,3,6}{}}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 250; + title = "CD->flac"; + color = 4,2; + shortkeys { + } + commands { + OwnOp { + separateeachentry = false; + recursive = false; + start = terminalwait; + com = "{scripts}/cd2flac.sh {Rs{Insert AudioCd tracks to be converted to flac format||The volume will be normalized||Example: \"1 3 6\" to rip-normalize-encode tracks 1,3,6}{}}"; + viewstr = ""; + inbackground = true; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 252; + title = "Num New Name/Same Ext/fix decimal"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "{Rs{Begin of numbering:}{1}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "\"{top 4}\" == \"\""; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 9; + pushstring = "{Rs{decimal count:}{3}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "\"{top 9}\" == \"\""; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 5; + pushstring = "{Rs{Prefix:}{pre-}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{f}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(1) == true"; + iflabel = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{pop 1}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + iftest = "true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Enumerate"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 6; + pushstring = "echo {top 0} | sed -n s/'.*\\\\.\\\\([^\\\\.]*$\\\\)'/'\\\\.\\\\1'/p"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 7; + pushstring = "{top 4}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 8; + pushstring = "1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "countdecimal"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "\"{top 7}\" < 10"; + iflabel = "buildnum1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 8; + pushstring = "expr {pop 8} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 7; + pushstring = "expr {pop 7} / 10"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "countdecimal"; + iftest = "true"; + iflabel = "counddecimal"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "buildnum1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 10; + pushstring = "{top 4}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "buildnum2"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "toNum( \"{top 8}\" ) >= \"{top 9}\""; + iflabel = "etest"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 10; + pushstring = "0{top 10}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 8; + pushstring = "expr {pop 8} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "buildnum2"; + iftest = "true"; + iflabel = "buildnum2"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "etest"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "?{test -e \"{p}/{top 5}{top 10}{top 6}\"} != 0"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + iftest = "true"; + iflabel = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {top 5}{top 10}{pop 6}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 254; + title = "Num New Name/Same Extension"; + color = 1,0; + shortkeys { + } + commands { + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "{Rs{Begin of numbering:}{1}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "\"{top 4}\" == \"\""; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 5; + pushstring = "{Rs{Prefix:}{pre-}}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "filelistEmpty(0) == true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 1; + pushstring = "{f}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "collect"; + iftest = "true"; + iflabel = "collect"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(1) == true"; + iflabel = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + pushstring = "{pop 1}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "prestart"; + iftest = "true"; + iflabel = "prestart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "realstart"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "0"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 3; + pushstring = "{size 0}"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = open; + changeprogress = true; + changetext = true; + progressuseoutput = false; + wintextuseoutput = false; + progress = "0"; + wintext = "Enumerate"; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 2; + pushstring = "expr {pop 2} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "isEmpty(0) == true"; + iflabel = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = window; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + wintype = leave; + changeprogress = true; + changetext = false; + progressuseoutput = true; + wintextuseoutput = true; + progress = "expr {top 2} \\\\* 100 / {top 3}"; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 6; + pushstring = "echo {top 0} | sed -n s/'.*\\\\.\\\\([^\\\\.]*$\\\\)'/'\\\\.\\\\1'/p"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = if; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + iftest = "?{test -e \"{p}/{top 5}{top 4}{top 6}\"} != 0"; + iflabel = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "findnext"; + iftest = "true"; + iflabel = "findnext"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "rename"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + OwnOp { + separateeachentry = false; + recursive = false; + start = normal; + com = "mv {pop 0} {top 5}{top 4}{pop 6}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ScriptOp { + type = push; + pushuseoutput = true; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 4; + pushstring = "expr {pop 4} + 1"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = goto; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "start"; + iftest = "true"; + iflabel = "start"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ScriptOp { + type = label; + pushuseoutput = false; + dodebug = false; + wpurecursive = false; + wputakedirs = false; + stacknr = 0; + label = "end"; + wintype = leave; + changeprogress = false; + changetext = false; + progressuseoutput = false; + wintextuseoutput = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 258; + title = "convert image"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "convert {uf} {fE}.{Rs{Enter type as extension (without .):}{jpg}}"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } + button { + position = 262; + title = "8Bit-Wave -> 16Bit"; + color = 1,0; + shortkeys { + } + commands { + OwnOp { + separateeachentry = true; + recursive = false; + start = terminalwait; + com = "sox {uF} -sw {FE}2.wav"; + viewstr = ""; + inbackground = false; + takedirs = false; + dontcd = false; + } + ReloadOp { + mode = current; + resetdirsizes = false; + keepfiletypes = false; + } + } + } +} +filetypes { + filetype { + title = "Dir"; + pattern = ""; + usepattern = false; + usecontent = false; + content { + } + type = dir; + patternignorecase = false; + patternuseregexp = false; + patternusefullname = false; + extcond = ""; + useextcond = false; + ftcommands { + } + subtype { + } + colormode = default; + unselectcolor = 1,0; + selectcolor = 1,0; + unselectactivecolor = 1,0; + selectactivecolor = 1,0; + } + filetype { + title = "NoSelect type"; + pattern = ""; + usepattern = false; + usecontent = false; + content { + } + type = noselect; + patternignorecase = false; + patternuseregexp = false; + patternusefullname = false; + extcond = ""; + useextcond = false; + ftcommands { + } + subtype { + } + colormode = default; + unselectcolor = 1,0; + selectcolor = 1,0; + unselectactivecolor = 1,0; + selectactivecolor = 1,0; + } + filetype { + title = "Not yet checked"; + pattern = ""; + usepattern = false; + usecontent = false; + content { + } + type = notyetchecked; + patternignorecase = false; + patternuseregexp = false; + patternusefullname = false; + extcond = ""; + useextcond = false; + ftcommands { + } + subtype { + } + colormode = default; + unselectcolor = 1,0; + selectcolor = 1,0; + unselectactivecolor = 1,0; + selectactivecolor = 1,0; + } + filetype { + title = "Unknown file type"; + pattern = ""; + usepattern = false; + usecontent = false; + content { + } + type = unknown; + patternignorecase = false; + patternuseregexp = false; + patternusefullname = false; + extcond = ""; + useextcond = false; + ftcommands { + } + subtype { + } + colormode = default; + unselectcolor = 1,0; + selectcolor = 1,0; + unselectactivecolor = 1,0; + selectactivecolor = 1,0; + } + ignoredirs { + } + dontcheckvirtual = true; +} diff --git a/talimatname/genel/w/worker/talimat b/talimatname/genel/w/worker/talimat new file mode 100644 index 000000000..14eb168b6 --- /dev/null +++ b/talimatname/genel/w/worker/talimat @@ -0,0 +1,16 @@ +# Tanım: Hızlı,fonksiyonel X dosya yöneticisi +# URL: http://www.boomerangsworld.de/cms/worker/ +# Paketçi: milisarge@gmail.com +# Gerekler: xorg-libx11 xorg-libxft +isim=worker +surum=3.8.2 +devir=1 + +kaynak=(http://www.boomerangsworld.de/cms/$isim/downloads/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--enable-xft +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/w/wpa-supplicant/talimat b/talimatname/genel/w/wpa-supplicant/talimat new file mode 100644 index 000000000..1c4ad5633 --- /dev/null +++ b/talimatname/genel/w/wpa-supplicant/talimat @@ -0,0 +1,54 @@ +# Tanım: WPA kablosuz ağlar için anahtar müzakeresi sağlayan bir yardımcı program +# URL: http://hostap.epitest.fi/wpa_supplicant +# Paketçi: milisarge +# Gerekler: libnl dbus libxml2 + +isim=wpa-supplicant +surum=2.5 +devir=1 + +kaynak=(http://hostap.epitest.fi/releases/wpa_supplicant-$surum.tar.gz) + +derle() { +cd wpa_supplicant-$surum +cat > wpa_supplicant/.config << "EOF" +CONFIG_BACKEND=file +CONFIG_CTRL_IFACE=y +CONFIG_DEBUG_FILE=y +CONFIG_DEBUG_SYSLOG=y +CONFIG_DEBUG_SYSLOG_FACILITY=LOG_DAEMON +CONFIG_DRIVER_NL80211=y +CONFIG_DRIVER_WEXT=y +CONFIG_DRIVER_WIRED=y +CONFIG_EAP_GTC=y +CONFIG_EAP_LEAP=y +CONFIG_EAP_MD5=y +CONFIG_EAP_MSCHAPV2=y +CONFIG_EAP_OTP=y +CONFIG_EAP_PEAP=y +CONFIG_EAP_TLS=y +CONFIG_EAP_TTLS=y +CONFIG_IEEE8021X_EAPOL=y +CONFIG_IPV6=y +CONFIG_LIBNL32=y +CONFIG_PEERKEY=y +CONFIG_PKCS12=y +CONFIG_READLINE=y +CONFIG_SMARTCARD=y +CONFIG_WPS=y +CFLAGS += -I/usr/include/libnl3 +CONFIG_CTRL_IFACE_DBUS=y +CONFIG_CTRL_IFACE_DBUS_NEW=y +CONFIG_CTRL_IFACE_DBUS_INTRO=y +EOF +cd wpa_supplicant && +make BINDIR=/sbin LIBDIR=/lib +mkdir -p $PKG/{etc/dbus-1/system.d,sbin,usr/share/{dbus-1/system-services,man/man{5,8}}} +install -v -m755 wpa_{cli,passphrase,supplicant} $PKG/sbin +install -v -m644 doc/docbook/wpa_supplicant.conf.5 $PKG/usr/share/man/man5 +install -v -m644 doc/docbook/wpa_{cli,passphrase,supplicant}.8 $PKG/usr/share/man/man8 +install -v -m644 dbus/fi.{epitest.hostap.WPASupplicant,w1.wpa_supplicant1}.service \ +$PKG/usr/share/dbus-1/system-services +install -v -m644 dbus/dbus-wpa_supplicant.conf \ +$PKG/etc/dbus-1/system.d/wpa_supplicant.conf +} diff --git a/talimatname/genel/w/wpa-supplicant/wpa-supplicant.okubeni b/talimatname/genel/w/wpa-supplicant/wpa-supplicant.okubeni new file mode 100644 index 000000000..0b8c04e8d --- /dev/null +++ b/talimatname/genel/w/wpa-supplicant/wpa-supplicant.okubeni @@ -0,0 +1,38 @@ +Assurez-vous des options du kernel: +[*] Networking support ---> + [*] Wireless ---> + [*] cfg80211 - wireless configuration API + [*] cfg80211 wireless extensions compatibility + [*] Generic IEEE 802.11 Networking Stack (mac80211) + +Device Drivers ---> + [*] Network device support ---> + [*] Wireless LAN ---> + +********************************** +Exemple de configuration manuelle: +********************************** +Dans cette exemple: + +la carte reseau wifi s'appelle: wlan0 +Le nom du reseau wifi (ESSID) s'appelle: reseau_maison +La passphrase est "ceci est un exemple de passphrase" + +1. On configure le fichier /etc/wpa_supplicant.conf avec la commande wpa_passphrase + +wpa_passphrase reseau_maison "ceci est un exemple de passphrase" + +2. On établie wifi avec la commande wpa_supplicant en spécifiant le mode démon (-B), +le fichier de configuration /etc/wpa_supplicant.conf (-c/etc/wpa_supplicant.conf), +la carte wlan0 (-iwlan0) + +wpa_supplicant -B -c/etc/wpa_supplicant.conf -iwlan0 + +3. eventuellement on attend 2 secondes + +sleep 2 + +4. on lance le service dhcpcd + +dhcpcd + diff --git a/talimatname/genel/w/wps-office/WEBDINGS.ttf b/talimatname/genel/w/wps-office/WEBDINGS.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b9b7441aeddf3a5f2b65f1202dcde864449c0454 GIT binary patch literal 121664 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

{ikSQ++2W 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 Uv!gex7+~=kMla;`yg2y(0F!roZvX%Q literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/wps-office/WINGDNG2.ttf b/talimatname/genel/w/wps-office/WINGDNG2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e36d7f6318eba4cc6db90b978355fb40e63b6ea5 GIT binary patch literal 65788 zcmeEvd3+Q_zIau4&wbyM%uMFW%;ZjHa!l?_?u$T3IFdkskc4mtVYo+#D9WV*f(Ihv zjduW*1W{RBFy5@I>+QNOtFDT=K0!q?`F*QrCQMj;Pv3ig{XVaH>f6=TRn_%9>RVOc zs_sD;A*2AnAbCY|ZFTy4*Z&Ej&ki6IGiltU<{GazSA~#p6QufhLUXz&?}IPzLI~dq z*HflcG_-v6+MkCJ63qpFtaDMvlIAa7*o6=e(&Mtu6@E+4cdH<6+;(`t7ju^MEc)a3 z1^o!cX2A8#o`tLD++F!kD?$a|BXrl2xm}A^`MHT_5ORKnkcL0EyQAw=AyPwGMtEM% zT!@g}$B&2WNpKxMcaeY96X$o_i;z8l5WQq!Z)e9Y`yzNg{}o7cbWz8uB?33c58+ji z-ma1vr*1S=zm%>I?qU2f{V_t*WXd`FTMO(y(LtzSY zc;G?>UV;tH77OxyYx(vkZZf_Xxw+5b{=Q4M5i;T_qxCrjHwcyliqNTWm_j`Cr*N2t z_;4 zm_kzO`*4^>TAB)n83^mcVGh#MY2h#zsp+b4m4oyEF#aPUt+^zHvT;} zEQhd^{*(=?AgrWA&sCE&P;*j$6B|~NFkj1t<49P{md_-yVYW;rXX?DgJze0JSv;1m z?q&0O7I$}9X0NuC&Fkr2*t^o=wAA!2T-3eHQoFb_%`&HVsik3F=hEI~y>tAQ^4_IO zdY5+i=k+d5gNr4rm(J^%>$f~;ap&cEel1;Nhd<5I*uA(b%~HB>p{0prS!QYKUe>*I zMK?sUxieCs2)AX@>LuNl=H7+N$s?AfgzE51xuURW>h4*-uw!XdOjK}6_tIrhl*OHv zojn@u84X$HEwgl3{7XB!x)*gUU0~^*^D9`O#i$o8MT<}eT8NsFAI^(W7r>c^R@G5BM(Bjg~=N58UmBD+`*9Rs$?!2+We80=!26+`4pt_J6fH#yAdYbI_wjZ-bkU z^Q6gBrna=UO`G06W9F<5G`q8_drr^XdGi-6T(r1%$rVeN`IoO)xoY*AwSgP z!`0Vpy!N_Ho40J;cKr=EZr`!=(8G^B z`q<o9u3=AH9`q(qiK6m^NC!YV~$x|;3z4+40ue|!&>!<(p#-HDO>o0G= z^X_}^hmm9u^rFxwGC&II+jZamG%|t^^lyD5BeK8CJ{cttN$w0EL--NOOl_b~GuLxt zxOZ^h<00OB-e37X{`&&GpjhybFjW{7O%dHCZji_%OQku|mu0Ku)8%s%m5N5ilZxZY zYg9F=2h?1(N^Mc6s`J&=>PhMj^v$@ec&7!izS$11x);nx$U&TE~YxT;;R zB(x`dmN+Nz+obBG)5(*PKT9b{xhmzgR72|fX|lA+^r;zs_jb?ynMbmI$fmL-+4^jI zc3MuY_uf2pUS?iX-qO5V@;=D7=FiR_EYKA!FW6GBzhI!?m4bg2#uio;E-ied@Y5no z(W;_dMg2vu6@69gC|*?jRPjj3l#(SSTS^`(87evFEAY+mt@qvKd*1iH?}t)-X@2SS z(!SCIrKihKSw>k`*{x--lr!Z;px{vC$^%LuN*S|3?ecbMG?=>Vg>>00{ zz)Yx^aBU;6ae(FY2l)SE2N+U_Vi9C$8YwxSq96Gqh>v(9K_ozYfI=hyC}N=)iAIKz zgoRQhhOi7t0LqaRpaS4Uq(m}+DkKM}Mhbu$qy(r%s*#_Oj)i)phHwnh0E|UifCi)+ zxqysF575NII1~e6Gm0Jg3G}7`pcNSb+K>sL9mN5R2lyj$ATvPdSpm9`6<`9g0Zc^p zksnYJ3zJbigj0|MU@CF~Ohc}b^C%r90L);a8zn;6gOWzhp-hwvFbkys%tomIb5I&U zFTn3nE=mWOhcW=>BR9YTMU5 z05}sh0-S{=0_;Fd0B57-kuPC;z8TkTw-l+iRq85PjP%FUsEL?!v zM*ays*EE2O&~$){Q9Hn1Gy~ugfS;o)&`f|!(JX+=PzOLinhkI{>KyqDMi>OHL|p(^ zp>BYy(VUS_(HhhPa4nh(Fo5O(ypo0M(EO2qp!H}0z&^AP;8kc5zzt|Iz^ehCLD!&O zfE&>gfY+ic0A7cd0^Ed_jr<*LMt*=>Shy7}hwwJEV&oHaJz5Fy2DA#`jc7H%?JV4Z z){OiO?L=z<-h=`GccCi*?ndhX-VE?#bPHM!@K)3Z@HTW6z&&UKz}wN)BY#DE(KP_? zVBtQr5yE$(Yezmp`_Xj(??RgZ-i&|2%kjvkNgE@c@F@50UZE1gdPO=A`4$a4~@KqUPccCd<8uM@Ky9E zz}L`Y0AELskGzRav+z%-AHr{-g8=`G4vqX7y@?J3d<#7R@GmTU8$Ai(chFNKZ=iS4 z5rFTZ0f6tLL4Y5iqX0hy_$TxcdK%zg(J_D@qh|pA4Lu9+6ZG83X_#*kcm^E@_z(04 zfS;lhBd?>+(DML4M}GwPPZoZGPD1!gbZX=^^c8vm;8`>T@N4uUz;Dn?0KWzJD*6|C z8Q^#56@dSNUIq9)dJW(?^!msv=sXL5K&K)6Bl;7-pU@j4FT)J?&j5c$Zvwo?!eR6l zgoEfWBQK#5^fti%)9L@G)BjJW|DR6(Kb`*nk4{HEF{-M90lZSd_tjVi@ZE=MJaBS^ zPWI5r7CKo&CrjuQ7djb3Cqw9@_f3QR=fR%?{~h?(z`qFoN$`iklXM5c9{_(Z_#NOk zgWm{#J^0n&7lZEtKNEaA_%`q@;0N$sp~vhGo$d&oZV#PIp;K(=6cak>eB&VF_ux;1 ze;xd*;9mj%GWeIk4}pII`~%?c1Ai;{?clEge--#X@Y8ENPJvV4-To|o73{~`aU~0B zUpa64=e+H2^S0l@+rEakeI;*uH*b3fZ~Ii<_Q||>zKw6;$MKE)SiYXG<*WHhzML=R zi}^x6pU>qpe2NdVq<$4$Pt`Y<;rjmLov41crT=`heE8ikLo9t=?4+! z9p8Apwm&zypV~Bl(WI6EJaQ1@8#WsHmE|pPACGLj-Vi>wwxZ;Jclt3=^^L1bWyp;0 z0c^~;k%dVtbh6Nlcx?LmW|D3@n{GRsZaXIFwqufRJC3B&<3o+eQ{S<5mg$!s9(pz& zQ-xo+z?Jg|F&bMA@=;l9`Sj5FFeMTKma`1j)-tVpNimCZfmOfGa1@Lu2aqVawO?#6 z>z9Bh)JQE&EhV=YSiON;Qizs?Z|T<+SPe(rkt;KFK!9F|J`+zLxSo@J@*uUav8OXaMJ)D(PBBrLa= zcMDTf&_SUHf+7g@SJ{^w#8t(Z4Nz5;`3EV)mjI6ab@qzN{#rX^g<@z&Wk*+k(-nx&|50?^DO;vxn;|Bmj3+{TS#G%yH=8>wG|3YO{s5cu|lowmD?-?jiweB11J>h z)1l%dj-VMrxZ7SyVrI>^^b71|_PJZ;&jMz}Zs|u&tF4D(>wJSS5v!}TY?;(zxAvD9 z?5!OY#)E3KrD^ryTA!tM?48t2LQ^qaLso)6gda~yKJWy?7Pf?z-U)!3Mh za17TWKZnRoA}*sM*N;0Q;r`_0{-h)#DZFxEE!3=-z0OWeS7BW!+M9|5b~u%d!=TPJI5n;G?U4lzQ~=??6d43&QGvr zQcXYKIr@{ywW`Xw`Tbb?pWN;a-G}B=X*tMn99tS&oE=-X8l1DXY-tef^dtmCzbPC=HAp-)iXhZEKy2fvEkNA!_ui%3EjyMI;kK zl!0zdWetH5AkXD|!iK*l8tV7EkzaBDbxEO&Y`QCdEj4u&tXrG_%Yz$iG;Xlg%tjSx z7iWlC4p%23?r}JiqXPW^u$VIh_7XQvpiV#t;#s(sf)a2l3F8E?g>^!C``~UJnuT^z zUaB3!v(X6E2q`dF%NfTnl$j!i@Jkj>EZlE7eHtVW5tjuenM%wz5wv0L$1Es0k@+ z4OnSNX(SgpzJr`r?8Ifbiqr;tm)HT#LY7abjm??&1635ROf^x@$ zRcaB~q}IZ57g#Mmf^rh@T)YZO2_0MUetZvp3d(yHze$x+t<*dy?OJ9sGo6DuG$)NM zDV=vUP-8k!Y!zG9TCh581gp|6u=d;m)|`jIc5)P~CC9)Ta)Pb#%V53u2$)1meYr~tK{+Ce=4$2)MGf#WP~p;O=}r5Dnx=*{%2 z^qWi((5aW%&&lVMaauU*fL=;&9&Z-!b>IeuQG^cZ;Ybg2IUlT`b#ROWTjMgY;H?5H z+l@fed(c6^{TPe$DX{Il4_JS}VlBpEtigIB4>%Q1#jUt4d@KQ6m$LK^;d(c|8+dRJ zJ_;Bg!_UF-HKn0q0JBYSfGmX%g2`7jqBZQHrM0w~w$aJ-EWl|ieLMX=gBdZSWpses zdZv%r&)m(NWKJ=kGoN!PIMl$+e9lzBc0Ff1XD8>9&<`|?j?$&*3T``t zp>`?!a?W;cJK9XyxD~wDnPOZ()gvA5Ms+ZPdj|F~oC4c<8JY-B`T*#B3XX|z=5m$H zB=iv<(QnePM(RUr@mb1?+o;3LbVkdWN~D3s`EI}oGm`@Yy6 zkJO%l9VldH3BMTC@sq&EfOn!g*gdj~H;i`iA3=}OAEJ|-ThOD#^K7B>e-;+V(WCrR zp|m7D@od~0C>uPd8_EFB+j*Ja1lLiX(V>%L{2ufu6Xn^uB%)nh3)D6IoYAut$|61- z&p(9r!%mrGt{Am*lTjo64w}Mi`nQw&aQ6DMifBn1w>Ik0mXvlLn z!#N8)p>+g@-*{&E2)v}?(4*8DpjGdGUdC@t7pVue1j@Y#@^Bs0?@1^do^iQn%e?B+ z^Ep33TJTI!$VbZJS@Fhj_)l;q9`MC-IR7IY|DWKGXG7YF;7h=#fj2>(3*g@de**kb z@Q1)Z4E`SQyTJbd{!8#5fqw)1De#v+wUl`2zq1_nTRilL`j4K0hi0+vIPK$#9w|E2!LqOkzz5;gvd%Tjf6xZ zhT#a9s+ISRR4D3pdB*hu&Sa1x;?f{z@8n#bqz*a84V;>Vt)QjrLxJvve*13?T& zTnb4fu)RdY7RGRhpzDnLo4REk2+gNG8{k#;Q;NmvpCP?81;sspmKE)qZXESE#; z7Kx)H6$+?-IO0-BCgX7VVzwj>E2x4|#hxm*Nd^xt=tu6QhUiOR*ptz%}xd%MG#c979ZuT&@c{f*WZ98ksVLjYbozR;r+*6zjt-5dGbIc}_QW*;_1{}eSw0*ro6T!!%Q)?trk;D*ok@&Iam>7_Lr7AkoVBiU5;fPBi zy&k$A6_V}ZLxTaNU!{(YHktTBc{t)yC^l9gl4#hnU=yNTtCh*3GyUGM z26jDK9CDW%K}C!^?HROI@9kB>r4n)oeHG3+H6*v(;5#= z%@qD=9Pv<`!*17V&0$A)M;dz+e(^?VpbDv+HCF=o|sZ6BW>HNH%9PD zFdI!um0alvyGZ=lv&|M88>f$rj&wML5=}VbQpjo*N#(I@SwgWyV>GJO(V2d4*kDB{ zDMN!|lE|t|MpBv@I2QgHGSc8V8L6p8V?x*w+(>J87%UNd((D$CTBFn?gBAG56aVg|*NaU)xMB-o!p);Gc+UQKbH*9twl$NbS#MhJH3{o)?~ymz{01 z5#)&@xRExLYH_kv0Faa9bm?O>F`lrC#E(6vrP=L?R(o`$$0Jc1!x5K4si`uRHr`E~ zM6NVC9I>&{nSO8B0VedEVgs_~x7X#3?m;hsP5iAD!vdBkSwchNN)BrBHdf&S=f4BTlU|B<1ENBt&QWytd;sLS!ORRGXdRpLuXvL`l&T_k?&xuKz;pdu$f zIUdtuORNM^2xv zw`PVTE`^$!jJCwGX~gMG*38OEw>vu1?+uqXA=I_hg9^KP=5)_l+O;sFs;V{gt1P`@ zacgVq74zqpm(K(@0~}GJM31zVHoz^`Et)j0AtN)%(-n4+__62q_Uh`U(yHjluCCa4 zZ#d#osI@iDky71BT&y|XTVJ1@9i8d-hHG1iahj|<(0#BTNW-d<-6!MqVWtm121^l# z5$7;Hh~GmfJ$P1r7L|Mr(4CQ~uqqr@g|&}H!+jKNdF2dU$n9f>$RbAF$ostSIbS0y z?D{W&ef4cVjm4IlR?H-MktM#ctO9IN?mRkk0LS=D-lTxmt3AO}WP_Q@7N45t&dw_= zE~}6VT>h9rN{R&O!)Fz`y!3RGel|~jHvOzF4=xo-h;nCO3??=n*KW(s@_KW;*a>Hx zlj(syCp^q0H)yR6=VWI&?KU1q2c}InZKg-(&B0C=B;jcx=w-eNJ|28M_{nWrr6kKb z`GJdgD>n=OY0uWq^{)k;0-jo-dEjjuzW0T$TK_%RSrWVDue_qtDxvJDTZ6F~TZ5uU zu5T?=T=l^h)Z*aqmmOIGUarc$?)wusT`D!Y@T}!m&fdN+xQoY;0z#j*HK*NhURfI19@d-+^O@SNwIu94Q(L?+JXmV z`lPTn%8#|#lT*_(JR<1;Mf)W1PIn|mC?BNYUGDTVx;#Vx5pl{2vYVp>xpp`}v_Y~7 zy+CwbAj3ea9IuN+a2SwfLRYPhT9F?7!Fp|j^t(Uf;`KNQ2Y$5WG&>UG6~Q0RK3%AK z2B&^d-@;L=5`0+`gWm_6SBf@to7zvBc(^locKMf>FT`8!xbx+Wp2QhR8Hvi^KZBEX zf<|2a)r9$6tw!!JrQC4l4r$Y|X@y^lEa4Xa0Z1z!-dvA`cZSM+8G207nxE<6m!256viumlb49)ru#58|N=C)7g5D1Aj;@CN1G{1Oz+Zgp zCOfXa5+>>?#U(AR{Q14@u3b0G4_tXeVENU7uBicAZ(vt)TOctz5L+7%T-jx#V;{YB zXm8^3UG&~Z1xRUgIFlz&ZE0&4xb{F1^v!V`vy#qeNWa$KvDLqd_D@XrbNmfGeg38X z9mv{B?^%CyuCB`8v1-S}hMT#rK}wCpgfM4A%@1^99{6eo}lx@)D45G#3YIH=N>^8RT=76Gfx#F|4SPiP->U5Y;8^e8IhBMm>w?UC| zHENDdtJUeqQV|!fw3!}nPIfk=$Raw}j(L#JOLBxtQbPf>H>8$B&r<0iPe?68eihV% z6cUQSVMRa>b@$+oj@y^+!MWSoO0L}zJi2e$4KFd%{Pa}i(Crs<=$Gy|B#ynfymT`) zY4SCbH{#sI9W^pa=v%n@v8%6{wz9Q_#>K0cC%f(&p1YUMR@~I{)3YTHv=ugOb-5IM zje2Wx^3_v{ra$Mf>D1~aWeEjOrED!qs+gzNsPHB-2%{!=y*Y_7cXf5$y!ee7NrqhS zBxh3lM+on0b|t0l8-9EEtql}ya89hXS#M}->uY{un#BnEuQu1}%wF0xIndg= zN^25}^L!Q5gAKzA+J=J-bd$cg$J?~Exu|&f5wp;n+j8B+oY~YFnKa(+o9~S;80M=A z^5e7Sl-X@~Tt-GZw6I;s!JEgq2V}Dd_TWrL0iQZGyJRAQw|kvQ@Dgus$wYB|YUKcB zIb_VPhm%ibJS)sc&Lp^(&&z;xbb{q5z8fXrQ-{iEI|=e&=koZ%7!s_(cOM>~@r?we zg^1Q!kh8PH(9e=?7Fs0fd5L_H;TtPAARDBQ4RI5wxE z19Tht+CUxbe(Hp`;#R}XEwa04GrWsD|zS6#V!LtdsdP}UsK1g5PVS~IkIXocTCC*a;NbnVdQE!Wdm4{h8zbi>f@ zn{T6U9NN(pur>r{2Z|O3l5+xaJ2tMEW-W4;@#BssqrfJVSxZkz+SYgL@=bx;Heb2h zy6PHwd)LO*J9-Rx1$1&tiON57kw0lCz0jY$Q(wvVH}?25TKxKq0m^!K`?(!m$0$46 zfnP_rQntgpm--zL?~~nXyXt!SHvjU0-BbK@BRzmuKe_AN?wQHE2k~m8Pd}4KbP7=^ z!=Q)c-;*<_mos4%7%;xM%4^aOQTmXh$tahS)~L?S$#GNL9s!BtWpbSAu260 z%m|eUq6e}C>co-_BMG95K+ZH^I(5P|+cz-Snw_apX(5@FXd_j2ro##Qks0VAiJHpJ zvRX765_0N@K!){>V^oPjBq!Uhp+T>a5}Ym?t~i+*yEp8AEzH}#q-k#O-NdqGUwyNz zJNQ=j#NLPTo^QUx`!D_tCw%l>v-Lt_YSn*yL_hvmaPgT>g8m0{W3uvB+=Tx{QMWBG zNHsYVs%~DpZAnAUPqOl|6}1Jcu9-+(wf3Ja4o-t%=2vTj$$`KdYuCarIQ`#4oQ`L2 zbIquGv!tdtHqD*VTlj9}h2}mwG~c|H|CVZ)K#tCh?nE5`mU_4(N^9Oe0cEL;DPg{E$3EV*T9r6 z>zn4ARCW~^;emc&zGRAF4#k7_vkQF|B&7KPEDUf(0nGi9gD6;i_hXTtBlg4Qw`V!& zUq||7WgbkY2#SEHlJv(4E16eWX#y1VEL>Uj^9ky(XSkn!pZ+oU^l$@H94yCMFFL43 zcwXemWX@*sDL4U|8=$|W5Z6!f{PTPFz_+P{Cm#530@SKl$^Clc$)XlNSf+>Rmt20&t380dc*jPX4@u zDc*JQI!1D8*TqeY_~g(30W^uwC&U>AybT|NOlYOA5(y2M=F{4MP8Cqf0@B!kK@{Ks z$D~S~fgwE8XhK{w#cKB|_p0{F_Qvd$hFG{0Hj3_(?&PF@51k??Jys8r{*q-P^p+)G zM|50h+{LP{%bAO_tr|y^AIt2EgVf>S2I6r-@Ex3RIrD=n-0qX`^LS3V-S8!h2&P05 zM9^ocfQOyFJV`*T4rl}czB~|;4p{fsFhoRjDv?|*;L7&N#rq`t1p7oGnb|4Y2QS;~ zq(Irrhgsat5*-gsj%aiiGnSDd#8{kIp^C13B#lE6{_ z`>gv+`^@`{L^w4DKlSXWg!+UaqQ-bcvqDN(Muap-20v_11d<6%W$|V^Dqu8wli*GS zmmO9A=R$iqS$SJTff; z-2PXaQx?D{#4Gv_1=PZ7LA zJ;NJ-mkz$A;YA(3bY83>&g|w|1G?;hJ|Q4C1!$d~UMokj@G=;Dp~q-4Tin8|ec2Ab zD#b58iYuU>v>l?e!2nl*RHLnuogtIK6j80D_aG6_8es@-g((>^y(nOiM21BQn1Si6 zu57Per?Hc%8yRt1VWy=3lbBtn)md}ARE6A3;Z{0MK6qPY^R2`Ew=`GYR*cV{gcdq) z&zj8K<lhZs3mN%+V!VEXlg6TQ5$zal(Wf>4$Eu+BMtbc6&T)E>2mV zo4cHTXpJYwk(cKnJ3oD=n)Y-_*?0 z`N}J6#!Z+wiC-5;b_a~MfWVk6IH5DA7Wq}#enXkR)RE|Cn*7ZT{_z8td$_dPUj^qU zn^XN#mGmf;fJ*U#L(PWfK?pJ|xxxch7^@OW0l9!!!wO<#AhZinE^JODO+7um#GRpn zktI8xv|7kihS*ya0IU{>#vYg+lkucR&A_113IkCt3>lq}f=p>)8VuWy6g&d#3NpZi zlhdVeDV!e(IQGmfI0L)4WZF4`jH`p^gFjrIfuA{oIl)iwxi9!n%nSYmo9myM^w%w$ zKeFeoe&^lQdA0<1VT-3wDk*Ze6uJ|b)qKX3vZmNrUvDg4lVW1{7t7~bTUxAhnY6;B zgo?_9#6m~h0}sT(63NDkvsz6>MW$AIzf^LuO+w!<5?*YjAE0Rhg(5ae66!tpogk;t zy~orinSe$vf!3DfGpJQ!7|T4yfsZOm)(aHtHGKGnqL%B2J^n}W5*X1X9+C>AgAfFx zRd|*F)MYg!NNI2w7KMV~!**jb6meu`+cRN+&9P=%t(wg2M|n^ExRy8R$45FlPmxzf z@Y$e>YJ^%r)1rS)W8QFghFnPZ@MEC9@D?VqRfB$z2bi@IWbz}mUoc1|Lp2D$;n4tr zp9*;nY#xCPNOCTmogAwr2f|JWbK$Ig^boewC$Rm{q2PxXi-R8?!f(N)@V486=i&1F zo;~<2%8cy?4+cLR{u|srbk!a#gcvpj#GHrL&W<*?%b`}J?Xl?Zq!nGW$zyrmCN3Rhevf0~I&? zNyuOP(wIiCN;B47+*C&$rZpG8Oqw5D-kqM_jknHEqRw2{V=Kj5t4yY<;PO%%bC=tF z%Hx5qZ8(^aW;CWHz|zt$)3qM$KN6yAQS|^$JCv8@C1!6=V;L?3>atV@`sxE^V<=ou zS1?N9I^@U;lUSJbTWCz|BELvwkg+g{+kw(&!sCMf7Nv7?z}^OS70?^(s6GA;1E88NFZ96J> zDlWj)2N3rdZbM2c6+Y_Ob_8}Y`Due+@CBPgUX}g09f}g;#0Pn^J;We#H z%%&hYC~hd#^bNsexEmLpIxI=7o+Be<(i^3-t5c6Zm72s8C0AxXgJX~br$Pgc!KsJL zC1xU0!aOPWSuK)O9cVcS-n=puigLX6ldtvsm`Ed z_C@6noH-ZvP#a#p@y3^4y79)B|5}roSwsAAHd8zsZ|#Ix$o<>r^labWGiUqST2E#z z+^mHc6oc=;kmuxuJwH%!H@y7Pc9NUTSX+DXE6xxZ7tz&oc92}#dopWlp~PB{Ceo~5 zg*A~Bx|V)wnP?t4CDbLtQbqO4Oq$>5gLumV0vd>N%`;7zlo zzG7=F&}&?cF|*>mN$OyY|0D(iM11koD{s;u~fVMx`0B zvU=R-$`em$q$L`Ixu}$>ZnL{Rc?`;`4rtl}C^0FmotY8H3Z!Tx@PP?mCKH%~rW{K# zl$R70*d6jbuf{WhZeYX`NSWcTZk*CKtzBBv;`KX9%>{mIiQiNMW-Xt*!7oQGeyZFb zBX?L$Ow1tuC!#_!%&Gt&d`J(lMo%!kv)v5=mqt|}Ch!)(Ay*3jXKU9{!ep*`p_Vad(&kvnI3 zf-}{araI~|?#q^?h>bfAd9@Sig;Z@_ioMLEbgt^bTN7d=Za3X4XmZrtd1pKxFR^tc zyqFnVTC&b&-ZJ?r<9K}M$`z}Z8HyYw+LIsg9J_Nmjg#8CCsya%%?(bI-61{>5i+i<>#SdD;~<7{2>SW*39ZyJRfL znZp@6&dw+Caqg$gMEDBfIQS-C3p(h_&$2k&9>$s-lUqYVn)y_$!Xn{th%z>C7{qhHPI8s4SWWodN|d9p+=rc7#&g(HoLNtL(JB_;X! zn2MF+#(B!Z@?J(3-<~(amfsj(W$kJ7F2u>M1X+gJEfCmjPNzCIRa<0dGGch?d>$ek z4Rfy=S$Q`h_<)@c!Mo0p*myL>r~W~Sb$T7_5LR+bDg-PMa6|)m&moOObqsr8=&=`> z@FLj7qF`@I6tM5vDzX!%7zoYDiWXS!@?eFOC3t%KD9JBTob4XQkQ+LZ5c%@6Bh(vw zO5+$qI#ZYu9zuw9emaT@wO7m-i=TZIKd|NEd$=DkXTX+Tjh^ubcJomiRbURHq^^ko~(R?`ObIViRr92FAmcc#)P zu{cmt7!YI!6oH)b0AooEm?{Dc{N+H2fJgYiK}2>6g-;%8}n`V82mWPuMaJBv$7 z%PS-)Rat&jhF^Oi1y%W}JikOG0ahG}^`{UaD!bg zi|!9Xd>HK$;(^AY0k+)*MCOHh1HvEZ23(-swS?Z;*_ob@cZAm9T@J4fRFDh0fcH|f z|AKj^-o?{v7cHFKSrB}-c?osJ-oy&S&Wc6XRcy3XSXZ~ICn-yC@4^KwtqH?hsXc2? ze>-TW+B*WB3)d$ z2)DG&4Yl`BdoZJEM-+zBO1T6pkHO$vi?<;?-g`JkNaLea28yBFPjd8P*-kN8!xZwN z!3$#yMjroZyd1?rgI5EI$awpE*62f|`1|kA!YCWa2aTRcD?56=B&^WxM@5yD!kngv z5Wev4s0b1%;}ap1EOxL$Hg{QA#KzWs`XN3~a1<&o!`q%@PD@pCDRd-!Jcdc*SPlb&qj>l3$q46~ za&|%+iSTCGT$VGA#S+39enU5CV6w6|g{y|WFV+zb_YYwmOmtV&9gcP+4S{Zk9(U{= z`>*D)UzP{@Zu)Dk5T4`Y>=;v8)SVF_7v`31FTiTg(L4#inkOMT4{6gQpK+ISE8u&< zYtXyC;x3&zp{2EpThBubyvpPDWM${T$IpGGWfhg<7xgY#x^h*_^5XhH^5lSR!twyG zC!n4YFcb%P$!Z&87@#tJNx8`5u5lz}m5pbba$0<5u@v%g^5;WVni0015M{N~DvCcmS`pQgyyn{yo8v~5ge8bd}3!{>+p!H&Nn9NBya zYB)6Bi%bnebDl8+L9zzwOsCjAHel4v@zS9gp-x4IX4ncgTYIfC zCN{@<<#=qim@VQdJM2jst!kZ;?9iHW zJMH*0*pO;o8_bsC?@Q8BOUo=l4SuW#-kz%oCKlJm*wns~gh&4d8-Fp{g=?7I%-`V~ z*X2Gb5-MYiR<4G_GoOyvJVWKc4w@L)qA8=YeIiMX=tF4M`l#e znX(poqHSD++OS=QU8dF%mI23rpk##RWygF}Z_Lwk$4@lMu71E}d}(poPHoa_YYJUF z$?eAzhhH5uX~AVx18(azU{VsIkRHkYe$TkBLzZb)mv%SA>mx#hiu)&oWH<# zIMm2-M1~ot90v{H^G|`?^OOu8#6Kbl5k7V`gv^(9@INgubAX<~>2#5L>6C~w5Epzu zDDF+kOXOK}^*x0X3!6LR58`uNOV;bd*9K3+D@pN;Bq^izsb)<%6{s5sPvf zn(fo@mAY7Kd?JsQ$XusW=phaoVq{MP@kEG&OAnb+Oh_>uC4|X&X8Hj`lOSU4DRrAm;qyLh?Sk9p@41;y~;(7hCxeXJI(yI@+ zOfU7O?$jl|4wU9fZ$F+CcZ5*7B5&QxosfDDF-89uBqzEC{+Qr1pt%-o(~Z7lQJg6j z(E^cF%~dFeVswh3*tMn;unZjse_tbz$~h|K`WS<1y?$F98J)&}1|YpYyCOjhK~YzP zL1USNFkr2K{{{jG%Q!kNJqx(Rw`d8Mikdp(F$W*~c^rrSJa|3zEEv*nt}isX@v<=- zdlN6bFwA`X=J0>e*%#(`@j!!a)@(^QA`rp@bN*9OSHJ(3t3d;}&25;}ll( zM>&MaUN8*XIuK3~0c@NIOMFxftx-l&M^rdWO_s7@<7t#>6btdH;3imY zIv?DOS7KrCR29x=0nV=qo&s>WA+?hvi_S(Bj7c9n1((t7{MRr%%@v>i1q=_+vID;X zLl0~hM|K<1s1ex)4D#|T7@o&%!TZmj58jWboeN%=3+rh=!>|T(=LIhSxE#A(xb6I< z9G`{L&JF&IIdg*-Apcm*RA4Li_)KDn+Q2AdhG^vwy;gwOORa1@(yr%jW0#vqqmAN~ zDq`gZrg1P=1D760PBxruyhksu5_9dvm3x5bg1=$j?ZB%aJ~$0t6<0=(+>U#q2tQO2GYC{GL4(xjFeMkhPK)g3_FxW6D#II5Pg&lf12>A_@^ zCeWR`oS5EOQ+!04uDke$0G{^!(C}+?Ng#Otx#y`fWA0D5_!C|7;E8j=`m{R zbFe@_!`JB3_XT{;PBSQeD2K_>2+6oB*QW)eJ(j>;`FK}qW{yaoyO(FspEC_oUc>|BLW+}2?xCMx z_h^s}iR|zxGJ=8&Sm;-A;e`Yz;RP6obJ&g!x(s6a^1}R-bkQ^pO@wTegDk|rEP)~R zFi3^G9O}yb!Hl<${0;vR8y4Om%UfGM_27~R+dS?iPx&q!iTCdP`R@KR1qE~NqF=Qy znvZ%Bq>vJ__>||%63GU zvRAH_`+?H=hqQ^>=WqjxL%FyH_!39uAufza*-0nqf7u}oyX%~_V6pG!u*Ly)tMD1v znIJzC8nlvOkJSY`Z`&eUe=G~riufYd5y$RO`w z;>R66{Y~&B-o5eMv!_Oadmp@MQH|Uxr((1fC9cYSZCx|sE`GV82>!h2$G;r9;;k)J zt?Mv8ffMg|{Q8|wKep-1xxpWv+qj{K#(@B4vZvm1-O5sGE&bNqTgEq(l~2By7{p1F zuG;l?GW%~Id7pCusB8vFZT2O=mrXPVoERsxo;IMw(~MGcT5gb^U{orhJ_YSD>-R{U zKbj?`K|BHi2nHn}3!Gqf$r6N}p_73;#DL(z&H`&_vjEwc>I@IiHAK8XvS1Y)w*0Z8 z#>$y8n|{CHf+S{l?UJ?xIKI{S(V7>7BZGrm@4&n>Pd>Wuwz*e7Fy(!!H~6pMJIg=m zymjNWJKh@X?fvJG+s@RRA6b3>anGs3o{5`FEQ7-d)H@aP_RPE<$DRi1o&wEe17F+gIs&~1Ne2HST9>I zUmuU-e}qpe4#MnP4vdqZZHIv-F~TT`IiA?$LB+GI4CcZ{-?D~@@@m68~JgV?{mBo;` zT7~6l(w51d;8)YGYfVvEeMdLroyVVhqTw)LRRs8*V(~M>l;cXkPYU?K%Qb3Cyg&)~ zd0;KJ&!O+U%2-#n+Vc+;Xr(=w-@eqGwDcg-3BV za^r$Sjv?rxdY-Hq!b5f?xo0=U4^YKEjRd91 ztezJk3(=;-X8^Klm7Na~y$ifN3tJ5!mYooW7B6AKq=BxR?OQ_Kx;NC#gUaRc7%Oy1 zS;(5H0p=2I1S%_}i*;l(Iq9d!*Z`ANHLr#Dd0v4*p0jr8b+7IF_UeYoZFTdTbGx4^ z3celu?u+2l@ReAF_3mfCedu0{CgkTAXxj>JTUfa?HUDS$2d|sfD6;E=8<^tG{3g%+ zS=t+CZ$A85>9mgW+@>2dzQ9=@evH+fqL=U9|M#K3qDdt_S9anJvsOGV>c(qQ^al9Ycr^{D=e( z#n%j(!0HTChwpp*8`a~1>Q5%@wd4scgzPY+0*mRt(VZO-0O>=7CqyUWMj8=WRKL{6 z@xpx^v3tZ@J!C*{wP%yJ&EN*?b_#JNGWc@3zz9O#%;oYduwG}7d)HjC>9u|T+AwZP zYu)^&yzZw8aUz!e6ITZNgWp(y>JQ&Lf*RqaYi(Q6Z3`=wrR853!6Q2f)$x@fnrm+C zBs6cERi4+hJ>!euD~nDk`@7@n^<&Of!uUniJ|) zqbfewIggXIDCkc?*85qSk3+Zk6zNIv&VtxHU46N*627BV8cX(#h~kAq()!Z{l|!XT zWLTDE20a|}WT~_up2;F)w=nQsMx8USoLi$v=cSt6CdGPQ>N&S*kF{ofG0$C0_OV%6 zx`T9w7JbPmf{dy_6O%UqL($<|>^`Pb~n9&KI!{LG4}jXFuwDqr$ate!X{c;w1=f**$2hZ;gUaVdG zO=a$QdW*m5c<_d*@of)1GH2^Gz=amzLUPh{>g9IeLhppd)0sJyDZb#}feV-iTyX3@ z7W{Hf^@9Ib-FE;)aeV*p?A{$52OP%%M~4HBF5Dd;Qq)7Rp(yqe8%;%}gknWeVq%O~ zV@zU@5jZd2h^DL*Y`g6_N5u^sn0)7f(PeP4uY?JJpFpJ?L)492)H9W5cOYgo-nt;3Lh z0|VH&SZ9ci)}~Ia=F_bd7~JXFrLWf3EPZwN?Ck7OS=rfHqgqa|NsL87V%B`z`-;C$ zq*uNoGXBBU3!h!Uzt1s_Temix>0c985q^M8VcgkZgH&j;kAH<<9oyMpN82ql*r$#S z-Q#gz6BOo0jg*5}Lk${_rr(1}IxORiLhFsm6cCT8!RlYMUjyT9l?qm~@tB>$fE%-? zXE&Wa?cS#ouSxIY?%pT;S&jbO$o29Nkq#Y*M_)Es2vXU_y3KLS$b(EM>(7LdWd^%| ziU?Cj3*H=L?lWnlW9R$bkE&xk8Kgqe$qp(D}fDPL2Hz=`top==+AI&i}jS z6UZzeC}Gr~k|u@_fw<^Mp>};XBuHL-LF&{Vg9deN=PqH>UoM%srl!X}7jpbrP%%dJ zd^@LoQEA4gk!txkuS4w?KL5rf{nRN{En$<&%-ol(sR#}2)Hdb-KorZS80?}d+L}P* zL6h8()5nC0=$B;8dwtpV3GItQ6e!B%FmQm8h|XI z6G1Q+fQC&vjR{~Pu3Ru>f=;^|@U1D}Y_!P+Q~gKQ~|tq&n94Ng(PzeU|q ztDWtKGtR>$1!kQdB+3RDYhHIs249aBu5>~quzvs^B>N!wG4`~9c=3m1{GSsQA)fAZ z+(zVtO>KWg%h;z%Vied@3h~E8(?I67aZr;#8~W^GzCZaQwW7kUpNxOYF4^8s$?ql4 zByK(`lO1V1UOKS1N=!+d3pJb}+gjqVju~rkaMyZl^qruUY2{)0kOkun;h~`#xkdv( z$^}@47{e9@1-W~@<~hRM-CkYTrcGY4Qa>PJQC|p0z!miHrWbyiy{|N@tEHTdS_U{>I!l z>An>!?9*ZPU2=#T9#Ca4+j(zNg_l=|8jK%o5CpA^t_U&FcpL^k$^ye84zQ_AI4HXv z9qrOgBcI+K6P>1!Pp>xyVAc=Bna5-et;}yeArHwk+D%KxDFUi zf8hSNysd3pWjvkRGTc9C^y}U;uJ`3xb`U>9`OGFtSAIj(dov!yRzfyiT$6A=+!`Ig)*G2Q z74j_t5hVVhY|LRr# zL5I&Tm_+;*oXd|%If&(taM*8kuf=@E^8muGq`vBV&Hd@_kF{SaQVQ129moTNF zEbBTTbsP8F&GC)I(kYCq3!TD*I0XhMoMQB?nl9>fX3d(@XI8H{b87wC^=n%-E$$+5 zLj%4w$9bleikr!;LmVMH2VX zl}ywgf@vrk*|pYL>8Qe7rA7(&3P#%T53o;#>V2_y*7z9B;af;FMC=-m`7Kp>qn86i zFllYo8m=3^&VHggY${7+-Qv7kwuW-0;hUDwRA+kZab&vKK?YZ0cZqtmU?b=Gf1>$rtESJ!+y-&;o)*m-xMdb-3MJ71bBF&lR2g>g$7czNRgAc zy|i~-oiW6yYkcS10~-RN!wLo%Q~*L70bw)DfB?SUL)#l5meKA82%OAth~`@iK4O6* zVt_I28i0be2@-*Ut}*^5RVyZ^fvtgZId(>mjYkRxZCtr3WoCyVMB<@uyZUik1F;|7 zw?kV`G26c-Y!*8ymdqObid*~j&lkJ69(5n=;JIOYpO5>G_I1dF>vL;4!yhZmuhy~w zY8WTfH%p2R`R_Drw7Sa6q0=1)9G=tCr{@A zbHq^*BFqAG+WFQ~0PGpYj0>~^c?~AFae>s;MLcOO^s_%Iy35FDSyyF2!ApE}5$V|y zG85YMaTSw3eTdk-SGzZ`mcq-aYK1xl``qRIEkdEr~%=SM2S$Qk308gJsi*$^!z16qRM zHAnedFOvxNXOuZjHvn&y{i$H_(b4t@bdn z_BIq1{D=txE-5lJ-4!xv1R89)2at?C=zseVZ){34@p?gqzus{Do(TYr{3H505TiK= zNF10wCgG}>II4EVC}5e62XJPeXRRoPO}d#J=P66L53+h@6j(_{4MlpRvBLAVyC=FEO$Eacd?~c#k};qqOxSGL*3%Et za8^O48LL=k@RR3T*8Tu_jvSt|V?2NIa5EXv4;>fFjN5DP<{vKd(j7$?DF{4W0&T;A z*WC^F6kmm>E{>r`SPh7EF%w0?7#AWiw?LZai?kS|Ig$+X2u-;i<#{G`I&F>ddMi1b z8pN2o$inMjxj+p!O>7^sp}_0nVq14x$KCthUViM{niW-Zw~)NpWqp(9-0Sl~>d5qW zTeh5JWUZX|%JS)J#tp6bcJ_jMr@abLykps?v&VRzz3sRit_{sx1XMJ;K~QvfydM5_gwS#f}O44 zq4eN4cscZTKj^F^%9~dnQamP(TN0-fI_H=hP^$GAmWL{ zDBJ@CnJt#eX&U&t146?aTGyJ0O0UCgB6xdOm^r$ziMt&<>jW7t`5uHHK^_n!Im+Uw zXz;kDJSTPqGMFSF3H%qu0WiUFVhR+qpcgO5cnYUhAYl{ugF)dTuByNU6{%Mx2D^~W zb8Bkm&fT?Z?zE}XTf&8ts0MKU$;K;5;hd;%Uy&%FQ$0~$xIkR^pDtYBe;!B{lf`@y zUqr`5SbQ9X#Rt{MdoeobVW}k^EK@yT>tT?)Z)aQu8@$6_%iXs%?$W0FPN-ciETpWA z3#|O&6V5F_QMWxEM-%7Eq`0BXI1Ih6{2G%Y<~z~CWi;pHdqyv zIJt>z-*?0fE?YNyC^ySIWc%6v!dj?c|713t#*XYDx~Cn!Sxrz2(6prs%NlqfL#GpB z;E(f<_ANC-Yu_p&<4xvLPDdWW8&H- z8B)?ZckS*ebyBK4Mf%gOt{!zPcJxUhX8Ec^#NJ$zG(zR6iAxi6RDp(pZ=aJgD#nl^ zu|0^m6vJ`qo`m+5(gbg_{kqxeN|o>ci=q&`C`T8}uc#RyfFZ;Muay?ZEH;WDto1XR zxOhstD%{*uHi2~OD?GKpfvI2*pi*K-tO5_Hp;kNw0+A|)?vj9pB}9Dk*p>9uKI!}u zek;HvPj933@l5}-E+w5K6Zf2~F^*b&?7+sa;<~!`OZjU5-C-Mu=aqE#lq65*pfpas zI{onhJvUlm^SD9J^>Q%Q))D{sJ-RPMq7Aw$J~{V2UV?YhX9q z8{-w6F6iFtg;Qt0yQ0C>(V3Mp*cAzu__DC_)^3-?j@og_IP8S%X|N;HuuRHvjGefS z^r*2}Zo8lKpvED_25OxKD|*2I2BJNIF9B+m1wCsV+YXj2eEA8!94DV*uk^{sFLRSm zn#=jos+`2XDrd#tlmjDm^B>y|)+H#2zi26mzxenEoR=C3|G`bO*d{+J@lX$SWUzsq z>B017`Z3oH(>#JB{nfApZI_S;q)P3U-UB|Z`zf`)?%4hn9E+u*WLN~Ib?(v?8+3cS zhC6rfq&=;J6EXV=#zzAuE57yNI%a#s>G16mM#w3oT|yH52Ks~^Ju`Z{L~S1PuSB?XNUe#A$5bqJPq@2}ALogX!9G}CCWS+hs9c@b-(DcOQXVr=gTeD;m5~B!#ZBl$lyiJIWB8IpI#=(vy z5NkZHL}e2~;#D>rek3Gb#hK$uOMG#2yJ9SRnw)7gy2}`-i-}3<6R}1XQKd6ZN)v5K zOEYduGhPo!3J}>Q1tdMf&$tb-WCYj&0f_-?)JXx4en$*0!djRN>#W>$2qpY^ZX3z> z88W)sW85+KZ}~X#5XV}u{nOGOe@e6Kk9>^|v?ys}VA5l~rO?OsEQK*Ga3l?K`D*#y;)7{rV4(>-{K#gtm=um(Zc3A*Bmc zN4w*NaX&WB<6r+FyjiB| z*k&k+9upy36EU4n`S($$Id}Oh%z12x@(7L6HAfsria459c;n*j90*4-%MCq!)IlLp zIz36sBx-qtq8JT@M{|)+J)fgNmCQfAoy~Y1`u7i_D zZf)Ow>pz4$JCVI^;6NRp`R}96Kjb*K3^RZ?PeB_DQ<~tAR=DF~<~bOVyu2a)MCq`v zFcKW7k=Y0zwqP|b{}rsp!f2c*iu}6+lL|o^V|2jHZJi)b;U>XclAi*>jUL3VP?jC|DqG=_-c$ftk9AOz5E%vDo zHw{$(7ZQvhxYUN5eHmJ4x!Pf85A}#e{XAuo!G?OAau<-?v13wugCQv}B_$v(wJijU z)cBONwD>kXqSAZxi0>lw zLB-Z1FaXkWG6a@PslT&_4{R88K0f~bfwI6@XI;10t|9rMq226D8Rt?7Gr3!S*U1vb zS8d4^A~nU=WM`Zv798RcXeuQQ(lX7^$+KswXONG7ml0jN2FYV_5R$7uEJQ-&MN-!y z?)l&mAQf#;KctQdF{`Z5TR`FMB6L79tr%p*p{)ubV@qxxC z?E(_^1SSUur&RbQsEzFc+O?3R^`xeiB>m`W4w=rskdwQ8yC@?qtuiSvacw|+(3h!~ z{oDDjP7Fxk?gb@U6~0_ zO&$N#)NxNu&9|hs7(3OB1{&Q~5<77+Z1s+h_lZkOi|yL2o7OiY!zWD}<{lNT1JXf! zht%W{s!ng~*`DG!mAq{=zCQYx*f=V|OTC;u)n2|bUyZXG=cu;VB!}jQh1s_U9s`>v zx6e-oCVP0B$wNm!qsZ*6@$zvG3H4PYKa1c_1$u>FN>Z}lLXd}ML{N}xNYaSp;^po&0x z5CNU}(HS3Sp6MxZ7n@O&hUx52c=jw5{cfOupL+Hc%=UgsV?8n5T8*C?6R=10_g2~r z%=C=-B_VlLqPpc|?`bId$2OzS_U-JopVHXZF~eJkj5vE-9(yDPB(ii$_b4rm{|O@e)(b95TduMLIAdTUV7=P)KA!QQ4G=88hYTadGi! zT{8O(&dM2GHG9r0ju|P#D~7>Cc(Q(6MTS39#}3}DIGr&p0|7%!H-}`ngTnW5@yTgj zx@8Q`nlZC#wlby6)*-WBLD7_oIj`7}oU$^}Xoi#xi&UqS8S2@B&_K0-QkPLjN8AukjN(_W<>kQ zQT*Mne-C}*73|Po&2KaQ+{ZVX-R%E|4RnpGbE2-mt~2!;Nx1Kak%f zlCdRi{^0k|Sf}9E8~+%n)~NL_lw2k$8T=aTS3W`_q2Y|kHG~i1`|*}o+xIhx5<_zonjz61X` z7Ktrb%P|$g2{ErQi6KNp?fPU(p#=5z*Mzsx#wVn7 z>DJ?=x$_pdOh{I9aZ@Io&UWf^dKg#74y$E`Wdn(yGbG0)Pl=09Nbb_D&%j}$$5zdL zX|B9|ibk6~LDU21&3lHIPnljhZ-Je(SXH4Gaa^0?$_j5~rF2M-$`rPa9lEf; z&kliF9j?!A14T{$g~7CO9%xdSQfy9eGQT6dVBuO2^aO;a+B_$vn@9z$2A+mM$Luc# zo-sSeYMiiuhUHLb&)WvYg9dPzi{;%o zkr*_f2ZhkQBx;spHE^&^Uw3oG2b2yNpuRJ~Dwv1}NNvmf&eT5$iAuzaFY6@n(se_ocM%4n@A4+nVv|(&v)Q2N-}?E zY#A(&Jly+nxbfn`cjJ>IGmXFS8)|OzdN~Mq;oscOhX(<+I_Crd`%*<&N-$Y971 zp0}s-4fRWQk|FkDzPSEfQiP2T(oTPTIe%M%t6fk~ch;Q@zxE>Ey(0<#gzqwgZ2og_ z9BF%D7H{~NM0BX<|3x*y>?~5kb;Zh(Vn4%?Hnmd8axBl_Ki0am@{mRPv_AO-_`j(dBUTX5HHH3R# zIHSbnFvGFKu^J%3M%|}oaAWQIn>W_2zri-FyLodRekLupd7p}0u#KUM+SIzK`6_+u zb-EUw7@FBvsOZTnuvL_syh2o(Hhh>?tt{@x|6(^stAbkXT4}ii*m8?Xi<$%#^e|4wy4<|PmMm7EbgrueJHia3G~Tb7BiQ{ zG$%@*B0wUe#->Gn)V~x#b=Y?F@E#s}{LtcBdJ;^lxmi<%1gju7%4Va^vcit2(!|FXKv$!*@5S0Z1WB=J~d%C`w? zP3K%B>|yFfT)mi5oD>vi3yK3Y1piQ!;$)yWTiivhD6SFA01dG?hMEGoL7RTDQ|oolkA(qYv2Hrb2-a#td|ig(H~SNl&19Za<@d*(LY_tS|T2)C0?% zs2!$#Jq{HK-Yu$!9}-xg*EnpJQA2d`W{?10(A3y(#tWJn(Pp|sQn0|m6${plVQer5 zl{giDu zfBw8lcKL|C!aZvGF5CRwC(XZ;vfJT>LB-z!E5?<-CCDv%;o;c1@mtpXEo?rTm5FcJ zC^pK7Qt8$BDW#<+t8Cgy!tt#Q({VRTWx+bOtQH3qV@grB$Dcz0bAz&4%$(q1p$s{C z+`~~V)Jy<}K6-jQM&u_%s2!_RvYqS9b$NWi*p=PS9x!%c8))qDL9R2x2iOAw_Myah zbBQvh*FIJZhaDoJ*gdSo4o*o>oI&c(i6pjmro#7dVwtpA@w5W4W3g0#R)KDUp;e#@ z+q4>;A0ISUvt?|VvHH_b&!4xdiaAw)Jhg>tg1~>EK6Vz6m`kM&)u?;5*7c#O{7Ll0 ze|3#!kxDX?pZSy;A(fv=?Jb+ZNX|TGuoJq?K`s$GZXY_%(cav3GE>*tJ4yu1*~f_; zyip&h4+4`~Uu5o9e{#}7X*5KSXinSn~5@WaVE+NE?3G8l6ZO1mCr+TBBG zmyY7i2{$J@+eEnZ8zoLrp>%8h=D6_9idNq&UAojnv~*1W2(uMRvw?>&KE{EZ7+8w? zbLfB>LT&Zn^iLLboQlpsA{q=I2p4qB-4)Gt5*Jiqc`} zX@e2g-yju#V8h;*F!wQe`UOmz%JjlsRa5~q6iog_{>6tGce0t31+ops(d=?|xpA}! zq$ccZ%vr{Cv!YL3BYo-&&W-dr&qSQ_%#6XRW9hL@IMk_$GL=ehyQy40kGw_R;`2`9 zpB3I6WIMB+jR%P*f1STBa5jcp47(yb#(6h0jWF;@S_(&FMqyG$6jarvaKgE++~Onr z?*+Sd6%YyK=yp>p>j{owtgoD6mZchVp|TVpgZZL)Y8Rt`*1=8T1clo6V?;tT;eQvO zmQAUw=YQdUsjr+WU{r%JGqj^Jp@fvx5~iA%WkRBcYN9PY3d~tj-mGl4;Rvx6GW^rj z776yq(YEYIt;%-8F=wMtr&Lpw9z8*f#W-at{F9kekcYWtHbAi#nM>joqF>NUf)tq} zNRhXMw$KT-h6)@nid2_GZjV|>k?sZ=hB3JO10m2-fnD@?IE-L)RA>MmVB-zF8og21 z^UQonAHZG2_?jq4u}4HW5r^>)5(Kpi5V8=yR-b2&vB&tkkC$_2$P=DCK2BkdK@B-1 zAqT%25ep|vioG1tIa3ybPh)chh+4{$uei~~!DuiV#7U2j^926V1c>DT>UoeJd}=s4 z20s9H6ILV^3DR&=C5W03^>$JM+QM-vLQ7^DD~*+am=o&ZjFyNQUxPgi4#gq@ucT0sUsIaS*Z~#Ik9H@C054DE?qL-H{M5YnM0Q@S>-2Vv<43xPR!Yo?XuH$ z+bvdp+iWUrw^`fwSuFjUTljG!bEv?UW9-Gb(m*ynWie$gW zvdeb3?X#40n9YMH>I_U_@|xLrTH}DFILzkG(s?V+tt&Tv$88Zp6OG@}nQXK2+Bf#o zP|Qn40DeQ83d9`6#ynT~2Q6G~nw#)SUddgdC;QRa8BIeANj9@rd<3H;#cX>@A5i_m ztFRqr1=$7%a7BS)Y^5?g5w&u*Gjk_OHzt3uChxc0B66!U?@n%Z=2g6V7jhF9cn-eV zg?HywooTc)xrHc7?8B@V*NcOmRw7&;Llkd5M?BRRtz*5rg z9VpRU_OucetxEj8S&32^7VT$3Qkx0M_!gCdar`E(M8!R7nL-^-6BWw)7ZWb&Azq2{ zA`PC_nEG>boFUGw%NkCG^Xur(^k<5RQd*{9(E@)c>wQ3T6vj12rkz0!GQlE<4fVC{ z;AoFyA!i$u*u-k~y)9*Iu8S+#!&Eg$g)w1dnNR1gV%T4v#X7x>POTYze!~Mg$qhQz+_9t2&L-{0koy2!tEXHML#<*tPLt+ zj{_r!?RCj!?mEHNu*QNxm6~P+bMD5qZP<}Z*^yDkHDuCcel9;J<}Hqm%;=MTI1n8oBH;er~hW7GH>aAxT^^@z}t+8*gslZ*1gyy-R9@3mtQoG9Hoz zLM=M9hQm06Be=8`?j6SFSTP147Wc-!u*fx*dWZ?pkfl?xeEbSIG8JdoEBRwQ4%_CB z5f{#ZOj<-P@R5u7xr_N1Z<1-kh1TRDq`L^zM8PB)Lap#n?xb)OO><;8L7<|@DRZ(@ z*v)aMbey9A8Bpbc`3zJ#N??C&j6(1oPO#5`gm6*DGkP{Yn~m2S&j^=nn$SSH4dCn8 zg~sPew}IG-vwtAzW_+Gq$kz=-U4BGe;)S~OGz1gY#ukN36;5({JDE@y7CUS>xkPHO zu$9>pyE)?dk~+4pL1sVSVY7&n&v%?dqVF{%!{68S20^*e(P$dOtZK&vawLR(Z2Tpi zbzaIkryFkz7xF5hNex6llmD2_HLef>{Kqqi-nfFzMF92t3iV5EgcTh{0Txgxg_Yej zmXX>E11n8Y*x5MEBg@%&HmzVKz{eV5+}#trGKUV@+2r;K@^cOyxpUYA<0!g+##({jFD1v&kIoUY*8373ZiDFBnr7yKWrqw$Uq;Qzq+MaDa< zBLWnsASOzN33cmb2zyH1#MrV#>qb!vb(7EMBr6=Twp9vr%J^(H!C!=5T`X=V*e4wC==?b<2W}yqcf??Ci}YZ8C2>fwO#n` z*?hOoq}KR47Ezv>4p<9cwXCf~%1~OMBNpK2rgC&7H(ctKHyo+1()`3p;fyU{j!N6Z z@REF3`SjYFSV;4#s!2T8bt##j&lj-qm;}C>&zCOcOY_OAl&|mw`P|~Cr<3{gt7di0 zH8`8#DiNtnfR!jjM@Ruyxfx88?6J06VDMKk0)7I%HZqE#fU?AmlPp)r8l09Z8U#oK zH_cX(be~r;v{UA&1?C)hp{5zk*|q%2c_il~A-VJTx5)z@Hc$wh8y9EhF4&lU>=06xyWVQox3BXMw5 z!Z)ojF>|0j0PRH+fmvZqs~#XYTNFpv93ThyE+kW_oF5)D2MnBO_$xkzlPw}3egV5OMs z3H3G)J=QhGDjLumx|kuxpqb#>U=A2pVZo}2BmT4euuMU|#&%-~ z`HBy~i5`zIBs7M3HTfDjo@W*aBa{@fyd7<%2t$%B1iC_lOp3TLR@&O^XA58~)vVn_ z40R1ra*Ozk`^G11dig{)-N@f(UHK_cF@^U)Y;O<#3*#^5QhK9*q)e1S2Eb5$VFk4#Sb7` zjkm^)H{K%K`2O76Y=rUi{rm!c!G7cCY{Y(20%e(Xc}WH-XM>d^naGws#6t1K7BhBi z5!JKMa_LBFC$ob-_CByj(0AQ?V3N(iiquM_n!|ritpsXs`{Hx5?eow1{-1xr_y5AA zo}(pG1syH5aa5EudV{8^S?~ofcN9-^K-mIx;ZmKBOO8^iz-`p95e-@jlqF)?R_I7q z@s8vUe}inw%_W=o>*Ox)0Il?p+&q3LJ5xxzf#;6I18KSZ5Zs0Lo7E!`_28s942gCs zE!2*kX2*za?d7y*h1r?hPEzei>p?eH337sYmz6pmhfAw$6l$9gHTH6nmx%t-MG|xA z693V~OZ>-|E{T3Y_~T0#`H#^3F&C|MfGVbwA>bp3m`Vumzid7LSGXaQ2;wBFy5gll4@t`rVJ-&1{%<+J>23P zBF`bE{I68oOPu)mIs9)q^oN+7q84_$m*5?k+yC9;97{IPEI097TWA7I^K$^a5#A1z z2OFHkQcRQuu7cwV9Ar)0STGcB;>Q>nG;vU5DJWwm->zOwzA@e_BcJd(UQ33Rv61`9 z$Lt*A6kbnur}Fn-dn)~FQQLHBTh4L$%PfhBA=K7GlOCB{0kcM02I zPN%#9&&KDHIAG!D>Bfv?v5(4 z#F=9&p^Tdi<%d>P@k7ag&#-@g02xsAnK6a+*tn7P;CpSPY<45tuzNR~#uxvd z#z*}AB_BZ+r+rTsKj6xN;Gp;8^uQM@zUv5C-35}5C)_NJF=V)@P?FL{C3Uk?Ig6d# zn|QJnJ-T~h)1N2h(JoZgVL}x<6P7y*ZKTJ7c{XuvtBw*HXvMv;c25F{hV~i3_HMCC z!T$OBGV&w8o%G{fm%Wbj4g2xi*@xxebHD$HOI7*AiM&0r{Rx*D6S-UDYhGPIne7A| zrTEnZ%5pcICI0+3{5Sp28IO^&bNn~NpZE_r%Nl@d7R)oX*dO+5!PwOi$wV_SCd59b zB<34K3~iCSCpOh%QHQbfjS+e2W%h0=oS+z>35|%-#>OW)`9;f}oRz^LVd0TdR|SqC zD%xio*A^#m6S&ZR-q6u8Fo=t;a3!wdX$nRP=+Hgcfl`@V;^ZD83Jw#A6*zIxFF+F> z5v7ZbPjE_X%Me$$XstdbPO8GmHfj6V$TnQtGG!vd276miFD|%DE?3H`RdkVzVhv7{ zz@>3tk!ex~UTt~`Lw-DM+ID1m3>*XB#^#`SaB%Dp0uQ&rPJDHI2;qn;AvR*QjRsu; zU4tS-NkHK78g;xFeM3}A1$liAk^k`W%RdmOmw))-W&T$h=6{>>12=RcN#T#Ok>z}M zw(2Y{kw5ZBNy^!Y=q}ui7s|;# zkG%s_UbctG^U&`s0_S^vAHjKl5LX-ylVY&ug^&e`1-l`OQwb{c0&Mhb9Bfxm$6+rq zwmrZSoZ;SfhsyXW2_n1Qp)n5PuR^OVMD~zC8o^^^Nv1Pb#T&#T@UjGhl!zrVxs!yk zJ4B)wTTF$VNt6LAenes?bCQVVOB}9qOT^~s8dZN%*#gU?A#D{-I88$Bk24V!PH^F& z_9qJz_4SHxNdO7>#<{-U`8%NY*H@jtK_B^lM<0F1f6ae|M*?46FOJ0e0BrM659&c@ zfx+8ZDVB308#@PQrG)hYPq+1|_jHu7^&BU!BSUwq>fJou5HR@22rIEwU`W8r5@%P) zCoaPC!5pa+0@GSf}2psNfJm2w%E0RwNheF9Ec+XW+$vbjh|a7#qeNe|MKWRPB@H%`3iL;8|_q(4T` zfn*T27z`mpvAbs&Rxn18kz^FfBH7rjkW2E&XflS3CHZ6=8BZpV0vwQ8M2g`Qss!`K zGEz<^;_So8WD1!|rjZIVoy?#XOJo+QA}^5H@vb@Puwq^u-AcTApr zK~Z^Wo-Vt*tgNWe6p1lKWMyN^3$nAba>kbz+c$=DCl%V!MiiG#7+t25nt~-|I)}!@ z(h0dbdrLZv2#>OJ#^aN`(PfVGkq|4%A2YVh{3bHPt1_$4%vqNg>&)e$WJ|u~#f|wE zmm!_Tgl~m>QQgKe@X(y8@Qt}N(WsS}*nvh$V z*DN;4I#${|mS;B+xJy3-qBaI6H3mzqf_b8;c_l?0P?{^7R3t7NTauS20&SE4p(o~X zrTLS^rFj$c3dMP}hed_Rm@CUGw4q<+7fzJmLwduvxY-JyBVa>w5bnr?K1V+ExsVkN z2)WT0XomC!dP*hYnx_rU}2O*GOQd;&r5FGeiR5&5a6p`j+73Y_gPbe=C z=adwcmf8webc7W3DI1$#QZ_}3Dw#q+el*GywxboZ1W`BhyQrS|U7?2Nuuw_!%e0>6 zmr+$y$R02TXv~qaNqG}28Ook7&!13M`h0m-NuHxsn6}u2XFBse#(a-6-{ZxA+Zdg2 zjS;SK!Zlt-(@oT@vkJ%9m`c%^@0NI+IUY}uT}Ll*^wO4I;_YxTXVnzcHw9y)c%dw- zWK3R}ZOPc8g6#5Aoh6{R1Y#_KIH~YX5typI5He?N9no7yVr0T=<^m=ZP0cGDlc%#a z2lSRej3p2!Ge4q5IGDqxLL5u;3i3@5r3}fwDOzG3DKB@=_Xh zK>lS}V~PrO&0=~Qvmcu`x$%)DB0RAz$}xRp3FtAJ04a5*n>iL^ip834ai&{a(=DEz ztYatZ*~u~NQKV#BVk@(4tdA4`bN zQEM-;H9cX)Vn#bkVizHSj9C@W64C0u+DvVvRf_jo-atAdJt%N;NL&LAkV*F8OBI3H2;2iB@^>=^8EW26_x2?wR+Rr5xsi* z_w1h1se8}v{fGFcq^5Sx?B6*p(mymOEFs?Cl9j0pt*^=CnoY8O3Wq_L`&}%* zb|xmg=E4K%bFp`CE#js2^;f)x?*Hh0MtRw|isT z&mT+Me6~B`EtUg9TUQS#!J%GR0~|X{JGI1lhQet6P_M?fOSu+GobfRuvC?upqor_3`&PN2lc5lt%4*E%cT9Kfkl( z)8QZ4edr`z_;Kxy&}GM`gw0-Z^~r%Tow{vY-QD?zJK+6X~*A zA}2>%C1SNz-1yZTOIX&)c51<}qU=|DA2@DI{no|(?G`oupN|7TV&JS^->x|lw{1k? z)fOVNYei&c@|680c_wKSOmwC1pI1^)>R&Y49}@-ttTO+xWo5;siP6!MCQXW(NCz6w zc2rJLL3BxR7Ns_=P8Xup(2qH#uZ8ZOPQuzM5?~E>ipNz@$Rgd2ts;auHZ^O`k2RaP z9Ipt^tgmM7bM;w0Z&CY$AxmbvB>ec|$6-q(qr0u=de6Vvd(*EwMx2lKIJNkQCW0X|9)0i#W$L4Q$uE$wI7sF%8tmwxXI^#p;x(@;ysEOGPxyWZ9+X)YR( zz1Gh131_R7(L^~Gv02G6>&`WEfi`!0=ZuPUzkEMP-nZ8N$J#?b92WI#keisC!M_& z_+V++aKnJR8~VL{x@}@Yo^5IAdi|$6wjDhsPJYt)rw?vk4m$sF&b!i0kG}J|W=ydg zw+vjs8Kc;rCN3an-ecw^C%>#X-{C>dPhT5aR9IWAi_nIlK^Uh3Qj3bG2$NQd<^H+^ z3@aJ=RQ4zuUFM%!R8kzJ^VNErUUqH%q^KmTEFUtWTI)xjb4vH7=X4nJPbn`OTU3%? zHpM(N>2z9cJf&+4O?s-X!{8)D{~K!bEF#^)9)7R*deWU*1olN;VAw1^PO_1+}<|vO#jPweq8aA_rg`PN7tShKQ%k>3!mh# z?-?BYUY8qo9oj96+!C6w`KRtLbhc&65WlJdo`%|yCcJ8Oe> z)>?}FL^Nx;cGl}Not~>N{w2R;WniBfE;Shoo}67%@?YP7RnNe2a9qN?c2jn2{@vHz z<9@CqK^G?}?hYHJU$s(pwu5-_%L~sWURU4wbf1OK88oH%z|9n2E zpyQcy?|db$_)<5&{VJ#8aR+(l-tPIw9@nQ{Qw;U*{X_P&9q)LYj)>Q^Ig+==`4x>k zXWhg8-hZgieBpYx@3z8Jy^XO-_51f@COGtYaQL^rrw-pZu6^vUlfLZpT9{|X=RWL) z-)4Tp?SAgwt}jmyx}DekRNwx4cXOf6PZoXgtL?%Wb+4b;8Xws(wPEw5YZF&9_2W9e z_i5W#zDaT395>Eu+?BX*FL;X@Hg^`C9vaiGFvHs+d!OCf>d!v!-?7U_-UBukUvW;H z^J@93O`om?SC|Lcpwz?_?6M@`^93%kJ(|u*>qrxAls0|ya-oLHwJ-)duI*8FH=yiG=G)qNXy*7?UV`x-6Yt4UkLv*bgVrG}zUqD6scT(;Gx1!6c z&#rZTt!CS2-+!WO?{j?4!Cu|Of6N=WC1Os_>9ot*GcJdIoa}kv_z&NeFg?4Be(S63 zE`=)}rX9F>;FI@1zn`?MYh9la=O>K`nAR`6%?|+!D|$U)_jtvu{^7MB-49IsBkNN} zwscf%Qumi4YcDN$HLA^cBhEbTJ!NF% zgc*^KqsUF<^2;K_SG~XSs_lHyhMV^0ALSmS<2<#qwou*?D4Mkfvgb^fuwnbX_I?y| z`{2qU(;t5SVbpPl*w8g)>;F4Ah|@UPo4t=QU%jKaaM7@Q^O5V?bXrwEQK~jY+i`XK z)k!ZUm?e;$k_k}-mQhg<3ya6+MFiqYKioU+nrimDV-fu&J+(1OAQb|e~e?vpQ{ z&*=L8f*10g$FCi^EZFAe!i%4+9C{@r-^b@(@_^8OUn+t^mb^P;pyAf>jJJQfvUSGN zx7zzh#@z|&b?kJ)zPz0CaicHyJDf6ONc#G|`|cZ0A6_#}QuoHiH*TMo#g>nDxSF!? zgPlue4|=cD)E7@KR$l49{i_)%SN(U~@;dXrUUy>tt+Ri=(Br+quj-Hg>)JtycOcWx}aX_FbQ|MFj-96mSoQlk7x zP1-AiPJ71Z+Nh>aE9ucivL^Joz(Ky_jEe(e4Cl*xIFmw&dUo5Q&EfWy9o~(Lc(8A} z%vSmRpu0V`FZ4fJ2X=G@>}Z#Hs?rMlE#}+*EmDdWVhN-aVfI0}OB{S->dn#rJ#4ay z_*)~OX$ImzXCSu13}o$W*M1jeTF2Peo+Ns`e>ZwsL407w-A}8(H|{W=U}OD)PJO@T zYX6^Ruw`AhUeOPBbLkV-?zb5=yQ>qs?n&rX*#CW2mjdJubcargmu8^4#5@9sF|d zR{OVm*Oex@C%&_LPW8^0cV_hV>!sKeGxKYQ#N48^Q?ZBBUw!M)MxQ^#fxSkBEj$-~ zXZG?pw{N~;S3K>D*px*Z_KiL@%*$t8jN@DVInR!7EUG(qqrIps)qCN?gzL52x=kG) z?wC!o5+)WJJG^1j!{s;9#pud>)Ae%i264ko4c0E#RgqA@Bj{=3KKH*v;&GBl&H6D{ zf{6)Xta$O$_^j5W@dFoDWbbQ-(<;iLIZI_ytmZeQix!?0Fr}h=U##VDv&JPl;i0ls z=fU4CPpN$T_R(&WCcRsI>AJ^>LAyN<@7_O>UDJ77!jM1qhpcFmvGVcShIX&C%MIxC z_5SGaPxgHw`S8c^qu+SGSaGF~ZTouxpItas@bWCzw2`?lj% zG^@wPHM>Sn-J;rbR&uQCj~i=m>0JA@4;LMMQrhk6ypYt#IX7|IWB^n2YHX4dcI*uOBMfgonhtd!H) zTPa&bm;yE_V`YM>wkht431H)gBAv6yso4IF#MK+FuAcMl!t0v zI$)+hGlRh%PnNe)&$SA=m4l*ruhh5Hl?^|Oi5Pp*eNY} zooLofvdJzeX6JVwzV>0(@{dmER6Qw_dXd@H)r&({JxzZ-%?CJ>|OunR}1?N+cTt^*%~5UQ^oege7su|SR}eC zHUUX-0>ae(k5|M!MU~hbU504gn_9=|WQ`FU0%U1K2eD2r2!62ji7ep* z-(#1J{p9x13kx-GmdxyH&2BJsiK+;*zh};>v2hiP9-Mh@&h>LUJ$BYs_gX3bY}Bup z?tC$J>OM)-XWD&V?*A~`p>yDbgN6l@-Y-ioK1pJHd~frwjsIr&fR}%XzZBT1)VttR z_JE<{iqlayKK;Ud-<*$9M?3Yb zoY{BA3g<4@eRlB=R13E+>sYz$%X=9IvhUmrQvaS98_jJ0{)4H<-~E1g!-ewA;`fey v^~&$@MZ1nXo_M4Bt?zo?u$dtJX}C+tA$w0unp1%~-Qlx!cL literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/wps-office/WINGDNG3.ttf b/talimatname/genel/w/wps-office/WINGDNG3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a6f6b32523433f8995e8b7c91fd3341c4166822c GIT binary patch literal 35328 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

Djd7xVDImjycBuyg{-AZUrt_k>4vL%uDCtq z^lNF2zx+7+%ide3J>8#g8@X-rV|_bktPi&TQNOX%vQ<*bw}XUXbJxa>N?SKHd4YO) zL+?A*b}P(~o6^He54e^-;c~0B=;Kv*-IPn{^;|ChwTs^zPey@FYRcC|js92GcG-wZf@E~* z{Y6Br%RrI%R-q`Up9wUsuNO%Db!7RpZs8wZh&LDSHGa4E$c&qwi#xY=P|zEZ!=L{3 zx@#S-%&h0;B3NNRhGR?j0 zM?ljuI=P~i%=Rn(7;1*o6-()&ExbLQhA~IK#)g?#?ldg)4Ndgn9DD^w9-1=g7Y;Ev z$(R2H9R0gSx>b1U+1f9A{W2mdas59QT;=+9)7I4qSO4x=H|*j4o(DHM`dl}9)BT&) zPRpEqvVX}$*7-iygUW9D~$efJATQ>Wi|-^?!e zzS*y~ThHjLO6{@UHTL?@eY`?RXu!$X5L`QyElFFi6{uigCC((x01e6rV7p-bmWAO80A z<4e|gnor#D-j>L^DfzD)`APe5XV+f!O)u|t%(vb2iLa49=34rwYw0HPel9J&&$aX) zODvP$to^a7?xDERi$nGdU*mmsW8MFI`z`x7K8_xjvvpq^o>~3tKf-g)9pLe&=39TA zGA(ocLxxxTsP4FB?aMvCbpG%aZD&;1 zeVnnn_j*h1tizt*k>OR(w7gmHxpk6bujsC;= z@_Y7Qi+5BPWNKQMh5i1;j5$H0e|zfZ;+LNK>IGMeBSUvf%(|q=;qS%>kN&*mpW?pB z=XZa6e8LZvLtZK#`{X_`G1zg%IZ-)JUXaszkbtgZ@)XX@1PUW<2Kix4(_?)uEzCS z-r9g(VHM^E^-8axFI6Y6mS^FHzz%_C+DkWQ803yrQrm=aV=`-Ow;`-?X+ddIx5;_!&Usy|kZ-O113r5iE#ToRHrJ@xiOlTLT7iitU&KQ3|1$JY3+cRpS+-u=xB z!yo+q^!CL~_xE;m%lW12h-Z%H?XN69nKS*vF;DedTvGH%@%{^~$Di7`NPXa*Q}_IE z(vaOaJ?Nu;YoBkvbNPg4`(Jz0i+9*gkKK7@aleloyS|Bf`MJ!DW2?V;_0JoJK0EQQ z%opDO{KU1}Ke=A}z>7Ea`nuoJ9=jJr9O-fK#O&u@-!|;_m>XaGlHWRW+gEG9){IKd z{P_Jho_g)t4|+PS=Y z&11>N8~Qw+lk(gC>kV4l7ZZLRx^u1L=mB&`FQYr!?OUq+Mg5npxBp9KDfqe{e%r_; zuRf@E$-!3-Gkur;bGpf8+!5%2$_gZiRv=n=1+rsz;d(YmYkn2;SC|I!y5KN|b}VxggM`{~Syp&_G_di=b2&%WDw7CwZk{z9^Z26gQ6~dpE&mF+Pgm+^2^*)-`w5jjOvY_Hjm5QnLh2rlG6Sghm0*U zhwmTy!Cm*dCKWbT?0ft0$4_oIJ~;9~eXsDI+xD%vt@)Pb;Ui;5Sf9vR@<~w7ikbm0 zWj|GP*ZoH}$NZs+8!;_u?Q6-uEWhvGosXT?*DiW5yWj1P?w|hBl&F}8vrPAo6(jrJ zbNhkUzUnPC6hyDRnD^!09fPl(oop)OrFrwJTl?Ij85;64AJl4R|1A7)h(m>nCjrx6+OT;PAmuSI5bE|<9KfABr4J{8I9Xx;jSqeS+r0Oi4Evbg z$8zkVUF$L$Fp5AHo`)y0TP*OY+b#*7iJVH-Lxap3DaRjeAno?PKO*E0vp!Z8SY zxz(&;W0xiVJpkI5={N#6EUc}WQCC_!bK&KEowRhx{DtRE9Ub%ZZ!wjxE$Bb-l^F+* zroDT1z{!y3zWl9tUBbNOt@!odhM|Mw@7Q$DtFK!&Tf)vX%zu6BH!Bu&_S{r6_QIMz z>#hA~3|xBQ+w=!sKGIn2&5#y-voz7|GI&bFYtMZ2($&94uisZ%G5+Y7AinLgupS@Wt`>F1G9eF9IkLm-{cpb!cZIFQj_y+83U8NA z%rLZFXgHju%^g%3W_gmHflsPt;mDZu7iUTTZ2r~u_n#iwC3X9(Q_>yLf!z&;E@>HO zk)e07BL}8G_exa4({De>uFJlk*3ZI{@%%yIqB%=p-yY`N$D4}TtfHeTEE=$u>6eyZF1Ro4d{gMJjV d*RF4vpY+MhyD#i{(pY%lfw%K^+;SIV{|7pJP_h63 literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/wps-office/mtextra.ttf b/talimatname/genel/w/wps-office/mtextra.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5dfa24df5c79fbf6ee26ea32606f702a11069e88 GIT binary patch literal 27092 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/wps-office/symbol.ttf b/talimatname/genel/w/wps-office/symbol.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fd1c0337496166aa40b07cd1edbca37919319c7d GIT binary patch literal 70128 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 literal 0 HcmV?d00001 diff --git a/talimatname/genel/w/wps-office/talimat b/talimatname/genel/w/wps-office/talimat new file mode 100644 index 000000000..7fe8ebe82 --- /dev/null +++ b/talimatname/genel/w/wps-office/talimat @@ -0,0 +1,48 @@ +# Tanım: WPS Office Türkçe +# URL: http://wps-community.org/ +# Paketçi: Cihan Alkan +# Gerekler: libpng12 xorg-fontconfig pango libxml2 xorg-libsm xorg-libxext xorg-libxrender xorg-glu + +isim=wps-office +surum=10.1.0.5707 +_surum=10.1.0.5707~a21 +devir=2 +kaynak=(https://sourceforge.net/projects/mebis/files/Programlar/wps-office-$surum-x86_64.tar.xz + WEBDINGS.ttf + WINGDNG2.ttf + WINGDNG3.ttf + symbol.ttf + mtextra.ttf + wingding.ttf) + +derle() { + #cd wps-office_${_version}_x86_64 + sed -i 's|/opt/kingsoft/wps-office|/usr/lib|' wps wpp et + sed -i 's|/office6/${gApp} ${gOptExt}|/office6/${gApp} -style gtk+ ${gOptExt}|' wps + sed -i 's|/office6/${gApp} ${gOptExt}|/office6/${gApp} -style gtk+ ${gOptExt}|' wpp et + + + install -d $PKG/usr/lib + cp -r office6 $PKG/usr/lib + + install -d $PKG/usr/bin + install -m755 wps wpp et $PKG/usr/bin + + install -d $PKG/usr/share/applications + cp -r resource/applications/* $PKG/usr/share/applications + + install -d $PKG/usr/share/icons + cp -r resource/icons/* $PKG/usr/share/icons + + install -d $PKG/usr/share/mime + cp -r resource/mime/* $PKG/usr/share/mime + + #cp -r $SRC/usr/share $PKG/usr/ + + install -d $PKG/usr/share/fonts/wps-office + cp -r fonts/* $PKG/usr/share/fonts/wps-office + cp -r $SRC/*.ttf $PKG/usr/share/fonts/wps-office + + + install -Dm644 office6/mui/default/EULA.txt $PKG/usr/share/licenses/$isim/EULA.txt +} diff --git a/talimatname/genel/w/wps-office/wingding.ttf b/talimatname/genel/w/wps-office/wingding.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e8c4b9506f70c4b7e40186474315360b77bf548a GIT binary patch literal 83740 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 .ruby-version + patch -p1 < ../f6644eebf95baea3356290ecd6364f0a4a456406.patch + + install -d "${PKG}/opt/${isim}" + cp -ra --no-preserve=owner . "${PKG}/opt/${isim}" + + install -d "${PKG}/usr/bin" + cat > "${PKG}/usr/bin/${isim}" << EOF +#!/bin/sh +BUNDLE_GEMFILE=/opt/${isim}/Gemfile bundle exec ruby /opt/${isim}/${isim}.rb "\$@" +EOF + chmod 755 "${PKG}/usr/bin/${isim}" + + install -Dm 644 LICENSE -t "${PKG}/usr/share/licenses/${isim}" + install -Dm 644 CHANGELOG.md DISCLAIMER.txt README.md -t "${PKG}/usr/share/doc/${isim}" +} diff --git a/talimatname/genel/w/wpscan/wpscan.kur-kos b/talimatname/genel/w/wpscan/wpscan.kur-kos new file mode 100644 index 000000000..22c573b36 --- /dev/null +++ b/talimatname/genel/w/wpscan/wpscan.kur-kos @@ -0,0 +1,6 @@ +#!/bin/sh + +cd /opt/wpscan +bundler install + +/usr/bin/wpscan --update >/dev/null 2>&1 diff --git a/talimatname/genel/w/wren/talimat b/talimatname/genel/w/wren/talimat new file mode 100644 index 000000000..13a955840 --- /dev/null +++ b/talimatname/genel/w/wren/talimat @@ -0,0 +1,31 @@ +# Tanım: Küçük,hızlı ve sınıf bazlı script dili +# URL: http://wren.io/ +# Paketçi: milisarge +# Gerekler: python +# Grup: geliştirme + +isim=wren +surum=0.1.0 +devir=1 +kaynak=() + +derle() { + + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/munificent/wren $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + make + install -d "$PKG/usr/bin" + install -d "$PKG/usr/lib" + install -d "$PKG/usr/include" + install -Dm755 "$SRC/$isim/bin/wren" "$PKG/usr/bin/wren" + install -Dm755 "$SRC/$isim/lib/libwren.a" "$PKG/usr/lib/libwren.a" + #install -Dm755 "$SRC/$isim/lib/libwren.so" "$PKG/usr/lib/libwren.so" + install -Dm755 "$SRC/$isim/src/include/wren.h" "$PKG/usr/include/wren.h" +} diff --git a/talimatname/genel/w/wv/talimat b/talimatname/genel/w/wv/talimat new file mode 100644 index 000000000..2e9705481 --- /dev/null +++ b/talimatname/genel/w/wv/talimat @@ -0,0 +1,16 @@ +# Tanım: MSWord kitaplığı, Word 2000, 97, 95 ve 6 dosya formatlarını yükleyebilir ve ayrıştırabilir +# URL: http://wvware.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: libgsf libpng + +isim=wv +surum=1.2.9 +devir=1 + +kaynak=(http://www.abiword.com/downloads/$isim/$surum/$isim-$surum.tar.gz) +derle() { +cd $isim-$surum +./configure --prefix=/usr --mandir=/usr/share/man +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/w/wxgtk/make-abicheck-non-fatal.patch b/talimatname/genel/w/wxgtk/make-abicheck-non-fatal.patch new file mode 100644 index 000000000..851afe5c0 --- /dev/null +++ b/talimatname/genel/w/wxgtk/make-abicheck-non-fatal.patch @@ -0,0 +1,14 @@ +diff -up wxGTK-2.8.12/src/common/appbase.cpp.abicheck wxGTK-2.8.12/src/common/appbase.cpp +--- wxGTK-2.8.12/src/common/appbase.cpp.abicheck 2015-03-12 17:15:18.000000000 +0100 ++++ wxGTK-2.8.12/src/common/appbase.cpp 2015-03-12 17:15:57.000000000 +0100 +@@ -424,10 +424,7 @@ bool wxAppConsole::CheckBuildOptions(con + msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %s,\nand %s used %s."), + lib.c_str(), progName.c_str(), prog.c_str()); + +- wxLogFatalError(msg.c_str()); +- +- // normally wxLogFatalError doesn't return +- return false; ++ wxLogWarning(msg.c_str()); + } + #undef wxCMP diff --git a/talimatname/genel/w/wxgtk/talimat b/talimatname/genel/w/wxgtk/talimat new file mode 100644 index 000000000..23dca07d8 --- /dev/null +++ b/talimatname/genel/w/wxgtk/talimat @@ -0,0 +1,43 @@ +# Tanım: GUI için GTK+ wxWidgets API'sının uygulanması +# URL: http://wxwidgets.org +# Paketçi: milisarge +# Gerekler: gtk2 gstreamer-plugins-base xorg-mesa xorg-libsm xorg-libxxf86vm sdl +# Grup: geliştirme + +isim=wxgtk +surum=3.0.3.1 +devir=1 + +kaynak=(https://github.com/wxWidgets/wxWidgets/archive/v$surum.tar.gz::wxWidgets-$surum.tar.bz2 + https://github.com/wxWidgets/wxWidgets/commit/ec6e54bc.patch::wxgtk-webkit2gtk.patch + https://github.com/wxWidgets/wxWidgets/commit/fd247cca.patch::wxgtk2-fix-webview.patch + https://github.com/wxWidgets/wxWidgets/commit/ce1dce11.patch::wxgtk-filezilla-assert.patch + make-abicheck-non-fatal.patch + wxgtk-webkit-infinite-loop.patch) + +derle() { + + cd wxWidgets-$surum + # C++ ABI check is too strict and breaks with GCC 5.1 + # https://bugzilla.redhat.com/show_bug.cgi?id=1200611 + patch -Np1 -i ../make-abicheck-non-fatal.patch + + # Support webkit2gtk + #sed -e 's|setup0.h|setup.h|g' -i ../wxgtk-webkit2gtk.patch + patch -p1 -i ../wxgtk-webkit2gtk.patch + # fix webview after webkit2gtk port + patch -p1 -i ../wxgtk2-fix-webview.patch + # fix assert in FileZilla + patch -p1 -i ../wxgtk-filezilla-assert.patch + # fix infinite loop in webkit + patch -p1 -i ../wxgtk-webkit-infinite-loop.patch + + ./autogen.sh + ./configure --prefix=/usr --libdir=/usr/lib --with-gtk=2 --with-gtk=3 --with-opengl --enable-unicode \ + --enable-graphics_ctx --enable-mediactrl --enable-webview --with-regex=builtin \ + --with-libpng=sys --with-libxpm=sys --with-libjpeg=sys --with-libtiff=sys \ + --disable-precomp-headers + make + make -C locale allmo + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/w/wxgtk/wxgtk-webkit-infinite-loop.patch b/talimatname/genel/w/wxgtk/wxgtk-webkit-infinite-loop.patch new file mode 100644 index 000000000..67d97e663 --- /dev/null +++ b/talimatname/genel/w/wxgtk/wxgtk-webkit-infinite-loop.patch @@ -0,0 +1,36 @@ +From 572fe37898f8d4f8664849ec76483dd63ea13a13 Mon Sep 17 00:00:00 2001 +From: Paul Cornett +Date: Sat, 6 Jan 2018 11:07:11 -0800 +Subject: [PATCH] Avoid calling default "key-press-event" handler + +We have already done everything it does, and doing it again seems to +cause an infinite loop with WebKitGTK. See #17932 +--- + src/gtk/toplevel.cpp | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp +index f63fdd3e463..ae825d40396 100644 +--- a/src/gtk/toplevel.cpp ++++ b/src/gtk/toplevel.cpp +@@ -227,15 +227,15 @@ wxgtk_tlw_key_press_event(GtkWidget *widget, GdkEventKey *event) + // GTK+ gtk_window_key_press_event() handler. + + if ( gtk_window_propagate_key_event(window, event) ) +- return TRUE; ++ return true; + + if ( gtk_window_activate_key(window, event) ) +- return TRUE; ++ return true; + +- if (GTK_WIDGET_GET_CLASS(widget)->key_press_event(widget, event)) +- return TRUE; ++ GTK_WIDGET_GET_CLASS(widget)->key_press_event(widget, event); + +- return FALSE; ++ // Avoid calling the default handler, we have already done everything it does ++ return true; + } + } + diff --git a/talimatname/genel/w/wxgtk28/make-abicheck-non-fatal.patch b/talimatname/genel/w/wxgtk28/make-abicheck-non-fatal.patch new file mode 100644 index 000000000..851afe5c0 --- /dev/null +++ b/talimatname/genel/w/wxgtk28/make-abicheck-non-fatal.patch @@ -0,0 +1,14 @@ +diff -up wxGTK-2.8.12/src/common/appbase.cpp.abicheck wxGTK-2.8.12/src/common/appbase.cpp +--- wxGTK-2.8.12/src/common/appbase.cpp.abicheck 2015-03-12 17:15:18.000000000 +0100 ++++ wxGTK-2.8.12/src/common/appbase.cpp 2015-03-12 17:15:57.000000000 +0100 +@@ -424,10 +424,7 @@ bool wxAppConsole::CheckBuildOptions(con + msg.Printf(_T("Mismatch between the program and library build versions detected.\nThe library used %s,\nand %s used %s."), + lib.c_str(), progName.c_str(), prog.c_str()); + +- wxLogFatalError(msg.c_str()); +- +- // normally wxLogFatalError doesn't return +- return false; ++ wxLogWarning(msg.c_str()); + } + #undef wxCMP diff --git a/talimatname/genel/w/wxgtk28/talimat b/talimatname/genel/w/wxgtk28/talimat new file mode 100644 index 000000000..e1bff8060 --- /dev/null +++ b/talimatname/genel/w/wxgtk28/talimat @@ -0,0 +1,25 @@ +# Tanım: GUI için GTK+ wxWidgets API'sının uygulanması +# URL: http://wxwidgets.org +# Paketçi: milisarge +# Gerekler: gtk2 gstreamer-plugins-base xorg-mesa xorg-libsm xorg-libxxf86vm sdl + +isim=wxgtk28 +surum=2.8.12.1 +devir=1 + +kaynak=(http://downloads.sourceforge.net/wxpython/wxPython-src-${surum}.tar.bz2 + make-abicheck-non-fatal.patch wxGTK-collision.patch configure_in.diff) +derle() { +cd wx*-$surum + +patch -p1 -i ../wxGTK-collision.patch +patch -Np1 -i ../make-abicheck-non-fatal.patch +sed -i '/^SEARCH_INCLUDE="\\/s|\\|/usr/lib \\|' configure +./configure --prefix=/usr --libdir=/usr/lib --with-gtk=2 --with-opengl --enable-unicode \ +--enable-graphics_ctx --enable-mediactrl --enable-webview --with-regex=builtin \ +--with-libpng=sys --with-libxpm=sys --with-libjpeg=sys --with-libtiff=sys \ +--disable-precomp-headers +make +make -C locale allmo +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/w/wxgtk28/wxGTK-collision.patch b/talimatname/genel/w/wxgtk28/wxGTK-collision.patch new file mode 100644 index 000000000..36d8acf26 --- /dev/null +++ b/talimatname/genel/w/wxgtk28/wxGTK-collision.patch @@ -0,0 +1,81 @@ +diff -Naur wxPython-src-2.8.12.1.orig/build/bakefiles/wx.bkl wxPython-src-2.8.12.1/build/bakefiles/wx.bkl +--- wxPython-src-2.8.12.1.orig/build/bakefiles/wx.bkl 2014-01-04 22:28:16.491774907 -0500 ++++ wxPython-src-2.8.12.1/build/bakefiles/wx.bkl 2014-01-04 22:37:39.610020870 -0500 +@@ -128,7 +128,7 @@ + + + $(SRCDIR)/locale +- wxstd ++ wxstd$(WX_RELEASE_NODOT) + + ca cs da de el es fi fr hu id it ja nl pl ru sl sv tr uk + zh zh_CN zh_TW +diff -Naur wxPython-src-2.8.12.1.orig/Makefile.in wxPython-src-2.8.12.1/Makefile.in +--- wxPython-src-2.8.12.1.orig/Makefile.in 2014-01-04 22:28:16.545107766 -0500 ++++ wxPython-src-2.8.12.1/Makefile.in 2014-01-04 22:40:27.191813403 -0500 +@@ -11695,9 +11695,11 @@ + + install: $(__install_wxregex___depname) $(__install_wxzlib___depname) $(__install_wxpng___depname) $(__install_wxjpeg___depname) $(__install_wxtiff___depname) $(__install_wxodbc___depname) $(__install_wxexpat___depname) $(__install_monodll___depname) $(__install_monolib___depname) $(__install_basedll___depname) $(__install_baselib___depname) $(__install_netdll___depname) $(__install_netlib___depname) $(__install_coredll___depname) $(__install_corelib___depname) $(__install_advdll___depname) $(__install_advlib___depname) $(__install_mediadll___depname) $(__install_medialib___depname) $(__install_odbcdll___depname) $(__install_odbclib___depname) $(__install_dbgriddll___depname) $(__install_dbgridlib___depname) $(__install_htmldll___depname) $(__install_htmllib___depname) $(__install_qadll___depname) $(__install_qalib___depname) $(__install_xmldll___depname) $(__install_xmllib___depname) $(__install_xrcdll___depname) $(__install_xrclib___depname) $(__install_auidll___depname) $(__install_auilib___depname) $(__install_richtextdll___depname) $(__install_richtextlib___depname) $(__install_gldll___depname) $(__install_gllib___depname) $(__install_sound_sdl___depname) $(__install_wxrc___depname) install-wxconfig locale_install locale_msw_install $(__cocoa_res_install___depname) + $(INSTALL_DIR) $(DESTDIR)$(datadir)/aclocal +- (cd $(srcdir) ; $(INSTALL_DATA) wxwin.m4 $(DESTDIR)$(datadir)/aclocal) ++ (cd $(srcdir) ; $(INSTALL_DATA) wxwin.m4 $(DESTDIR)$(datadir)/aclocal/wxwin2.8.m4) + $(INSTALL_DIR) $(DESTDIR)$(datadir)/bakefile/presets +- (cd $(srcdir)/build/bakefiles/wxpresets/presets ; $(INSTALL_DATA) wx.bkl wx_unix.bkl wx_win32.bkl $(DESTDIR)$(datadir)/bakefile/presets) ++ (cd $(srcdir)/build/bakefiles/wxpresets/presets ; \ ++ for i in wx.bkl wx_unix.bkl wx_win32.bkl ; do \ ++ $(INSTALL_DATA) $$i $(DESTDIR)$(datadir)/bakefile/presets/wx$(WX_RELEASE_NODOT)$${i##wx} ; done) + $(INSTALL_DIR) $(DESTDIR)$(libdir)/wx/include/$(TOOLCHAIN_FULLNAME)/wx + for f in setup.h $(RCDEFS_H); do \ + if test ! -d $(DESTDIR)$(libdir)/wx/include/$(TOOLCHAIN_FULLNAME)/wx/`dirname $$f` ; then \ +@@ -12455,7 +12456,8 @@ + $(INSTALL_DIR) $(DESTDIR)$(bindir) + $(INSTALL_DIR) $(DESTDIR)$(libdir)/wx/config + $(INSTALL_PROGRAM) lib/wx/config/$(TOOLCHAIN_FULLNAME) $(DESTDIR)$(libdir)/wx/config +- (cd $(DESTDIR)$(bindir) && rm -f wx-config && $(LN_S) $(libdir)/wx/config/$(TOOLCHAIN_FULLNAME) wx-config) ++ (cd $(DESTDIR)$(bindir) && rm -f wx-config-$(WX_RELEASE) \ ++ && $(LN_S) ../lib/wx/config/$(TOOLCHAIN_FULLNAME) wx-config-$(WX_RELEASE)) + + locale_install: + $(INSTALL_DIR) $(DESTDIR)$(datadir)/locale +@@ -12463,7 +12465,8 @@ + $(INSTALL_DIR) $(DESTDIR)$(datadir)/locale/$$l ; \ + $(INSTALL_DIR) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES ; \ + if test -f $(srcdir)/locale/$$l.mo ; then \ +- $(INSTALL_DATA) $(srcdir)/locale/$$l.mo $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/wxstd.mo ; \ ++ $(INSTALL_DATA) $(srcdir)/locale/$$l.mo \ ++ $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/wxstd$(WX_RELEASE_NODOT).mo ; \ + fi ; \ + done + +@@ -12480,7 +12483,7 @@ + $(INSTALL_DIR) $(DESTDIR)$(datadir)/locale/$$l ; \ + $(INSTALL_DIR) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES ; \ + if test -f $(srcdir)/locale/msw/$$l.mo ; then \ +- $(INSTALL_DATA) $(srcdir)/locale/msw/$$l.mo $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/wxmsw.mo ; \ ++ $(INSTALL_DATA) $(srcdir)/locale/msw/$$l.mo $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/wxmsw$(WX_RELEASE_NODOT).mo ; \ + fi ; \ + done + +diff -Naur wxPython-src-2.8.12.1.orig/src/common/intl.cpp wxPython-src-2.8.12.1/src/common/intl.cpp +--- wxPython-src-2.8.12.1.orig/src/common/intl.cpp 2014-01-04 22:28:16.675106608 -0500 ++++ wxPython-src-2.8.12.1/src/common/intl.cpp 2014-01-04 22:47:49.523526232 -0500 +@@ -1597,7 +1597,7 @@ + bool bOk = true; + if ( bLoadDefault ) + { +- bOk = AddCatalog(wxT("wxstd")); ++ bOk = AddCatalog(wxT("wxstd" wxSTRINGIZE(wxMAJOR_VERSION) wxSTRINGIZE(wxMINOR_VERSION))); + + // there may be a catalog with toolkit specific overrides, it is not + // an error if this does not exist +diff -Naur wxPython-src-2.8.12.1.orig/utils/wxrc/Makefile.in wxPython-src-2.8.12.1/utils/wxrc/Makefile.in +--- wxPython-src-2.8.12.1.orig/utils/wxrc/Makefile.in 2014-01-04 22:28:16.335109635 -0500 ++++ wxPython-src-2.8.12.1/utils/wxrc/Makefile.in 2014-01-04 22:37:34.410068493 -0500 +@@ -120,7 +120,6 @@ + @COND_USE_XRC_1@ rm -f $(DESTDIR)$(bindir)/wxrc$(EXEEXT) $(DESTDIR)$(bindir)/wxrc-$(WX_RELEASE) + @COND_USE_XRC_1@ $(INSTALL_PROGRAM) wxrc$(EXEEXT) $(DESTDIR)$(bindir) + @COND_USE_XRC_1@ mv -f $(DESTDIR)$(bindir)/wxrc$(EXEEXT) $(DESTDIR)$(bindir)/wxrc-$(WX_RELEASE) +-@COND_USE_XRC_1@ (cd $(DESTDIR)$(bindir) && $(LN_S) wxrc-$(WX_RELEASE) wxrc$(EXEEXT)) + + @COND_USE_XRC_1@uninstall_wxrc: + @COND_USE_XRC_1@ rm -f $(DESTDIR)$(bindir)/wxrc$(EXEEXT) diff --git a/talimatname/genel/w/wxpython/talimat b/talimatname/genel/w/wxpython/talimat new file mode 100644 index 000000000..1ad139507 --- /dev/null +++ b/talimatname/genel/w/wxpython/talimat @@ -0,0 +1,38 @@ +# Tanım: Python için bir wxWidgets GUI araç seti +# URL: https://www.wxpython.org +# Paketçi: Cihan_Alkan +# Gerekler: wxgtk libnotify python xorg-mesa xorg-glu gtk3 +# Gruplar: kütüphane + +isim=wxpython +surum=3.0.2.0 +devir=2 + +kaynak=(https://downloads.sourceforge.net/wxpython/wxPython-src-${surum}.tar.bz2) + +derle() { + cd wxPython-src-${surum} + #patch -Np1 -i ../fix-plot.patch + CFLAGS="$CFLAGS `wx-config --cflags --libs`" \ + LDFLAGS="`wx-config --libs` $LDFLAGS" \ + ./configure \ + --prefix=/usr \ + --libdir=/usr/lib \ + --includedir=/usr/include \ + --with-gtk=3 \ + --with-opengl \ + --enable-unicode \ + --enable-graphics_ctx \ + --disable-precomp-headers \ + --with-regex=sys \ + --with-libpng=sys \ + --with-libxpm=sys \ + --with-libjpeg=sys \ + --with-libtiff=sys \ + --with-wx-config=/usr/bin/wx-config + cd wxPython + python2 setup.py WX_CONFIG=/usr/bin/wx-config WXPORT=gtk3 UNICODE=1 build + python2 setup.py WX_CONFIG=/usr/bin/wx-config WXPORT=gtk3 UNICODE=1 install --root="${PKG}" --optimize=1 + for file in "${PKG}"/usr/bin/*; do mv "${file}" "${file}2"; done + install -Dm644 ../docs/licence.txt "${PKG}"/usr/share/licenses/${isim}/LICENSE +} diff --git a/talimatname/genel/x/x11vnc/talimat b/talimatname/genel/x/x11vnc/talimat new file mode 100644 index 000000000..a9fb7cb41 --- /dev/null +++ b/talimatname/genel/x/x11vnc/talimat @@ -0,0 +1,20 @@ +# Tanım: Gerçek X ekranları için VNC sunucusu +# URL: http://www.karlrunge.com/x11vnc/ +# Paketçi: milisarge +# Gerekler: libjpeg-turbo xorg-libxdamage xorg-libxinerama xorg-libxrandr xorg-libxtst + +isim=x11vnc +surum=0.9.13 +devir=1 +kaynak=(http://prdownloads.sf.net/libvncserver/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + CONFIG_SHELL=/bin/bash \ + ./configure --prefix=/usr \ + --disable-nls \ + --mandir=$PKG/usr/man + make + make prefix=$PKG/usr install + rm -rf $PKG/usr/{include,share} +} diff --git a/talimatname/genel/x/x264/talimat b/talimatname/genel/x/x264/talimat new file mode 100644 index 000000000..fbc93af19 --- /dev/null +++ b/talimatname/genel/x/x264/talimat @@ -0,0 +1,21 @@ +# Tanım: H264/AVC video akışlarını kodlayan kütüphane +# URL: http://www.videolan.org/developers/x264.html +# Paketçi: milisarge +# Gerekler: yasm + +isim=x264 +surum=20150908.2245 +devir=1 + +kaynak=(http://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${version/./-}-stable.tar.bz2) + +derle() { +cd x264-snapshot-${version/./-}-stable +./configure \ +--prefix=/usr \ +--enable-pic \ +--enable-shared + +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/x265/talimat b/talimatname/genel/x/x265/talimat new file mode 100644 index 000000000..e589e59a5 --- /dev/null +++ b/talimatname/genel/x/x265/talimat @@ -0,0 +1,22 @@ +# Tanım: Açık Kaynaklı H265/HEVC video kodlayıcı. +# URL: https://bitbucket.org/multicoreware/x265/wiki/Home +# Paketçi: milisarge +# Gerekler: yasm cmake + +isim=x265 +surum=1.8 +devir=1 +kaynak=(https://bitbucket.org/multicoreware/x265/get/$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/downloads/x265/x265_1.8-enable_static-1.patch) + +derle() { + cd multicoreware-$isim-* + patch -Np1 -i ../x265_1.8-enable_static-1.patch + mkdir bld + cd bld + cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DENABLE_STATIC=OFF \ + ../source + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xapian/talimat b/talimatname/genel/x/xapian/talimat new file mode 100644 index 000000000..cef562c2b --- /dev/null +++ b/talimatname/genel/x/xapian/talimat @@ -0,0 +1,18 @@ +# Tanım: Xapian, açık kaynak kodlu bir arama motoru kütüphanesi. +# URL: http://oligarchy.co.uk/xapian.html +# Paketçi: milisarge +# Gerekler: + +isim=xapian +surum=1.2.22 +devir=1 + +kaynak=( http://oligarchy.co.uk/xapian/$surum/xapian-core-$surum.tar.xz) +derle() { +cd $isim-core-$surum +./configure --prefix=/usr \ +--disable-static \ +--docdir=/usr/share/doc/xapian-core-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xapps/talimat b/talimatname/genel/x/xapps/talimat new file mode 100644 index 000000000..194e78fe4 --- /dev/null +++ b/talimatname/genel/x/xapps/talimat @@ -0,0 +1,22 @@ +# Tanımlar: X-Apps projesi için ortak kütüphane +# URL: https://github.com/linuxmint/xapps +# Paketçi: Cihan_Alkan +# Gerekler: libgnomekbd python gnome-common gobject-introspection gtk-doc gtk3 +# Grup: cinnamon + +isim=xapps +surum=1.2.1 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd + mkdir -p "${SRC}"/$isim-$surum/build + cd "${SRC}"/${isim}-${surum}/build + + meson --prefix=/usr --libdir=/usr/lib --buildtype=plain .. + ninja + DESTDIR="${PKG}" ninja install + # rm useless scripts + rm -r "${PKG}"/usr/bin +} diff --git a/talimatname/genel/x/xarchiver/talimat b/talimatname/genel/x/xarchiver/talimat new file mode 100644 index 000000000..cb7793b6c --- /dev/null +++ b/talimatname/genel/x/xarchiver/talimat @@ -0,0 +1,22 @@ +# Tanım: Xarchiver, GTK + 2 araç seti ile inşa edilmiş hafif, masaüstü bağımsız bir arşiv yöneticisidir. +# URL: http://xarchiver.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: gtk2 intltool xorg-libxcursor xorg-libxdamage xorg-libxrandr xorg-libxinerama unzip p7zip lzop unrar + +isim=xarchiver +surum=0.5.4.11 +devir=1 + +kaynak=(https://github.com/ib/xarchiver/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/xfce4 \ + --localstatedir=/var \ + --disable-static + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xcb-proto/talimat b/talimatname/genel/x/xcb-proto/talimat new file mode 100644 index 000000000..a3c25eb13 --- /dev/null +++ b/talimatname/genel/x/xcb-proto/talimat @@ -0,0 +1,19 @@ +# Tanım: XCB X protokol açıklamaları +# URL: http://xcb.freedesktop.org +# Paketçi: milisarge +# Gerekler: python + +isim=xcb-proto +surum=1.12 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/xcb-proto-$surum.tar.bz2) + +derle() { + cd xcb-proto-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcb-util-cursor/talimat b/talimatname/genel/x/xcb-util-cursor/talimat new file mode 100644 index 000000000..a17eeee49 --- /dev/null +++ b/talimatname/genel/x/xcb-util-cursor/talimat @@ -0,0 +1,17 @@ +# Tanım: XCB imleç kitaplığı +# URL: http://cgit.freedesktop.org/xcb/util-cursor: +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libxcb xcb-util-renderutil xcb-util-image + +isim=xcb-util-cursor +surum=0.1.3 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/xcb-util-cursor-$surum.tar.bz2) + +derle() { +cd $isim-* +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcb-util-image/talimat b/talimatname/genel/x/xcb-util-image/talimat new file mode 100644 index 000000000..7d6fa8fc4 --- /dev/null +++ b/talimatname/genel/x/xcb-util-image/talimat @@ -0,0 +1,19 @@ +# Tanım: XCB yardımcı programları kitaplığı +# URL: http://xcb.freedesktop.org +# Paketçi: milisarge +# Gerekler: libxcb xcb-util xorg-util-macros + +isim=xcb-util-image +surum=0.4.0 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcb-util-keysyms/talimat b/talimatname/genel/x/xcb-util-keysyms/talimat new file mode 100644 index 000000000..e8ab80456 --- /dev/null +++ b/talimatname/genel/x/xcb-util-keysyms/talimat @@ -0,0 +1,18 @@ +# Tanım: Standart X anahtar sabitleri ve tuş kodlarına / anahtar kodlarına dönüşüm +# URL: http://xcb.freedesktop.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libxcb xorg-util-macros + +isim=xcb-util-keysyms +surum=0.4.0 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xcb-util-renderutil/talimat b/talimatname/genel/x/xcb-util-renderutil/talimat new file mode 100644 index 000000000..aac619436 --- /dev/null +++ b/talimatname/genel/x/xcb-util-renderutil/talimat @@ -0,0 +1,19 @@ +# Tanım: XCB yardımcı programları kitaplığı +# URL: http://xcb.freedesktop.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libxcb xorg-util-macros + +isim=xcb-util-renderutil +surum=0.3.9 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcb-util-wm/talimat b/talimatname/genel/x/xcb-util-wm/talimat new file mode 100644 index 000000000..56f6e1f57 --- /dev/null +++ b/talimatname/genel/x/xcb-util-wm/talimat @@ -0,0 +1,18 @@ +# Tanım: XCB yardımcı programları kitaplığı +# URL: http://xcb.freedesktop.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: libxcb xcb-util xorg-util-macros + +isim=xcb-util-wm +surum=0.4.1 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xcb-util-xrm/talimat b/talimatname/genel/x/xcb-util-xrm/talimat new file mode 100644 index 000000000..b27b6d593 --- /dev/null +++ b/talimatname/genel/x/xcb-util-xrm/talimat @@ -0,0 +1,17 @@ +# Tanım: X kaynak yönetimi için xcb yardımcı araç kütüphanesi +# URL: https://github.com/Airblader/xcb-util-xrm +# Paketçi: milisarge +# Gerekler: xorg-util-macros xorg-libx11 xcb-util + +isim=xcb-util-xrm +_isim=util-xrm +surum=1.2 +devir=1 +kaynak=(https://github.com/Airblader/xcb-util-xrm/releases/download/v${surum}/xcb-util-xrm-${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd "$isim-$surum" + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/x/xcb-util/talimat b/talimatname/genel/x/xcb-util/talimat new file mode 100644 index 000000000..fdbe725e3 --- /dev/null +++ b/talimatname/genel/x/xcb-util/talimat @@ -0,0 +1,19 @@ +# Tanım: XCB yardımcı programları kitaplığı +# URL: http://xcb.freedesktop.org +# Paketçi: milisarge +# Gerekler: libxcb xorg-util-macros + +isim=xcb-util +surum=0.4.0 +devir=1 + +kaynak=(http://xcb.freedesktop.org/dist/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcfa/talimat b/talimatname/genel/x/xcfa/talimat new file mode 100644 index 000000000..757e9502c --- /dev/null +++ b/talimatname/genel/x/xcfa/talimat @@ -0,0 +1,18 @@ +# Tanım: Ses dosyası dönüştür +# URL: http://www.xcfa.tuxfamily.org/ +# Paketçi: Cihan_Alkan +# Gerekler: taglib alsa-lib vte3 +# Grup: medya + +isim=xcfa +surum=5.0.2 +devir=1 +kaynak=(http://download.tuxfamily.org/xcfaudio/xcfa_download/src/${isim}-${surum}.tar.gz) + +derle() { + cd ${isim}-${surum} + ./configure --prefix=/usr + make + make check + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/x/xchat/talimat b/talimatname/genel/x/xchat/talimat new file mode 100644 index 000000000..9e3731c73 --- /dev/null +++ b/talimatname/genel/x/xchat/talimat @@ -0,0 +1,19 @@ +# Tanım: Bir GTK+ tabanlı IRC istemcisi +# URL: http://www.xchat.org/ +# Paketçi: milisarge +# Gerekler: shared-mime-info gtk2 enchant dbus-glib + +isim=xchat +surum=2.8.8 +devir=2 + +kaynak=(http://www.xchat.org/files/source/${surum%.*}/$isim-$surum.tar.xz + http://www.linuxfromscratch.org/patches/blfs/svn/xchat-2.8.8-glib-2.31-1.patch) +derle() { +cd $isim-$surum +patch -Np1 -i ../xchat-2.8.8-glib-2.31-1.patch +LIBS+="-lgmodule-2.0" ./configure --prefix=/usr \ +--sysconfdir=/etc --enable-shm +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xclip/talimat b/talimatname/genel/x/xclip/talimat new file mode 100644 index 000000000..4a8ba09af --- /dev/null +++ b/talimatname/genel/x/xclip/talimat @@ -0,0 +1,18 @@ +# Tanım: X11 panosuna komut satırı arayüzü +# URL: https://github.com/astrand/xclip +# Paketçi: milisarge +# Gerekler: xorg-libxmu + +isim=xclip +surum=0.12 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr \ + --mandir=/usr/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xcompmgr/fix_broken_shadows.diff b/talimatname/genel/x/xcompmgr/fix_broken_shadows.diff new file mode 100644 index 000000000..39b8ac725 --- /dev/null +++ b/talimatname/genel/x/xcompmgr/fix_broken_shadows.diff @@ -0,0 +1,28 @@ +--- xcompmgr.c 2011-11-19 01:49:52.000000000 -0600 ++++ xcompmgr.c 2012-08-11 21:58:58.000000000 -0500 +@@ -1028,7 +1028,6 @@ + { + w->borderClip = XFixesCreateRegion (dpy, NULL, 0); + XFixesCopyRegion (dpy, w->borderClip, region); +- XFixesIntersectRegion(dpy, w->borderClip, w->borderClip, w->borderSize); + } + w->prev_trans = t; + t = w; +@@ -1080,6 +1079,8 @@ + if (w->mode == WINDOW_TRANS) + { + int x, y, wid, hei; ++ XFixesIntersectRegion(dpy, w->borderClip, w->borderClip, w->borderSize); ++ XFixesSetPictureClipRegion(dpy, rootBuffer, 0, 0, w->borderClip); + #if HAS_NAME_WINDOW_PIXMAP + x = w->a.x; + y = w->a.y; +@@ -1099,6 +1100,8 @@ + else if (w->mode == WINDOW_ARGB) + { + int x, y, wid, hei; ++ XFixesIntersectRegion(dpy, w->borderClip, w->borderClip, w->borderSize); ++ XFixesSetPictureClipRegion(dpy, rootBuffer, 0, 0, w->borderClip); + #if HAS_NAME_WINDOW_PIXMAP + x = w->a.x; + y = w->a.y; diff --git a/talimatname/genel/x/xcompmgr/talimat b/talimatname/genel/x/xcompmgr/talimat new file mode 100644 index 000000000..be0e91c69 --- /dev/null +++ b/talimatname/genel/x/xcompmgr/talimat @@ -0,0 +1,21 @@ +# Tanım: X.org için Bileşik Pencere efektleri yöneticisi +# URL: http://xorg.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: xorg-libxcomposite xorg-libxdamage xorg-libxrender xorg-libxext + +isim=xcompmgr +surum=1.1.7 +devir=1 + +kaynak=(http://xorg.freedesktop.org/releases/individual/app/${isim}-${surum}.tar.bz2 fix_broken_shadows.diff) + +derle() { + cd ${isim}-${surum} + patch -Np0 -i ${SRC}/fix_broken_shadows.diff + ./configure --prefix=/usr + make + + make DESTDIR="${PKG}" install + install -m755 -d "${PKG}/usr/share/licenses/${isim}" + install -m644 COPYING "${PKG}/usr/share/licenses/${isim}/" +} diff --git a/talimatname/genel/x/xdg-user-dirs/talimat b/talimatname/genel/x/xdg-user-dirs/talimat new file mode 100644 index 000000000..6c4a06569 --- /dev/null +++ b/talimatname/genel/x/xdg-user-dirs/talimat @@ -0,0 +1,18 @@ +# Tanım: ~ / Masaüstü ve ~ / Müzik gibi kullanıcı dizinlerini yönetme +# Url: http://www.freedesktop.org/wiki/Software/xdg-user-dirs +# Paketçi: milisarge +# Gerekler: libxslt docbook-xsl + +isim=xdg-user-dirs +surum=0.15 +devir=2 +kaynak=(http://user-dirs.freedesktop.org/releases/$isim-$surum.tar.gz + xdg-user-dirs-src) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc + make + make DESTDIR=$PKG install + install -D ../$isim-src $PKG/etc/X11/xinit/xinitrc.d/xdg-user-dirs +} diff --git a/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs-src b/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs-src new file mode 100644 index 000000000..dbe8abb48 --- /dev/null +++ b/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs-src @@ -0,0 +1,4 @@ +#!/bin/sh + +# Set up user directories like ~/Desktop and ~/Music +[ -x /usr/bin/xdg-user-dirs-update ] && /usr/bin/xdg-user-dirs-update diff --git a/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs.kur-kos b/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs.kur-kos new file mode 100644 index 000000000..70c9e319e --- /dev/null +++ b/talimatname/genel/x/xdg-user-dirs/xdg-user-dirs.kur-kos @@ -0,0 +1 @@ +xdg-user-dirs-update diff --git a/talimatname/genel/x/xdg-utils/talimat b/talimatname/genel/x/xdg-utils/talimat new file mode 100644 index 000000000..5efa80ea4 --- /dev/null +++ b/talimatname/genel/x/xdg-utils/talimat @@ -0,0 +1,18 @@ +# Tanım: Çeşitli masaüstü entegrasyon görevleriyle uygulamalara yardımcı olan komut satırı araçları. +# URL: http://portland.freedesktop.org/wiki/ +# Paketçi: milisarge +# Gerekler: links xmlto xorg-app + +isim=xdg-utils +surum=1.1.0.rc3 +devir=2 +_surum=1.1.0-rc3 +kaynak=(http://people.freedesktop.org/~rdieter/$isim/$isim-${_version}.tar.gz) + +derle() { +cd $isim-${_version} +./configure --prefix=/usr \ +--mandir=/usr/share/man +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xdialog/talimat b/talimatname/genel/x/xdialog/talimat new file mode 100644 index 000000000..db4ebcf0b --- /dev/null +++ b/talimatname/genel/x/xdialog/talimat @@ -0,0 +1,19 @@ +# Tanım: dialog ve cdialog un geliştirilmiş sürümü +# URL: http://xdialog.dyns.net/ +# Paketçi: milisarge +# Gerekler: gtk2 + +isim=xdialog +surum=2.3.1 +devir=1 +kaynak=(http://xdialog.free.fr/Xdialog-$surum.tar.bz2) + +derle() { + cd Xdialog-$surum + ./configure --prefix=/usr \ + --disable-gtktest \ + --with-gtk2 + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/x/xdotool/talimat b/talimatname/genel/x/xdotool/talimat new file mode 100644 index 000000000..4abfd934c --- /dev/null +++ b/talimatname/genel/x/xdotool/talimat @@ -0,0 +1,23 @@ +# Tanım: fare ve klavye tuş sinyalleri göndermeye yarayan konsol uygulaması +# URL: http://www.semicomplete.com/projects/xdotool +# Paketçi: milisarge +# Gerekler: xorg-libxtst xorg-libxinerama libxkbcommon + +isim=xdotool +surum=3.2 +devir=1 +kaynak=(https://github.com/jordansissel/xdotool/archive/v3.20160805.1.tar.gz::$isim-$surum.tar.gz) + + +derle() { + cd ${isim}-3.20160805.1 + + # Build + make PREFIX=/usr DESTDIR=${PKG} + make PREFIX=/usr DESTDIR=${PKG} \ + pre-install \ + installlib \ + installprog \ + installman \ + installheader +} diff --git a/talimatname/genel/x/xed/talimat b/talimatname/genel/x/xed/talimat new file mode 100644 index 000000000..c99918e57 --- /dev/null +++ b/talimatname/genel/x/xed/talimat @@ -0,0 +1,19 @@ +# Tanım: Küçük ve hafif metin düzenleyici +# URL: https://github.com/linuxmint/xed +# Paketçi: Cihan Alkan +# Gerekler: gspell libpeas xapps gtksourceview3 gobject-introspection desktop-file-utils xorg-libsm enchant2 gnome-common yelp-tools iso-codes + +isim=xed +surum=1.8.1 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz) + +derle() { + cd $isim-$surum + sed -i 's/, enchant/, enchant-2/' configure.ac + ./autogen.sh --with-gtk=3.0 --prefix="/usr" \ + --localstatedir="/var" \ + --libexecdir="/usr/lib/xed" + make CFLAGS='-w -O2' + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xed/xed.kur-kos b/talimatname/genel/x/xed/xed.kur-kos new file mode 100644 index 000000000..088752e4d --- /dev/null +++ b/talimatname/genel/x/xed/xed.kur-kos @@ -0,0 +1 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/x/xf86-video-openchrome/talimat b/talimatname/genel/x/xf86-video-openchrome/talimat new file mode 100644 index 000000000..f74d6a442 --- /dev/null +++ b/talimatname/genel/x/xf86-video-openchrome/talimat @@ -0,0 +1,25 @@ +# Tanım: X.Org Openchrome sürücüsü +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg xorg-libdrm xorg-libxvmc + +isim=xf86-video-openchrome +surum=0.6.164 +devir=1 + +kaynak=() + +derle() { + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://anongit.freedesktop.org/git/openchrome/xf86-video-openchrome.git $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + ./autogen.sh --prefix=/usr --enable-debug --enable-xv-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce-theme-blackbird/talimat b/talimatname/genel/x/xfce-theme-blackbird/talimat new file mode 100644 index 000000000..54df2f2a4 --- /dev/null +++ b/talimatname/genel/x/xfce-theme-blackbird/talimat @@ -0,0 +1,16 @@ +# Tanım: Siyah Xfce teması, +# URL: http://shimmerproject.org/projects/blackbird/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk-engine-murrine +# Grup: xfce4 + +isim=xfce-theme-blackbird +surum=0.4 +devir=1 +kaynak=(https://github.com/shimmerproject/Blackbird/archive/v$surum.tar.gz::Blackbird-$surum.tar.gz) + +derle() { + install -d "$PKG"/usr/share/themes/ + cp -rf Blackbird-$surum/ "$PKG"/usr/share/themes/Blackbird/ + rm "$PKG"/usr/share/themes/Blackbird/.gitignore +} diff --git a/talimatname/genel/x/xfce-theme-bluebird/talimat b/talimatname/genel/x/xfce-theme-bluebird/talimat new file mode 100644 index 000000000..2ac08706b --- /dev/null +++ b/talimatname/genel/x/xfce-theme-bluebird/talimat @@ -0,0 +1,16 @@ +# Tanım: Açık mavi Xfce teması, +# URL: http://shimmerproject.org/projects/bluebird/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk-engine-murrine +# Grup: xfce4 + +isim=xfce-theme-bluebird +surum=1.2 +devir=1 +kaynak=(https://github.com/shimmerproject/Bluebird/archive/v$surum.tar.gz::Bluebird-$surum.tar.gz) + +derle() { + install -d "$PKG"/usr/share/themes/ + cp -rf Bluebird-$surum/ "$PKG"/usr/share/themes/Bluebird/ + rm "$PKG"/usr/share/themes/Bluebird/.gitignore +} diff --git a/talimatname/genel/x/xfce-theme-graybird/talimat b/talimatname/genel/x/xfce-theme-graybird/talimat new file mode 100644 index 000000000..823c66703 --- /dev/null +++ b/talimatname/genel/x/xfce-theme-graybird/talimat @@ -0,0 +1,16 @@ +# Tanım: Gri Xfce teması, +# URL: http://shimmerproject.org/projects/graybird/ +# Paketçi: Cihan_Alkan +# Gerekler: gtk-engine-murrine +# Grup: xfce4 + +isim=xfce-theme-graybird +surum=3.22.5 +devir=1 +kaynak=(https://github.com/shimmerproject/Greybird/archive/v$surum.tar.gz::Greybird-$surum.tar.gz) + +derle() { + install -d "$PKG"/usr/share/themes/ + cp -rf Greybird-$surum/ "$PKG"/usr/share/themes/Greybird/ + rm "$PKG"/usr/share/themes/Greybird/.gitignore +} diff --git a/talimatname/genel/x/xfce4-appfinder/appfinder-preferences-ui.h b/talimatname/genel/x/xfce4-appfinder/appfinder-preferences-ui.h new file mode 100644 index 000000000..2d4bfdccf --- /dev/null +++ b/talimatname/genel/x/xfce4-appfinder/appfinder-preferences-ui.h @@ -0,0 +1,334 @@ +/* automatically generated from appfinder-preferences.glade */ +#ifdef __SUNPRO_C +#pragma align 4 (appfinder_preferences_ui) +#endif +#ifdef __GNUC__ +static const char appfinder_preferences_ui[] __attribute__ ((__aligned__ (4))) = +#else +static const char appfinder_preferences_ui[] = +#endif +{ + "PrefixRegular ExpressionVery Small" + "SmallerSmallNormalLargeLarger<" + "/row>Very LargeTrueFalsegtk-clearFalseApplication Finder385425gtk-prefere" + "ncesdialogTrueFals" + "e2TrueFalseendgtk-closeFals" + "eTrueTrueTrueTrueFalseFalse0gtk-helpFalseTrueTrueFalseTrueFalseFalse0TrueFalseTrueend0TrueTrue6Tr" + "ueFalse66<" + "child>TrueFalse0none" + "TrueFals" + "e12TrueFalse66Remember last _selected categoryFalseTrueTrueFalseTrueTrueTrueTrue0Always c_ent" + "er the windowFalse<" + "/property>TrueTrueFalseCenter the w" + "indow on startup.TrueTrueTrueTrue<" + "/property>1Keep running _instance in the backgro" + "undFalse" + "True" + "TrueFalseInstead of quitting th" + "e application when the last window is closed, keep a running instance t" + "o speed up opening new windows. You might want to disable this to reduc" + "e memory usage.TrueTrueTrueTrue<" + "/property>True2<" + "child type=\"label\">TrueFalseBehaviour<" + "/object>FalseTrue0TrueFalse0noneTrue<" + "property isim=\"can_focus\">False12TrueFalse" + "642126<" + "/property>_View items as iconsFalseTrueTrueFalseTrueTrue2" + "Text besi_de " + "iconsFalseTrueTrueFalseTrueTrue21TrueFalse0Ite_m icon size:Tru" + "eitem-icon-size23GTK_FIL" + "LTrueFalse0Categ_ory icon size:Truecategory-icon-size34GTK_FILLTrueFalse<" + "property isim=\"model\">icon-sizes01223TrueFalseicon-sizes01234TrueFalseAppearanceTrueTrueTrue1TrueFalse0noneTrueFalse600012<" + "object class=\"GtkButton\" id=\"button-clear\">C_lear Custom Command HistoryFalseTrueTrueTrueima" + "ge3True" + "TrueFalseHistoryFalseTrue2TrueFalse_GeneralTrueFalseTrueFalse66TrueFalse6TrueTrueauto" + "maticautomaticetched-inT" + "rueTrueactions-storeFalseTrueFalse0Pattern0TrueTrue0TrueFalse000TrueFals" + "e6FalseTrueTrueT" + "rueAdd " + "a new custom action.TrueFalsegtk-addTrueTrue0FalseTrueTr" + "ueTrueRemove the currently sele" + "cted action." + "True" + "Falsegtk-delete" + "TrueTrue1FalseTrue1TrueTrue<" + "/property>0TrueFalse42126TrueTrue<" + "/property>If the t" + "ype is set to prefix, %s will be replaced with the string after the pat" + "tern, %S with the complete entry text. For regular expressions you can " + "use \\0 and \\<num>." + "\342\200\242TrueFalseFalseTrueTrue1223TrueTrue\342\200\242TrueFalseFalseTrueTr" + "ue1212TrueFalse0Co_mmand:Tr" + "uecommand23GTK_FILL" + "True" + "False0Patte_rn:Truepattern12" + "GTK_FILLTrueFalse0_Type:TruetypeGTK_FILL" + "TrueFalse00TrueFalseaction-types01" + "2_Save match in command history<" + "property isim=\"use_action_appearance\">FalseTrueTrue" + "FalseTrueTrue12" + "34FalseTrue11Tr" + "ueFalseCustom _ActionsTrue1FalseTrueTrue1<" + "/property>button-closebutton-help" +}; + +static const unsigned appfinder_preferences_ui_length = 21594u; + diff --git a/talimatname/genel/x/xfce4-appfinder/talimat b/talimatname/genel/x/xfce4-appfinder/talimat new file mode 100644 index 000000000..71354c663 --- /dev/null +++ b/talimatname/genel/x/xfce4-appfinder/talimat @@ -0,0 +1,34 @@ +# Tanım: Xfce için bir uygulama bulucu +# URL: http://http://www.xfce.org/projects/xfce4-appfinder/ +# Paketçi: milisarge +# Gerekler: xfce4-libui xfce4-garcon xfce4-dev-tools +# Grup: xfce4 + +isim=xfce4-appfinder +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_appfinder_surum}";[ -z ${xfce4_appfinder_surum} ] && \ +surum=4.12.0 +devir=3 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2 + appfinder-preferences-ui.h) + +derle() { + cd $isim-master + cp $SRC/appfinder-preferences-ui.h src/ + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-gtk-doc-html \ + --disable-debug + make + make DESTDIR=$PKG install + + for i in /usr/bin/xfrun4 + do rm $PKG/$i + done + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-appfinder/xfce4-appfinder.kur-kos b/talimatname/genel/x/xfce4-appfinder/xfce4-appfinder.kur-kos new file mode 100644 index 000000000..b12d3f529 --- /dev/null +++ b/talimatname/genel/x/xfce4-appfinder/xfce4-appfinder.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-artwork/talimat b/talimatname/genel/x/xfce4-artwork/talimat new file mode 100644 index 000000000..1e19ef4c9 --- /dev/null +++ b/talimatname/genel/x/xfce4-artwork/talimat @@ -0,0 +1,19 @@ +# Tanım: Xfce4 masaüstü için arka plan resimleri +# URL: http://goodies.xfce.org/projects/artwork/xfce4-artwork +# Paketçi: yasarciv67@gmail.com +# Gerekler: + +isim=xfce4-artwork +surum=0.1.1 +_debian_surum=0.1.1a~git+20110420 +devir=1 +kaynak=(http://ftp.debian.org/debian/pool/main/x/$isim/${isim}_$_debian_version.orig.tar.gz) + +derle() { + cd "$SRC/$isim-0.1.1a" + + ./configure --prefix=/usr + make + make backdropsdir="$PKG/usr/share/backgrounds/xfce" install +} + diff --git a/talimatname/genel/x/xfce4-battery-plugin/talimat b/talimatname/genel/x/xfce4-battery-plugin/talimat new file mode 100644 index 000000000..acc9be353 --- /dev/null +++ b/talimatname/genel/x/xfce4-battery-plugin/talimat @@ -0,0 +1,27 @@ +# Tanım: Xfce paneli için pil durumunu görüntüleme eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-battery-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel +# Grup: xfce4 + +isim=xfce4-battery-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_battery_plugin_surum}";[ -z ${xfce4_battery_plugin_surum} ] && \ +surum=1.0.5 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-battery-plugin/xfce4-battery-plugin.kur-kos b/talimatname/genel/x/xfce4-battery-plugin/xfce4-battery-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-battery-plugin/xfce4-battery-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-burn/talimat b/talimatname/genel/x/xfce4-burn/talimat new file mode 100644 index 000000000..d44b07f38 --- /dev/null +++ b/talimatname/genel/x/xfce4-burn/talimat @@ -0,0 +1,19 @@ +# Tanım: Bilgisayarınızdaki dosyalardan CD veya DVD'leri veya başka yerlerden indirilen ISO görüntülerini yakın. +# URL: http://www.xfce.org/projects/xfburn/ +# Paketçi: milisarge +# Gerekler: gstreamer-plugins-base exo libisoburn xorg-pixman startup-notification gstreamer-plugins-good + +_isim=xfburn +isim=xfce4-burn +surum=0.5.4 +devir=3 + +kaynak=(http://archive.xfce.org/src/apps/xfburn/${surum%.*}/xfburn-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--enable-gstreamer +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-burn/xfce4-burn.kur-kos b/talimatname/genel/x/xfce4-burn/xfce4-burn.kur-kos new file mode 100644 index 000000000..35d3191c5 --- /dev/null +++ b/talimatname/genel/x/xfce4-burn/xfce4-burn.kur-kos @@ -0,0 +1,2 @@ +update-desktop-database -q + gtk-update-icon-cache -q -t -f usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-calculator-plugin/talimat b/talimatname/genel/x/xfce4-calculator-plugin/talimat new file mode 100644 index 000000000..1e5f4d533 --- /dev/null +++ b/talimatname/genel/x/xfce4-calculator-plugin/talimat @@ -0,0 +1,23 @@ +# Tanım: Xfce4 paneli için bir hesap makinesi eklentisidir. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-calculator-plugin +# Paketçi: Cihan_Alkan +# Gerekler: xfce4-panel +# Grup: xfce4 + +isim=xfce4-calculator-plugin +surum=0.6.0 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/0.6/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-clipman-plugin/talimat b/talimatname/genel/x/xfce4-clipman-plugin/talimat new file mode 100644 index 000000000..cec9eec70 --- /dev/null +++ b/talimatname/genel/x/xfce4-clipman-plugin/talimat @@ -0,0 +1,26 @@ +# Tanım: Xfce4 paneli için bir pano eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-clipman-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel libunique1 xorg-libxtst qrencode +# Grup: xfce4 + +isim=xfce4-clipman-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_clipman_plugin_surum}";[ -z ${xfce4_clipman_plugin_surum} ] && \ +surum=1.4.2 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-clipman-plugin/xfce4-clipman-plugin.kur-kos b/talimatname/genel/x/xfce4-clipman-plugin/xfce4-clipman-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-clipman-plugin/xfce4-clipman-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-conf/talimat b/talimatname/genel/x/xfce4-conf/talimat new file mode 100644 index 000000000..cb99803c4 --- /dev/null +++ b/talimatname/genel/x/xfce4-conf/talimat @@ -0,0 +1,30 @@ +# Tanım: Xfconf, Xfce için yapılandırma depolama sistemidir. +# URL: http://wiki.xfce.org/releng/4.6/general-info +# Paketçi: milisarge +# Gerekler: xfce4-libutil dbus-glib perl-glib +# Grup: xfce4 + +_isim=xfconf +isim=xfce4-conf +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_conf_surum}";[ -z ${xfce4_conf_surum} ] && \ +surum=4.12.0 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/$_isim-$surum.tar.bz2) + +derle() { + cd ${_isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib/xfce4 \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -r $PKG/usr/share/gtk-doc + rm -r $PKG/usr/share/man + find $PKG -name perllocal.pod -exec rm {} \; +} diff --git a/talimatname/genel/x/xfce4-cpufreq-plugin/talimat b/talimatname/genel/x/xfce4-cpufreq-plugin/talimat new file mode 100644 index 000000000..c7bedbe58 --- /dev/null +++ b/talimatname/genel/x/xfce4-cpufreq-plugin/talimat @@ -0,0 +1,24 @@ +# Tanım: Xfce4 paneli için CPU frekansı eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-cpufreq-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-cpufreq-plugin +surum=1.1.2 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xfce4-cpufreq-plugin/xfce4-cpufreq-plugin.kur-kos b/talimatname/genel/x/xfce4-cpufreq-plugin/xfce4-cpufreq-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-cpufreq-plugin/xfce4-cpufreq-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-cpugraph-plugin/talimat b/talimatname/genel/x/xfce4-cpugraph-plugin/talimat new file mode 100644 index 000000000..e444c9325 --- /dev/null +++ b/talimatname/genel/x/xfce4-cpugraph-plugin/talimat @@ -0,0 +1,24 @@ +# Tanım: Bu panel eklentisi, sistemin geçerli CPU yükünü göstermek için birden fazla ekran modu (LED, gradyan, yangın vb.) sunar. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-cpugraph-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-cpugraph-plugin +surum=1.0.5 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/1.0/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xfce4-cpugraph-plugin/xfce4-cpugraph-plugin.kur-kos b/talimatname/genel/x/xfce4-cpugraph-plugin/xfce4-cpugraph-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-cpugraph-plugin/xfce4-cpugraph-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-datetime-plugin/talimat b/talimatname/genel/x/xfce4-datetime-plugin/talimat new file mode 100644 index 000000000..a0273ae42 --- /dev/null +++ b/talimatname/genel/x/xfce4-datetime-plugin/talimat @@ -0,0 +1,27 @@ +# Tanım: Xfce paneli için tarih ve saat görüntüleme eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-datetime-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel +# Grup: xfce4 + +isim=xfce4-datetime-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_datetime_plugin_surum}";[ -z ${xfce4_datetime_plugin_surum} ] && \ +surum=0.6.2 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/x/xfce4-desktop/talimat b/talimatname/genel/x/xfce4-desktop/talimat new file mode 100644 index 000000000..c8c43f743 --- /dev/null +++ b/talimatname/genel/x/xfce4-desktop/talimat @@ -0,0 +1,36 @@ +# Tanım: Xfdesktop masa yoneticisi xfce4 için. +# URL: http://www.xfce.org +# Paketçi: milisarge +# Gerekler: exo libwnck xfce4-libui thunar xfce4-garcon +# Grup: xfce4 + +_isim=xfdesktop +isim=xfce4-desktop +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_desktop_surum}";[ -z ${xfce4_desktop_surum} ] && \ +surum=4.12.3 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/${_isim}-$surum.tar.bz2) + +derle() { + cd ${_isim}-$surum + #duvar kagidi yuklemek icin + #sed -i "s/xfce-blue.jpg/milis.jpg/" common/xfdesktop-common.h + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --enable-gio-unix \ + --enable-thunarx \ + --enable-notifications \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man + #duvar kagidi yuklemek icin + #install -D -m644 ../milis.jpg \ + #$PKG/usr/share/backgrounds/xfce/milis.jpg +} diff --git a/talimatname/genel/x/xfce4-desktop/xfce4-desktop.kur-kos b/talimatname/genel/x/xfce4-desktop/xfce4-desktop.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-desktop/xfce4-desktop.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-dev-tools/talimat b/talimatname/genel/x/xfce4-dev-tools/talimat new file mode 100644 index 000000000..7dfb5885c --- /dev/null +++ b/talimatname/genel/x/xfce4-dev-tools/talimat @@ -0,0 +1,16 @@ +# Tanım: xfce4 geliştirme araçları +# URL: http://thunar.xfce.org +# Paketçi: milisarge +# Gerekler: + +isim=xfce4-dev-tools +surum=4.12.0 +devir=1 +kaynak=(http://archive.xfce.org/xfce/4.12/src/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-diskperf-plugin/talimat b/talimatname/genel/x/xfce4-diskperf-plugin/talimat new file mode 100644 index 000000000..7985eeaae --- /dev/null +++ b/talimatname/genel/x/xfce4-diskperf-plugin/talimat @@ -0,0 +1,23 @@ +# Tanım: Bu eklenti anlık disk / bölüm performansını görüntüler (saniyede bayt aktarılır). +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-diskperf-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-diskperf-plugin +surum=2.5.5 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/2.5/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-elementary-icon-theme/talimat b/talimatname/genel/x/xfce4-elementary-icon-theme/talimat new file mode 100644 index 000000000..7c38ab7af --- /dev/null +++ b/talimatname/genel/x/xfce4-elementary-icon-theme/talimat @@ -0,0 +1,18 @@ +# Tanım: Elementary simge teması +# URL: https://github.com/shimmerproject/elementary-xfce +# Paketçi: milisarge +# Gerekler: +# Grup: xfce4 + +isim=xfce4-elementary-icon-theme +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_elementary_icon_theme_surum}";[ -z ${xfce4_elementary_icon_theme_surum} ] && \ +surum=0.8 +devir=1 + +kaynak=(https://github.com/shimmerproject/elementary-xfce/archive/v$surum.tar.gz) + +derle() { + install -d -m 0755 $PKG//usr/share/icons + mv elementary-xfce-$surum/elementary-xfce{,-dark,-darker} $PKG//usr/share/icons +} diff --git a/talimatname/genel/x/xfce4-elementary-icon-theme/xfce4-elementary-icon-theme.kur-kos b/talimatname/genel/x/xfce4-elementary-icon-theme/xfce4-elementary-icon-theme.kur-kos new file mode 100644 index 000000000..3f8a7efcb --- /dev/null +++ b/talimatname/genel/x/xfce4-elementary-icon-theme/xfce4-elementary-icon-theme.kur-kos @@ -0,0 +1,6 @@ +gtk-update-icon-cache /usr/share/icons/elementary-xfce +[ -d ~/.icons ] && gtk-update-icon-cache ~/.icons/elementary-xfce-dark +gtk-update-icon-cache /usr/share/icons/elementary-xfce-dark +[ -d ~/.icons ] && gtk-update-icon-cache ~/.icons/elementary-xfce-dark +gtk-update-icon-cache /usr/share/icons/elementary-xfce-darker +[ -d ~/.icons ] && gtk-update-icon-cache ~/.icons/elementary-xfce-dark diff --git a/talimatname/genel/x/xfce4-fsguard-plugin/talimat b/talimatname/genel/x/xfce4-fsguard-plugin/talimat new file mode 100644 index 000000000..e3dd7332d --- /dev/null +++ b/talimatname/genel/x/xfce4-fsguard-plugin/talimat @@ -0,0 +1,22 @@ +# Tanım: Bu eklenti, boş disk alanı için seçilen bağlantı noktasını denetler. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-fsguard-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-fsguard-plugin +surum=1.0.2 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/1.0/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-fsguard-plugin/xfce4-fsguard-plugin.kur-kos b/talimatname/genel/x/xfce4-fsguard-plugin/xfce4-fsguard-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-fsguard-plugin/xfce4-fsguard-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-garcon/talimat b/talimatname/genel/x/xfce4-garcon/talimat new file mode 100644 index 000000000..eecda8e95 --- /dev/null +++ b/talimatname/genel/x/xfce4-garcon/talimat @@ -0,0 +1,27 @@ +# Tanım: Garcon, GLib ve GIO'ya dayalı bir freedesktop.org uyumlu menü uygulamasıdır. +# URL: http://wiki.xfce.org/releng/4.6/general-info +# Paketçi: milisarge +# Gerekler: gtk3 xfce4-libui xfce4-libutil +# Grup: xfce4 + +_isim=garcon +isim=xfce4-garcon +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_garcon_surum}";[ -z ${xfce4_garcon_surum} ] && \ +surum=0.5.0 +devir=2 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/$_isim-$surum.tar.bz2) + +derle() { + cd ${_isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -r $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/x/xfce4-gtk-engine/talimat b/talimatname/genel/x/xfce4-gtk-engine/talimat new file mode 100644 index 000000000..526361fa2 --- /dev/null +++ b/talimatname/genel/x/xfce4-gtk-engine/talimat @@ -0,0 +1,22 @@ +# Tanım: GTK Xfce Engine paketi, onları görüntülemek için gereken birkaç GTK+ 2 ve GTK+ 3 temasını ve kütüphanelerini içerir. +# URL: http://www.xfce.org +# Paketçi: milisarge +# Gerekler: gtk2 gtk3 +# Grup: xfce4 + +_isim=gtk-xfce-engine +isim=xfce4-gtk-engine +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_gtk_engine_surum}";[ -z ${xfce4_gtk_engine_surum} ] && \ +surum=3.2.0 +devir=2 + +kaynak=(http://archive.xfce.org/src/xfce/${_name}/${surum%.*}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum + ./configure --prefix=/usr \ + --enable-gtk3 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-hardware-monitor-plugin/talimat b/talimatname/genel/x/xfce4-hardware-monitor-plugin/talimat new file mode 100644 index 000000000..bbae1cf3b --- /dev/null +++ b/talimatname/genel/x/xfce4-hardware-monitor-plugin/talimat @@ -0,0 +1,22 @@ +# Tanım: CPU kullanımı, ağ bant genişliği vb. Izlemenizi sağlayan Xfce4 paneli için eklenti +# URL: http://git.xfce.org/panel-plugins/xfce4-hardware-monitor-plugin/ +# Paketçi: yasarciv67@gmail.com +# Gerekler: autoconf-archive intltool xfce4-dev-tools lm-sensors gtkmm libglademm libgnomecanvasmm libgtop xfce4-libui xfce4-panel + +isim=xfce4-hardware-monitor-plugin +surum=1.5.0 +devir=1. +kaynak=(https://git.xfce.org/panel-plugins/xfce4-hardware-monitor-plugin/snapshot/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + sed -i '/c++11/d' configure.ac + sed -i '/gnu++11/d' configure.ac + sed -i 's/AM_PROG_AR/AM_PROG_AR\nAX_CHECK_COMPILE_FLAG([-std=c++11], [CXXFLAGS="$CXXFLAGS -std=c++11"])/' configure.ac + sed -i 's/AM_PROG_AR/AM_PROG_AR\nAX_CHECK_COMPILE_FLAG([-std=gnu++11], [CXXFLAGS="$CXXFLAGS -std=gnu++11"])/' configure.ac + ./autogen.sh + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + +} \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-indicator-plugin/talimat b/talimatname/genel/x/xfce4-indicator-plugin/talimat new file mode 100644 index 000000000..1e0feac33 --- /dev/null +++ b/talimatname/genel/x/xfce4-indicator-plugin/talimat @@ -0,0 +1,19 @@ +# Tanım: Xfce4 panelindeki uygulamalardan bilgi görüntülemek için eklenti +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-indicator-plugin +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool xfce4-dev-tools hicolor-icon-theme ido libindicator libindicator-gtk2 libindicator xfce4-panel xdg-utils + +isim=xfce4-indicator-plugin +surum=2.3.3 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2 +) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libexecdir=/usr/lib --disable-static + + make + make DESTDIR="$PKG/" install + +} \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-libui/talimat b/talimatname/genel/x/xfce4-libui/talimat new file mode 100644 index 000000000..20351e525 --- /dev/null +++ b/talimatname/genel/x/xfce4-libui/talimat @@ -0,0 +1,32 @@ +# Tanım: Libxfce4ui paketi, diğer Xfce uygulamaları tarafından kullanılan GTK+ 2 widget'larını içerir. +# URL: http://www.xfce.org/projects/libraries/ +# Paketçi: milisarge +# Gerekler: gtk2 gtk3 startup-notification xfce4-conf +# Grup: xfce4 + +_isim=libxfce4ui +isim=xfce4-libui +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_libui_surum}";[ -z ${xfce4_libui_surum} ] && \ +surum=4.12.1 +devir=2 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/$_isim-$surum.tar.bz2) + +derle() { + cd ${_isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc + + for i in usr/bin/xfce4-about usr/share/applications/xfce4-about.desktop usr/share/icons/hicolor/48x48/apps/xfce4-logo.png + do rm $PKG/$i + done +} diff --git a/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-kur b/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-kur new file mode 100644 index 000000000..957916f7e --- /dev/null +++ b/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-kur @@ -0,0 +1 @@ +mkdir -p /etc/xdg/xfce4/xfconf diff --git a/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-sil b/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-sil new file mode 100644 index 000000000..6fd32ab78 --- /dev/null +++ b/talimatname/genel/x/xfce4-libui/xfce4-libui.kos-sil @@ -0,0 +1,11 @@ +#!/bin/sh +_paket=xfce4-libui +for _kurtar in \ +'/etc/xdg/xfce4' \ +'/etc/xdg/xfce4/xfconf'; \ +do + +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/$_paket.sil + +done diff --git a/talimatname/genel/x/xfce4-libutil/talimat b/talimatname/genel/x/xfce4-libutil/talimat new file mode 100644 index 000000000..a5f385fad --- /dev/null +++ b/talimatname/genel/x/xfce4-libutil/talimat @@ -0,0 +1,28 @@ +# Tanım: Libxfce4util paketi Xfce masaüstü ortamı için temel bir yardımcı program kütüphanesi. +# URL: http://ww.xfce.org/projects/libraries/ +# Paketçi: milisarge +# Gerekler: glib intltool +# Grup: xfce4 + +_isim=libxfce4util +isim=xfce4-libutil +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_libutil_surum}";[ -z ${xfce4_libutil_surum} ] && \ +surum=4.12.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/$_isim-$surum.tar.bz2) +derle() { + cd ${_isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --sbindir=/usr/bin \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/x/xfce4-libutil/xfce4-libutil.kos-sil b/talimatname/genel/x/xfce4-libutil/xfce4-libutil.kos-sil new file mode 100644 index 000000000..21fa698f4 --- /dev/null +++ b/talimatname/genel/x/xfce4-libutil/xfce4-libutil.kos-sil @@ -0,0 +1,12 @@ +#!/bin/sh +_paket=xfce4-libutil +for _kurtar in \ +'/usr/share/locale/ur_PK/LC_MESSAGES' \ +'/usr/share/gir-1.0' \ +'/usr/share/locale/ur_PK'; \ +do + +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/$_paket.sil + +done diff --git a/talimatname/genel/x/xfce4-linelight-plugin/talimat b/talimatname/genel/x/xfce4-linelight-plugin/talimat new file mode 100644 index 000000000..4c12f8d84 --- /dev/null +++ b/talimatname/genel/x/xfce4-linelight-plugin/talimat @@ -0,0 +1,20 @@ +# Tanım: linelight, arama için basit bir ön uçtur. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-linelight-plugin +# Paketçi: Cihan_Alkan +# Gerekler: xfce4-panel libxfcegui4 +# Grup: xfce4 + +isim=xfce4-linelight-plugin +surum=0.1.7 +devir=1 +kaynak=(http://ftp.de.debian.org/debian/pool/main/x/${isim}/${isim}_${surum}.orig.tar.bz2 + http://lionel.lefolgoc.net/misc/01_port-to-xfcerc.patch) + +derle() { + patch -p0 -i 01_port-to-xfcerc.patch + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib/ \ + --localstatedir=/var --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-mailwatch-plugin/talimat b/talimatname/genel/x/xfce4-mailwatch-plugin/talimat new file mode 100644 index 000000000..45e566812 --- /dev/null +++ b/talimatname/genel/x/xfce4-mailwatch-plugin/talimat @@ -0,0 +1,23 @@ +# Tanım: Periyodik olarak postaları kontrol etmek için konforlu, çok parçacıklı, çoklu posta kutusu, çok protokollü eklenti. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-mailwatch-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel gnutls libgcrypt intltool perl-xml-parser xfce4-libui + +isim=xfce4-mailwatch-plugin +surum=1.2.0 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd "$SRC/$isim-$surum" + + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-debug + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/x/xfce4-mixer/talimat b/talimatname/genel/x/xfce4-mixer/talimat new file mode 100644 index 000000000..1b9e99c28 --- /dev/null +++ b/talimatname/genel/x/xfce4-mixer/talimat @@ -0,0 +1,22 @@ +# Tanım: Xfce4 Mixer, GStreamer tabanlı Xfce masaüstü için bir ses denetimi uygulamasıdır. +# URL: http://www.xfce.org/projects/xfce4-mixer/ +# Paketçi: milisarge +# Gerekler: gstreamer-plugins-base libunique1 xfce4-libutil xfce4-panel + +isim=xfce4-mixer +surum=4.11.0 +devir=2 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-mixer/xfce4-mixer.kur-kos b/talimatname/genel/x/xfce4-mixer/xfce4-mixer.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-mixer/xfce4-mixer.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-netload-plugin/talimat b/talimatname/genel/x/xfce4-netload-plugin/talimat new file mode 100644 index 000000000..d19e5f63c --- /dev/null +++ b/talimatname/genel/x/xfce4-netload-plugin/talimat @@ -0,0 +1,22 @@ +# Tanım: Bu eklenti, panelde seçtiğiniz ağ arabirimlerinin güncel yükünü görüntüler. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-netload-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-netload-plugin +surum=1.2.4 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/1.2/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-netload-plugin/xfce4-netload-plugin.kur-kos b/talimatname/genel/x/xfce4-netload-plugin/xfce4-netload-plugin.kur-kos new file mode 100644 index 000000000..23b174fbd --- /dev/null +++ b/talimatname/genel/x/xfce4-netload-plugin/xfce4-netload-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-notes-plugin/talimat b/talimatname/genel/x/xfce4-notes-plugin/talimat new file mode 100644 index 000000000..e620b6a7f --- /dev/null +++ b/talimatname/genel/x/xfce4-notes-plugin/talimat @@ -0,0 +1,22 @@ +# Tanım: Xfce4 panel için not eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-notes-plugin +# Paketçi: milisarge +# Gerekler: intltool xfce4-panel libunique1 hicolor-icon-theme + +isim=xfce4-notes-plugin +surum=1.8.1 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/xfce4-notes-plugin/${surum%.*}/xfce4-notes-plugin-$surum.tar.bz2) + +derle() { + cd "$SRC/$isim-$surum" + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/x/xfce4-notifyd/talimat b/talimatname/genel/x/xfce4-notifyd/talimat new file mode 100644 index 000000000..d46a2aa02 --- /dev/null +++ b/talimatname/genel/x/xfce4-notifyd/talimat @@ -0,0 +1,27 @@ +# Tanım: Freedesktop masaüstü bildirimleri belirtiminin "sunucu tarafı" kısmı. +# URL: http://git.xfce.org/kelnos/xfce4-notifyd/ +# Paketçi: milisarge +# Gerekler: xfce4-libui libnotify +# Grup: xfce4 + +isim=xfce4-notifyd +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_notifyd_surum}";[ -z ${xfce4_notifyd_surum} ] && \ +surum=0.3.6 +devir=4 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/lib/systemd + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-notifyd/xfce4-notifyd.kur-kos b/talimatname/genel/x/xfce4-notifyd/xfce4-notifyd.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-notifyd/xfce4-notifyd.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-panel/talimat b/talimatname/genel/x/xfce4-panel/talimat new file mode 100644 index 000000000..2c23cdbfb --- /dev/null +++ b/talimatname/genel/x/xfce4-panel/talimat @@ -0,0 +1,29 @@ +# Tanım: Bu paket Xfce4 Paneli'ni içerir. +# URL: http://www.xfce.org/projects/xfce4-panel/ +# Paketçi: milisarge +# Gerekler: exo xfce4-garcon libwnck xfce4-libui gtk3 hicolor-icon-theme desktop-file-utils vim +# Grup: xfce4 + +isim=xfce4-panel +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_panel_surum}";[ -z ${xfce4_panel_surum} ] && \ +surum=4.12.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --enable-gio-unix \ + --enable-gtk3 \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/x/xfce4-panel/xfce4-panel.kos-sil b/talimatname/genel/x/xfce4-panel/xfce4-panel.kos-sil new file mode 100644 index 000000000..8598aec26 --- /dev/null +++ b/talimatname/genel/x/xfce4-panel/xfce4-panel.kos-sil @@ -0,0 +1,12 @@ +#!/bin/sh +_paket=xfce4-panel +for _kurtar in \ +'/etc/xdg/xfce4' \ +'/usr/lib/xfce4/panel' \ +'/usr/lib/xfce4/panel/plugins'; \ +do + +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/$_paket.sil + +done diff --git a/talimatname/genel/x/xfce4-panel/xfce4-panel.kur-kos b/talimatname/genel/x/xfce4-panel/xfce4-panel.kur-kos new file mode 100644 index 000000000..614d576b9 --- /dev/null +++ b/talimatname/genel/x/xfce4-panel/xfce4-panel.kur-kos @@ -0,0 +1,2 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +update-desktop-database -q \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-places-plugin/mounts.patch b/talimatname/genel/x/xfce4-places-plugin/mounts.patch new file mode 100644 index 000000000..44e5e0368 --- /dev/null +++ b/talimatname/genel/x/xfce4-places-plugin/mounts.patch @@ -0,0 +1,12 @@ +diff -Nur original/panel-plugin/model_volumes.c modified/panel-plugin/model_volumes.c +--- original/panel-plugin/model_volumes.c 2013-12-28 11:30:18.000000000 +0000 ++++ modified/panel-plugin/model_volumes.c 2015-06-25 09:59:34.324437370 +0100 +@@ -380,7 +380,7 @@ + g_object_unref(mount); + } + +- return has_media && !is_shadowed; ++ return /*has_media &&*/ !is_shadowed; + } + + static inline gboolean diff --git a/talimatname/genel/x/xfce4-places-plugin/talimat b/talimatname/genel/x/xfce4-places-plugin/talimat new file mode 100644 index 000000000..c6944b69e --- /dev/null +++ b/talimatname/genel/x/xfce4-places-plugin/talimat @@ -0,0 +1,34 @@ +# Tanım: Xfce paneli için Yerler Menüsü eklentisi +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-places-plugin +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool libnotify xfce4-panel + +isim=xfce4-places-plugin +surum=1.7.0 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2 +mounts.patch +undefined-symbol.patch +) + +derle() { + cd "$isim-$surum" + # Disk olmayan diğer bağları göster (örn. NFS) + + patch -Np1 -i "${SRC}/mounts.patch" + + # Bug 11939 + + patch -Np1 -i "${SRC}/undefined-symbol.patch" + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + + make + make DESTDIR="$PKG" install + +} \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-places-plugin/undefined-symbol.patch b/talimatname/genel/x/xfce4-places-plugin/undefined-symbol.patch new file mode 100644 index 000000000..3fe7be23d --- /dev/null +++ b/talimatname/genel/x/xfce4-places-plugin/undefined-symbol.patch @@ -0,0 +1,65 @@ +From 94d583d0ba257cdc96cde5794ebb7d38001ae3a5 Mon Sep 17 00:00:00 2001 +From: Andrzej +Date: Tue, 7 Jul 2015 22:26:51 +0100 +Subject: Bug 11939: xfce4-places-plugin 1.7.0 crashes with undefined symbol + +Patch from Fedora. Submitted by Kevin Fenzi. + +diff --git a/panel-plugin/model.h b/panel-plugin/model.h +index 06d9d6f..043e391 100644 +--- a/panel-plugin/model.h ++++ b/panel-plugin/model.h +@@ -36,13 +36,13 @@ struct _PlacesBookmarkAction + void (*finalize) (PlacesBookmarkAction *self); + }; + +-inline PlacesBookmarkAction* ++extern inline PlacesBookmarkAction* + places_bookmark_action_create(gchar *label); + +-inline void ++extern inline void + places_bookmark_action_destroy(PlacesBookmarkAction*); + +-inline void ++extern inline void + places_bookmark_action_call(PlacesBookmarkAction*); + + /* Places Bookmark */ +@@ -70,10 +70,10 @@ struct _PlacesBookmark + void (*finalize) (PlacesBookmark *self); + }; + +-inline PlacesBookmark* ++extern inline PlacesBookmark* + places_bookmark_create(gchar *label); + +-inline void ++extern inline void + places_bookmark_destroy(PlacesBookmark *bookmark); + + /* Places Bookmark Group */ +@@ -86,16 +86,16 @@ struct _PlacesBookmarkGroup + gpointer priv; + }; + +-inline GList* ++extern inline GList* + places_bookmark_group_get_bookmarks(PlacesBookmarkGroup*); + +-inline gboolean ++extern inline gboolean + places_bookmark_group_changed(PlacesBookmarkGroup*); + +-inline PlacesBookmarkGroup* ++extern inline PlacesBookmarkGroup* + places_bookmark_group_create(); + +-inline void ++extern inline void + places_bookmark_group_destroy(PlacesBookmarkGroup*); + + #endif +-- +cgit v0.10.1 + diff --git a/talimatname/genel/x/xfce4-power-manager/talimat b/talimatname/genel/x/xfce4-power-manager/talimat new file mode 100644 index 000000000..c4d05b27d --- /dev/null +++ b/talimatname/genel/x/xfce4-power-manager/talimat @@ -0,0 +1,22 @@ +# Tanım: Xfce masaüstü için güç yöneticisi. +# URL: http://goodies.xfce.org/projects/applications/xfce4-power-manager +# Paketçi: milisarge +# Gerekler: dbus-glib xorg-app libnotify xfce4-panel upower udisks +# Grup: xfce4 + +isim=xfce4-power-manager +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_power_manager_surum}";[ -z ${xfce4_power_manager_surum} ] && \ +surum=1.4.4 +devir=2 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2) +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kos-sil b/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kos-sil new file mode 100644 index 000000000..334ace824 --- /dev/null +++ b/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kos-sil @@ -0,0 +1,13 @@ +#!/bin/sh +_paket=xfce4-power-manager +for _kurtar in \ +'/usr/share/xfce4/panel/plugins' \ +'/usr/share/xfce4/panel' \ +'/usr/share/xfce4/panel' \ +'/usr/lib/xfce4/panel'; \ +do + +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/$_paket.sil + +done diff --git a/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kur-kos b/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kur-kos new file mode 100644 index 000000000..b12d3f529 --- /dev/null +++ b/talimatname/genel/x/xfce4-power-manager/xfce4-power-manager.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-pulseaudio-plugin/talimat b/talimatname/genel/x/xfce4-pulseaudio-plugin/talimat new file mode 100644 index 000000000..49ce955b2 --- /dev/null +++ b/talimatname/genel/x/xfce4-pulseaudio-plugin/talimat @@ -0,0 +1,27 @@ +# Tanım: Xfce4 paneli için pulseaudio eklentisi +# URL: http://xfce.org/ +# Paketçi: milisarge +# Gerekler: xfce4-panel pulseaudio gtk-update-icon-cache libnotify intltool dbus-glib pavucontrol xfce4-dev-tools +# Grup: xfce4 + +isim=xfce4-pulseaudio-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_pulseaudio_plugin_surum}";[ -z ${xfce4_pulseaudio_plugin_surum} ] && \ +surum=0.3.3 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --enable-keybinder \ + --enable-libnotify \ + --enable-maintainer-mode + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-screenshooter/talimat b/talimatname/genel/x/xfce4-screenshooter/talimat new file mode 100644 index 000000000..b1f0dadfb --- /dev/null +++ b/talimatname/genel/x/xfce4-screenshooter/talimat @@ -0,0 +1,28 @@ +# Tanım: Bu, çeşitli seçeneklerle ekran görüntüleri almak için bir eklentidir. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-screenshooter-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel libsoup p11-kit +# Grup: xfce4 + +isim=xfce4-screenshooter +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_screenshooter_surum}";[ -z ${xfce4_screenshooter_surum} ] && \ +surum=1.8.2 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} + diff --git a/talimatname/genel/x/xfce4-screenshooter/xfce4-screenshooter.kur-kos b/talimatname/genel/x/xfce4-screenshooter/xfce4-screenshooter.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-screenshooter/xfce4-screenshooter.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-sensors-plugin/talimat b/talimatname/genel/x/xfce4-sensors-plugin/talimat new file mode 100644 index 000000000..ad498c336 --- /dev/null +++ b/talimatname/genel/x/xfce4-sensors-plugin/talimat @@ -0,0 +1,25 @@ +# Tanım: Xfce paneli için bir lm_sensors eklentisi. +# URL: http://goodies.xfce.org/projects/panel-plugins/start +# Paketçi: milisarge +# Gerekler: xfce4-panel lm-sensors libnotify hicolor-icon-theme + +isim=xfce4-sensors-plugin +surum=1.2.6 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/1.2/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --datadir=/usr/share \ + --datarootdir=/usr/share \ + --disable-static + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-sensors-plugin/xfce4-sensors-plugin.kur-kos b/talimatname/genel/x/xfce4-sensors-plugin/xfce4-sensors-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-sensors-plugin/xfce4-sensors-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-session/0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch b/talimatname/genel/x/xfce4-session/0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch new file mode 100644 index 000000000..828015318 --- /dev/null +++ b/talimatname/genel/x/xfce4-session/0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch @@ -0,0 +1,27 @@ +From e740aad5d6761ce9a9df48a3d87ff29240433d19 Mon Sep 17 00:00:00 2001 +From: Evangelos Foutras +Date: Tue, 24 Mar 2015 10:09:33 +0200 +Subject: [PATCH] Pass VT number to xinit if XDG_VTNR is set + +--- + scripts/startxfce4.in | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/scripts/startxfce4.in b/scripts/startxfce4.in +index d0a74a9..bf3201b 100644 +--- a/scripts/startxfce4.in ++++ b/scripts/startxfce4.in +@@ -92,6 +92,10 @@ if test "x$DISPLAY" = "x" + then + echo "$0: Starting X server" + prog=xinit ++ ++ if test ! "x$XDG_VTNR" = "x"; then ++ SERVERRC="vt$XDG_VTNR $SERVERRC" ++ fi + else + echo "$0: X server already running on display $DISPLAY" + prog=/bin/sh +-- +2.3.4 + diff --git a/talimatname/genel/x/xfce4-session/talimat b/talimatname/genel/x/xfce4-session/talimat new file mode 100644 index 000000000..4c556085e --- /dev/null +++ b/talimatname/genel/x/xfce4-session/talimat @@ -0,0 +1,32 @@ +# Tanım: Xfce4-session, Xfce için bir oturum yöneticisi +# URL: http://www.xfce.org +# Paketçi: milisarge +# Gerekler: gnupg polkit consolekit2 udisks upower xorg-libxres libwnck xfce4-libui xorg-app xlockmore +# Grup: xfce4 + +isim=xfce4-session +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_session_surum}";[ -z ${xfce4_session_surum} ] && \ +surum=4.12.1 +devir=3 + +kaynak=(http://archive.xfce.org/src/xfce/$isim/${surum%.*}/$isim-$surum.tar.bz2 +0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch + xfce-polkit-gnome-authentication-agent-1.desktop) + +derle() { + cd $isim-$surum + patch -Np1 -i ../0001-Pass-VT-number-to-xinit-if-XDG_VTNR-is-set.patch + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug \ + --disable-legacy-sm + make + make DESTDIR=$PKG install + install -d $PKG/etc/xdg/autostart + cp $SRC/xfce-polkit-gnome-authentication-agent-1.desktop $PKG/etc/xdg/autostart/ +} diff --git a/talimatname/genel/x/xfce4-session/xfce-polkit-gnome-authentication-agent-1.desktop b/talimatname/genel/x/xfce4-session/xfce-polkit-gnome-authentication-agent-1.desktop new file mode 100644 index 000000000..028aad946 --- /dev/null +++ b/talimatname/genel/x/xfce4-session/xfce-polkit-gnome-authentication-agent-1.desktop @@ -0,0 +1,87 @@ +[Desktop Entry] +Name=PolicyKit Authentication Agent +Name[ar]=مدير الاستيثاق PolicyKit +Name[be]=PolicyKit - аґент аўтэнтыфікацыі +Name[bn_IN]=PolicyKit অনুমোদনের এজেন্ট +Name[ca]=Agent d'autenticació del PolicyKit +Name[cs]=Ověřovací agent PolicyKit +Name[da]=Godkendelsesprogrammet PolicyKit +Name[de]=Legitimationsdienst von PolicyKit +Name[el]=Πράκτορας πιστοποίησης PolicyKit +Name[en_GB]=PolicyKit Authentication Agent +Name[es]=Agente de autenticación de PolicyKit +Name[eu]=PolicyKit autentifikatzeko agentea +Name[fi]=PolicytKit-tunnistautumisohjelma +Name[fr]=Agent d'authentification de PolicyKit +Name[gl]=Axente de autenticación PolicyKit +Name[gu]=PolicyKit સત્તાધિકરણ એજન્ટ +Name[hi]=PolicyKit प्रमाणीकरण प्रतिनिधि +Name[hu]=PolicyKit hitelesítési ügynök +Name[it]=Agente di autenticazione per PolicyKit +Name[ja]=PolicyKit 認証エージェント +Name[kn]=PolicyKit ದೃಢೀಕರಣ ಮಧ್ಯವರ್ತಿ +Name[lt]=PolicyKit tapatybės nustatymo agentas +Name[ml]=പോളിസിക്കിറ്റ് ഓഥന്റിക്കേഷന്‍ ഏജന്റ് +Name[mr]=PolicyKit ऑथेंटीकेशन एजेंट +Name[or]=PolicyKit ବୈଧିକରଣ ସଦସ୍ୟ +Name[pa]=ਪਾਲਸੀਕਿੱਟ ਪਰਮਾਣਕਿਤਾ ਏਜੰਟ +Name[pl]=Agent uwierzytelniania PolicyKit +Name[pt]=Agente de Autenticação PolicyKit +Name[pt_BR]=Agente de autenticação PolicyKit +Name[ro]=Agent de autentificare PolicyKit +Name[sk]=Agent PolicyKit na overovanie totožnosti +Name[sl]=PolicyKit program overjanja +Name[sv]=Autentiseringsagent för PolicyKit +Name[ta]=PolicyKit அங்கீகார முகவர் +Name[te]=పాలసీకిట్ ధృవీకరణ ప్రతినిధి +Name[th]=ตัวกลางสำหรับยืนยันตัวบุคคล PolicyKit +Name[uk]=Агент автентифікації PolicyKit +Name[zh_CN]=PolicyKit 认证代理 +Name[zh_HK]=PolicyKit 驗證代理程式 +Name[zh_TW]=PolicyKit 驗證代理程式 +Comment=PolicyKit Authentication Agent +Comment[ar]=مدير الاستيثاق PolicyKit +Comment[be]=PolicyKit - аґент аўтэнтыфікацыі +Comment[bn_IN]=PolicyKit অনুমোদনের এজেন্ট +Comment[ca]=Agent d'autenticació del PolicyKit +Comment[cs]=Ověřovací agent PolicyKit +Comment[da]=Godkendelsesprogrammet PolicyKit +Comment[de]=Legitimationsdienst von PolicyKit +Comment[el]=Πράκτορας πιστοποίησης PolicyKit +Comment[en_GB]=PolicyKit Authentication Agent +Comment[es]=Agente de autenticación de PolicyKit +Comment[eu]=PolicyKit autentifikatzeko agentea +Comment[fi]=PolicytKit-tunnistautumisohjelma +Comment[fr]=Agent d'authentification de PolicyKit +Comment[gl]=Axente de autenticación PolicyKit +Comment[gu]=PolicyKit સત્તાધિકરણ એજન્ટ +Comment[hi]=PolicyKit प्रमाणीकरण प्रतिनिधि +Comment[hu]=PolicyKit hitelesítési ügynök +Comment[it]=Agente di autenticazione per PolicyKit +Comment[ja]=PolicyKit 認証エージェント +Comment[kn]=PolicyKit ದೃಢೀಕರಣ ಮಧ್ಯವರ್ತಿ +Comment[lt]=PolicyKit tapatybės nustatymo agentas +Comment[ml]=പോളിസിക്കിറ്റ് ഓഥന്റിക്കേഷന്‍ ഏജന്റ് +Comment[mr]=PolicyKit ऑथेंटीकेशन एजेंट +Comment[or]=PolicyKit ବୈଧିକରଣ ସଦସ୍ୟ +Comment[pa]=ਪਾਲਸੀਕਿੱਟ ਪਰਮਾਣਕਿਤਾ ਏਜੰਟ +Comment[pl]=Agent uwierzytelniania PolicyKit +Comment[pt]=Agente de Autenticação PolicyKit +Comment[pt_BR]=Agente de autenticação PolicyKit +Comment[ro]=Agent de autentificare PolicyKit +Comment[sk]=Agent PolicyKit na overovanie totožnosti +Comment[sl]=PolicyKit program overjanja +Comment[sv]=Autentiseringsagent för PolicyKit +Comment[ta]=PolicyKit அங்கீகார முகவர் +Comment[te]=పాలసీకిట్ ధృవీకరణ ప్రతినిధి +Comment[th]=ตัวกลางสำหรับยืนยันตัวบุคคล PolicyKit +Comment[uk]=Агент автентифікації PolicyKit +Comment[zh_CN]=PolicyKit 认证代理 +Comment[zh_HK]=PolicyKit 驗證代理程式 +Comment[zh_TW]=PolicyKit 驗證代理程式 +Exec=/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 +Terminal=false +Type=Application +Categories= +NoDisplay=true +OnlyShowIn=XFCE; \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-session/xfce4-session.kur-kos b/talimatname/genel/x/xfce4-session/xfce4-session.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-session/xfce4-session.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-settings/talimat b/talimatname/genel/x/xfce4-settings/talimat new file mode 100644 index 000000000..07220dae4 --- /dev/null +++ b/talimatname/genel/x/xfce4-settings/talimat @@ -0,0 +1,32 @@ +# Tanım: Xfce4 ayar uygulamaları. +# URL: http://wiki.xfce.org/releng +# Paketçi: milisarge +# Gerekler: exo xfce4-libui xfce4-garcon xorg-libxklavier xorg-libxkbfile libcanberra gnome-icon-theme +# Grup: xfce4 + +isim=xfce4-settings +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_settings_surum}";[ -z ${xfce4_settings_surum} ] && \ +surum=4.12.0 +devir=3 + +kaynak=(http://archive.xfce.org/src/xfce/${isim}/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --disable-static \ + --enable-xrandr \ + --enable-xcursor \ + --enable-libnotify \ + --enable-libxklavier \ + --enable-pluggable-dialogs \ + --enable-sound-settings \ + --disable-upower-glib \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-settings/xfce4-settings.kur-kos b/talimatname/genel/x/xfce4-settings/xfce4-settings.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-settings/xfce4-settings.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-statusnotifier-plugin/talimat b/talimatname/genel/x/xfce4-statusnotifier-plugin/talimat new file mode 100644 index 000000000..0c850ce32 --- /dev/null +++ b/talimatname/genel/x/xfce4-statusnotifier-plugin/talimat @@ -0,0 +1,24 @@ +# Tanım: Xfce4 panelindeki durum bildirim göstergelerine eklenti +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-statusnotifier-plugin +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool python3 xfce4-panel libdbusmenu-gtk3 + +isim=xfce4-statusnotifier-plugin +surum=0.2.0 +devir=1 +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd "${isim}-${surum}" + + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --libexecdir=/usr/lib \ + --disable-static + + make + make DESTDIR="${PKG}" install + +} diff --git a/talimatname/genel/x/xfce4-systemload-plugin/talimat b/talimatname/genel/x/xfce4-systemload-plugin/talimat new file mode 100644 index 000000000..eba58ed61 --- /dev/null +++ b/talimatname/genel/x/xfce4-systemload-plugin/talimat @@ -0,0 +1,21 @@ +# Tanım: Panel için monitör sistemi +# URL: http://goodies.xfce.org/projects/panel-plugins/start +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-systemload-plugin +surum=1.1.2 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/1.1/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-systemload-plugin/xfce4-systemload-plugin.kur-kos b/talimatname/genel/x/xfce4-systemload-plugin/xfce4-systemload-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-systemload-plugin/xfce4-systemload-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-taskmanager/talimat b/talimatname/genel/x/xfce4-taskmanager/talimat new file mode 100644 index 000000000..5ab206357 --- /dev/null +++ b/talimatname/genel/x/xfce4-taskmanager/talimat @@ -0,0 +1,22 @@ +# Tanım: Xfce için görev yöneticisi +# URL: http://goodies.xfce.org/projects/applications/xfce4-taskmanager +# Paketçi: milisarge +# Gerekler: gtk2 libwnck +# Grup: xfce4 + +isim=xfce4-taskmanager +surum=1.2.0 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-terminal/talimat b/talimatname/genel/x/xfce4-terminal/talimat new file mode 100644 index 000000000..b8123b004 --- /dev/null +++ b/talimatname/genel/x/xfce4-terminal/talimat @@ -0,0 +1,26 @@ +# Tanım: Xfce4 Terminal, bir GTK + 2 terminal emülatörüdür. +# URL: http://wiki.xfce.org +# Paketçi: milisarge +# Gerekler: exo vte vte3 +# Grup: xfce4 + +isim=xfce4-terminal +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_terminal_surum}";[ -z ${xfce4_terminal_surum} ] && \ +surum=0.8.6 +devir=1 + +kaynak=(http://archive.xfce.org/src/apps/${isim}/${surum%.*}/$isim-$surum.tar.bz2 ) + +derle() { + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --disable-debug + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-terminal/xfce4-terminal.kur-kos b/talimatname/genel/x/xfce4-terminal/xfce4-terminal.kur-kos new file mode 100644 index 000000000..b12d3f529 --- /dev/null +++ b/talimatname/genel/x/xfce4-terminal/xfce4-terminal.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-verve-plugin/talimat b/talimatname/genel/x/xfce4-verve-plugin/talimat new file mode 100644 index 000000000..2e2e5ac66 --- /dev/null +++ b/talimatname/genel/x/xfce4-verve-plugin/talimat @@ -0,0 +1,18 @@ +# Tanım: Xfce4 paneli için komut satırı eklentisi. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-verve-plugin +# Paketçi: milisarge +# Gerekler: xfce4-panel + +isim=xfce4-verve-plugin +surum=1.1.0 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-debug +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-volumed-pulse/talimat b/talimatname/genel/x/xfce4-volumed-pulse/talimat new file mode 100644 index 000000000..0de23fc13 --- /dev/null +++ b/talimatname/genel/x/xfce4-volumed-pulse/talimat @@ -0,0 +1,21 @@ +# Tanım: Xfce için pulseaudio kullanan bir ses tuşları kontrol programı +# URL: https://git.xfce.org/apps/xfce4-volumed-pulse +# Paketçi: milisarge +# Gerekler: libnotify pulseaudio keybinder xfce4-conf + +isim=xfce4-volumed-pulse +surum=0.2.2 +devir=1 +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum%.*}/$isim-$surum.tar.bz2 +) + +derle() { + + cd $isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var + make + make DESTDIR="$PKG" install + +} diff --git a/talimatname/genel/x/xfce4-volumed/talimat b/talimatname/genel/x/xfce4-volumed/talimat new file mode 100644 index 000000000..321622e15 --- /dev/null +++ b/talimatname/genel/x/xfce4-volumed/talimat @@ -0,0 +1,23 @@ +# Tanım: XF86 Ses tuşlarını etkinleştiren ve senkronize sesli uyarıları destekleyen temel hizmet programı +# URL: http://xfce.org/ +# Paketçi: milisarge +# Gerekler: gstreamer-plugins-base keybinder xfce4-conf glib +# Grup: xfce4 + +isim=xfce4-volumed +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_volumed_surum}";[ -z ${xfce4_volumed_surum} ] && \ +surum=0.1.13 +devir=2 + +kaynak=(http://archive.xfce.org/src/apps/$isim/${surum::3}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --libexecdir=/usr/lib/$isim \ + --sysconfdir=/etc + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-weather-plugin/talimat b/talimatname/genel/x/xfce4-weather-plugin/talimat new file mode 100644 index 000000000..2396a69a5 --- /dev/null +++ b/talimatname/genel/x/xfce4-weather-plugin/talimat @@ -0,0 +1,24 @@ +# Tanım: Bu panel eklentisi, xoap.weather.com tarafından sağlanan hava verileri kullanılarak, mevcut sıcaklık ve hava durumunu gösterir. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-weather-plugin +# Paketçi: milisarge +# Gerekler: libsoup xfce4-panel + +isim=xfce4-weather-plugin +surum=0.8.6 +devir=2 + +kaynak=(http://archive.xfce.org/src/panel-plugins/xfce4-weather-plugin/0.8/$isim-$surum.tar.bz2) + +derle() { +cd $isim-$surum +./configure \ +--prefix=/usr \ +--sysconfdir=/etc \ +--libexecdir=/usr/lib \ +--localstatedir=/var \ +--disable-static \ +--disable-debug \ +--disable-upower +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfce4-weather-plugin/xfce4-weather-plugin.kur-kos b/talimatname/genel/x/xfce4-weather-plugin/xfce4-weather-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-weather-plugin/xfce4-weather-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-whiskermenu-plugin/talimat b/talimatname/genel/x/xfce4-whiskermenu-plugin/talimat new file mode 100644 index 000000000..ecc88c50c --- /dev/null +++ b/talimatname/genel/x/xfce4-whiskermenu-plugin/talimat @@ -0,0 +1,27 @@ +# Tanım: Xfce4 için alternatif menü +# URL: http://gottcode.org/xfce4-whiskermenu-plugin/ +# Paketçi: milisarge +# Gerekler: cmake xfce4-panel exo ninja +# Grup: xfce4 + +isim=xfce4-whiskermenu-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_whiskermenu_plugin_surum}";[ -z ${xfce4_whiskermenu_plugin_surum} ] && \ +surum=2.1.3 +devir=1 + +kaynak=(https://github.com/gottcode/xfce4-whiskermenu-plugin/archive/v$surum.tar.gz::$isim-$surum.tar.gz) +derle() { + +cd $isim-$surum + mkdir -p build + cd build + cmake "$SRC/$isim-$surum" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -GNinja + ninja + DESTDIR="$PKG" ninja -C $SRC/$isim-$surum/build install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.kur-kos b/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.sil-kos b/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.sil-kos new file mode 100644 index 000000000..f38600c2d --- /dev/null +++ b/talimatname/genel/x/xfce4-whiskermenu-plugin/xfce4-whiskermenu-plugin.sil-kos @@ -0,0 +1 @@ +[ -f /usr/lib/xfce4/panel/plugins/libwhiskermenu.so ] && rm -rf /usr/lib/xfce4/panel/plugins/libwhiskermenu.so diff --git a/talimatname/genel/x/xfce4-windowck-plugin/talimat b/talimatname/genel/x/xfce4-windowck-plugin/talimat new file mode 100644 index 000000000..e7d5690c9 --- /dev/null +++ b/talimatname/genel/x/xfce4-windowck-plugin/talimat @@ -0,0 +1,21 @@ +# Tanım: Xfce panel eklentisi, panelde simge durumuna küçültülmüş pencere başlığını ve düğmelerini koymaya olanak tanır.. +# URL: https://github.com/cedl38/xfce4-windowck-plugin +# Paketçi: yasarciv67@gmail.com +# Gerekler: intltool xfce4-dev-tools python3 imagemagick xfce4-panel graphite2 + +isim=xfce4-windowck-plugin +surum=0.4.4 +devir=1 +kaynak=(https://github.com/cedl38/xfce4-windowck-plugin/archive/v0.4.4.tar.gz +https://github.com/yasarciv/xfce4-windowck-plugin/raw/master/po/tr.po) + +derle() { + cd "$isim-$surum" +cp ../tr.po $SRC/$isim-$surum/po/ + + ./autogen.sh \ + --prefix=/usr + make + make DESTDIR="$PKG" install + +} \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-windowck-plugin/xfce4-windowck-plugin.kur-kos b/talimatname/genel/x/xfce4-windowck-plugin/xfce4-windowck-plugin.kur-kos new file mode 100644 index 000000000..8e5463385 --- /dev/null +++ b/talimatname/genel/x/xfce4-windowck-plugin/xfce4-windowck-plugin.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -t -f /usr/share/icons/hicolor \ No newline at end of file diff --git a/talimatname/genel/x/xfce4-wm/talimat b/talimatname/genel/x/xfce4-wm/talimat new file mode 100644 index 000000000..59e6472e2 --- /dev/null +++ b/talimatname/genel/x/xfce4-wm/talimat @@ -0,0 +1,32 @@ +# Tanım: Xfwm4, Xfce için pencere yöneticisi. +# URL: http://www.xfce.org/projects/xfwm4/ +# Paketçi: milisarge +# Gerekler: xorg-libxres libwnck xfce4-libui xfce4-libutil startup-notification +# Grup: xfce4 + +_isim=xfwm4 +isim=xfce4-wm +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_wm_surum}";[ -z ${xfce4_wm_surum} ] && \ +surum=4.12.3 +devir=1 + +kaynak=(http://archive.xfce.org/src/xfce/${_isim}/${surum%.*}/$_isim-$surum.tar.bz2) + +derle() { + cd ${_isim}-$surum + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --libexecdir=/usr/lib \ + --localstatedir=/var \ + --disable-static \ + --enable-startup-notification \ + --enable-randr \ + --enable-compositor \ + --enable-xsync \ + --disable-debugr + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/x/xfce4-wm/xfce4-wm.kur-kos b/talimatname/genel/x/xfce4-wm/xfce4-wm.kur-kos new file mode 100644 index 000000000..0fd2e1c87 --- /dev/null +++ b/talimatname/genel/x/xfce4-wm/xfce4-wm.kur-kos @@ -0,0 +1 @@ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor diff --git a/talimatname/genel/x/xfce4-xkb-plugin/talimat b/talimatname/genel/x/xfce4-xkb-plugin/talimat new file mode 100644 index 000000000..600047cbb --- /dev/null +++ b/talimatname/genel/x/xfce4-xkb-plugin/talimat @@ -0,0 +1,22 @@ +# Tanım: Bu eklenti,birden fazla klavye düzenlerini kurmanıza ve kullanmanıza olanak tanır. +# URL: http://goodies.xfce.org/projects/panel-plugins/xfce4-xkb-plugin +# Paketçi: milisarge +# Gerekler: librsvg xorg-libxklavier xfce4-panel libwnck3 +# Grup: xfce4 + +isim=xfce4-xkb-plugin +source /root/talimatname/genel/x/xfce4/surumler +surum="${xfce4_xkb_plugin_surum}";[ -z ${xfce4_xkb_plugin_surum} ] && \ +surum=0.7.1 +devir=1 + +kaynak=(http://archive.xfce.org/src/panel-plugins/$isim/${surum%.*}/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --disable-debug + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man +} diff --git a/talimatname/genel/x/xfce4/surumler b/talimatname/genel/x/xfce4/surumler new file mode 100644 index 000000000..ae6c5d7e5 --- /dev/null +++ b/talimatname/genel/x/xfce4/surumler @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# xfce4 grubu sürüm takibi + +#xfce4_libutil_surum="4.12.1" +#xfce4_conf_surum="4.12.1" +#xfce4_libui_surum="4.12.1" +#xfce4_settings_surum="4.12.1" +#xfce4_session_surum="4.12.1" +#xfce4_desktop_surum="4.12.4" +#xfce4_panel_surum="4.12.2" +#xfce4_wm_surum="4.12.4" +#xfce4_appfinder_surum="4.12.0" +#thunar_surum="1.7.0" +#xfce4_notifyd_surum="0.4.1" +#xfce4_power_manager_surum="1.6.1" +#xfce4_xkb_plugin_surum="0.8.1" +#xfce4_terminal_surum="0.8.6" +#xfce4_garcon_surum="0.6.1" +#xfce4_clipman_plugin_surum="1.4.2" +#xfce4_volumed_surum="0.1.13" +#xfce4_gtk_engine_surum="3.2.0" +#xfce4_battery_plugin_surum="1.1.0" +#xfce4_datetime_plugin_surum="0.7.0" +#xfce4_elementary_icon_theme_surum="0.9" +#tumbler_surum="0.2.0" +#xfce4_screenshooter_surum="1.9.1" +#xfce4_whiskermenu_plugin_surum="2.1.5" +#xfce4_pulseaudio_plugin_surum="0.3.4" diff --git a/talimatname/genel/x/xfce4/surumler_test b/talimatname/genel/x/xfce4/surumler_test new file mode 100644 index 000000000..57e0af50b --- /dev/null +++ b/talimatname/genel/x/xfce4/surumler_test @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# xfce4 grubu sürüm takibi + +xfce4_libutil_surum="4.12.1" +xfce4_conf_surum="4.12.1" +xfce4_libui_surum="4.12.1" +xfce4_settings_surum="4.12.1" +xfce4_session_surum="4.12.1" +xfce4_desktop_surum="4.12.4" +xfce4_panel_surum="4.12.2" +xfce4_wm_surum="4.12.4" +xfce4_appfinder_surum="4.12.0" +thunar_surum="1.7.0" +xfce4_notifyd_surum="0.4.1" +xfce4_power_manager_surum="1.6.1" +xfce4_xkb_plugin_surum="0.8.1" +xfce4_terminal_surum="0.8.6" +xfce4_garcon_surum="0.6.1" +xfce4_clipman_plugin_surum="1.4.2" +xfce4_volumed_surum="0.1.13" +xfce4_gtk_engine_surum="3.2.0" +xfce4_battery_plugin_surum="1.1.0" +xfce4_datetime_plugin_surum="0.7.0" +xfce4_elementary_icon_theme_surum="0.9" +tumbler_surum="0.2.0" +xfce4_screenshooter_surum="1.9.1" +xfce4_whiskermenu_plugin_surum="2.1.3" +xfce4_pulseaudio_plugin_surum="0.3.4" diff --git a/talimatname/genel/x/xfce4/talimat b/talimatname/genel/x/xfce4/talimat new file mode 100644 index 000000000..3cb53965b --- /dev/null +++ b/talimatname/genel/x/xfce4/talimat @@ -0,0 +1,14 @@ +# Tanım: sistem +# URL: sistem +# Paketçi: milisarge +# Gerekler: xorg xfce4-desktop xfce4-session xfce4-settings xfce4-notifyd xfce4-panel xfce4-wm xfce4-power-manager xfce4-xkb-plugin xfce4-terminal xfce4-libui xfce4-libutil xfce4-garcon xfce4-clipman-plugin xfce4-gtk-engine xfce4-appfinder xfce4-battery-plugin xfce4-conf xfce4-datetime-plugin xfce4-elementary-icon-theme tumbler xfce4-screenshooter xfce4-whiskermenu-plugin xfce4-pulseaudio-plugin dejavu-ttf + +isim=xfce4-sistem +surum=1 +devir=1 + +kaynak=() + +derle() { + echo "xfce4 sistem" +} diff --git a/talimatname/genel/x/xfdashboard/talimat b/talimatname/genel/x/xfdashboard/talimat new file mode 100644 index 000000000..a39d4c56a --- /dev/null +++ b/talimatname/genel/x/xfdashboard/talimat @@ -0,0 +1,23 @@ +# Tanım: Belki Xfce için bir kontrol paneli gibi bir Gnome kabuğu +# URL: http://goodies.xfce.org/projects/applications/xfdashboard/start +# Paketçi: yasarciv67@gmail.com +# Gerekler: xfce4-dev-tools libwnck3 clutter xfce4-garcon + +isim=xfdashboard +surum=0.7.3 +devir=1 +kaynak=(https://github.com/gmc-holle/xfdashboard/archive/0.7.3.tar.gz +) + +derle() { + cd $isim-$surum + ./autogen.sh --prefix=/usr --sysconfdir=/etc --disable-dependency-tracking + + # -Wl,--as-needed should come before all libraries + + sed -i -e '/\$CC/s/-shared/\0 -Wl,--as-needed/' libtool + + make + make DESTDIR=${PKG} install + +} diff --git a/talimatname/genel/x/xfe/talimat b/talimatname/genel/x/xfe/talimat new file mode 100644 index 000000000..93c6930d3 --- /dev/null +++ b/talimatname/genel/x/xfe/talimat @@ -0,0 +1,20 @@ +# Tanım: MS-Explorer veya Commander, X için dosya yöneticisi gibi. +# URL: http://roland65.free.fr/xfe +# Paketçi: milisarge +# Gerekler: freetype fox libpng libjpeg-turbo libtiff expat intltool + +isim=xfe +surum=1.42 +devir=1 +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + export CFLAGS="$CFLAGS `pkg-config --cflags freetype2`" + aclocal + automake --add-missing + autoreconf + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xfsprogs/talimat b/talimatname/genel/x/xfsprogs/talimat new file mode 100644 index 000000000..6c3526522 --- /dev/null +++ b/talimatname/genel/x/xfsprogs/talimat @@ -0,0 +1,27 @@ +# Tanım: XFS filesystem utilities +# URL: http://oss.sgi.com/projects/xfs/ +# Paketçi: milisarge +# Gerekler: + +isim=xfsprogs +surum=4.3.0 +devir=1 + +kaynak=(ftp://oss.sgi.com/projects/xfs/cmd_tars/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +make DEBUG=-DNDEBUG INSTALL_USER=root INSTALL_GROUP=root \ + LOCAL_CONFIGURE_OPTIONS="--enable-readline" + +make DIST_ROOT=$PKG install +make DIST_ROOT=$PKG install-dev +if [ "`uname -m `" == "x86_64" ];then + LIB="lib64" +else + LIB="lib" +fi + rm -rfv $PKG/$LIB/libhandle.{a,la,so} + ln -sfv ../../$LIB/libhandle.so.1 $PKG/usr/$LIB/libhandle.so + sed -i "s@libdir='/$LIB@libdir='/usr/$LIB@g" $PKG/usr/$LIB/libhandle.la +} diff --git a/talimatname/genel/x/xine-lib/talimat b/talimatname/genel/x/xine-lib/talimat new file mode 100644 index 000000000..8c7b6a8e4 --- /dev/null +++ b/talimatname/genel/x/xine-lib/talimat @@ -0,0 +1,20 @@ +# Tanım: Xine kütüphanesini içeriyor +# URL: http://xinehq.de/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xorg-mesa xorg-libxvmc libxcb faad2 speex libmng libvorbis flac libtheora sdl ffmpeg samba librsvg imagemagick + +isim=xine-lib +surum=1.2.6 +devir=1 + +kaynak=(http://downloads.sourceforge.net/xine/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--disable-vcd \ +--disable-modplug \ +--docdir=/usr/share/doc/$isim-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xine-ui/talimat b/talimatname/genel/x/xine-ui/talimat new file mode 100644 index 000000000..f3ba18498 --- /dev/null +++ b/talimatname/genel/x/xine-ui/talimat @@ -0,0 +1,22 @@ +# Tanım: Unix için ücretsiz video oynatıcı +# URL: http://www.xine-project.org +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: xine-lib curl xorg-libxft xorg-libxxf86vm xdg-utils shared-mime-info hicolor-icon-theme desktop-file-utils + +isim=xine-ui +surum=0.99.9 +devir=1 + +kaynak=(http://downloads.sourceforge.net/xine/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --with-x \ + --disable-lirc \ + --without-aalib \ + --enable-debug + make + make DESTDIR=$PKG desktopdir=/usr/share/applications install +} diff --git a/talimatname/genel/x/xinetd/chargen b/talimatname/genel/x/xinetd/chargen new file mode 100644 index 000000000..f805f0a59 --- /dev/null +++ b/talimatname/genel/x/xinetd/chargen @@ -0,0 +1,25 @@ +# Begin /etc/xinetd.d/chargen + +service chargen +{ + disable = yes + type = INTERNAL + id = chargen-stream + socket_type = stream + protocol = tcp + user = root + wait = no +} + +service chargen +{ + disable = yes + type = INTERNAL + id = chargen-dgram + socket_type = dgram + protocol = udp + user = root + wait = yes +} + +# End /etc/xinetd.d/chargen diff --git a/talimatname/genel/x/xinetd/daytime b/talimatname/genel/x/xinetd/daytime new file mode 100644 index 000000000..a13de6d6f --- /dev/null +++ b/talimatname/genel/x/xinetd/daytime @@ -0,0 +1,25 @@ +# Begin /etc/xinetd.d/daytime + +service daytime +{ + disable = yes + type = INTERNAL + id = daytime-stream + socket_type = stream + protocol = tcp + user = root + wait = no +} + +service daytime +{ + disable = yes + type = INTERNAL + id = daytime-dgram + socket_type = dgram + protocol = udp + user = root + wait = yes +} + +# End /etc/xinetd.d/daytime diff --git a/talimatname/genel/x/xinetd/echo b/talimatname/genel/x/xinetd/echo new file mode 100644 index 000000000..69d8cc740 --- /dev/null +++ b/talimatname/genel/x/xinetd/echo @@ -0,0 +1,25 @@ +# Begin /etc/xinetd.d/echo + +service echo +{ + disable = yes + type = INTERNAL + id = echo-stream + socket_type = stream + protocol = tcp + user = root + wait = no +} + +service echo +{ + disable = yes + type = INTERNAL + id = echo-dgram + socket_type = dgram + protocol = udp + user = root + wait = yes +} + +# End /etc/xinetd.d/echo diff --git a/talimatname/genel/x/xinetd/systat b/talimatname/genel/x/xinetd/systat new file mode 100644 index 000000000..b37baa5fc --- /dev/null +++ b/talimatname/genel/x/xinetd/systat @@ -0,0 +1,15 @@ +# Begin /etc/xinetd.d/systat + +service systat +{ + disable = yes + socket_type = stream + wait = no + user = nobody + server = /bin/ps + server_args = -auwwx + only_from = 128.138.209.0 + log_on_success = HOST +} + +# End /etc/xinetd.d/systat diff --git a/talimatname/genel/x/xinetd/talimat b/talimatname/genel/x/xinetd/talimat new file mode 100644 index 000000000..2a1167660 --- /dev/null +++ b/talimatname/genel/x/xinetd/talimat @@ -0,0 +1,50 @@ +# Tanım: Xinetd, * inetd * için güvenli bir değiştirme olan, genişletilmiş InterNET hizmetleri arka plan programıdır. +# URL: ftp://anduin.linuxfromscratch.org/BLFS/xinetd/xinetd-2.3.15.tar.gz +# Paketçi: milisarge +# Gerekler: + +isim=xinetd +surum=2.3.15 +devir=1 +kaynak=(ftp://anduin.linuxfromscratch.org/BLFS/xinetd/$isim-$surum.tar.gz + xinetd.conf chargen daytime echo systat xined_time ) + +derle() { + +cd $isim-$surum + +source /etc/blfs-bootscripts +wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 +tar xvf $scripts-$scriptsversion.tar.bz2 + + +sed -i -e "s/exec_server/child_process/" xinetd/builtins.c +sed -i -e "/register unsigned count/s/register//" xinetd/itox.c +./configure --prefix=/usr --mandir=/usr/share/man --with-loadavg + +make + +make DESTDIR=$PKG install + +install -v -m755 -d $PKG/etc +cp -v $SRC/xinetd.conf $PKG/etc + +install -v -m755 -d $PKG/etc/xinetd.d +cp -v $SRC/chargen $PKG/etc/xinetd.d + +install -v -m755 -d $PKG/etc/xinetd.d +cp -v $SRC/daytime $PKG/etc/xinetd.d + +install -v -m755 -d $PKG/etc/xinetd.d +cp -v $SRC/echo $PKG/etc/xinetd.d + +install -v -m755 -d $PKG/etc/xinetd.d +cp -v $SRC/systat $PKG/etc/xinetd.d + +install -v -m755 -d $PKG/etc/xinetd.d +cp -v $SRC/xined_time $PKG/etc/xinetd.d/time + +cd $scripts-$scriptsversion +make DESTDIR=$PKG install-xinetd + +} diff --git a/talimatname/genel/x/xinetd/xined_time b/talimatname/genel/x/xinetd/xined_time new file mode 100644 index 000000000..30084abbf --- /dev/null +++ b/talimatname/genel/x/xinetd/xined_time @@ -0,0 +1,25 @@ +# Begin /etc/xinetd.d/time + +service time +{ + disable = yes + type = INTERNAL + id = time-stream + socket_type = stream + protocol = tcp + user = root + wait = no +} + +service time +{ + disable = yes + type = INTERNAL + id = time-dgram + socket_type = dgram + protocol = udp + user = root + wait = yes +} + +# End /etc/xinetd.d/time diff --git a/talimatname/genel/x/xinetd/xinetd.conf b/talimatname/genel/x/xinetd/xinetd.conf new file mode 100644 index 000000000..c9a470137 --- /dev/null +++ b/talimatname/genel/x/xinetd/xinetd.conf @@ -0,0 +1,17 @@ +# Begin /etc/xinetd +# Configuration file for xinetd + +defaults +{ + instances = 60 + log_type = SYSLOG daemon + log_on_success = HOST PID USERID + log_on_failure = HOST USERID + cps = 25 30 +} + +# All service files are stored in the /etc/xinetd.d directory + +includedir /etc/xinetd.d + +# End /etc/xinetd diff --git a/talimatname/genel/x/xli/talimat b/talimatname/genel/x/xli/talimat new file mode 100644 index 000000000..6c241e90f --- /dev/null +++ b/talimatname/genel/x/xli/talimat @@ -0,0 +1,22 @@ +# Tanım: X için ekran görüntüleri sağlar +# URL: +# Paketçi: milisarge +# Gerekler: xorg-libxext libpng libjpeg-turbo + +isim=xli +surum=1 +devir=1 + +kaynak=(ftp://ftp.x.org/contrib/applications/xli.1.16.tar.gz + http://downloads.nutyx.org/files/patchs/$isim/xli-1.16-makefile-1.patch) +derle() { +sed -i "s/varargs/stdarg/" rlelib.c +mv Makefile{.std,} +patch -Np0 -i xli-1.16-makefile-1.patch +make +mkdir -p $PKG/usr{/bin,/lib/X11,/share/man/man3} +make DESTDIR=$PKG/usr install +for MANUAL in xli xliguide xlito + do install -m644 $MANUAL.man $PKG/usr/share/man/man3/$MANUAL.3 +done +} diff --git a/talimatname/genel/x/xli/xli.okubeni b/talimatname/genel/x/xli/xli.okubeni new file mode 100644 index 000000000..54c6a027c --- /dev/null +++ b/talimatname/genel/x/xli/xli.okubeni @@ -0,0 +1,204 @@ +XLI - X11 Image Loading Utility + +WHAT IS IT? + +xli is a version of xloadimage. + +This utility will view several types of images under X11, or load +images onto the X11 root window. xli can also be used on some (32 bit) +MSDOS systems. The current version (1.16) supports: + + CMU Window Manager raster files + Faces Project images + Fuzzy Bitmap (.fbm) images + GEM bit images + GIF images (Including GIF89a compatibility) + G3 FAX images + JFIF style jpeg images + McIDAS areafiles + MacPaint images +-> Windows, OS/2 BMP Image + Monochrome PC Paintbrush (.pcx) images +-> Photograph on CD Image + Portable Bitmap (.pbm, .pgm, .ppm) images + Sun monochrome rasterfiles + Sun color RGB rasterfiles + Targa (.tga) files + Utah Raster Toolkit (.rle) files + X pixmap (.xpm) files (Version 1, 2C and 3) + X10 bitmap files + X11 bitmap files + X Window Dump (except TrueColor and DirectColor) + +A variety of options are available to modify images prior to viewing. +These options include clipping, dithering, depth reduction, zoom +(either X or Y axis independently or both at once), brightening or +darkening, input gamma correction, and image merging. When applicable, +these options are done automatically (eg. a color image to be displayed +on a monochrome screen will be dithered automatically). A utility (xlito) +is provided that allows these viewing options to be appended to the image +files. + +CHANGES FROM XLI 1.15 + + Added BMP (MS Windows, OS/2) file format loader. + + Added PCD (PhotoCD) file format loader. + + Bowed to the pressure of the number of JPEGs that are gamma + corrected. JPEG images now are assumed to have a gamma of 2.2. + + Fixed bug in gif loader (files with local colormaps came out black) + + Improved the quality of color quantization. + + Added an -expand option that forces the image to be expanded + to 24 bit. + + Added a -title option. + + Added interactive image rotation using the 'l' and 'r' keys. + + Numerous bug fixes. + + (See the patches file for more details and credits) + +HOW IS XLI RELATED TO XLOADIMAGE ? + + xli version 1.00 was based on xloadimage version 3.01. + xli version 1.16 has many improvements over xli 1.00. + + xloadimage is maintained by Jim Frost - jimf@saber.com + + xli is maintained by Graeme Gill - graeme@labtam.oz.au + + Please read the README.orig file, which is the original xloadimage README + file for xloadimage info and credits. + +WHERE CAN I GET IT ? + + Two files: + xli.README + xli.1.16.tar.gz + on + ftp.x.org + in + /contrib/applications, and mirrors of this archive. + + Note that ftp.x.org will recompress as .Z on the fly. + +COMPILING + + There are a variety of ways to compile xli, depending on what + environment you have. + + The easiest way of compiling it is to use the Imakefile. Simply + run 'xmkmf' (which should be in your systems /usr/bin/X11 or + somewhere equivalent), which should make a Makefile suitable + for your system. Type 'make' to then build xli. It can be + installed in the standard place (along with its aliases xview + and xsetbg) by typing 'make install'. The manual entry can + be installed using 'make install.man'. + + If using the Imakefile is not possible, then you can try using + Makefile.std. Choose your target from + + std BSD environment + sysv SYSV environment + gcc BSD using gcc + sysv-gcc SYSV using older gcc + + and use something like: + + make -f Makefile.std target + + Makefile.std can also be used to re-make the Imakefile, Makefile.dos, + the tar archive, or a DOS ready .zip archive. + + There are a few compilation flags that you may need/want to change. + This can be done in the Makefile.std file. The defines are: + + -DHAVE_GUNZIP if you want to use gunzip rather than uncompress on .Z files + -DNO_UNCOMPRESS if you system doesn't have uncompress or gunzip. + The JPEG code needs a compilation flag that tells it whether right + shift (>>) is signed or unsigned on your machine. If it's unsigned, add + -DRIGHT_SHIFT_IS_UNSIGNED + + The defines should be added to the MISC_DEFINES= line in the Makefile.std + file. After doing this you may need to re-bulild the Imakefile or + Makefile.dos if you are using them. You can do this using: + + make -f Makefile.std Imakefile + or + make -f Makefile.std Makefile.dos + +COMPILING FOR DOS USING DJGPP 1.11 + + xli can be used on 32 bit 80x86 systems running MSDOS if + compiled using djgpp version 1.11. Since it has to run without + the aid of a windowing system or window manager, the user interface + leaves a lot to be desired, but it does work. It is important to + check that your video card is supported by the djgpp go32 environment, + and that it is configured appropriately. + + Assuming that you have unpacked the tar archive on a UNIX system, + and have the zip utility in your path, the first step is to + create xli.zip: + + make -f Makefile.std zip + + This can then be transfered to the MSDOS system and unpacked + in a suitable directory using unzip or pkunzip. Assuming the djgpp + compiling environment is set up suitably, xli can be compiled using + ndmake: + + ndmake -f Makefile.dos + + xlito now seems to work with djgpp 1.11 (it didn't + under version 1.09) + + xli can then be run as usual. + + For details on setting up djgpp, please read the djgpp docs. + + There is an optional compile flag -DDO_ARG_EXP that can be added + to the MISC_DEFINES in Makefile.std, or to DEFINES in Makefile.dos + that turns on argument expansion processing within xli. This + is somewhat more powerful than that provided by go32, but to get + it to work fully you will have to turn off the go32 argument expansion + by setting the appropriate go32 options. + + Please note that this DOS release probably has several undiscovered + bugs, as it has not been as extensively tested as the X11 version. + +OTHER NOTES + + The file build-jpeg is intended to aid those who want to port + the latest Independent JPEG Group's JPEG software to xli. + It semi-automatically creates the jpeglib.h and jpeglib.c files + used by xli. Note that future versions of the jpeg library + may be require updating of the xli specific jpeg.h and jpeg.c + files. Note that one change was made to the file jmemnobs.c, + "methods" was renamed to "smethods" so as to avoid clashing + with the variable of the same name in jmemmgr.c + + Please also note that the JPEG library README file is included at + the top of jpeglib.c, and gives distribution and copyright + information for this library. + +PRAISE, SUGGESTIONS AND BUG REPORTS + + xli has been developed in a fairly limited hardware environment, and + not all combinations of displays and/or image formats and options + have been tested. xli is useful to me, and maybe it will be + useful to you. + + Praise, suggestions, and bug reports should go to: + + Graeme Gill + graeme@labtam.oz.au + + [I may not be able to respond promptly to mail during the period + 94/7/30 to 94/8/15] + + diff --git a/talimatname/genel/x/xlockmore/talimat b/talimatname/genel/x/xlockmore/talimat new file mode 100644 index 000000000..ce7235116 --- /dev/null +++ b/talimatname/genel/x/xlockmore/talimat @@ -0,0 +1,22 @@ +# Tanım: X Pencere Sistem Kilidi Ekranı +# URL: http://www.tux.org/~bagleyd/xlockmore.html +# Paketçi: milisarge +# Gerekler: gtk2 fortune + +isim=xlockmore +surum=5.49 +devir=1 +kaynak=(http://sillycycle.com/xlock/recent-releases/xlockmore-$surum.tar.xz) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr --enable-vtlock --enable-syslog \ + --enable-multiple-user --enable-multiple-root \ + --without-motif --with-opengl --without-esound + make + make prefix=$PKG/usr xapploaddir=$PKG/etc/X11/app-defaults install + if [ -d $PKG/usr/lib ]; then + rm -rf $PKG/usr/lib + fi + mv $PKG/usr/share/man $PKG/usr +} diff --git a/talimatname/genel/x/xmlsec/talimat b/talimatname/genel/x/xmlsec/talimat new file mode 100644 index 000000000..6f312e229 --- /dev/null +++ b/talimatname/genel/x/xmlsec/talimat @@ -0,0 +1,20 @@ +# Tanım: XML Güvenlik Kütüphanesi LibXML2 tabanlı bir C kütüphanesi +# URL: https://www.aleksey.com/xmlsec/index.html +# Paketçi: Cihan Alkan +# Gerekler: libxslt nss + +isim=xmlsec +surum=1.2.24 +devir=1 +kaynak=(https://www.aleksey.com/xmlsec/download/xmlsec1-$surum.tar.gz) + +derle() { + cd xmlsec1-$surum + ./configure --prefix=/usr --disable-static + make + + make DESTDIR=$PKG install + install -dm755 "$PKG"/usr/share/licenses/$isim + install -m644 COPYING $PKG/usr/share/licenses/$isim/ + +} diff --git a/talimatname/genel/x/xmlto/talimat b/talimatname/genel/x/xmlto/talimat new file mode 100644 index 000000000..ee67b9b1f --- /dev/null +++ b/talimatname/genel/x/xmlto/talimat @@ -0,0 +1,18 @@ +# Tanım: Xml'yi diğer birçok biçime dönüştürün +# URL: http://cyberelk.net/tim/software/xmlto/ +# Paketçi: milisarge +# Gerekler: libxslt docbook-xsl docbook-xml + +isim=xmlto +surum=0.0.26 +devir=1 + +kaynak=(https://fedorahosted.org/releases/x/m/xmlto/$isim-$surum.tar.bz2) + +derle() { +unset MAKEFLAGS +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xmoto/lua52_compat.patch b/talimatname/genel/x/xmoto/lua52_compat.patch new file mode 100644 index 000000000..54aaf20d6 --- /dev/null +++ b/talimatname/genel/x/xmoto/lua52_compat.patch @@ -0,0 +1,45 @@ +diff --git a/configure.in b/configure.in +index 452f196..dbceb05 100644 +--- a/configure.in ++++ b/configure.in +@@ -157,8 +157,8 @@ AM_CONDITIONAL([USE_SDLGFX], test "$USE_SDLGFX" = "1") + # m + AC_CHECK_LIB(m, floor, , AC_MSG_ERROR(No math library found)) + +-AC_SEARCH_LIBS(lua_pushboolean,lua lua5.1 lua50, [], [AC_MSG_ERROR(liblua5.1, liblua50, or liblua required)]) +-AC_SEARCH_LIBS(luaopen_math,lualib lualib5.1 lualib50, [], [AC_MSG_ERROR(liblualib5.1, liblualib50, or liblualib required)]) ++AC_SEARCH_LIBS(lua_pushboolean,lua lua5.2 lua5.1 lua50, [], [AC_MSG_ERROR(liblua5.2 liblua5.1, liblua50, or liblua required)]) ++AC_SEARCH_LIBS(luaopen_math,lualib liblua5.2 lualib5.1 lualib50, [], [AC_MSG_ERROR(liblualib5.2 liblualib5.1, liblualib50, or liblualib required)]) + + dnl ***** Check lua headers, as they are prone to be located random places on random systems! ***** + dnl The following three lines where suggested by Eric Piel, but they don't seem to work on my system +@@ -174,6 +174,8 @@ AC_CHECK_HEADER(lua/lua.h, AC_DEFINE(HAVE_LUA_LUA_H) [USE_LUA_VERSION="unkn + AC_CHECK_HEADER(lua50/lua.h, AC_DEFINE(HAVE_LUA50_LUA_H) [USE_LUA_VERSION="5.0"]) + AC_CHECK_HEADER(lua51/lua.h, AC_DEFINE(HAVE_LUA51_LUA_H) [USE_LUA_VERSION="5.1"]) + AC_CHECK_HEADER(lua5.1/lua.h, AC_DEFINE(HAVE_LUA5_1_LUA_H)[USE_LUA_VERSION="5.1"]) ++AC_CHECK_HEADER(lua52/lua.h, AC_DEFINE(HAVE_LUA52_LUA_H) [USE_LUA_VERSION="5.2"]) ++AC_CHECK_HEADER(lua5.2/lua.h, AC_DEFINE(HAVE_LUA5_2_LUA_H)[USE_LUA_VERSION="5.2"]) + AC_DEFINE(LUA_COMPAT_MODULE, 1) + + AC_LANG_PUSH([C++]) +diff --git a/src/include/xm_lua.h b/src/include/xm_lua.h +index 8a2cc17..f470de2 100644 +--- a/src/include/xm_lua.h ++++ b/src/include/xm_lua.h +@@ -4,7 +4,15 @@ extern "C" { + #include "lauxlib.h" + #include "lualib.h" + #else +- #if defined(HAVE_LUA5_1_LUA_H) ++ #if defined(HAVE_LUA5_2_LUA_H) ++ #include ++ #include ++ #include ++ #elif defined(HAVE_LUA52_LUA_H) ++ #include ++ #include ++ #include ++ #elif defined(HAVE_LUA5_1_LUA_H) + #include + #include + #include diff --git a/talimatname/genel/x/xmoto/talimat b/talimatname/genel/x/xmoto/talimat new file mode 100644 index 000000000..3b9c5d277 --- /dev/null +++ b/talimatname/genel/x/xmoto/talimat @@ -0,0 +1,31 @@ +# Tanım: Zorlu bir 2D motocross platform oyunu, burada fizik oyunda önemli bir rol oynamaktadır +# URL: http://xmoto.tuxfamily.org +# Paketçi: milisarge +# Gerekler: desktop-file-utils libxdg-basedir xorg-glu libmikmod libjpeg-turbo lua51 lua52 ode sdl-mixer sdl-net sdl-ttf + +isim=xmoto +surum=0.5.11 +devir=1 +kaynak=(http://download.tuxfamily.org/$isim/$isim/$surum/$isim-$surum-src.tar.gz + lua52_compat.patch ) + +derle() { + cd $isim-$surum + patch -Np1 -i "${SRC}/lua52_compat.patch" + ./bootstrap + rm -r src/ode + CPPFLAGS+=' -D_GLIBCXX_USE_CXX11_ABI=0' + + ./configure --prefix=/usr --disable-sdltest + make + make DESTDIR=$PKG install + + # Masaüstü dosyasını yükle + install -Dm0644 "${SRC}/xmoto-0.5.11/extra/xmoto.desktop" \ + "${PKG}/usr/share/applications/xmoto.desktop" + + # Masaüstü dosyası için simge yükle. + install -Dm0644 "${SRC}/xmoto-0.5.11/extra/xmoto.xpm" \ + "${PKG}/usr/share/pixmaps/xmoto.xpm" + #rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/x/xneur/talimat b/talimatname/genel/x/xneur/talimat new file mode 100644 index 000000000..087bb001e --- /dev/null +++ b/talimatname/genel/x/xneur/talimat @@ -0,0 +1,19 @@ +# Tanım: X Neural Değiştirici girdi dilini algılar ve gerekirse klavye düzenini düzeltir +# URL: http://www.xneur.ru +# Paketçi: Cihan Alkan +# Gerekler: gstreamer enchant libnotify gtk2 xorg-proto + +isim=xneur +surum=0.20.0 +devir=1 +kaynak=(https://raw.githubusercontent.com/AndrewCrewKuznetsov/xneur-devel/master/dists/$surum/xneur_$surum.orig.tar.gz) + +derle() { + + cd $SRC/$isim-$surum + ./configure --prefix=/usr --sysconfdir=/etc \ + --without-xosd \ + --with-gtk=gtk2 # Because gxneur still doesn't supports gtk3 + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xnviewmp/talimat b/talimatname/genel/x/xnviewmp/talimat new file mode 100644 index 000000000..9c6e20ea5 --- /dev/null +++ b/talimatname/genel/x/xnviewmp/talimat @@ -0,0 +1,28 @@ +# Tanım: Etkili bir multimedya görüntüleyici,tarayıcı ve dönüştürücü. +# URL: http://www.xnview.com/en/xnviewmp/ +# Paketçi: Cihan_Alkan +# Gerekler: qt5 desktop-file-utils +# Grup: medya + +isim=xnviewmp +surum=0.89 +devir=1 +kaynak=(http://download.xnview.com/XnViewMP-linux-x64.tgz + xnviewmp.desktop) + +derle() { + install -d -m755 "${PKG}/opt/${isim}" + install -d -m755 "${PKG}/usr/bin" + install -d -m755 "${PKG}/usr/share/applications" + + cp -a "${SRC}/XnView"/* "${PKG}/opt/${isim}" + ln -s "/opt/${isim}/xnview.sh" "${PKG}/usr/bin/${isim}" + + install -m644 "${SRC}/${isim}.desktop" "${PKG}/usr/share/applications/${isim}.desktop" + install -D -m644 "${SRC}/XnView/license.txt" "${PKG}/usr/share/licenses/${isim}/LICENSE" + + # Clean up + rm "${PKG}/opt/${isim}/XnView.desktop"{,~} + chmod -x "${PKG}/opt/${isim}/xnview.png" +} + diff --git a/talimatname/genel/x/xnviewmp/xnviewmp.desktop b/talimatname/genel/x/xnviewmp/xnviewmp.desktop new file mode 100644 index 000000000..850cb932a --- /dev/null +++ b/talimatname/genel/x/xnviewmp/xnviewmp.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Terminal=0 +Exec=/usr/bin/xnviewmp %F +Icon=/opt/xnviewmp/xnview.png +Type=Application +Categories=Graphics; +StartupNotify=true +Name=XnView Multi Platform +GenericName=XnViewMP +MimeType=image/bmp;image/gif;image/x-portable-bitmap;image/x-portable-pixmap;image/x-psd;image/x-tga;image/x-xbitmap;image/tiff;image/jpeg;image/x-psd;image/png;image/x-icon;image/x-xpixmap;image/svg+xml; diff --git a/talimatname/genel/x/xombrero/talimat b/talimatname/genel/x/xombrero/talimat new file mode 100644 index 000000000..d99e3377d --- /dev/null +++ b/talimatname/genel/x/xombrero/talimat @@ -0,0 +1,21 @@ +# Tanım: Gtk temelli ve webkit motorunu kullanan basit tarayıcı +# URL: https://opensource.conformal.com/wiki/xombrero +# Paketçi: milisarge +# Gerekler: libbsd libsoup gnutls gtk3 webkitgtk3 + +isim=xombrero +surum=1.6.3 +devir=1 + +kaynak=(https://opensource.conformal.com/snapshots/xombrero/xombrero-$surum.tgz) +derle() { +cd $isim-$surum +sed -i 's|/usr/local/share/|/usr/share/|' {unix.c,xombrero.conf,xombrero.h} + +make PREFIX="/usr" -C linux +mkdir -p $PKG/usr/share/applications + +make DESTDIR=$PKG PREFIX="/usr" -C linux install +install -Dm644 xombrero.conf $PKG/etc/skel/.xombrero.conf +install -Dm755 config-checker.pl $PKG/usr/bin/config-checker.pl +} diff --git a/talimatname/genel/x/xonotic/talimat b/talimatname/genel/x/xonotic/talimat new file mode 100644 index 000000000..9840ff836 --- /dev/null +++ b/talimatname/genel/x/xonotic/talimat @@ -0,0 +1,20 @@ +# Tanım: Xonotic, net hareket ve geniş bir silah yelpazesine sahip, bağımlılık yaratan, arena tarzı bir birinci şahıs nişancılık oyunudur. +# URL: https://xonotic.org +# Paketçi: milisarge +# Gerekler: alsa-lib libjpeg-turbo libmodplug libvorbis xorg-libxpm xorg-libxxf86dga xorg-libxxf86vm libpng xorg-mesa + +isim=xonotic +surum=0.8.2 +devir=1 +kaynak=(https://dl.xonotic.org/$isim-$surum.zip) + +derle() { + cd Xonotic + + make -C source/darkplaces CPUOPTIMIZATIONS="${CFLAGS}" DP_FS_BASEDIR=/usr/share/xonotic/ DP_LINK_TO_LIBJPEG=1 cl-release + install -Dm755 source/darkplaces/darkplaces-glx $PKG/usr/bin/xonotic-glx + + mkdir -p $PKG/usr/share/xonotic/ + mv data $PKG/usr/share/xonotic/ + install -Dm644 key_0.d0pk $PKG/usr/share/xonotic/key_0.d0pk +} diff --git a/talimatname/genel/x/xorg-app/talimat b/talimatname/genel/x/xorg-app/talimat new file mode 100644 index 000000000..1b9b0fb73 --- /dev/null +++ b/talimatname/genel/x/xorg-app/talimat @@ -0,0 +1,86 @@ +# Tanım: X pencere uygulamalarında kullanılabilen uygulamaları sağlar. +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: harfbuzz libpng xorg-mesa xorg-glu xcb-util xorg-libx11 xorg-libxinerama xorg-libxt xorg-libxfont xorg-libxkbfile xorg-libxmu xorg-libxrender xorg-libxrandr xorg-libxcursor xorg-libxtst xorg-libxxf86vm xorg-libxaw xorg-xbitmaps xorg-libxv xorg-libdmx xorg-libxt + +isim=xorg-app +surum=7.8 +devir=1 +section=app +kaynak=() + +derle() { +unset MAKEFLAGS +cat > list.md5 << "EOF" +53a48e1fdfec29ab2e89f86d4b7ca902 bdftopcf-1.0.5.tar.bz2 +25dab02f8e40d5b71ce29a07dc901b8c iceauth-1.0.7.tar.bz2 +c4a3664e08e5a47c120ff9263ee2f20c luit-1.1.1.tar.bz2 +18c429148c96c2079edda922a2b67632 mkfontdir-1.0.7.tar.bz2 +9bdd6ebfa62b1bbd474906ac86a40fd8 mkfontscale-1.1.2.tar.bz2 +e238c89dabc566e1835e1ecb61b605b9 sessreg-1.1.0.tar.bz2 +2c47a1b8e268df73963c4eb2316b1a89 setxkbmap-1.3.1.tar.bz2 +3a93d9f0859de5d8b65a68a125d48f6a smproxy-1.0.6.tar.bz2 +f0b24e4d8beb622a419e8431e1c03cd7 x11perf-1.6.0.tar.bz2 +7d6003f32838d5b688e2c8a131083271 xauth-1.0.9.tar.bz2 +0066f23f69ca3ef62dcaeb74a87fdc48 xbacklight-1.2.1.tar.bz2 +9956d751ea3ae4538c3ebd07f70736a0 xcmsdb-1.0.5.tar.bz2 +b58a87e6cd7145c70346adad551dba48 xcursorgen-1.0.6.tar.bz2 +8809037bd48599af55dad81c508b6b39 xdpyinfo-1.3.2.tar.bz2 +fceddaeb08e32e027d12a71490665866 xdriinfo-1.0.5.tar.bz2 +249bdde90f01c0d861af52dc8fec379e xev-1.2.2.tar.bz2 +90b4305157c2b966d5180e2ee61262be xgamma-1.0.6.tar.bz2 +f5d490738b148cb7f2fe760f40f92516 xhost-1.0.7.tar.bz2 +6a889412eff2e3c1c6bb19146f6fe84c xinput-1.6.2.tar.bz2 +a4d8353daf6cb0a9c47379b7413c42c6 xkbcomp-1.3.1.tar.bz2 +c747faf1f78f5a5962419f8bdd066501 xkbevd-1.1.4.tar.bz2 +502b14843f610af977dffc6cbf2102d5 xkbutils-1.0.4.tar.bz2 +0ae6bc2a8d3af68e9c76b1a6ca5f7a78 xkill-1.0.4.tar.bz2 +5dcb6e6c4b28c8d7aeb45257f5a72a7d xlsatoms-1.1.2.tar.bz2 +9fbf6b174a5138a61738a42e707ad8f5 xlsclients-1.1.3.tar.bz2 +2dd5ae46fa18abc9331bc26250a25005 xmessage-1.0.4.tar.bz2 +723f02d3a5f98450554556205f0a9497 xmodmap-1.0.9.tar.bz2 +6101f04731ffd40803df80eca274ec4b xpr-1.0.4.tar.bz2 +fae3d2fda07684027a643ca783d595cc xprop-1.2.2.tar.bz2 +441fdb98d2abc6051108b7075d948fc7 xrandr-1.4.3.tar.bz2 +b54c7e3e53b4f332d41ed435433fbda0 xrdb-1.1.0.tar.bz2 +a896382bc53ef3e149eaf9b13bc81d42 xrefresh-1.0.5.tar.bz2 +dcd227388b57487d543cab2fd7a602d7 xset-1.2.3.tar.bz2 +7211b31ec70631829ebae9460999aa0b xsetroot-1.1.1.tar.bz2 +558360176b718dee3c39bc0648c0d10c xvinfo-1.1.3.tar.bz2 +6b5d48464c5f366e91efd08b62b12d94 xwd-1.0.6.tar.bz2 +b777bafb674555e48fd8437618270931 xwininfo-1.1.3.tar.bz2 +3025b152b4f13fdffd0c46d0be587be6 xwud-1.0.4.tar.bz2 +EOF +for paket in $(grep -v '^#' list.md5 |cut -d " " -f 3) + do + cd $DERLEME_KAYNAKDIZIN/ + #agdan ceker + if [ ! -f $DERLEME_KAYNAKDIZIN/$paket ];then + wget http://mirror.switch.ch/ftp/mirror/X11/pub/individual/${section}/$paket + fi + + grep $paket $SRC/list.md5 |md5sum -c - + paketdizini=$(echo $paket | sed 's/.tar.bz2//') + cd - + tar -xf $DERLEME_KAYNAKDIZIN/$paket + + pushd $paketdizini + case $paketdizini in + luit-[0-9]* ) + line1="#ifdef _XOPEN_SOURCE" + line2="# undef _XOPEN_SOURCE" + line3="# define _XOPEN_SOURCE 600" + line4="#endif" + sed -i -e "s@#ifdef HAVE_CONFIG_H@$line1\n$line2\n$line3\n$line4\n\n&@" sys.c + unset line1 line2 line3 line4 + ;; + sessreg-* ) + sed -e 's/\$(CPP) \$(DEFS)/$(CPP) -P $(DEFS)/' -i man/Makefile.in + ;; + esac + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install + popd + done +} diff --git a/talimatname/genel/x/xorg-cf-files/talimat b/talimatname/genel/x/xorg-cf-files/talimat new file mode 100644 index 000000000..6f96d33c9 --- /dev/null +++ b/talimatname/genel/x/xorg-cf-files/talimat @@ -0,0 +1,16 @@ +# Tanım: xorg ayar dosyaları +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-util-macros + +isim=xorg-cf-files +surum=1.0.6 +devir=1 +kaynak=(http://xorg.freedesktop.org/releases/individual/util/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-compositeproto/talimat b/talimatname/genel/x/xorg-compositeproto/talimat new file mode 100644 index 000000000..debae581d --- /dev/null +++ b/talimatname/genel/x/xorg-compositeproto/talimat @@ -0,0 +1,20 @@ +# Tanım: Bileşik uzatma protokolü belirtimi ve üstbilgi dosyaları +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +isim=xorg-compositeproto +surum=0.4.2 +devir=1 +kaynak=(http://xorg.freedesktop.org/releases/individual/proto/compositeproto-$surum.tar.bz2) + +derle() { + cd compositeproto-$surum + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/x/xorg-dri2proto/talimat b/talimatname/genel/x/xorg-dri2proto/talimat new file mode 100644 index 000000000..10b7897a2 --- /dev/null +++ b/talimatname/genel/x/xorg-dri2proto/talimat @@ -0,0 +1,18 @@ +# Tanım: X DRI2 protocol headers +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +isim=xorg-dri2proto +surum=2.8 +devir=1 +kaynak=(http://xorg.freedesktop.org/releases/individual/proto/dri2proto-$surum.tar.bz2) + +derle() { + cd dri2proto-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install + rm -f $PKG/usr/share/doc/dri2proto/dri2proto.txt + rmdir $PKG/usr/share/{doc/dri2proto,doc,} +} diff --git a/talimatname/genel/x/xorg-encodings/talimat b/talimatname/genel/x/xorg-encodings/talimat new file mode 100644 index 000000000..63217da35 --- /dev/null +++ b/talimatname/genel/x/xorg-encodings/talimat @@ -0,0 +1,20 @@ +# Tanım: X.Org yazı tipi kodlamaları +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-util-macros xorg-app + +_isim=encodings +isim=xorg-encodings +surum=1.0.4 +devir=1 + +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/font/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-font-util/talimat b/talimatname/genel/x/xorg-font-util/talimat new file mode 100644 index 000000000..4f0d20207 --- /dev/null +++ b/talimatname/genel/x/xorg-font-util/talimat @@ -0,0 +1,19 @@ +# Tanım: X.Org yazı tipi araçları. +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +_isim=font-util +isim=xorg-font-util +surum=1.3.0 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/font/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-font/talimat b/talimatname/genel/x/xorg-font/talimat new file mode 100644 index 000000000..70c8f106d --- /dev/null +++ b/talimatname/genel/x/xorg-font/talimat @@ -0,0 +1,77 @@ +# Tanım: Xorg font paketleri, Xorg uygulamalarına gerekli yazı tiplerini sağlar. +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-font-util xorg-encodings xorg-xcursor-themes xorg-fontconfig + +isim=xorg-font +surum=7.7 +devir=3 +section="font" + +kaynak=() + +derle() { +unset MAKEFLAGS +cat > $section-$surum-$devir.md5 << "EOF" +23756dab809f9ec5011bb27fb2c3c7d6 font-util-1.3.1.tar.bz2 +0f2d6546d514c5cc4ecf78a60657a5c1 encodings-1.0.4.tar.bz2 +1347c3031b74c9e91dc4dfa53b12f143 font-adobe-100dpi-1.0.3.tar.bz2 +6c9f26c92393c0756f3e8d614713495b font-adobe-75dpi-1.0.3.tar.bz2 +66fb6de561648a6dce2755621d6aea17 font-adobe-utopia-100dpi-1.0.4.tar.bz2 +e99276db3e7cef6dccc8a57bc68aeba7 font-adobe-utopia-75dpi-1.0.4.tar.bz2 +fcf24554c348df3c689b91596d7f9971 font-adobe-utopia-type1-1.0.4.tar.bz2 +6d25f64796fef34b53b439c2e9efa562 font-alias-1.0.3.tar.bz2 +cc0726e4a277d6ed93b8e09c1f195470 font-arabic-misc-1.0.3.tar.bz2 +9f11ade089d689b9d59e0f47d26f39cd font-bh-100dpi-1.0.3.tar.bz2 +565494fc3b6ac08010201d79c677a7a7 font-bh-75dpi-1.0.3.tar.bz2 +c8b73a53dcefe3e8d3907d3500e484a9 font-bh-lucidatypewriter-100dpi-1.0.3.tar.bz2 +f6d65758ac9eb576ae49ab24c5e9019a font-bh-lucidatypewriter-75dpi-1.0.3.tar.bz2 +e8ca58ea0d3726b94fe9f2c17344be60 font-bh-ttf-1.0.3.tar.bz2 +53ed9a42388b7ebb689bdfc374f96a22 font-bh-type1-1.0.3.tar.bz2 +6b223a54b15ecbd5a1bc52312ad790d8 font-bitstream-100dpi-1.0.3.tar.bz2 +d7c0588c26fac055c0dd683fdd65ac34 font-bitstream-75dpi-1.0.3.tar.bz2 +5e0c9895d69d2632e2170114f8283c11 font-bitstream-type1-1.0.3.tar.bz2 +e452b94b59b9cfd49110bb49b6267fba font-cronyx-cyrillic-1.0.3.tar.bz2 +3e0069d4f178a399cffe56daa95c2b63 font-cursor-misc-1.0.3.tar.bz2 +0571bf77f8fab465a5454569d9989506 font-daewoo-misc-1.0.3.tar.bz2 +6e7c5108f1b16d7a1c7b2c9760edd6e5 font-dec-misc-1.0.3.tar.bz2 +bfb2593d2102585f45daa960f43cb3c4 font-ibm-type1-1.0.3.tar.bz2 +a2401caccbdcf5698e001784dbd43f1a font-isas-misc-1.0.3.tar.bz2 +cb7b57d7800fd9e28ec35d85761ed278 font-jis-misc-1.0.3.tar.bz2 +143c228286fe9c920ab60e47c1b60b67 font-micro-misc-1.0.3.tar.bz2 +96109d0890ad2b6b0e948525ebb0aba8 font-misc-cyrillic-1.0.3.tar.bz2 +6306c808f7d7e7d660dfb3859f9091d2 font-misc-ethiopic-1.0.3.tar.bz2 +e3e7b0fda650adc7eb6964ff3c486b1c font-misc-meltho-1.0.3.tar.bz2 +c88eb44b3b903d79fb44b860a213e623 font-misc-misc-1.1.2.tar.bz2 +56b0296e8862fc1df5cdbb4efe604e86 font-mutt-misc-1.0.3.tar.bz2 +e805feb7c4f20e6bfb1118d19d972219 font-schumacher-misc-1.1.2.tar.bz2 +6f3fdcf2454bf08128a651914b7948ca font-screen-cyrillic-1.0.4.tar.bz2 +beef61a9b0762aba8af7b736bb961f86 font-sony-misc-1.0.3.tar.bz2 +948f2e07810b4f31195185921470f68d font-sun-misc-1.0.3.tar.bz2 +829a3159389b7f96f629e5388bfee67b font-winitzki-cyrillic-1.0.3.tar.bz2 +3eeb3fb44690b477d510bbd8f86cf5aa font-xfree86-type1-1.0.4.tar.bz2 +EOF +for package in $(grep -v '^#' ${section}-${surum}-${devir}.md5 |cut -d " " -f 3) + do + wget http://mirror.switch.ch/ftp/mirror/X11/pub/individual/${section}/$package + grep $package $section-$surum-$devir.md5 |md5sum -c - + packagedir=$(echo $package | sed 's/.tar.bz2//') + tar -xf $package + + pushd $packagedir + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --with-fontrootdir=/usr/share/fonts + make + make DESTDIR=$PKG install + popd + done +for FILE in usr/bin/bdftruncate \ +usr/bin/ucs2any \ +usr/share/aclocal/fontutil.m4 \ +usr/lib/pkgconfig/fontutil.pc \ +usr/share/man/man1/bdftruncate.1 \ +usr/share/man/man1/ucs2any.1 +do + rm $PKG/$FILE +done +} diff --git a/talimatname/genel/x/xorg-font/xorg-font.kur-kos b/talimatname/genel/x/xorg-font/xorg-font.kur-kos new file mode 100644 index 000000000..16fc29713 --- /dev/null +++ b/talimatname/genel/x/xorg-font/xorg-font.kur-kos @@ -0,0 +1,6 @@ +fc-cache -f -s > /dev/null +for i in 100dpi 75dpi cyrillic misc OTF TTF Type1 +do + mkfontscale /usr/share/fonts/$i + mkfontdir /usr/share/fonts/$i +done diff --git a/talimatname/genel/x/xorg-fontconfig/talimat b/talimatname/genel/x/xorg-fontconfig/talimat new file mode 100644 index 000000000..f71e05cc7 --- /dev/null +++ b/talimatname/genel/x/xorg-fontconfig/talimat @@ -0,0 +1,23 @@ +# Tanım: Fontconfig, erişim kitaplığı ve ilkelerin yapılandırması +# URL: http://xorg-fontconfig.org/wiki/ +# Paketçi: milisarge +# Gerekler: freetype expat libpng +# Grup: kütüphane + +_isim=fontconfig +isim=xorg-fontconfig +surum=2.13.0 +devir=1 +kaynak=( http://fontconfig.org/release/${_isim}-$surum.tar.gz) + +derle() { + cd ${_isim}-$surum + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --docdir=/usr/share/doc/$isim-$surum \ + --disable-docs --disable-static + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/doc +} diff --git a/talimatname/genel/x/xorg-fontconfig/xorg-fontconfig.kos-sil.kos-sil b/talimatname/genel/x/xorg-fontconfig/xorg-fontconfig.kos-sil.kos-sil new file mode 100644 index 000000000..8bbd3ccf9 --- /dev/null +++ b/talimatname/genel/x/xorg-fontconfig/xorg-fontconfig.kos-sil.kos-sil @@ -0,0 +1,11 @@ +#!/bin/sh +for _kurtar in \ +'/etc/conf.d' \ +'/etc/conf.avail' ;\ +do + +#sed -i '\|'\'$_kurtar\''|d' /var/lib/pkg/DB/cups/kurulan +# -sz ve -g den sonra /tmp/$paket.sil dikkate alınır +sed -i '\|'\'$_kurtar\''|d' /tmp/xorg-fontconfig.sil + +done diff --git a/talimatname/genel/x/xorg-gccmakedep/talimat b/talimatname/genel/x/xorg-gccmakedep/talimat new file mode 100644 index 000000000..efe22679c --- /dev/null +++ b/talimatname/genel/x/xorg-gccmakedep/talimat @@ -0,0 +1,16 @@ +# Tanım: creates dependencies in Makefiles +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +isim=xorg-gccmakedep +surum=1.0.3 +devir=2 +kaynak=(http://xorg.freedesktop.org/releases/individual/util/gccmakedep-$surum.tar.bz2) + +derle() { + cd gccmakedep-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-glu/talimat b/talimatname/genel/x/xorg-glu/talimat new file mode 100644 index 000000000..3df9881bc --- /dev/null +++ b/talimatname/genel/x/xorg-glu/talimat @@ -0,0 +1,16 @@ +# Tanım: OpenGL Yardımcı Program Kütüphanesi +# URL: http://www.xorg-mesa3d.org +# Paketçi: milisarge +# Gerekler: xorg-mesa + +_isim=glu +isim=xorg-glu +surum=9.0.0 +devir=1 +kaynak=(ftp://ftp.freedesktop.org/pub/mesa/${_name}/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --disable-static +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-imake/talimat b/talimatname/genel/x/xorg-imake/talimat new file mode 100644 index 000000000..ebb3dc7b1 --- /dev/null +++ b/talimatname/genel/x/xorg-imake/talimat @@ -0,0 +1,16 @@ +# Tanım: imake derleme sistemi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-cf-files + +isim=xorg-imake +surum=1.0.7 +devir=1 +kaynak=(http://xorg.freedesktop.org/releases/individual/util/imake-$surum.tar.bz2) + +derle() { + cd imake-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libdmx/talimat b/talimatname/genel/x/xorg-libdmx/talimat new file mode 100644 index 000000000..44930fb32 --- /dev/null +++ b/talimatname/genel/x/xorg-libdmx/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin dmx kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-libxext + +isim=xorg-libdmx +surum=1.1.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libdmx-$surum.tar.bz2) + +derle() { + cd libdmx-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libdrm/talimat b/talimatname/genel/x/xorg-libdrm/talimat new file mode 100644 index 000000000..251ae0d48 --- /dev/null +++ b/talimatname/genel/x/xorg-libdrm/talimat @@ -0,0 +1,23 @@ +# Tanım: Çekirdek DRM servislerine kullanıcı alanı arayüzü. +# URL: http://dri.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: docbook-xsl libxslt xorg-util-macros xorg-libpciaccess + +_isim=libdrm +isim=xorg-libdrm +surum=2.4.83 +devir=1 +kaynak=( http://dri.freedesktop.org/${_name}/${_name}-$surum.tar.bz2) + +derle() { + cd $_name-$surum + + ./configure \ + --prefix=/usr \ + --disable-manpages \ + --disable-valgrind \ + --disable-cairo-tests + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libfontenc/talimat b/talimatname/genel/x/xorg-libfontenc/talimat new file mode 100644 index 000000000..77121430f --- /dev/null +++ b/talimatname/genel/x/xorg-libfontenc/talimat @@ -0,0 +1,17 @@ +# Tanım: X.Org icin fontenc kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto + +_isim=libfontenc +isim=xorg-libfontenc +surum=1.1.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libfs/talimat b/talimatname/genel/x/xorg-libfs/talimat new file mode 100644 index 000000000..a97e63370 --- /dev/null +++ b/talimatname/genel/x/xorg-libfs/talimat @@ -0,0 +1,16 @@ +# Tanım: X Font Servisi icin FS kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-xtrans + +isim=xorg-libfs +surum=1.0.7 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libFS-$surum.tar.bz2) + +derle() { +cd libFS-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libice/talimat b/talimatname/genel/x/xorg-libice/talimat new file mode 100644 index 000000000..d12f88002 --- /dev/null +++ b/talimatname/genel/x/xorg-libice/talimat @@ -0,0 +1,18 @@ +# Tanım: X.Org ICE kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-xtrans + +isim=xorg-libice +surum=1.0.9 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libICE-$surum.tar.bz2) + +derle() { + cd libICE-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libpciaccess/talimat b/talimatname/genel/x/xorg-libpciaccess/talimat new file mode 100644 index 000000000..f8efa37a4 --- /dev/null +++ b/talimatname/genel/x/xorg-libpciaccess/talimat @@ -0,0 +1,19 @@ +# Tanım: X.Org PCI erisim kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +_isim=libpciaccess +isim=xorg-libpciaccess +surum=0.13.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libsm/talimat b/talimatname/genel/x/xorg-libsm/talimat new file mode 100644 index 000000000..68ccec36d --- /dev/null +++ b/talimatname/genel/x/xorg-libsm/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin oturum yonetimi kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libice xorg-proto xorg-xtrans + +isim=xorg-libsm +surum=1.2.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libSM-$surum.tar.bz2) + +derle() { +cd libSM-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libx11/talimat b/talimatname/genel/x/xorg-libx11/talimat new file mode 100644 index 000000000..286556882 --- /dev/null +++ b/talimatname/genel/x/xorg-libx11/talimat @@ -0,0 +1,16 @@ +# Tanım: X Pencere Sistemi icin X11 kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: libxcb xorg-proto xorg-xtrans + +isim=xorg-libx11 +surum=1.6.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libX11-$surum.tar.bz2) + +derle() { +cd libX11-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxau/talimat b/talimatname/genel/x/xorg-libxau/talimat new file mode 100644 index 000000000..f6833a484 --- /dev/null +++ b/talimatname/genel/x/xorg-libxau/talimat @@ -0,0 +1,18 @@ +# Tanım: X Sahiplik rutinleri +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto + +isim=xorg-libxau +surum=1.0.8 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXau-$surum.tar.bz2) + +derle() { + cd libXau-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxaw/talimat b/talimatname/genel/x/xorg-libxaw/talimat new file mode 100644 index 000000000..d1c094128 --- /dev/null +++ b/talimatname/genel/x/xorg-libxaw/talimat @@ -0,0 +1,16 @@ +# Tanım: Athena Widget araclari +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext xorg-libxt xorg-libxmu xorg-libxpm xorg-libxau + +isim=xorg-libxaw +surum=1.0.13 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXaw-$surum.tar.bz2) + +derle() { +cd libXaw-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxaw3d/talimat b/talimatname/genel/x/xorg-libxaw3d/talimat new file mode 100644 index 000000000..6aed3afa7 --- /dev/null +++ b/talimatname/genel/x/xorg-libxaw3d/talimat @@ -0,0 +1,16 @@ +# Tanım: 3-D icin Athena uygulama araclari +# URL: URL: http://directory.fsf.org/project/xaw3d/ +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libxmu xorg-util-macros + +isim=xorg-libxaw3d +surum=1.6.2 +devir=1 +kaynak=(http://xorg.freedesktop.org/archive/individual/lib/libXaw3d-$surum.tar.bz2) + +derle() { +cd libXaw3d-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxcomposite/talimat b/talimatname/genel/x/xorg-libxcomposite/talimat new file mode 100644 index 000000000..cf45e07b2 --- /dev/null +++ b/talimatname/genel/x/xorg-libxcomposite/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xcomposite kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-proto xorg-libxfixes xorg-libxext xorg-compositeproto + +isim=xorg-libxcomposite +surum=0.4.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXcomposite-$surum.tar.bz2) + +derle() { +cd libXcomposite-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxcursor/talimat b/talimatname/genel/x/xorg-libxcursor/talimat new file mode 100644 index 000000000..9c6f5297e --- /dev/null +++ b/talimatname/genel/x/xorg-libxcursor/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xcursor kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libxrender xorg-libxfixes xorg-libx11 + +isim=xorg-libxcursor +surum=1.1.14 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXcursor-$surum.tar.bz2) + +derle() { +cd libXcursor-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxdamage/talimat b/talimatname/genel/x/xorg-libxdamage/talimat new file mode 100644 index 000000000..a1ff37b7e --- /dev/null +++ b/talimatname/genel/x/xorg-libxdamage/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xdamage kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-proto xorg-libxfixes + +isim=xorg-libxdamage +surum=1.1.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXdamage-$surum.tar.bz2) + +derle() { +cd libXdamage-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxdmcp/talimat b/talimatname/genel/x/xorg-libxdmcp/talimat new file mode 100644 index 000000000..3e6889a17 --- /dev/null +++ b/talimatname/genel/x/xorg-libxdmcp/talimat @@ -0,0 +1,17 @@ +# Tanım: X.Org icin Xdmcp kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto + +_isim=libXdmcp +isim=xorg-libxdmcp +surum=1.1.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxext/talimat b/talimatname/genel/x/xorg-libxext/talimat new file mode 100644 index 000000000..cd893da38 --- /dev/null +++ b/talimatname/genel/x/xorg-libxext/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xext kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 + +isim=xorg-libxext +surum=1.3.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXext-$surum.tar.bz2) + +derle() { +cd libXext-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxfixes/talimat b/talimatname/genel/x/xorg-libxfixes/talimat new file mode 100644 index 000000000..4cfeca062 --- /dev/null +++ b/talimatname/genel/x/xorg-libxfixes/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xfixes kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-proto + +isim=xorg-libxfixes +surum=5.0.1 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXfixes-$surum.tar.bz2) + +derle() { +cd libXfixes-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxfont/talimat b/talimatname/genel/x/xorg-libxfont/talimat new file mode 100644 index 000000000..f5f18cf9d --- /dev/null +++ b/talimatname/genel/x/xorg-libxfont/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xfont kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: freetype xorg-proto xorg-xtrans xorg-libfontenc + +isim=xorg-libxfont +surum=1.5.1 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXfont-$surum.tar.bz2) + +derle() { +cd libXfont-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxft/talimat b/talimatname/genel/x/xorg-libxft/talimat new file mode 100644 index 000000000..8e88d736a --- /dev/null +++ b/talimatname/genel/x/xorg-libxft/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xft kutuphanesi +# URL: http://xorg.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: xorg-libxrender freetype xorg-fontconfig + +isim=xorg-libxft +surum=2.3.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXft-$surum.tar.bz2) + +derle() { +cd libXft-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxi/talimat b/talimatname/genel/x/xorg-libxi/talimat new file mode 100644 index 000000000..7c4340a62 --- /dev/null +++ b/talimatname/genel/x/xorg-libxi/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org Xi kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext xorg-libxfixes + +isim=xorg-libxi +surum=1.7.6 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXi-$surum.tar.bz2) + +derle() { +cd libXi-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxinerama/talimat b/talimatname/genel/x/xorg-libxinerama/talimat new file mode 100644 index 000000000..bcc461623 --- /dev/null +++ b/talimatname/genel/x/xorg-libxinerama/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org Xinerama kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext + +isim=xorg-libxinerama +surum=1.1.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXinerama-$surum.tar.bz2) + +derle() { +cd libXinerama-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxkbfile/talimat b/talimatname/genel/x/xorg-libxkbfile/talimat new file mode 100644 index 000000000..2fd48d843 --- /dev/null +++ b/talimatname/genel/x/xorg-libxkbfile/talimat @@ -0,0 +1,18 @@ +# Tanım: X.Org xkbfile kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 + +isim=xorg-libxkbfile +surum=1.0.9 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libxkbfile-$surum.tar.bz2) + +derle() { + cd libxkbfile-$surum + + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxklavier/talimat b/talimatname/genel/x/xorg-libxklavier/talimat new file mode 100644 index 000000000..a64193b63 --- /dev/null +++ b/talimatname/genel/x/xorg-libxklavier/talimat @@ -0,0 +1,20 @@ +# Tanım: X ortami icin klavye kutuphanesi +# URL: http://www.freedesktop.org/wiki/Software/LibXklavier +# Paketçi: milisarge +# Gerekler: iso-codes libxml2 xorg-libx11 glib gobject-introspection xorg-libxkbfile + +_isim=libxklavier +isim=xorg-libxklavier +surum=5.4 +devir=1 +kaynak=(http://pkgs.fedoraproject.org/repo/pkgs/libxklavier/${_name}-$surum.tar.bz2/13af74dcb6011ecedf1e3ed122bd31fa/${_name}-$surum.tar.bz2) + + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr \ +--disable-static +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/gtk-doc +} diff --git a/talimatname/genel/x/xorg-libxmu/talimat b/talimatname/genel/x/xorg-libxmu/talimat new file mode 100644 index 000000000..f0301cbf6 --- /dev/null +++ b/talimatname/genel/x/xorg-libxmu/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org xmu kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libxt xorg-proto xorg-libxext xorg-libx11 + +isim=xorg-libxmu +surum=1.1.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXmu-$surum.tar.bz2) + +derle() { +cd libXmu-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxp/talimat b/talimatname/genel/x/xorg-libxp/talimat new file mode 100644 index 000000000..b7fbbffdd --- /dev/null +++ b/talimatname/genel/x/xorg-libxp/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org icin Xp kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext + +isim=xorg-libxp +surum=1.0.3 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXp-$surum.tar.bz2) + +derle() { +cd libXp-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxpm/talimat b/talimatname/genel/x/xorg-libxpm/talimat new file mode 100644 index 000000000..88809c557 --- /dev/null +++ b/talimatname/genel/x/xorg-libxpm/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org Xpm kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxt xorg-libxext + +isim=xorg-libxpm +surum=3.5.11 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXpm-$surum.tar.bz2) + +derle() { +cd libXpm-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxrandr/talimat b/talimatname/genel/x/xorg-libxrandr/talimat new file mode 100644 index 000000000..b33d56978 --- /dev/null +++ b/talimatname/genel/x/xorg-libxrandr/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org yeniden boyutlama, dondurme islemleri kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext xorg-libxrender + +isim=xorg-libxrandr +surum=1.5.0 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXrandr-$surum.tar.bz2) + +derle() { +cd libXrandr-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxrender/talimat b/talimatname/genel/x/xorg-libxrender/talimat new file mode 100644 index 000000000..5e3c6b24f --- /dev/null +++ b/talimatname/genel/x/xorg-libxrender/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org Xrender kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-proto + +isim=xorg-libxrender +surum=0.9.9 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXrender-$surum.tar.bz2) + +derle() { +cd libXrender-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxres/talimat b/talimatname/genel/x/xorg-libxres/talimat new file mode 100644 index 000000000..3e3dff720 --- /dev/null +++ b/talimatname/genel/x/xorg-libxres/talimat @@ -0,0 +1,19 @@ +# Tanım: X.Org icin Xres kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext +# Grup: xorg + +isim=xorg-libxres +surum=1.2.0 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXres-$surum.tar.bz2) + +derle() { + cd libXres-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/man + rmdir "${PKG}/usr/share" || true +} diff --git a/talimatname/genel/x/xorg-libxscrnsaver/talimat b/talimatname/genel/x/xorg-libxscrnsaver/talimat new file mode 100644 index 000000000..183a6972e --- /dev/null +++ b/talimatname/genel/x/xorg-libxscrnsaver/talimat @@ -0,0 +1,16 @@ +# Tanım: X Ekran Koruyucu icin kutuphane +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-proto xorg-libxext + +isim=xorg-libxscrnsaver +surum=1.2.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXScrnSaver-$surum.tar.bz2) + +derle() { +cd libXScrnSaver-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxshmfence/talimat b/talimatname/genel/x/xorg-libxshmfence/talimat new file mode 100644 index 000000000..5efb82e34 --- /dev/null +++ b/talimatname/genel/x/xorg-libxshmfence/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org libxshmfence kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 + +isim=xorg-libxshmfence +surum=1.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libxshmfence-$surum.tar.bz2) + +derle() { +cd libxshmfence-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxt/talimat b/talimatname/genel/x/xorg-libxt/talimat new file mode 100644 index 000000000..5d062336b --- /dev/null +++ b/talimatname/genel/x/xorg-libxt/talimat @@ -0,0 +1,17 @@ +# Tanım: X.Org icin Xt kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libsm xorg-libx11 xorg-proto + +isim=xorg-libxt +surum=1.1.5 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXt-$surum.tar.bz2) + +derle() { +cd libXt-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ +--with-appdefaultdir=/etc/X11/app-defaults +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxtst/talimat b/talimatname/genel/x/xorg-libxtst/talimat new file mode 100644 index 000000000..cdacbcb03 --- /dev/null +++ b/talimatname/genel/x/xorg-libxtst/talimat @@ -0,0 +1,16 @@ +# Tanım:X.Org libXtst kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext xorg-libxi + +isim=xorg-libxtst +surum=1.2.2 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXtst-$surum.tar.bz2) + +derle() { +cd libXtst-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxv/talimat b/talimatname/genel/x/xorg-libxv/talimat new file mode 100644 index 000000000..a7c092a93 --- /dev/null +++ b/talimatname/genel/x/xorg-libxv/talimat @@ -0,0 +1,16 @@ +# Tanım: X Video uzantısı istemcisi kitaplığı +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext + +isim=xorg-libxv +surum=1.0.10 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXv-$surum.tar.bz2) + +derle() { +cd libXv-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxvmc/talimat b/talimatname/genel/x/xorg-libxvmc/talimat new file mode 100644 index 000000000..02954c975 --- /dev/null +++ b/talimatname/genel/x/xorg-libxvmc/talimat @@ -0,0 +1,16 @@ +# Tanım: X11 Video Motion Compensation uzatma kitaplığı +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libx11 xorg-libxext xorg-libxv + +isim=xorg-libxvmc +surum=1.0.9 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXvMC-$surum.tar.bz2) + +derle() { + cd libXvMC-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxxf86dga/talimat b/talimatname/genel/x/xorg-libxxf86dga/talimat new file mode 100644 index 000000000..91213a33c --- /dev/null +++ b/talimatname/genel/x/xorg-libxxf86dga/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org libXxf86dga kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext + +isim=xorg-libxxf86dga +surum=1.1.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXxf86dga-$surum.tar.bz2) + +derle() { +cd libXxf86dga-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-libxxf86vm/talimat b/talimatname/genel/x/xorg-libxxf86vm/talimat new file mode 100644 index 000000000..48491b6cf --- /dev/null +++ b/talimatname/genel/x/xorg-libxxf86vm/talimat @@ -0,0 +1,16 @@ +# Tanım: X.Org libXxf86vm kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-proto xorg-libx11 xorg-libxext + +isim=xorg-libxxf86vm +surum=1.1.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/libXxf86vm-$surum.tar.bz2) + +derle() { +cd libXxf86vm-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-mesa/talimat b/talimatname/genel/x/xorg-mesa/talimat new file mode 100644 index 000000000..186cbac71 --- /dev/null +++ b/talimatname/genel/x/xorg-mesa/talimat @@ -0,0 +1,36 @@ +# Tanım: Acik kaynak kodlu OpenGL uyumlu grafik kutuphanesi +# URL: http://www.xorg-mesa3d.org +# Paketçi: milisarge +# Gerekler: pkg-config libtool wayland xorg-libx11 xorg-libdrm xorg-libxext xorg-libxdamage llvm elfutils xorg-libxshmfence wayland libvdpau + +isim=xorg-mesa +surum=17.1.8 +devir=1 + +kaynak=(ftp://ftp.freedesktop.org/pub/mesa/mesa-$surum.tar.xz) + +derle() { + cd mesa-$surum + + CONFIG_SHELL=/bin/bash \ + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --enable-llvm \ + --enable-gbm \ + --enable-gles1 \ + --enable-gles2 \ + --enable-glx-tls \ + --enable-osmesa \ + --enable-texture-float \ + --enable-xa \ + --enable-vdpau \ + --enable-llvm-shared-libs \ + --disable-dependency-tracking \ + --with-platforms=x11,drm,wayland \ + --with-gallium-drivers=r300,r600,svga,swrast,radeonsi,nouveau \ + --with-vulkan-drivers=intel,radeon + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-pixman/talimat b/talimatname/genel/x/xorg-pixman/talimat new file mode 100644 index 000000000..5ef37a8e3 --- /dev/null +++ b/talimatname/genel/x/xorg-pixman/talimat @@ -0,0 +1,17 @@ +# Tanım: X.org piksel manupulasyonu icin kutuphane +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: libpng + +_isim=pixman +isim=xorg-pixman +surum=0.32.6 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --disable-static +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-proto/talimat b/talimatname/genel/x/xorg-proto/talimat new file mode 100644 index 000000000..9203c2ed6 --- /dev/null +++ b/talimatname/genel/x/xorg-proto/talimat @@ -0,0 +1,55 @@ +# Tanım: X11 gelistiricileri icin protokol dosyalari (headers) +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge + +isim=xorg-proto +surum=7.7 +devir=1 + +kaynak=() + +derle() { +unset MAKEFLAGS +cat > list.md5 << "EOF" +99d0e25feea2fead7d8325b7000b41c3 printproto-1.0.5.tar.bz2 +1a05fb01fa1d5198894c931cf925c025 bigreqsproto-1.1.2.tar.bz2 +98482f65ba1e74a08bf5b056a4031ef0 compositeproto-0.4.2.tar.bz2 +998e5904764b82642cc63d97b4ba9e95 damageproto-1.2.1.tar.bz2 +4ee175bbd44d05c34d43bb129be5098a dmxproto-2.3.1.tar.bz2 +b2721d5d24c04d9980a0c6540cb5396a dri2proto-2.8.tar.bz2 +a3d2cbe60a9ca1bf3aea6c93c817fee3 dri3proto-1.0.tar.bz2 +e7431ab84d37b2678af71e29355e101d fixesproto-5.0.tar.bz2 +36934d00b00555eaacde9f091f392f97 fontsproto-2.1.3.tar.bz2 +5565f1b0facf4a59c2778229c1f70d10 glproto-1.4.17.tar.bz2 +6caebead4b779ba031727f66a7ffa358 inputproto-2.3.1.tar.bz2 +94afc90c1f7bef4a27fdd59ece39c878 kbproto-1.0.7.tar.bz2 +2d569c75884455c7148d133d341e8fd6 presentproto-1.0.tar.bz2 +a46765c8dcacb7114c821baf0df1e797 randrproto-1.5.0.tar.bz2 +1b4e5dede5ea51906f1530ca1e21d216 recordproto-1.14.2.tar.bz2 +a914ccc1de66ddeb4b611c6b0686e274 renderproto-0.11.1.tar.bz2 +cfdb57dae221b71b2703f8e2980eaaf4 resourceproto-1.2.0.tar.bz2 +edd8a73775e8ece1d69515dd17767bfb scrnsaverproto-1.2.2.tar.bz2 +e658641595327d3990eab70fdb55ca8b videoproto-2.3.2.tar.bz2 +5f4847c78e41b801982c8a5e06365b24 xcmiscproto-1.2.2.tar.bz2 +70c90f313b4b0851758ef77b95019584 xextproto-7.3.0.tar.bz2 +120e226ede5a4687b25dd357cc9b8efe xf86bigfontproto-1.2.0.tar.bz2 +a036dc2fcbf052ec10621fd48b68dbb1 xf86dgaproto-2.1.tar.bz2 +1d716d0dac3b664e5ee20c69d34bc10e xf86driproto-2.1.1.tar.bz2 +e793ecefeaecfeabd1aed6a01095174e xf86vidmodeproto-2.3.1.tar.bz2 +9959fe0bfb22a0e7260433b8d199590a xineramaproto-1.2.1.tar.bz2 +3ce2f230c5d8fa929f326ad1f0fa40a8 xproto-7.0.28.tar.bz2 +EOF +for package in $(grep -v '^#' list.md5 |cut -d " " -f 3) + do + wget http://mirror.switch.ch/ftp/mirror/X11/pub/individual/${section}/$package + grep $package list.md5 |md5sum -c - + packagedir=$(echo $package | sed 's/.tar.bz2//') + tar -xf $package + + pushd $packagedir + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install + popd + done +} diff --git a/talimatname/genel/x/xorg-server/talimat b/talimatname/genel/x/xorg-server/talimat new file mode 100644 index 000000000..2b5d602cb --- /dev/null +++ b/talimatname/genel/x/xorg-server/talimat @@ -0,0 +1,32 @@ +# Tanım: X Pencere Sistemi cekirdegi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xcb-util-keysyms libepoxy xcb-util-image xcb-util-renderutil xcb-util-wm xorg-mesa xorg-glu xorg-pixman xorg-libdmx xorg-libxres xorg-font xorg-xkeyboard-config + +isim=xorg-server +surum=1.18.1 +devir=1 +kaynak=(http://www.x.org/releases/individual/xserver/$isim-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/downloads/xorg-server/$isim-$surum-add_prime_support-1.patch + http://www.linuxfromscratch.org/patches/downloads/xorg-server/$isim-$surum-wayland_190-1.patch) + +derle() { +cd $isim-$surum + +patch -Np1 -i ../$isim-$surum-add_prime_support-1.patch +patch -Np1 -i ../$isim-$surum-wayland_190-1.patch + +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ +--with-xkb-output=/var/lib/xkb \ +--enable-glamor \ +--with-fontrootdir=/usr/share/fonts \ +--enable-install-setuid \ +--disable-systemd-logind \ +--enable-suid-wrapper +make +make DESTDIR=$PKG install +rm -rf $PKG/var + +# glamor module part of xorg-glamor-egl +rm $PKG/usr/lib/xorg/modules/libglamoregl.{la,so} +} diff --git a/talimatname/genel/x/xorg-server/xorg-server.kur-kos b/talimatname/genel/x/xorg-server/xorg-server.kur-kos new file mode 100644 index 000000000..32283fc1a --- /dev/null +++ b/talimatname/genel/x/xorg-server/xorg-server.kur-kos @@ -0,0 +1,6 @@ +if ( ! grep ICE /etc/sysconfig/createfiles > /dev/null );then + echo "/tmp/.ICE-unix dir 1777 root root" >> /etc/sysconfig/createfiles +fi +if ( ! grep X11 /etc/sysconfig/createfiles > /dev/null );then + echo "/tmp/.X11-unix dir 1777 root root" >> /etc/sysconfig/createfiles +fi diff --git a/talimatname/genel/x/xorg-server/xorg-server.okubeni b/talimatname/genel/x/xorg-server/xorg-server.okubeni new file mode 100644 index 000000000..2ebc17b09 --- /dev/null +++ b/talimatname/genel/x/xorg-server/xorg-server.okubeni @@ -0,0 +1,15 @@ +si la souris reste bloquée ou revient toujours au centre de l'écran, installez le +fichier 15-quirks.conf ds le dossier /etc/X11/xorg.conf.d +le contenu de ce fichier ressemble à: + +Section "InputClass" + Identifier "no need Accelerometer in X" + MatchProduct "Accelerometer" + Option "Ignore" "on" +EndSection +Section "InputClass" + Identifier "no need accelerometer in X" + MatchProduct "accelerometer" + Option "Ignore" "on" +EndSection + diff --git a/talimatname/genel/x/xorg-term/talimat b/talimatname/genel/x/xorg-term/talimat new file mode 100644 index 000000000..a0ef83446 --- /dev/null +++ b/talimatname/genel/x/xorg-term/talimat @@ -0,0 +1,39 @@ +# Tanım: X Pencere Sistemi icin terminal emulatoru +# URL: http://invisible-island.net/xorg-term/ +# Paketçi: milisarge +# Gerekler: xorg-app xorg-fontconfig xorg-libxft + +_isim=xterm +isim=xorg-term +surum=322 +devir=1 +kaynak=(ftp://invisible-island.net/${_name}/${_name}-$surum.tgz + $isim.list) + +derle() { +cd ${_name}-* + +sed -i '/v0/{n;s/new:/new:kb=^?:/}' termcap && +printf '\tkbs=\\177,\n' >> terminfo + +TERMINFO=/usr/share/terminfo \ +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ +--with-app-defaults=/etc/X11/app-defaults +make +make DESTDIR=$PKG install +make DESTDIR=$PKG install-ti + +cat >> $PKG/etc/X11/app-defaults/XTerm << "EOF" +*VT100*locale: true +*VT100*faceName: Monospace +*VT100*faceSize: 10 +*backarrowKeyIsErase: true +*ptyInitialErase: true +EOF +install -m755 -d $PKG/usr/share/applications +install -m644 {xterm,uxterm}.desktop $PKG/usr/share/applications/ +for file in `cat $SRC/$isim.list` +do + rm $PKG/$file +done +} diff --git a/talimatname/genel/x/xorg-term/xorg-term.list b/talimatname/genel/x/xorg-term/xorg-term.list new file mode 100644 index 000000000..1142fa037 --- /dev/null +++ b/talimatname/genel/x/xorg-term/xorg-term.list @@ -0,0 +1,40 @@ +/usr/share/terminfo/v/vs100 +/usr/share/terminfo/x/xterm +/usr/share/terminfo/x/xterm+256color +/usr/share/terminfo/x/xterm+app +/usr/share/terminfo/x/xterm+edit +/usr/share/terminfo/x/xterm+kbs +/usr/share/terminfo/x/xterm+noapp +/usr/share/terminfo/x/xterm+pc+edit +/usr/share/terminfo/x/xterm+pcc0 +/usr/share/terminfo/x/xterm+pcc1 +/usr/share/terminfo/x/xterm+pcc2 +/usr/share/terminfo/x/xterm+pcc3 +/usr/share/terminfo/x/xterm+pce2 +/usr/share/terminfo/x/xterm+pcf0 +/usr/share/terminfo/x/xterm+pcf2 +/usr/share/terminfo/x/xterm+pcfkeys +/usr/share/terminfo/x/xterm+tmux +/usr/share/terminfo/x/xterm+vt+edit +/usr/share/terminfo/x/xterm-16color +/usr/share/terminfo/x/xterm-24 +/usr/share/terminfo/x/xterm-256color +/usr/share/terminfo/x/xterm-88color +/usr/share/terminfo/x/xterm-8bit +/usr/share/terminfo/x/xterm-basic +/usr/share/terminfo/x/xterm-bold +/usr/share/terminfo/x/xterm-color +/usr/share/terminfo/x/xterm-hp +/usr/share/terminfo/x/xterm-new +/usr/share/terminfo/x/xterm-noapp +/usr/share/terminfo/x/xterm-old +/usr/share/terminfo/x/xterm-r5 +/usr/share/terminfo/x/xterm-r6 +/usr/share/terminfo/x/xterm-sco +/usr/share/terminfo/x/xterm-sun +/usr/share/terminfo/x/xterm-vt220 +/usr/share/terminfo/x/xterm-vt52 +/usr/share/terminfo/x/xterm-xf86-v44 +/usr/share/terminfo/x/xterm-xfree86 +/usr/share/terminfo/x/xterms + diff --git a/talimatname/genel/x/xorg-twm/talimat b/talimatname/genel/x/xorg-twm/talimat new file mode 100644 index 000000000..ffc24f583 --- /dev/null +++ b/talimatname/genel/x/xorg-twm/talimat @@ -0,0 +1,18 @@ +# Tanım: Minimal boyutta pencere yoneticisi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-server + +_isim=twm +isim=xorg-twm +surum=1.0.9 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/app/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + sed -i -e '/^rcdir =/s,^\(rcdir = \).*,\1/etc/X11/app-defaults,' src/Makefile.in + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-util-macros/talimat b/talimatname/genel/x/xorg-util-macros/talimat new file mode 100644 index 000000000..e514f0709 --- /dev/null +++ b/talimatname/genel/x/xorg-util-macros/talimat @@ -0,0 +1,17 @@ +# Tanım: X.Org X11 Autotools makrolari +# URL: http://www.x.org +# Paketçi: milisarge +# Gerekler: + +_isim=util-macros +isim=xorg-util-macros +surum=1.19.0 +devir=2 + +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/util/${_name}-$surum.tar.bz2) +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xauth/talimat b/talimatname/genel/x/xorg-xauth/talimat new file mode 100644 index 000000000..b8ad8c01b --- /dev/null +++ b/talimatname/genel/x/xorg-xauth/talimat @@ -0,0 +1,18 @@ +# Tanım: X sahiplik dosyasi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-server + +isim=xorg-xauth +surum=1.0.9 +devir=2 +kaynak=(http://xorg.freedesktop.org/releases/individual/app/xauth-$surum.tar.bz2) + +derle() { + cd xauth-$surum + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xbitmaps/talimat b/talimatname/genel/x/xorg-xbitmaps/talimat new file mode 100644 index 000000000..80d70f8fc --- /dev/null +++ b/talimatname/genel/x/xorg-xbitmaps/talimat @@ -0,0 +1,17 @@ +# Tanım: X Pencere Sistemi icin statik grafikler +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: + +_isim=xbitmaps +isim=xorg-xbitmaps +surum=1.1.1 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/data/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xcb-util-keysyms/talimat b/talimatname/genel/x/xorg-xcb-util-keysyms/talimat new file mode 100644 index 000000000..afc891dc6 --- /dev/null +++ b/talimatname/genel/x/xorg-xcb-util-keysyms/talimat @@ -0,0 +1,18 @@ +# Tanım: XCB araç kütüphanesi +# URL: http://xcb.freedesktop.org +# Paketçi: milisarge +# Gerekler: libxcb + +isim=xorg-xcb-util-keysyms +surum=0.4.0 +devir=1 +kaynak=(http://xcb.freedesktop.org/dist/xcb-util-keysyms-$surum.tar.bz2) + +derle() { + cd xcb-util-keysyms-$surum + + ./configure --prefix=/usr + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xclock/talimat b/talimatname/genel/x/xorg-xclock/talimat new file mode 100644 index 000000000..a83136a78 --- /dev/null +++ b/talimatname/genel/x/xorg-xclock/talimat @@ -0,0 +1,17 @@ +# Tanım: X için analog saat +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-libxft xorg-server + +_isim=xclock +isim=xorg-xclock +surum=1.0.7 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/app/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xcursor-themes/talimat b/talimatname/genel/x/xorg-xcursor-themes/talimat new file mode 100644 index 000000000..45aef72d8 --- /dev/null +++ b/talimatname/genel/x/xorg-xcursor-themes/talimat @@ -0,0 +1,17 @@ +# Tanım: X Pencere sistemi fare imlecleri icin temalar +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: xorg-app + +_isim=xcursor-themes +isim=xorg-xcursor-themes +surum=1.0.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/data/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xinit/talimat b/talimatname/genel/x/xorg-xinit/talimat new file mode 100644 index 000000000..fdf0cb651 --- /dev/null +++ b/talimatname/genel/x/xorg-xinit/talimat @@ -0,0 +1,18 @@ +# Tanım: X Pencere Sistemi icin oturum hazirlayici +# Paketçi: milisarge +# Gerekler: xorg-server desktop-file-utils shared-mime-info + +_isim=xinit +run=(desktop-file-utils shared-mime-info) +isim=xorg-xinit +surum=1.3.4 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/app/${_name}-$surum.tar.bz2) + +derle() { + cd ${_name}-$surum + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --with-xorg-xinitdir=/etc/X11/app-defaults + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xkeyboard-config/talimat b/talimatname/genel/x/xorg-xkeyboard-config/talimat new file mode 100644 index 000000000..2c237df93 --- /dev/null +++ b/talimatname/genel/x/xorg-xkeyboard-config/talimat @@ -0,0 +1,17 @@ +# Tanım: X.org icin klavye konfigurasyonu +# URL: http://www.freedesktop.org/wiki/Software_2fXKeyboardConfig +# Paketçi: milisarge +# Gerekler: xorg-app intltool + +_isim=xkeyboard-config +isim=xorg-xkeyboard-config +surum=2.17 +devir=1 +kaynak=( http://xorg.freedesktop.org/archive/individual/data/${_name}/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-xkb-rules-symlink=xorg +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg-xtrans/talimat b/talimatname/genel/x/xorg-xtrans/talimat new file mode 100644 index 000000000..cb8fcbb2a --- /dev/null +++ b/talimatname/genel/x/xorg-xtrans/talimat @@ -0,0 +1,17 @@ +# Tanım: X.org trans kutuphanesi +# URL: http://xorg.freedesktop.org +# Paketçi: milisarge +# Gerekler: libxcb + +_isim=xtrans +isim=xorg-xtrans +surum=1.3.5 +devir=1 +kaynak=(http://mirror.switch.ch/ftp/mirror/X11/pub/individual/lib/${_name}-$surum.tar.bz2) + +derle() { +cd ${_name}-$surum +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg/talimat b/talimatname/genel/x/xorg/talimat new file mode 100644 index 000000000..04150452e --- /dev/null +++ b/talimatname/genel/x/xorg/talimat @@ -0,0 +1,67 @@ +# Tanım: xf86-input-evdev, synaptics, vmmouse, wacom, xf86-video-ati, fbdev, intel, nouveau, vmware sürücüleri +# URL: http://ftp.x.org/archive//individual +# Paketçi: milisarge +# Gerekler: mtdev xorg-libxvmc xorg-server xcb-util xorg-xkeyboard-config xorg-twm xorg-term xorg-xclock xorg-xinit libevdev + +isim=xorg +surum=7.8 +devir=1 +section=driver +kaynak=() + +derle() { +cat > list.md5 << "EOF" +0f209d13b39427c1a6d38d70059b1e8f xf86-input-evdev-2.10.4.tar.bz2 +58e5b7722a402114093bf193962d1e3a xf86-input-synaptics-1.9.0.tar.bz2 +85e2e464b7219c495ad3a16465c226ed xf86-input-vmmouse-13.1.0.tar.bz2 +4faa1d4bf6eb74f40dba8c5cb3c9c3e4 xf86-input-wacom-0.33.0.tar.bz2 +f34d04a755e761e03b459155fa3ddcbb xf86-video-ati-7.8.0.tar.bz2 +3931c0e19d441cc576dc088f9eb9fd73 xf86-video-fbdev-0.4.4.tar.bz2 +2d7b2917ef18c6e97a6f3817c3e9387b xf86-video-nouveau-1.0.13.tar.bz2 +316aaf97eb152eef71dac70c349fb8c7 xf86-video-openchrome-0.5.0.tar.bz2 +a893c37c589f7a31cea929a5d896a0e2 xf86-video-vesa-2.3.4.tar.bz2 +4c3912e4d8947f6c2fc1ee9e2f211d74 xf86-video-vmware-13.2.1.tar.bz2 +EOF +unset MAKEFLAGS +for paket in $(grep -v '^#' list.md5 |cut -d " " -f 3) + do + paketdizini=$(echo $paket | sed 's/.tar.bz2//') + paketismi=$(echo $paket | sed 's/.tar.bz2//') + case $paketismi in + xf86-input-wacom-[0-9]*) + wget http://downloads.sourceforge.net/linuxwacom/$paket;; + *) + wget http://ftp.x.org/archive//individual/$section/$paket;; + esac + grep $paket list.md5 |md5sum -c - + tar -xf $paket + + pushd $paketdizini + case $paketismi in + xf86-input-vmmouse-[0-9]*) + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --with-udev-rules-dir=/lib/udev/rules.d \ + --without-hal-callouts-dir \ + --without-hal-fdi-dir;; + xf86-input-wacom-[0-9]*) + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-systemd-unit-dir=no;; + *) + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var;; + esac + make + make DESTDIR=$PKG install + popd + done + +# Intel is a bit different +wget ftp://anduin.linuxfromscratch.org/BLFS/xf86-video-intel/xf86-video-intel-20160902.tar.bz2 +tar -xf xf86-video-intel-20160902.tar.bz2 +cd xf86-video-intel +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--localstatedir=/var \ +--enable-kms-only \ +--enable-uxa +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xorg/xorg.kur-kos b/talimatname/genel/x/xorg/xorg.kur-kos new file mode 100755 index 000000000..c38c810bc --- /dev/null +++ b/talimatname/genel/x/xorg/xorg.kur-kos @@ -0,0 +1,8 @@ +cat > /usr/share/X11/xorg.conf.d/10-keyboard.conf << "EOF" +Section "InputClass" + Identifier "Keyboard Defaults" + MatchIsKeyboard "yes" + Option "XkbLayout" "tr" +EndSection +EOF +ln -s /usr/share/X11/xorg.conf.d/10-keyboard.conf /etc/X11/xorg.conf.d/ diff --git a/talimatname/genel/x/xorriso/talimat b/talimatname/genel/x/xorriso/talimat new file mode 100644 index 000000000..605944570 --- /dev/null +++ b/talimatname/genel/x/xorriso/talimat @@ -0,0 +1,18 @@ +# Tanım: ISO 9660 image manipulasyon araci +# URL: https://www.gnu.org/software/xorriso/ +# Paketçi: milisarge +# Gerekler: + +isim=xorriso +surum=1.4.4 +devir=1 +kaynak=(https://www.gnu.org/software/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + ./configure --prefix=/usr + + make all + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xpad/talimat b/talimatname/genel/x/xpad/talimat new file mode 100644 index 000000000..80bbb56bc --- /dev/null +++ b/talimatname/genel/x/xpad/talimat @@ -0,0 +1,16 @@ +# Tanım: Yapiskan notlar benzeri not alma uygulamasi +# URL: http://mterry.name/xpad/ +# Paketçi: dei +# Gerekler: intltool xorg-libsm gtk3 + +isim=xpad +surum=4.3.1 +devir=2 +kaynak=(http://launchpad.net/xpad/trunk/4.3/+download/xpad-$surum.tar.bz2) + +derle(){ + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install helpdir=$PKG/usr/lib/xpad/help +} diff --git a/talimatname/genel/x/xpdf/talimat b/talimatname/genel/x/xpdf/talimat new file mode 100644 index 000000000..f4b4391e8 --- /dev/null +++ b/talimatname/genel/x/xpdf/talimat @@ -0,0 +1,31 @@ +# Tanım: PDF goruntuleyici +# URL: http://foolabs.com/xpdf +# Paketçi: milisarge +# Gerekler: lesstif + +isim=xpdf +surum=3.04 +devir=1 +kaynak=(ftp://ftp.foolabs.com/pub/xpdf/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + + sed -i 's/\(s = XmStringCreateLocalized(\)/\1(char *)/g' xpdf/XPDFViewer.cc + + ./configure \ + --prefix=/usr \ + --with-Xm-library=/usr/lib \ + --with-Xm-includes=/usr/include/Xm \ + --with-freetype2-includes=/usr/include/freetype2 \ + --sysconfdir=/etc \ + --enable-a4-paper \ + --enable-opi \ + --with-t1-library=no \ + --mandir=/usr/man + + make + make install DESTDIR=$PKG + + find $PKG/usr/bin $PKG/usr/man/man1 -iname 'pdf*' -delete +} diff --git a/talimatname/genel/x/xquisite/talimat b/talimatname/genel/x/xquisite/talimat new file mode 100644 index 000000000..e902b7991 --- /dev/null +++ b/talimatname/genel/x/xquisite/talimat @@ -0,0 +1,14 @@ +# Tanım: XFCE icin xquisite icon temasi +# URL: http://xfce-look.org/content/show.php/Xquisite?content=69735 +# Paketçi: milisarge +# Gerekler: + +isim=xquisite +surum=0.4.6 +devir=1 +kaynak=(http://downloads.nutyx.org/files/$isim-$surum.tar.gz) + +derle() { +mkdir -p $PKG//usr/share/icons/ +cp -a * $PKG//usr/share/icons/ +} diff --git a/talimatname/genel/x/xreader/talimat b/talimatname/genel/x/xreader/talimat new file mode 100644 index 000000000..c6fd08db7 --- /dev/null +++ b/talimatname/genel/x/xreader/talimat @@ -0,0 +1,19 @@ +# Tanım: PDF ve Postscript gibi dosyalar için belge görüntüleyici. X-Apps Projesi. +# URL: https://github.com/linuxmint/xreader +# Paketçi: milisarge yasarciv +# Gerekler: ghostscript poppler-glib djvulibre desktop-file-utils gsettings-desktop-schemas gtk3 gtk2 libsecret mate-common yelp-tools + +isim=xreader +surum=1.6.2 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./autogen.sh --prefix="/usr" \ + --localstatedir="/var" \ + --libexecdir="/usr/lib/$isim" \ + --disable-caja --disable-nemo + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xreader/xreader.kur-kos b/talimatname/genel/x/xreader/xreader.kur-kos new file mode 100644 index 000000000..a96c64f40 --- /dev/null +++ b/talimatname/genel/x/xreader/xreader.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas /usr/share/glib-2.0/schemas/ +gtk-update-icon-cache -q -t -f /usr/share/icons/hicolor +update-desktop-database -q diff --git a/talimatname/genel/x/xsane/talimat b/talimatname/genel/x/xsane/talimat new file mode 100644 index 000000000..e8de22f42 --- /dev/null +++ b/talimatname/genel/x/xsane/talimat @@ -0,0 +1,18 @@ +# Tanım: SANE-1.0.24 için ön uç. Görüntü kalitesini ve kullanımı kolaylaştırmak için ek özelliklere sahiptir +# URL: http://www.xsane.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: gtk2 sane lcms gimp libjpeg-turbo + +isim=xsane +surum=0.999 +devir=2 + +kaynak=(http://www.xsane.org/download/xsane-$surum.tar.gz) + +derle() { +cd xsane-$surum +sed -i -e 's/png_ptr->jmpbuf/png_jmpbuf(png_ptr)/' src/xsane-save.c +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xscreensaver/talimat b/talimatname/genel/x/xscreensaver/talimat new file mode 100644 index 000000000..7cb9372ea --- /dev/null +++ b/talimatname/genel/x/xscreensaver/talimat @@ -0,0 +1,30 @@ +# Tanım: X Pencere Yoneticisi icin ekran koruyucu +# URL: http://www.jwz.org/xscreensaver/ +# Paketçi: milisarge +# Gerekler: bc libglade xorg-libxmu xorg-libxt xorg-libxpm +# Grup: sistem + +isim=xscreensaver +surum=5.38 +devir=1 +kaynak=(http://www.jwz.org/xscreensaver/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib \ +--without-gnome +make +make install_prefix=$PKG install +chmod 755 $PKG/usr/bin/xscreensaver +mkdir -p $PKG/etc/pam.d +cat > $PKG/etc/pam.d/xscreensaver << "EOF" +# Begin /etc/pam.d/xscreensaver + +auth include system-auth +account include system-account + +# End /etc/pam.d/xscreensaver +EOF +} + diff --git a/talimatname/genel/x/xtables-addons/talimat b/talimatname/genel/x/xtables-addons/talimat new file mode 100644 index 000000000..de8b3eedb --- /dev/null +++ b/talimatname/genel/x/xtables-addons/talimat @@ -0,0 +1,22 @@ +# Tanım: Xtables-addons patch-o-matic'in (-ng) devamı niteliğindedir. Ana Xtables paketinde kabul edilmeyen uzantılar içeriyor. +# URL: http://xtables-addons.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: iptables libmnl + +isim=xtables-addons +surum=2.10 +devir=1 +kaynak=(http://downloads.sourceforge.net/project/$isim/Xtables-addons/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + + ./configure \ + --prefix=/usr \ + --libexecdir=/usr/lib \ + --mandir=/usr/man \ + --disable-dependency-tracking + + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/x/xulrunner/talimat b/talimatname/genel/x/xulrunner/talimat new file mode 100644 index 000000000..230c0ce35 --- /dev/null +++ b/talimatname/genel/x/xulrunner/talimat @@ -0,0 +1,21 @@ +# Tanım: Mozilla Çalışma Zamanı Ortamı +# URL: http://wiki.mozilla.org/XUL:Xul_Runner +# Paketçi: milisarge +# Gerekler: + +isim=xulrunner +surum=41.0.2 +devir=1 +kaynak=(http://ftp.mozilla.org/pub/xulrunner/releases/$surum/source/$isim-$surum.source.tar.xz) + +derle() { + mkdir ${PKG}/opt/ + + mkdir ${PKG}/usr/ + + mkdir ${PKG}/usr/bin/ + + cp -R "${SRC}/mozilla-release/${isim}" "${PKG}/opt/${isim}" + + ln -s "/opt/${isim}/${isim}" "${PKG}/usr/bin/${isim}" +} diff --git a/talimatname/genel/x/xvid/talimat b/talimatname/genel/x/xvid/talimat new file mode 100644 index 000000000..dfc2104da --- /dev/null +++ b/talimatname/genel/x/xvid/talimat @@ -0,0 +1,23 @@ +# Tanım: Acik kaynak kodlu MPEG-4 kodlayici +# URL: http://xvid.org +# Paketçi: milisarge +# Gerekler: yasm + +isim=xvid +surum=1.3.3 +devir=1 +kaynak=( http://downloads.xvid.org/downloads/xvidcore-$surum.tar.gz ) + +derle() { +cd xvidcore/build/generic +./configure --prefix=/usr +make +make DESTDIR=$PKG install +chmod -v 755 $PKG/usr/lib/libxvidcore.so.4.3 +ln -v -sf libxvidcore.so.4.3 $PKG/usr/lib/libxvidcore.so.4 +ln -v -sf libxvidcore.so.4 $PKG/usr/lib/libxvidcore.so +install -v -m755 -d $PKG/usr/share/doc/xvidcore-$surum/examples +install -v -m644 ../../doc/* $PKG/usr/share/doc/xvidcore-$surum +install -v -m644 ../../examples/* \ +$PKG/usr/share/doc/xvidcore-$surum/examples +} diff --git a/talimatname/genel/x/xviewer/talimat b/talimatname/genel/x/xviewer/talimat new file mode 100644 index 000000000..3f9f06476 --- /dev/null +++ b/talimatname/genel/x/xviewer/talimat @@ -0,0 +1,19 @@ +# Tanım: Basit ve kullanımı kolay bir resim görüntüleyici. +# URL: https://github.com/linuxmint/xviewer +# Paketçi: milisarge +# Gerekler: gnome-common gnome-desktop libglade yelp-tools libpeas + +isim=xviewer +surum=1.6.1 +devir=1 +kaynak=(https://github.com/linuxmint/$isim/archive/$surum.tar.gz::$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + gnome-autogen.sh --prefix="/usr" \ + --localstatedir="/var" \ + --libexecdir="/usr/lib/$isim" + make + make DESTDIR=$PKG install + +} diff --git a/talimatname/genel/x/xviewer/xviewer.kur-kos b/talimatname/genel/x/xviewer/xviewer.kur-kos new file mode 100644 index 000000000..088752e4d --- /dev/null +++ b/talimatname/genel/x/xviewer/xviewer.kur-kos @@ -0,0 +1 @@ +/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas diff --git a/talimatname/genel/x/xzoom/talimat b/talimatname/genel/x/xzoom/talimat new file mode 100644 index 000000000..cf4bb809c --- /dev/null +++ b/talimatname/genel/x/xzoom/talimat @@ -0,0 +1,20 @@ +# Tanım: Ekran Büyüteci +# URL: ftp://sunsite.unc.edu/pub/linux/libs/X/ +# Paketçi: milisarge +# Gerekler: xorg-imake xorg-libxt xorg-libxext xorg-gccmakedep + +isim=xzoom +surum=0.3 +devir=1 +kaynak=(http://webdiis.unizar.es/pub/unix/X11/$isim-$surum.tgz +ftp://ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/x/xzoom/xzoom_0.3-23.diff.gz) + +derle() { + cd "$isim-$surum" + gzip -d $SRC/xzoom_0.3-23.diff.gz + patch -Np1 < "$SRC/xzoom_0.3-23.diff" + xmkmf -a + sed -i "s@-O2@$CFLAGS@" ./Makefile + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/y/yacy/talimat b/talimatname/genel/y/yacy/talimat new file mode 100644 index 000000000..ce6e69284 --- /dev/null +++ b/talimatname/genel/y/yacy/talimat @@ -0,0 +1,33 @@ +# Tanım: p2p merkezi olmayan arama motoru +# URL: http://yacy.net/ +# Paketçi: milisarge@gmail.com +# Gerekler: openjdk apache-ant + +isim=yacy +surum=1.92 +_surum=20161226_9000 +devir=1 + +kaynak=("http://www.yacy.net/release/yacy_v${surum}_${_surum}.tar.gz" + yacy.rc) + +derle() { + export JAVA_HOME=/opt/jdk + cd "$SRC/$isim" + /opt/ant/bin/ant all + /opt/ant/bin/ant installonlinux -DDESTDIR="$PKG/" + install -d "$PKG"/usr/share/java/yacy + install -t "$PKG"/usr/share/java/yacy/ lib/*.jar + + install -Dm644 "${SRC}/yacy.rc" "${PKG}/etc/rc.d/init.d/yacy" + + # ayar kısayol + ln -s /var/cache/yacy/DATA/SETTINGS/yacy.conf $PKG/etc/yacy/yacy.conf + + # servis dosya + install -d $PKG/usr/bin + install -m 0750 $SRC/$isim/startYACY.sh $PKG/usr/bin/yacy-start + install -m 0750 $SRC/$isim/stopYACY.sh $PKG/usr/bin/yacy-stop + + rm -f "$PKG"/usr/share/yacy/DATA "$PKG"/var/log/yacy +} diff --git a/talimatname/genel/y/yacy/yacy.rc b/talimatname/genel/y/yacy/yacy.rc new file mode 100644 index 000000000..99e82e7c6 --- /dev/null +++ b/talimatname/genel/y/yacy/yacy.rc @@ -0,0 +1,37 @@ +#!/bin/sh +# +# /etc/rc.d/yacy: start/stop yacy daemon +# + +# User settings here +DAEMON=yacy +RUN_AS_USER=yacy +# end of user settings + +RETVAL=0 + +case $1 in + start) + echo -n "Starting $DAEMON..." + su $RUN_AS_USER -c /usr/sbin/$DAEMON-start &> /dev/null & RETVAL=$? + echo " done." + ;; + stop) + echo -n "Shutting down $DAEMON..." + su $RUN_AS_USER -c /usr/sbin/$DAEMON-stop &> /dev/null & RETVAL=$? + echo " done." + ;; + restart) + $0 stop + sleep 20 + $0 start + RETVAL=$? + ;; + *) + echo "usage: $0 [start|stop|restart]" + ;; +esac + +exit $RETVAL + +# End of file diff --git a/talimatname/genel/y/yad/talimat b/talimatname/genel/y/yad/talimat new file mode 100644 index 000000000..1f534b0be --- /dev/null +++ b/talimatname/genel/y/yad/talimat @@ -0,0 +1,16 @@ +# Tanım: shell skriptleri icin dialog penceresi araci +# URL: https://sourceforge.net/projects/yad-dialog/ +# Paketçi: milisarge +# Gerekler: gtk2 webkitgtk2 gtk3 + +isim=yad +surum=0.39.0 +devir=1 +kaynak=(https://sourceforge.net/projects/yad-dialog/files/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yajl/talimat b/talimatname/genel/y/yajl/talimat new file mode 100644 index 000000000..19bc6ce7c --- /dev/null +++ b/talimatname/genel/y/yajl/talimat @@ -0,0 +1,18 @@ +# Tanım: Başka bir JSON Kütüphanesi +# URL: http://lloyd.github.com/yajl +# Paketçi: Cihan_Alkan +# Gerekler: cmake +# Grup: kütüphane + +isim=yajl +surum=2.1.0 +devir=1 +kaynak=(https://github.com/lloyd/yajl/archive/$surum.tar.gz::yajl-$surum.tar.gz) + +derle() { + cd yajl-$surum + cmake -DCMAKE_INSTALL_PREFIX=/usr . + make + make DESTDIR="$PKG" install + install -Dm644 COPYING "$PKG/usr/share/licenses/yajl/LICENSE" +} diff --git a/talimatname/genel/y/yakuake/talimat b/talimatname/genel/y/yakuake/talimat new file mode 100644 index 000000000..948db999b --- /dev/null +++ b/talimatname/genel/y/yakuake/talimat @@ -0,0 +1,20 @@ +# Tanım: KDE konsole temelli aşağı açılan terminal emulatoru +# URL: https://www.kde.org/ +# Paketçi: alihan-ozturk28@hotmail.com +# Gerekler: kf5-extra-cmake-modules konsole kf5-karchive kf5-kconfig kf5-kcoreaddons kf5-kcrash kf5-kdbusaddons kf5-kglobalaccel kf5-ki18n kf5-kiconthemes kf5-kio kf5-knewstuff kf5-knotifications kf5-knotifyconfig kf5-kparts kf5-kwidgetsaddons kf5-kwindowsystem + +isim=yakuake +surum=3.0.2 +devir=1 +kaynak=( http://download.kde.org/stable/$isim/$surum/src/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +cmake -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -Wno-dev + +make +make DESTDIR=$PKG install +} + diff --git a/talimatname/genel/y/yaml-cpp/1f4b6d5c855b59e849b7228090981c520928c2a4.patch b/talimatname/genel/y/yaml-cpp/1f4b6d5c855b59e849b7228090981c520928c2a4.patch new file mode 100644 index 000000000..91ea79eae --- /dev/null +++ b/talimatname/genel/y/yaml-cpp/1f4b6d5c855b59e849b7228090981c520928c2a4.patch @@ -0,0 +1,23 @@ +From 1f4b6d5c855b59e849b7228090981c520928c2a4 Mon Sep 17 00:00:00 2001 +From: Ovidiu-Florin BOGDAN +Date: Fri, 2 Dec 2016 16:51:07 +0200 +Subject: [PATCH] Remove prefix duplication in yaml-cpp.pc.cmake + +--- + yaml-cpp.pc.cmake | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/yaml-cpp.pc.cmake b/yaml-cpp.pc.cmake +index 04d343f..044ef78 100644 +--- a/yaml-cpp.pc.cmake ++++ b/yaml-cpp.pc.cmake +@@ -1,7 +1,5 @@ +-prefix=@CMAKE_INSTALL_PREFIX@ +-exec_prefix=@CMAKE_INSTALL_PREFIX@ +-libdir=${prefix}/@LIB_INSTALL_DIR@ +-includedir=${prefix}/@INCLUDE_INSTALL_ROOT_DIR@ ++libdir=@LIB_INSTALL_DIR@ ++includedir=@INCLUDE_INSTALL_ROOT_DIR@ + + Name: Yaml-cpp + Tanım: A YAML parser and emitter for C++ diff --git a/talimatname/genel/y/yaml-cpp/500db60f899ae6845039d4eca503133d0db81dbd.patch b/talimatname/genel/y/yaml-cpp/500db60f899ae6845039d4eca503133d0db81dbd.patch new file mode 100644 index 000000000..d71375c13 --- /dev/null +++ b/talimatname/genel/y/yaml-cpp/500db60f899ae6845039d4eca503133d0db81dbd.patch @@ -0,0 +1,79 @@ +From 500db60f899ae6845039d4eca503133d0db81dbd Mon Sep 17 00:00:00 2001 +From: Paul Novotny +Date: Wed, 25 Nov 2015 11:33:36 -0500 +Subject: [PATCH] Include cmake files in install + +This adds yaml-cpp-config.cmake, yaml-cpp-config-version.cmake, and +yaml-cpp-targets.cmake to the cmake install. As a result, cmake's +find_package can easily find yaml-cpp for software that depends on +yaml-cpp. + +Add code to install cmake files to $CMAKE_INSTALL_PREFIX/CMake on +Windows, which is the de-facto standard. + +Closes jbeder/yaml-cpp#336 jbeder/yaml-cpp#127 +--- + CMakeLists.txt | 28 +++++++++++++++++++++++----- + 1 file changed, 23 insertions(+), 5 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5b326a3..cbaad07 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -256,15 +256,15 @@ else() + set(_library_dir lib) + endif() + +-set(INCLUDE_INSTALL_ROOT_DIR include) ++set(INCLUDE_INSTALL_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/include) + + set(INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_ROOT_DIR}/yaml-cpp) +-set(LIB_INSTALL_DIR "${_library_dir}${LIB_SUFFIX}") ++set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${_library_dir}${LIB_SUFFIX}") + + set(_INSTALL_DESTINATIONS +- RUNTIME DESTINATION bin ++ RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin + LIBRARY DESTINATION ${LIB_INSTALL_DIR} +- ARCHIVE DESTINATION "lib${LIB_SUFFIX}" ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" + ) + + +@@ -300,7 +300,7 @@ if(MSVC) + endif() + endif() + +-install(TARGETS yaml-cpp ${_INSTALL_DESTINATIONS}) ++install(TARGETS yaml-cpp EXPORT yaml-cpp-targets ${_INSTALL_DESTINATIONS}) + install( + DIRECTORY ${header_directory} + DESTINATION ${INCLUDE_INSTALL_DIR} +@@ -316,9 +316,27 @@ set(EXPORT_TARGETS yaml-cpp CACHE INTERNAL "export targets") + set(CONFIG_INCLUDE_DIRS "${YAML_CPP_SOURCE_DIR}/include") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in + "${PROJECT_BINARY_DIR}/yaml-cpp-config.cmake" @ONLY) ++ ++if(WIN32 AND NOT CYGWIN) ++ set(INSTALL_CMAKE_DIR ${CMAKE_INSTALL_PREFIX}/CMake) ++else() ++ set(INSTALL_CMAKE_DIR ${LIB_INSTALL_DIR}/cmake/yaml-cpp) ++endif() ++ ++file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" "${INCLUDE_INSTALL_ROOT_DIR}") ++set(CONFIG_INCLUDE_DIRS "\${YAML_CPP_CMAKE_DIR}/${REL_INCLUDE_DIR}") ++configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config.cmake.in ++ "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake" @ONLY) ++ + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-config-version.cmake.in + "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" @ONLY) + ++install(FILES ++ "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/yaml-cpp-config.cmake" ++ "${PROJECT_BINARY_DIR}/yaml-cpp-config-version.cmake" ++ DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev) ++install(EXPORT yaml-cpp-targets DESTINATION ${INSTALL_CMAKE_DIR}) ++ + if(UNIX) + set(PC_FILE ${CMAKE_BINARY_DIR}/yaml-cpp.pc) + configure_file("yaml-cpp.pc.cmake" ${PC_FILE} @ONLY) diff --git a/talimatname/genel/y/yaml-cpp/talimat b/talimatname/genel/y/yaml-cpp/talimat new file mode 100644 index 000000000..faa4dd929 --- /dev/null +++ b/talimatname/genel/y/yaml-cpp/talimat @@ -0,0 +1,22 @@ +# Tanım: YAML ayrıştırıcı ve yayıcı C ++, YAML 1.2 spesifikasyonu etrafında yazılmıştır +# URL: https://github.com/jbeder/yaml-cpp +# Paketçi: Cihan Alkan +# Gerekler: boost cmake + +isim=yaml-cpp +surum=0.5.3 +devir=1 + +kaynak=(https://github.com/jbeder/yaml-cpp/archive/release-$surum.tar.gz + 500db60f899ae6845039d4eca503133d0db81dbd.patch + 1f4b6d5c855b59e849b7228090981c520928c2a4.patch) + +derle() { +cd yaml-cpp-release-$surum + patch -Np1 < $SRC/500db60f899ae6845039d4eca503133d0db81dbd.patch + patch -Np1 < $SRC/1f4b6d5c855b59e849b7228090981c520928c2a4.patch + + cmake . -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=ON + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yaml/talimat b/talimatname/genel/y/yaml/talimat new file mode 100644 index 000000000..aa3ae0241 --- /dev/null +++ b/talimatname/genel/y/yaml/talimat @@ -0,0 +1,15 @@ +# Tanım: Ayrıştırma ve YAML yaymak için C kitaplığı (YAML Markup Language değil) +# URL: http://pyyaml.org/ +# Paketçi: milisarge +# Gerekler: doxygen + +isim=yaml +surum=0.1.7 +devir=1 +kaynak=(http://pyyaml.org/download/libyaml/yaml-$surum.tar.gz) + +derle() { + cd yaml-$surum + ./configure --prefix=/usr --disable-static + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yarn/talimat b/talimatname/genel/y/yarn/talimat new file mode 100644 index 000000000..12582986b --- /dev/null +++ b/talimatname/genel/y/yarn/talimat @@ -0,0 +1,24 @@ +# Tanım: Nodejs için hızlı, güvenilir ve güvenli bağımlılık yönetimi +# URL: http://yarnpkg.com +# Paketçi: Cihan_Alkan +# Gerekler: node +# Grup: geliştirme + +isim=yarn +surum=1.3.2 +devir=1 +kaynak=(https://github.com/yarnpkg/yarn/releases/download/v$surum/yarn-v$surum.tar.gz) + +derle() { + + cd yarn-v${surum} + install -dm755 "$PKG"/usr/lib/node_modules/yarn + cp -R * "$PKG"/usr/lib/node_modules/yarn + + install -dm755 "$PKG"/usr/bin + ln -s /usr/lib/node_modules/yarn/bin/yarn.js "$PKG"/usr/bin/yarn + ln -s /usr/lib/node_modules/yarn/bin/yarn.js "$PKG"/usr/bin/yarnpkg + + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + install -Dm644 README.md "$PKG/usr/share/doc/$isim/README.md" +} diff --git a/talimatname/genel/y/yasm/talimat b/talimatname/genel/y/yasm/talimat new file mode 100644 index 000000000..1b507c8ca --- /dev/null +++ b/talimatname/genel/y/yasm/talimat @@ -0,0 +1,19 @@ +# Tanım: Bir cok sentaks ve mimari destekleyen Assembler +# URL: http://www.tortall.net/projects/yasm/ +# Paketçi: milisarge +# Gerekler: + +isim=yasm +surum=1.3.0 +devir=1 +kaynak=(http://www.tortall.net/projects/$isim/releases/$isim-$surum.tar.gz ) + + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yate/talimat b/talimatname/genel/y/yate/talimat new file mode 100644 index 000000000..878b23d30 --- /dev/null +++ b/talimatname/genel/y/yate/talimat @@ -0,0 +1,24 @@ +# Tanım: Yeni nesil telefon motoru +# URL: http://www.yate.ro/ +# Paketçi: milisarge CihanAlkan +# Gerekler: speex gsm postgresql mariadb alsa-lib openssl sqlite qt4 +# Grup: ağ + +isim=yate +surum=6.0.0 +devir=1 +kaynak=(http://yate.null.ro/tarballs/yate6/yate-$surum-1.tar.gz) + +derle() { + cd $SRC/$isim-$surum || cd $SRC/$isim + ./autogen.sh + export LDFLAGS="${LDFLAGS//-Wl,--as-needed}" + export PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --with-libpq \ + --with-mysql \ + --without-openh323 + make -j1 + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yelp-tools/talimat b/talimatname/genel/y/yelp-tools/talimat new file mode 100644 index 000000000..2f5bef3ee --- /dev/null +++ b/talimatname/genel/y/yelp-tools/talimat @@ -0,0 +1,17 @@ +# Tanım: Yelp dokumantasyonu hazirlamak icin araclar +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: libxslt libxml2 yelp-xsl itstool +# Grup: kütüphane + +isim=yelp-tools +surum=3.18.0 +devir=1 +kaynak=(http://download.gnome.org/sources/$isim/${surum:0:4}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yelp-xsl/talimat b/talimatname/genel/y/yelp-xsl/talimat new file mode 100644 index 000000000..2442bd62f --- /dev/null +++ b/talimatname/genel/y/yelp-xsl/talimat @@ -0,0 +1,17 @@ +# Tanım: Yelp icin stil dosyalari +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: itstool libxslt intltool +# Grup: kütüphane + +isim=yelp-xsl +surum=3.27.1 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum:0:4}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yelp/talimat b/talimatname/genel/y/yelp/talimat new file mode 100644 index 000000000..b1c25b449 --- /dev/null +++ b/talimatname/genel/y/yelp/talimat @@ -0,0 +1,17 @@ +# Tanım: Gnome icin yardim dosyalari +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: itstool intltool gtk-doc libxslt hicolor-icon-theme webkit2gtk3 webkitgtk3 yelp-xsl desktop-file-utils +# Grup: kütüphane + +isim=yelp +surum=3.27.1 +devir=1 +kaynak=(http://ftp.gnome.org/pub/gnome/sources/$isim/${surum%.*}/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/y/yelp/yelp.kur-kos b/talimatname/genel/y/yelp/yelp.kur-kos new file mode 100644 index 000000000..fe3a6a284 --- /dev/null +++ b/talimatname/genel/y/yelp/yelp.kur-kos @@ -0,0 +1,3 @@ +glib-compile-schemas usr/share/glib-2.0/schemas > /dev/null 2>&1 +[ -f usr/bin/gtk-update-icon-cache ] && gtk-update-icon-cache -q -t -f usr/share/icons/hicolor +[ -f usr/bin/update-desktop-database ] && update-desktop-database -q diff --git a/talimatname/genel/y/you-get/talimat b/talimatname/genel/y/you-get/talimat new file mode 100644 index 000000000..1d634cb7d --- /dev/null +++ b/talimatname/genel/y/you-get/talimat @@ -0,0 +1,16 @@ +# Tanım: Python3 ile yazılmış bir YouTube,Youku,Sohu,Tudou,QQ,Sina,PPTV,Xiami,Vimeo,ifeng,AcFun,bilibili,CNTV video indiricisi. +# URL: http://www.soimort.org/you-get/ +# Paketçi: Cihan Alkan +# Gerekler: python3 python3-setuptools +# Grup: ağ + +isim=you-get +surum=0.4.1011 +devir=1 +kaynak=(https://github.com/soimort/you-get/archive/v$surum.tar.gz::you-get-$surum.tar.gz) + +derle() { + cd ${isim}-${surum} + python3 setup.py build + python3 setup.py install --root="$PKG/" --optimize=1 +} diff --git a/talimatname/genel/y/youtube-dl-gui/talimat b/talimatname/genel/y/youtube-dl-gui/talimat new file mode 100644 index 000000000..5d7f9608e --- /dev/null +++ b/talimatname/genel/y/youtube-dl-gui/talimat @@ -0,0 +1,23 @@ +# Tanım: WxPython'da yazılmış popüler youtube-dl nin çapraz platform arayüzü +# URL: https://github.com/MrS0m30n3/youtube-dl-gui +# Paketçi: Cihan_Alkan +# Gerekler: python wxpython pytwodict gtk-update-icon-cache ffmpeg youtube-dl +# Grup: medya + +isim=youtube-dl-gui +surum=0.4 +devir=1 +kaynak=(https://github.com/MrS0m30n3/youtube-dl-gui/archive/0.4.tar.gz::$isim-$surum.tar.gz + youtube-dl-gui.desktop + youtube_dl_gui.po) + +derle() { + cd $isim-$surum + # ed ile + #printf '%s\n' '/LOCAL_NAMES/a' " ('tr_TR', 'Turkish')," . w | ed -s optionsframe.py + sed -i -e '/LOCALE_NAMES/a \' -e " ('tr_TR', 'Turkish')," youtube_dl_gui//optionsframe.py + install -Dm644 ../youtube_dl_gui.po $SRC/$isim-$surum/youtube_dl_gui/locale/tr_TR/LC_MESSAGES/youtube_dl_gui.po + install -Dm644 ../youtube-dl-gui.desktop "$PKG/usr/share/applications/youtube-dl-gui.desktop" + install -Dm644 LICENSE "$PKG/usr/share/licenses/$isim/LICENSE" + python setup.py install --root="$PKG" --optimize=1 +} diff --git a/talimatname/genel/y/youtube-dl-gui/youtube-dl-gui.desktop b/talimatname/genel/y/youtube-dl-gui/youtube-dl-gui.desktop new file mode 100644 index 000000000..4c11f8cac --- /dev/null +++ b/talimatname/genel/y/youtube-dl-gui/youtube-dl-gui.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Youtube-dl GUI +Exec=youtube-dl-gui +Icon=youtube-dl-gui +Categories=Network; +Comment=youtube-dl için arayüz diff --git a/talimatname/genel/y/youtube-dl-gui/youtube_dl_gui.po b/talimatname/genel/y/youtube-dl-gui/youtube_dl_gui.po new file mode 100644 index 000000000..95564d3c0 --- /dev/null +++ b/talimatname/genel/y/youtube-dl-gui/youtube_dl_gui.po @@ -0,0 +1,590 @@ +# Youtube-dlG localization file. +# FIRST AUTHOR: Sotiris Papadopoulos , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: youtube-dlg 0.4\n" +"POT-Creation-Date: 2017-06-15 17:13+EEST\n" +"PO-Revision-Date: 2018-01-03 19:29+0200\n" +"Last-Translator: Cihan Alkan \n" +"Language-Team: tr\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.5\n" + +#: youtube_dl_gui/formats.py:9 youtube_dl_gui/formats.py:108 +msgid "ID" +msgstr "ID" + +#: youtube_dl_gui/formats.py:10 youtube_dl_gui/formats.py:109 +#: youtube_dl_gui/mainframe.py:140 +msgid "Title" +msgstr "Başlık" + +#: youtube_dl_gui/formats.py:11 youtube_dl_gui/formats.py:110 +msgid "Title + ID" +msgstr "Başlık + ID" + +#: youtube_dl_gui/formats.py:12 youtube_dl_gui/formats.py:111 +msgid "Title + Quality" +msgstr "Başlık + Kalite" + +#: youtube_dl_gui/formats.py:13 youtube_dl_gui/formats.py:112 +msgid "Title + ID + Quality" +msgstr "Başlık + ID +Kalite" + +#: youtube_dl_gui/formats.py:14 youtube_dl_gui/formats.py:113 +msgid "Custom" +msgstr "Özel" + +#: youtube_dl_gui/formats.py:19 youtube_dl_gui/formats.py:118 +#: youtube_dl_gui/mainframe.py:503 youtube_dl_gui/mainframe.py:506 +msgid "default" +msgstr "Varsayılan" + +#: youtube_dl_gui/mainframe.py:97 +msgid "Enter URLs below" +msgstr "URL'leri aşağıda girin" + +#: youtube_dl_gui/mainframe.py:98 +msgid "Update" +msgstr "Güncelle" + +#: youtube_dl_gui/mainframe.py:99 youtube_dl_gui/optionsframe.py:41 +msgid "Options" +msgstr "Ayarlar" + +#: youtube_dl_gui/mainframe.py:100 youtube_dl_gui/optionsframe.py:589 +msgid "Stop" +msgstr "Dur" + +#: youtube_dl_gui/mainframe.py:101 +msgid "Info" +msgstr "Bilgi" + +#: youtube_dl_gui/mainframe.py:102 +msgid "Welcome" +msgstr "Hoşgeldiniz" + +#: youtube_dl_gui/mainframe.py:103 +msgid "Warning" +msgstr "Uyarı" + +#: youtube_dl_gui/mainframe.py:105 +msgid "Add" +msgstr "Ekle" + +#: youtube_dl_gui/mainframe.py:106 +msgid "Download list" +msgstr "İndirme Listesi" + +#: youtube_dl_gui/mainframe.py:107 youtube_dl_gui/mainframe.py:516 +#: youtube_dl_gui/mainframe.py:534 +msgid "Delete" +msgstr "Sil" + +#: youtube_dl_gui/mainframe.py:108 +msgid "Play" +msgstr "Oynat" + +#: youtube_dl_gui/mainframe.py:109 +msgid "Up" +msgstr "Yukarı" + +#: youtube_dl_gui/mainframe.py:110 +msgid "Down" +msgstr "Aşağı" + +#: youtube_dl_gui/mainframe.py:111 +msgid "Reload" +msgstr "Yeniden Yükle" + +#: youtube_dl_gui/mainframe.py:112 youtube_dl_gui/mainframe.py:448 +#: youtube_dl_gui/mainframe.py:649 +msgid "Pause" +msgstr "Bekle" + +#: youtube_dl_gui/mainframe.py:113 youtube_dl_gui/mainframe.py:865 +#: youtube_dl_gui/mainframe.py:866 youtube_dl_gui/optionsframe.py:587 +msgid "Start" +msgstr "Başlat" + +#: youtube_dl_gui/mainframe.py:114 +msgid "About" +msgstr "Hakkında" + +#: youtube_dl_gui/mainframe.py:115 +msgid "View Log" +msgstr "Günlük Göster" + +#: youtube_dl_gui/mainframe.py:117 +msgid "Successfully downloaded {0} URL(s) in {1} day(s) {2} hour(s) {3} minute(s) {4} second(s)" +msgstr "Başarılı indirmeler {0} URL(s) in {1} gün {2} saat {3} dakika {4} saniye" + +#: youtube_dl_gui/mainframe.py:119 +msgid "Downloads completed" +msgstr "İndirmeler tamamlandı" + +#: youtube_dl_gui/mainframe.py:120 +msgid "Total Progress: {0:.1f}% | Queued ({1}) Paused ({2}) Active ({3}) Completed ({4}) Error ({5})" +msgstr "Toplam İlerleme: {0:.1f}% | Sırada ({1}) Bekleyen ({2}) Aktif ({3}) Tamamlanan ({4}) Hatalı ({5})" + +#: youtube_dl_gui/mainframe.py:121 +msgid "Stopping downloads" +msgstr "İndirmeler durduruluyor" + +#: youtube_dl_gui/mainframe.py:122 +msgid "Downloads stopped" +msgstr "İndirmeler durduruldu" + +#: youtube_dl_gui/mainframe.py:123 +msgid "You need to provide at least one URL" +msgstr "En az bir URL eklemeniz gerekiyor" + +#: youtube_dl_gui/mainframe.py:124 +msgid "Downloads started" +msgstr "İndirmeler başladı" + +#: youtube_dl_gui/mainframe.py:125 +msgid "Choose Directory" +msgstr "Dizin Seçiniz" + +#: youtube_dl_gui/mainframe.py:127 +msgid "Download in progress. Please wait for all downloads to complete" +msgstr "İndirme devam ediyor. Lütfen tüm indirmelerin tamamlanmasını bekleyin" + +#: youtube_dl_gui/mainframe.py:128 +msgid "Update already in progress" +msgstr "Güncelleme zaten devam ediyor" + +#: youtube_dl_gui/mainframe.py:130 +msgid "Downloading latest youtube-dl. Please wait..." +msgstr "En son youtube-dl dosyasını indirmek. Lütfen bekle..." + +#: youtube_dl_gui/mainframe.py:131 +msgid "Youtube-dl download failed [{0}]" +msgstr "Youtube-dl indirilemedi [{0}]" + +#: youtube_dl_gui/mainframe.py:132 +msgid "Successfully downloaded youtube-dl" +msgstr "Youtube-dl başarıyla indirildi" + +#: youtube_dl_gui/mainframe.py:134 +msgid "Unable to open directory: '{dir}'. The specified path does not exist" +msgstr "Dizin açılamıyor: '{dir}'. Belirtilen yol mevcut değil" + +#: youtube_dl_gui/mainframe.py:136 +msgid "Error while shutting down. Make sure you typed the correct password" +msgstr "Kapatılırken hata oluştu. Doğru şifreyi girdiğinizden emin olun" + +#: youtube_dl_gui/mainframe.py:138 +msgid "Shutting down system" +msgstr "Sistemi kapat" + +#: youtube_dl_gui/mainframe.py:141 +msgid "Extension" +msgstr "Uzantı" + +#: youtube_dl_gui/mainframe.py:142 +msgid "Size" +msgstr "Boyut" + +#: youtube_dl_gui/mainframe.py:143 +msgid "Percent" +msgstr "Yüzde" + +#: youtube_dl_gui/mainframe.py:144 +msgid "ETA" +msgstr "" + +#: youtube_dl_gui/mainframe.py:145 +msgid "Speed" +msgstr "Hız" + +#: youtube_dl_gui/mainframe.py:146 +msgid "Status" +msgstr "Durum" + +#: youtube_dl_gui/mainframe.py:235 +msgid "Get URL" +msgstr "URL Al" + +#: youtube_dl_gui/mainframe.py:236 +msgid "Get command" +msgstr "Komut al" + +#: youtube_dl_gui/mainframe.py:237 +msgid "Open destination" +msgstr "Hedefi aç" + +#: youtube_dl_gui/mainframe.py:238 +msgid "Re-enter" +msgstr "Yeniden gir" + +#: youtube_dl_gui/mainframe.py:458 +msgid "Resume" +msgstr "Devam et" + +#: youtube_dl_gui/mainframe.py:480 +msgid "Video" +msgstr "Video" + +#: youtube_dl_gui/mainframe.py:484 +msgid "Audio" +msgstr "Ses" + +#: youtube_dl_gui/mainframe.py:516 +msgid "No items selected. Please pick an action" +msgstr "Hiçbir öğe seçilmedi. Lütfen bir işlem seçin" + +#: youtube_dl_gui/mainframe.py:516 +msgid "Remove all" +msgstr "Tümünü Sil" + +#: youtube_dl_gui/mainframe.py:516 +msgid "Remove completed" +msgstr "Silme tamamlandı" + +#: youtube_dl_gui/mainframe.py:534 +msgid "Are you sure you want to remove selected items?" +msgstr "Seçilen öğeleri kaldırmak istediğinizden emin misiniz?" + +#: youtube_dl_gui/mainframe.py:546 +msgid "Item is active, cannot remove" +msgstr "Öğe aktif, kaldırılamıyor" + +#: youtube_dl_gui/mainframe.py:579 +msgid "Item is not completed" +msgstr "Öğe tamamlanmadı" + +#: youtube_dl_gui/mainframe.py:668 +msgid "Update in progress. Please wait for the update to complete" +msgstr "Güncelleme devam ediyor. Lütfen güncellemenin tamamlanmasını bekleyin" + +#: youtube_dl_gui/mainframe.py:716 +msgid "Logging is disabled" +msgstr "Günlük devre dışı bırakıldı" + +#: youtube_dl_gui/mainframe.py:891 +msgid "Shutdown" +msgstr "Bilgisayarı Kapat" + +#: youtube_dl_gui/mainframe.py:891 +msgid "Shutting down in {0} second(s)" +msgstr "Bilgisayar {0} saniye içinde kapanıyor" + +#: youtube_dl_gui/mainframe.py:980 +msgid "No items to download" +msgstr "İndirilecek öğe yok" + +#: youtube_dl_gui/mainframe.py:1060 +msgid "Are you sure you want to exit?" +msgstr "Çıkmak istediğine emin misin?" + +#: youtube_dl_gui/mainframe.py:1060 +msgid "Exit" +msgstr "Çıkış" + +#: youtube_dl_gui/mainframe.py:1301 youtube_dl_gui/mainframe.py:1451 +msgid "Cancel" +msgstr "İptal" + +#: youtube_dl_gui/mainframe.py:1450 +msgid "OK" +msgstr "Tamam" + +#: youtube_dl_gui/optionsframe.py:65 +msgid "Reset" +msgstr "Sıfırla" + +#: youtube_dl_gui/optionsframe.py:66 +msgid "Close" +msgstr "Kapat" + +#: youtube_dl_gui/optionsframe.py:72 +msgid "General" +msgstr "Genel" + +#: youtube_dl_gui/optionsframe.py:73 +msgid "Formats" +msgstr "Formatlar" + +#: youtube_dl_gui/optionsframe.py:74 +msgid "Downloads" +msgstr "İndirilenler" + +#: youtube_dl_gui/optionsframe.py:75 +msgid "Advanced" +msgstr "Gelişmiş" + +#: youtube_dl_gui/optionsframe.py:76 +msgid "Extra" +msgstr "Diğer" + +#: youtube_dl_gui/optionsframe.py:315 +msgid "Language" +msgstr "Dil" + +#: youtube_dl_gui/optionsframe.py:318 +msgid "Filename format" +msgstr "Dosyaadı biçimi" + +#: youtube_dl_gui/optionsframe.py:323 +msgid "Filename options" +msgstr "Dosya adı ayarları" + +#: youtube_dl_gui/optionsframe.py:324 +msgid "Restrict filenames to ASCII" +msgstr "Dosya adlarını ASCII ile sınırla" + +#: youtube_dl_gui/optionsframe.py:326 +msgid "More options" +msgstr "Daha fazla ayar" + +#: youtube_dl_gui/optionsframe.py:327 +msgid "Confirm on exit" +msgstr "Çıkışı onayla" + +#: youtube_dl_gui/optionsframe.py:328 +msgid "Confirm item deletion" +msgstr "Öğe silme işlemini onayla" + +#: youtube_dl_gui/optionsframe.py:329 +msgid "Inform me on download completion" +msgstr "İndirme tamamlandığını bana bildir" + +#: youtube_dl_gui/optionsframe.py:331 +msgid "Shutdown on download completion" +msgstr "İndirme tamamlandığında kapat" + +#: youtube_dl_gui/optionsframe.py:342 +msgid "SUDO password" +msgstr "SUDO parolası" + +#: youtube_dl_gui/optionsframe.py:420 youtube_dl_gui/optionsframe.py:821 +msgid "In order for the changes to take effect please restart {0}" +msgstr "Değişikliklerin etkili olması için lütfen yeniden başlatın {0}" + +#: youtube_dl_gui/optionsframe.py:421 youtube_dl_gui/optionsframe.py:822 +msgid "Restart" +msgstr "Yeniden başlat" + +#: youtube_dl_gui/optionsframe.py:468 +msgid "high" +msgstr "yüksek" + +#: youtube_dl_gui/optionsframe.py:468 +msgid "low" +msgstr "düşük" + +#: youtube_dl_gui/optionsframe.py:468 +msgid "mid" +msgstr "orta" + +#: youtube_dl_gui/optionsframe.py:473 +msgid "Video formats" +msgstr "Video formatları" + +#: youtube_dl_gui/optionsframe.py:476 +msgid "Audio formats" +msgstr "Ses formatları" + +#: youtube_dl_gui/optionsframe.py:479 +msgid "Post-Process options" +msgstr "İşlem Sonrası Opsiyonları" + +#: youtube_dl_gui/optionsframe.py:480 +msgid "Keep original files" +msgstr "Orijinal dosyaları sakla" + +#: youtube_dl_gui/optionsframe.py:481 +msgid "Extract audio from video file" +msgstr "Video dosyasından ses ayıklayın" + +#: youtube_dl_gui/optionsframe.py:482 +msgid "Embed thumbnail in audio file" +msgstr "Ses dosyasına küçük resim yerleştir" + +#: youtube_dl_gui/optionsframe.py:483 +msgid "Add metadata to file" +msgstr "Dosyaya meta veri ekle" + +#: youtube_dl_gui/optionsframe.py:485 +msgid "Audio quality" +msgstr "Ses kalitesi" + +#: youtube_dl_gui/optionsframe.py:543 +msgid "English" +msgstr "İngilizce" + +#: youtube_dl_gui/optionsframe.py:544 +msgid "French" +msgstr "Fransızca" + +#: youtube_dl_gui/optionsframe.py:545 +msgid "German" +msgstr "Almanca" + +#: youtube_dl_gui/optionsframe.py:546 +msgid "Greek" +msgstr "Yunanca" + +#: youtube_dl_gui/optionsframe.py:547 +msgid "Hebrew" +msgstr "İbranice" + +#: youtube_dl_gui/optionsframe.py:548 +msgid "Italian" +msgstr "İtalyanca" + +#: youtube_dl_gui/optionsframe.py:549 +msgid "Portuguese" +msgstr "Portekizce" + +#: youtube_dl_gui/optionsframe.py:550 +msgid "Russian" +msgstr "Rusça" + +#: youtube_dl_gui/optionsframe.py:551 +msgid "Spanish" +msgstr "İspanyolca" + +#: youtube_dl_gui/optionsframe.py:552 +msgid "Swedish" +msgstr "İsveççe" + +#: youtube_dl_gui/optionsframe.py:553 +msgid "Turkish" +msgstr "Türkçe" + +#: youtube_dl_gui/optionsframe.py:569 +msgid "None" +msgstr "Hiçbiri" + +#: youtube_dl_gui/optionsframe.py:570 +msgid "Automatic subtitles (YOUTUBE ONLY)" +msgstr "Otomatik altyazılar (SADECE YOUTUBE)" + +#: youtube_dl_gui/optionsframe.py:571 +msgid "All available subtitles" +msgstr "Tüm mevcut altyazılar" + +#: youtube_dl_gui/optionsframe.py:572 +msgid "Subtitles by language" +msgstr "Dile göre altyazılar" + +#: youtube_dl_gui/optionsframe.py:578 +msgid "Subtitles" +msgstr "Altyazılar" + +#: youtube_dl_gui/optionsframe.py:582 +msgid "Subtitles options" +msgstr "Altyazı seçenekleri" + +#: youtube_dl_gui/optionsframe.py:583 +msgid "Embed subtitles into video file (mp4 ONLY)" +msgstr "Altyazıları video dosyasına gömün (SADECE mp4)" + +#: youtube_dl_gui/optionsframe.py:585 +msgid "Playlist" +msgstr "Oynatma Listesi" + +#: youtube_dl_gui/optionsframe.py:591 youtube_dl_gui/optionsframe.py:596 +msgid "Max" +msgstr "En çok" + +#: youtube_dl_gui/optionsframe.py:594 +msgid "Filesize" +msgstr "Dosya boyutu" + +#: youtube_dl_gui/optionsframe.py:599 +msgid "Min" +msgstr "En az" + +#: youtube_dl_gui/optionsframe.py:728 +msgid "Retries" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:731 +msgid "Authentication" +msgstr "Doğrulama" + +#: youtube_dl_gui/optionsframe.py:733 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: youtube_dl_gui/optionsframe.py:735 +msgid "Password" +msgstr "Parola" + +#: youtube_dl_gui/optionsframe.py:737 +msgid "Video password" +msgstr "Video parolası" + +#: youtube_dl_gui/optionsframe.py:740 +msgid "Network" +msgstr "Ağ" + +#: youtube_dl_gui/optionsframe.py:742 +msgid "Proxy" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:744 +msgid "User agent" +msgstr "Kullanıcı aracı" + +#: youtube_dl_gui/optionsframe.py:746 +msgid "Referer" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:749 +msgid "Logging" +msgstr "Günlük" + +#: youtube_dl_gui/optionsframe.py:751 +msgid "Enable log" +msgstr "Günlük Aktif" + +#: youtube_dl_gui/optionsframe.py:752 +msgid "View" +msgstr "Görünüm" + +#: youtube_dl_gui/optionsframe.py:753 +msgid "Clear" +msgstr "Temizle" + +#: youtube_dl_gui/optionsframe.py:863 +msgid "Youtube-dl command line options (e.g. --help)" +msgstr "Youtube-dl komut satırı seçenekleri (ör. --help)" + +#: youtube_dl_gui/optionsframe.py:866 +msgid "Extra options" +msgstr "Diğer ayarlar" + +#: youtube_dl_gui/optionsframe.py:868 +msgid "Debug youtube-dl" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:869 +msgid "Ignore errors" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:870 +msgid "Ignore youtube-dl config" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:871 +msgid "No mtime" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:872 +msgid "Prefer native HLS" +msgstr "" + +#: youtube_dl_gui/optionsframe.py:933 +msgid "Log Viewer" +msgstr "Günlük gösterici" diff --git a/talimatname/genel/y/youtube-dl/talimat b/talimatname/genel/y/youtube-dl/talimat new file mode 100644 index 000000000..5a4a334ac --- /dev/null +++ b/talimatname/genel/y/youtube-dl/talimat @@ -0,0 +1,20 @@ +# Tanım: YouTube.com'dan ve birkaç başka siteden videolar indirmek için küçük bir program +# URL: http://rg3.github.io/youtube-dl/ +# Paketçi: Cihan_Alkan +# Gerekler: python python-setuptools +# Grup: medya + +isim=youtube-dl +surum=2017.12.31 +devir=1 +kaynak=(https://github.com/rg3/youtube-dl/archive/$surum.tar.gz::${isim}-${surum}.tar.gz + https://github.com/rst0git/youtube-dl-mp3/raw/master/youtube-dl-mp3) + +derle() { + cd youtube-dl-$surum + sed -i 's|etc/bash_completion.d|share/bash-completion/completions|' setup.py + sed -i 's|etc/fish/completions|share/fish/completions|' setup.py + python setup.py install --root="${PKG}/" --optimize=1 + install -Dm755 ../youtube-dl-mp3 "${PKG}/usr/bin/youtube-dl-mp3" + rm -rf $PKG/usr/share +} diff --git a/talimatname/genel/y/youtube-viewer/gtk-youtube-viewer.desktop b/talimatname/genel/y/youtube-viewer/gtk-youtube-viewer.desktop new file mode 100644 index 000000000..23fa4548e --- /dev/null +++ b/talimatname/genel/y/youtube-viewer/gtk-youtube-viewer.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=GTK Youtube Viewer +Version=1.0 +Comment=MPlayer ile YouTube videolarını arayın ve oynatın. +Exec=gtk-youtube-viewer +Icon=gtk-youtube-viewer +StartupNotify=false +Terminal=false +Type=Application +Categories=AudioVideo; diff --git a/talimatname/genel/y/youtube-viewer/talimat b/talimatname/genel/y/youtube-viewer/talimat new file mode 100644 index 000000000..cf95516af --- /dev/null +++ b/talimatname/genel/y/youtube-viewer/talimat @@ -0,0 +1,19 @@ +# Tanım: YouTube videolarını izlemek için komut satırı yardımcı programı +# URL: https://github.com/trizen/youtube-viewer +# Paketçi: Cihan_Alkan +# Gerekler: perl-data-dump perl-json perl-lwp-protocol-https perl-libwww perl-module-build gtk2-perl perl-try-tiny perl-class-inspector perl-file-sharedir +# Grup: medya + +isim=youtube-viewer +surum=3.3.3 +devir=1 +kaynak=(https://github.com/trizen/youtube-viewer/archive/3.3.3.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd "$isim-$surum" + perl Build.PL --destdir "$PKG" --installdirs vendor --gtk + ./Build install --install_path script=/usr/bin + install -Dm 644 "$SRC/gtk-youtube-viewer.desktop" "$PKG/usr/share/applications/gtk-youtube-viewer.desktop" + install -Dm 644 "share/icons/gtk-youtube-viewer.png" "$PKG/usr/share/pixmaps/gtk-youtube-viewer.png" +} diff --git a/talimatname/genel/y/yubico-c-client/talimat b/talimatname/genel/y/yubico-c-client/talimat new file mode 100644 index 000000000..97300f782 --- /dev/null +++ b/talimatname/genel/y/yubico-c-client/talimat @@ -0,0 +1,18 @@ +# Tanım: Yubico icin C dili kutuphaneleri +# URL: http://www.yubico.com/ +# Paketçi: - https://github.com/Yubico/yubico-c-client.git +# Gerekler: libyubikey curl + +isim=yubico-c-client +surum=2.9 +devir=1 + +kaynak=(http://yubico-c-client.googlecode.com/files/ykclient-$surum.tar.gz) +derle() +{ +cd ykclient-$surum +./configure --prefix=/usr +make +make DESTDIR="${PKG}/" install +} + diff --git a/talimatname/genel/z/zarith/talimat b/talimatname/genel/z/zarith/talimat new file mode 100644 index 000000000..afe6dfe34 --- /dev/null +++ b/talimatname/genel/z/zarith/talimat @@ -0,0 +1,22 @@ +# Tanım: Rasgele kesinlikli tamsayılar ve rasyonel sayılar üzerinde aritmetik ve mantıksal işlemleri uygular +# URL: https://github.com/ocaml/Zarith +# Paketçi: Cihan_Alkan +# Gerekler: ocaml-findlib ocaml +# Grup: kütüphane + +isim=zarith +surum=1.7 +devir=1 +kaynak=(https://github.com/ocaml/Zarith/archive/release-${surum}.tar.gz::$isim-$surum.tar.gz) + +derle() { + + cd Zarith-release-${surum} + + ./configure -installdir "${PKG}/usr/lib/ocaml/site-lib/" # install ignores DESTDIR + make + + mkdir -p "${PKG}/usr/lib/ocaml/site-lib" + make OCAMLFIND_DESTDIR="${PKG}$(ocamlfind printconf destdir)" install + +} diff --git a/talimatname/genel/z/zenity/talimat b/talimatname/genel/z/zenity/talimat new file mode 100644 index 000000000..d64e22868 --- /dev/null +++ b/talimatname/genel/z/zenity/talimat @@ -0,0 +1,18 @@ +# Tanım: shell script dosyalari icin dialog pencereleri +# URL: http://www.gnome.org/ +# Paketçi: milisarge +# Gerekler: itstool gtk3 libnotify yelp-tools + +isim=zenity +surum=3.28.1 +devir=1 +kaynak=(https://git.gnome.org/browse/zenity/snapshot/zenity-3.28.1.tar.xz) + +derle() { +cd $isim-$surum + NOCONFIGURE=1 ./autogen.sh +./configure --prefix=/usr --sysconfdir=/etc \ + --localstatedir=/var +make +make DESTDIR=$PKG install +} diff --git a/talimatname/genel/z/zeromq/talimat b/talimatname/genel/z/zeromq/talimat new file mode 100644 index 000000000..73dc603af --- /dev/null +++ b/talimatname/genel/z/zeromq/talimat @@ -0,0 +1,28 @@ +# Tanım: Fast messaging system built on sockets. C and C++ bindings. aka 0MQ, ZMQ. +# URL: http://www.zeromq.org +# Paketçi: milisarge +# Gerekler: asciidoc xmlto libsodium libpgm + +isim=zeromq +surum=4.2.2 +devir=1 +kaynak=(https://github.com/zeromq/libzmq/releases/download/v$surum/$isim-$surum.tar.gz + https://raw.githubusercontent.com/zeromq/cppzmq/b0e6d4b/zmq.hpp::zmq.hpp.4.2.2) + +derle() { + + sed -i 's/libzmq_werror="yes"/libzmq_werror="no"/' $isim-$surum/configure + cp zmq.hpp.$surum zmq.hpp + cd "$SRC/$isim-$surum" + ./configure prefix=/usr --with-pgm --with-libsodium \ + --enable-static + + make + #LANG=C gcc -c ../zmq.hpp -L ./.libs/ -I ./include/ -o ./test.o + #rm -f test.o + #return 0 + #make -k check + make DESTDIR="$PKG" install + install -Dm644 "$SRC/zmq.hpp.4.2.2" "$PKG/usr/include/zmq.hpp" + +} diff --git a/talimatname/genel/z/zig/talimat b/talimatname/genel/z/zig/talimat new file mode 100644 index 000000000..0f01aecd9 --- /dev/null +++ b/talimatname/genel/z/zig/talimat @@ -0,0 +1,35 @@ +# Tanım: sağlamlık, optimallik ve netlik öncelik veren bir programlama dili +# URL: http://ziglang.org +# Paketçi: milisarge +# Gerekler: cmake llvm clang lld + +isim=zig +hesap=zig-lang +surum=0.1 +devir=2 +kaynak=() + +derle() { + + if [ ! -d $DERLEME_KAYNAKDIZIN/$isim ];then + git clone https://github.com/$hesap/$isim $DERLEME_KAYNAKDIZIN/$isim + else + cd $DERLEME_KAYNAKDIZIN/$isim + git pull + cd - + fi + cp -r $DERLEME_KAYNAKDIZIN/$isim $SRC/ + cd $SRC/$isim + + mkdir -p build + cd build + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DZIG_LIBC_LIB_DIR=$(dirname $(cc -print-file-isim=crt1.o)) \ + -DZIG_LIBC_INCLUDE_DIR=$(echo -n | cc -E -x c - -v 2>&1 | grep -B1 "End of search list." | head -n1 | cut -c 2- | sed "s/ .*//") \ + -DZIG_LIBC_STATIC_LIB_DIR=$(dirname $(cc -print-file-isim=crtbegin.o)) + + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/genel/z/zile/talimat b/talimatname/genel/z/zile/talimat new file mode 100644 index 000000000..8d56d8551 --- /dev/null +++ b/talimatname/genel/z/zile/talimat @@ -0,0 +1,18 @@ +# Tanım: Zile metin düzenleyici +# URL: http://zile.sf.net +# Paketçi: milisarge +# Gerekler: gc help2man + +isim=zile +surum=2.4.13 +devir=1 +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() +{ + cd $isim-$surum + ./configure --prefix=/usr + find -name Makefile | xargs -n1 sed -i 's|makeinfo|true|g' + make + make DESTDIR=$PKG install +} diff --git a/talimatname/genel/z/zim/talimat b/talimatname/genel/z/zim/talimat new file mode 100644 index 000000000..091e3d8a4 --- /dev/null +++ b/talimatname/genel/z/zim/talimat @@ -0,0 +1,19 @@ +# Tanım: Wiki kavramını masaüstüne getirmeyi amaçlayan bir WYSIWYG metin editörü. +# URL: http://zim-wiki.org/ +# Paketçi: Cihan Alkan +# Gerekler: python-gtk dejavu-ttf + +isim=zim +surum=0.67 +devir=1 + +kaynak=(http://zim-wiki.org/downloads/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + for file in zim/inc/xdot.py; do + sed -i 's_#!/usr/bin/env python_#!/usr/bin/env python2_' $file + done + sed -i 's|\t\tinstall_class.run(self)|&\n\t\treturn None|' setup.py + python2 setup.py install --root=$PKG --optimize=1 +} diff --git a/talimatname/genel/z/zim/zim.kur-kos b/talimatname/genel/z/zim/zim.kur-kos new file mode 100644 index 000000000..1c7a0f8d7 --- /dev/null +++ b/talimatname/genel/z/zim/zim.kur-kos @@ -0,0 +1,6 @@ +if [ -x /usr/bin/update-desktop-database ]; then + /usr/bin/update-desktop-database -q /usr/share/applications >/dev/null 2>&1 +fi +if [ -x /usr/bin/update-mime-database ]; then + /usr/bin/update-mime-database /usr/share/mime >/dev/null 2>&1 +fi diff --git a/talimatname/genel/z/zimg/talimat b/talimatname/genel/z/zimg/talimat new file mode 100644 index 000000000..a9ea71470 --- /dev/null +++ b/talimatname/genel/z/zimg/talimat @@ -0,0 +1,22 @@ +# Tanım: Ölçeklendirme, renk aralığı dönüşümleri ve renk tezgahı kütüphanesi +# URL: http://forum.doom9.org/showthread.php?t=171334 +# Paketçi: milisarge +# Gerekler: +# Grup: kütüphane + +isim=zimg +surum=2.7.3 +devir=1 +kaynak=(https://github.com/sekrit-twc/zimg/archive/release-$surum.tar.gz) + +derle() { + cd zimg-release-${surum} + + ./autogen.sh + ./configure \ + --prefix='/usr' \ + --enable-x86simd \ + --disable-static + make + make DESTDIR="${PKG}" install +} diff --git a/talimatname/genel/z/zip/talimat b/talimatname/genel/z/zip/talimat new file mode 100644 index 000000000..3c90163df --- /dev/null +++ b/talimatname/genel/z/zip/talimat @@ -0,0 +1,16 @@ +# Tanım: PKZIP uyumlu .zip dosyalari yaratir +# URL: http://infozip.sourceforge.net/Zip.html +# Paketçi: milisarge +# Gerekler: + +isim=zip +surum=3.0 +devir=1 +kaynak=( http://downloads.sourceforge.net/infozip/zip30.tar.gz) + +derle() { + cd ${isim}30 + make -f unix/Makefile prefix=/usr generic_gcc + make prefix=$PKG/usr MANDIR=$PKG/usr/share/man/man1 -f unix/Makefile install + +} diff --git a/talimatname/genel/z/zsh/talimat b/talimatname/genel/z/zsh/talimat new file mode 100644 index 000000000..73c5a1c15 --- /dev/null +++ b/talimatname/genel/z/zsh/talimat @@ -0,0 +1,42 @@ +# Tanım: UNIX için programlanabilir zsh komut arayüzü +# URL: http://www.zsh.org +# Paketçi: milisarge +# Gerekler: pcre +# Grup: sistem + +isim=zsh +surum=5.4.2 +devir=1 +kaynak=(http://www.zsh.org/pub/$isim-$surum.tar.gz) + +derle(){ + cd $isim-$surum + ./configure \ + --prefix=/usr \ + --enable-etcdir=/etc/zsh \ + --enable-zshrc=/etc/zsh/zshrc \ + --enable-zlogin=/etc/zsh/zshlogin \ + --enable-zshenv=/etc/zsh/zshenv \ + --enable-fndir=/usr/share/zsh/$version/functions \ + --enable-site-fndir=/usr/share/zsh/site-functions \ + --enable-maildir-support \ + --enable-function-subdirs \ + --enable-pcre \ + --enable-restricted-r \ + --enable-cap + make + + # fix a bug in recent glibc versions (2.16) + sed -e '/#include "attr.mdh"/d;/#include "attr.pro/d' \ + -e 's|\(#include \)|\1\n#include "attr.mdh"\n#include "attr.pro"|g' \ + -i Src/Modules/attr.c + + make + make DESTDIR=$PKG install + install -d $PKG/bin + ln -s /usr/bin/zsh $PKG/bin + +} + + + diff --git a/talimatname/genel/z/zsh/zsh.kur-kos b/talimatname/genel/z/zsh/zsh.kur-kos new file mode 100644 index 000000000..06542dc50 --- /dev/null +++ b/talimatname/genel/z/zsh/zsh.kur-kos @@ -0,0 +1,3 @@ +cat >> /etc/shells << EOF +/bin/zsh +EOF diff --git a/talimatname/genel/z/zzuf/talimat b/talimatname/genel/z/zzuf/talimat new file mode 100644 index 000000000..06bcb3728 --- /dev/null +++ b/talimatname/genel/z/zzuf/talimat @@ -0,0 +1,17 @@ +# Tanım: Uygulama girdi testi (fuzzing) aracı. +# URL: http://sam.zoy.org/zzuf/ +# Paketçi: yakar (aydin@komutan.org) +# Gerekler: + +isim=zzuf +surum=0.15 +devir=1 +kaynak=(https://github.com/samhocevar/$isim/archive/v$surum.tar.gz) + +derle() { + cd "$SRC/zzuf-$surum" + sh bootstrap + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} diff --git a/talimatname/temel/acl/talimat b/talimatname/temel/acl/talimat new file mode 100644 index 000000000..6a3cef8de --- /dev/null +++ b/talimatname/temel/acl/talimat @@ -0,0 +1,33 @@ +# Tanım: POSIX Erişim Kontrol Listelerini Yönetme Komutları +# URL: http://savannah.nongnu.org/projects/acl +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=acl +surum=2.2.52 +devir=1 + +kaynak=( http://download.savannah.gnu.org/releases/$isim/$isim-$surum.src.tar.gz) + +derle() { +cd acl-* + +sed -i -e 's|/@pkg_name@|&-@pkg_version@|' \ +include/builddefs.in + +sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);" \ +libacl/__acl_to_any_text.c + +INSTALL_USER=root \ +INSTALL_GROUP=root \ +./configure --prefix=/usr --libexecdir=/usr/lib \ +--bindir=/bin +make +make DIST_ROOT=$PKG install install-lib install-dev +chmod -v 755 $PKG/usr/lib/libacl.so +mkdir $PKG/lib +mv -v $PKG/usr/lib/libacl.so.* $PKG/lib +ln -sfv ../../lib/libacl.so.1 \ +$PKG/usr/lib/libacl.so +} diff --git a/talimatname/temel/attr/talimat b/talimatname/temel/attr/talimat new file mode 100644 index 000000000..89cae9b8f --- /dev/null +++ b/talimatname/temel/attr/talimat @@ -0,0 +1,31 @@ +# Tanım: Genişletilmiş öznitelikleri dosya sistemi nesneleri üzerinde yönetmek için kullanılan yardımcı programlar +# URL: http://savannah.nongnu.org/projects/attr +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=attr +surum=2.4.47 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/$isim/$isim-$surum.src.tar.gz) + +derle() { +cd attr-$surum + +sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in + +INSTALL_USER=root \ +INSTALL_GROUP=root \ +./configure --prefix=/usr \ +--bindir=/bin +make +make DIST_ROOT=$PKG install install-lib install-dev +chmod -v 755 $PKG/usr/lib/libattr.so +mkdir $PKG/lib +mv -v $PKG/usr/lib/libattr.so.* $PKG/lib +ln -sfv ../../lib/libattr.so.1 $PKG/usr/lib/libattr.so +rm -r $PKG/usr/share/man/man2 +rm -r $PKG/usr/share/doc +} + diff --git a/talimatname/temel/autoconf/talimat b/talimatname/temel/autoconf/talimat new file mode 100644 index 000000000..cd9b5123e --- /dev/null +++ b/talimatname/temel/autoconf/talimat @@ -0,0 +1,19 @@ +# Tanım: Kaynak kodunu otomatik olarak yapılandırabilen kabuk komut dizileri üretmek için. +# URL: http://www.gnu.org/software/autoconf/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=autoconf +surum=2.69 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/autoconf/autoconf-$surum.tar.xz) +derle() +{ +cd autoconf-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/automake/talimat b/talimatname/temel/automake/talimat new file mode 100644 index 000000000..4a4a4967c --- /dev/null +++ b/talimatname/temel/automake/talimat @@ -0,0 +1,20 @@ +# Tanım: Autoconf ile kullanılacak Makefile'leri üretmek için programlar içerir. +# URL: http://www.gnu.org/software/automake/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=automake +surum=1.15 +devir=2 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) +derle() { +cd automake-$surum +sed -i 's:/\\\${:/\\\$\\{:' bin/automake.in +./configure --prefix=/usr \ +--docdir=$PKG/usr/share/doc/automake-$surum +make +make prefix=$PKG/usr install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/bash/talimat b/talimatname/temel/bash/talimat new file mode 100644 index 000000000..a11af467b --- /dev/null +++ b/talimatname/temel/bash/talimat @@ -0,0 +1,28 @@ +# Tanım: Bash paketi Bourne-Again SHell'i içeriyor. +# Url: http://ftp.gnu.org/gnu/bash/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=bash +surum=4.3.30 +devir=3 + +kaynak=(http://ftp.gnu.org/gnu/bash/bash-$surum.tar.gz + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-upstream_fixes-2.patch) + +derle() +{ +cd bash-$surum +patch -Np1 -i ../$isim-$surum-upstream_fixes-2.patch +./configure --prefix=/usr --bindir=/bin \ +--htmldir=/usr/share/doc/bash-$surum --without-bash-malloc \ +--with-installed-readline +make + +make DESTDIR=$PKG install + +rm -rf $PKG/usr/share/info/dir + +ln -s bash $PKG/bin/sh +} diff --git a/talimatname/temel/bc/talimat b/talimatname/temel/bc/talimat new file mode 100755 index 000000000..ca054cefe --- /dev/null +++ b/talimatname/temel/bc/talimat @@ -0,0 +1,24 @@ +# Tanım: Bc paketi rasgele sayısal işleme dili içerir. +# URL: http://ftp.gnu.org/gnu/bc/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=bc +surum=1.06.95 +devir=1 + +kaynak=(http://alpha.gnu.org/gnu/$isim/$isim-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-memory_leak-1.patch) + +derle() { + cd $isim-$surum + patch -Np1 -i ../$isim-$surum-memory_leak-1.patch + ./configure --prefix=/usr --bindir=/bin \ + --with-readline \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/binutils/talimat b/talimatname/temel/binutils/talimat new file mode 100644 index 000000000..e3f3f044c --- /dev/null +++ b/talimatname/temel/binutils/talimat @@ -0,0 +1,50 @@ +# Tanım: Bağlayıcı, assembler ve nesne dosyalarını işlemek için kullanılan diğer araçlar. +# URL: http://sources.redhat.com/binutils/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=binutils +surum=2.26 +devir=3 + +kaynak=(http://ftp.gnu.org/gnu/binutils/binutils-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/downloads/binutils//binutils-$surum-upstream_fix-1.patch + http://www.linuxfromscratch.org/patches/downloads/binutils//binutils-$surum-upstream_fix-2.patch) + +derle() { + cd binutils-$surum + + patch -Np1 -i ../binutils-$surum-upstream_fix-1.patch + patch -Np1 -i ../binutils-$surum-upstream_fix-2.patch + + mkdir -v build + cd build + + ../configure \ + --prefix=/usr --includedir=/usr/include \ + --bindir=/bin --sbindir=/sbin \ + --datarootdir=/usr/share \ + --enable-shared --disable-werror + + make tooldir=/ + + # make LDFLAGS="" -k check || true + + # make tooldir=/usr DESTDIR=$PKG install + make tooldir=/usr DESTDIR=$PKG install + + rm -rf $PKG/usr/share/info/dir + rm $PKG/usr/share/man/man1/{dlltool,nlmconv,windres,windmc}.1 + mkdir $PKG/lib + for lib in libopcodes libbfd + do + mv $PKG/usr/lib/$lib-$surum.20160125.so \ + $PKG/lib/$lib-$surum.so + ln -s $lib-$surum.so $PKG/lib/$lib + ln -s ../../lib/$lib-$surum.20160125.so \ + $PKG/usr/lib/$lib-$surum.so + ln -s ../../lib/$lib-$surum.so \ + $PKG/usr/lib/$lib + done +} diff --git a/talimatname/temel/bison/talimat b/talimatname/temel/bison/talimat new file mode 100644 index 000000000..ab02568ba --- /dev/null +++ b/talimatname/temel/bison/talimat @@ -0,0 +1,22 @@ +# Tanım: Bison paketi bir ayrıştırıcı üreteci içerir +# URL: http://www.gnu.org/software/bison/ +# Paketçi: milisarge +# Gerekler: +# Grup: temel + +isim=bison +surum=3.0.4 +devir=2 + +kaynak=(http://ftp.gnu.org/gnu/bison/bison-$surum.tar.xz) + +derle(){ + cd bison-$surum + ./configure --prefix=/usr \ + --docdir=/usr/share/doc/$isim-$surum + make + make check||true + make DESTDIR=$PKG install + rm -r $PKG/usr/share/info $PKG/usr/share/doc/ + rm $PKG/usr/share/bison/README +} diff --git a/talimatname/temel/bzip2/talimat b/talimatname/temel/bzip2/talimat new file mode 100644 index 000000000..39a3e4c25 --- /dev/null +++ b/talimatname/temel/bzip2/talimat @@ -0,0 +1,51 @@ +# Tanım: Dosyaları sıkıştırma ve açma programları. +# URL: http://www.bzip.org/ +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=bzip2 +surum=1.0.6 +devir=1 + +kaynak=(http://www.bzip.org/$surum/bzip2-$surum.tar.gz \ + http://www.linuxfromscratch.org/patches/lfs/development/bzip2-$surum-install_docs-1.patch) + +derle() { + cd bzip2-$surum + + patch -Np1 -i ../bzip2-$surum-install_docs-1.patch + sed -i 's@\(ln -s -f \)/bin/@\1@' Makefile + sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile + + make -f Makefile-libbz2_so + make clean + + make + + make PREFIX=$PKG/usr install + + mkdir -pv $PKG/{bin,lib} + cp -v bzip2-shared $PKG/bin/bzip2 + cp -av libbz2.so* $PKG/lib + ln -sv ../../lib/libbz2.so.1.0 $PKG/usr/lib/libbz2.so + rm -v $PKG/usr/bin/{bunzip2,bzcat,bzip2} + mv -v $PKG/usr/bin/* \ + $PKG/bin + for i in bzegrep bzfgrep + do + ln -svf bzgrep $PKG/bin/$i + done + for i in bunzip2 bzcat + do + ln -svf bzip2 $PKG/bin/$i + done + for i in bzless + do + ln -svf bzmore $PKG/bin/$i + done + for i in bzcmp + do + ln -svf bzdiff $PKG/bin/$i + done +} diff --git a/talimatname/temel/ca-certificates/ca-certificates.kos-kur b/talimatname/temel/ca-certificates/ca-certificates.kos-kur new file mode 100644 index 000000000..1041b7403 --- /dev/null +++ b/talimatname/temel/ca-certificates/ca-certificates.kos-kur @@ -0,0 +1,5 @@ +if [ -f etc/ssl/ca-bundle.crt ]; then + rm etc/ssl/ca-bundle.crt + rm etc/ssl/certs/*.0 + rm etc/ssl/certs/*.pem +fi diff --git a/talimatname/temel/ca-certificates/ca-certificates.okubeni b/talimatname/temel/ca-certificates/ca-certificates.okubeni new file mode 100644 index 000000000..438fe8d0d --- /dev/null +++ b/talimatname/temel/ca-certificates/ca-certificates.okubeni @@ -0,0 +1,22 @@ +Si vous souhaitez faire une mise à jour manuelle des certificats, voici la procédure: + +certhost='http://mxr.mozilla.org' +certdir='/mozilla/source/security/nss/lib/ckfw/builtins' +url="$certhost$certdir/certdata.txt?raw=1" + +wget --output-document certdata.txt $url +unset certhost certdir url +make-ca.sh +remove-expired-certs.sh certs + +SSLDIR=/etc/ssl +if [ ! -d ${SSLDIR}/certs ]; then + install -d ${SSLDIR}/certs +fi +cp -v certs/*.pem ${SSLDIR}/certs +c_rehash +install BLFS-ca-bundle*.crt ${SSLDIR}/ca-bundle.crt +unset SSLDIR + +rm -rf certs +rm -r certdata.txt BLFS-ca-bundle* diff --git a/talimatname/temel/ca-certificates/talimat b/talimatname/temel/ca-certificates/talimat new file mode 100755 index 000000000..b833abdbc --- /dev/null +++ b/talimatname/temel/ca-certificates/talimat @@ -0,0 +1,231 @@ +# Tanım: Sertifika Yetki belgeleri, Ortak Anahtar Altyapısı. +# URL: http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=ca-certificates +surum=20160110 +devir=1 + +kaynak=(http://downloads.nutyx.org/files/$isim-$surum.tar.gz) + +derle() { + +mkdir -p $PKG/{bin,etc/ssl} +cp $SRC/ca-bundle.crt $PKG/etc/ssl/ +cp -a $SRC/certs $PKG/etc/ssl/certs + +# script to reformat a certificate into a form needed by openssl. +cat > $PKG/bin/make-cert.pl << "EOF" +#!/usr/bin/perl -w + +# Used to generate PEM encoded files from Mozilla certdata.txt. +# Run as ./mkcrt.pl > certificate.crt +# +# Parts of this script courtesy of RedHat (mkcabundle.pl) +# +# This script modified for use with single file data (tempfile.cer) extracted +# from certdata.txt, taken from the latest version in the Mozilla NSS source. +# mozilla/security/nss/lib/ckfw/builtins/certdata.txt +# +# Authors: DJ Lucas +# Bruce Dubbs +# +# Version 20120211 + +my $certdata = './tempfile.cer'; + +open( IN, "cat $certdata|" ) + || die "could not open $certdata"; + +my $incert = 0; + +while ( ) +{ + if ( /^CKA_VALUE MULTILINE_OCTAL/ ) + { + $incert = 1; + open( OUT, "|openssl x509 -text -inform DER -fingerprint" ) + || die "could not pipe to openssl x509"; + } + + elsif ( /^END/ && $incert ) + { + close( OUT ); + $incert = 0; + print "\n\n"; + } + + elsif ($incert) + { + my @bs = split( /\\/ ); + foreach my $b (@bs) + { + chomp $b; + printf( OUT "%c", oct($b) ) unless $b eq ''; + } + } +} +EOF +chmod +x $PKG/bin/make-cert.pl +# script to creates the certificates and a bundle of all the certificates. +cat > $PKG/bin/make-ca.sh << "EOF" +#!/bin/bash +# Begin make-ca.sh +# Script to populate OpenSSL's CApath from a bundle of PEM formatted CAs +# +# The file certdata.txt must exist in the local directory +# Version number is obtained from the version of the data. +# +# Authors: DJ Lucas +# Bruce Dubbs +# +# Version 20120211 + +certdata="certdata.txt" + +if [ ! -r $certdata ]; then + echo "$certdata must be in the local directory" + exit 1 +fi + +REVISION=$(grep CVS_ID $certdata | cut -f4 -d'$') + +if [ -z "${REVISION}" ]; then + echo "$certfile has no 'Revision' in CVS_ID" + exit 1 +fi + +VERSION=$(echo $REVISION | cut -f2 -d" ") + +TEMPDIR=$(mktemp -d) +TRUSTATTRIBUTES="CKA_TRUST_SERVER_AUTH" +BUNDLE="BLFS-ca-bundle-${VERSION}.crt" +CONVERTSCRIPT="/bin/make-cert.pl" +SSLDIR="/etc/ssl" + +mkdir "${TEMPDIR}/certs" + +# Get a list of staring lines for each cert +CERTBEGINLIST=$(grep -n "^# Certificate" "${certdata}" | cut -d ":" -f1) + +# Get a list of ending lines for each cert +CERTENDLIST=`grep -n "^CKA_TRUST_STEP_UP_APPROVED" "${certdata}" | cut -d ":" -f 1` + +# Start a loop +for certbegin in ${CERTBEGINLIST}; do + for certend in ${CERTENDLIST}; do + if test "${certend}" -gt "${certbegin}"; then + break + fi + done + + # Dump to a temp file with the name of the file as the beginning line number + sed -n "${certbegin},${certend}p" "${certdata}" > "${TEMPDIR}/certs/${certbegin}.tmp" +done + +unset CERTBEGINLIST CERTDATA CERTENDLIST certebegin certend + +mkdir -p certs +rm certs/* # Make sure the directory is clean + +for tempfile in ${TEMPDIR}/certs/*.tmp; do + # Make sure that the cert is trusted... + grep "CKA_TRUST_SERVER_AUTH" "${tempfile}" | \ + egrep "TRUST_UNKNOWN|NOT_TRUSTED" > /dev/null + + if test "${?}" = "0"; then + # Throw a meaningful error and remove the file + cp "${tempfile}" tempfile.cer + perl ${CONVERTSCRIPT} > tempfile.crt + keyhash=$(openssl x509 -noout -in tempfile.crt -hash) + echo "Certificate ${keyhash} is not trusted! Removing..." + rm -f tempfile.cer tempfile.crt "${tempfile}" + continue + fi + + # If execution made it to here in the loop, the temp cert is trusted + # Find the cert data and generate a cert file for it + + cp "${tempfile}" tempfile.cer + perl ${CONVERTSCRIPT} > tempfile.crt + keyhash=$(openssl x509 -noout -in tempfile.crt -hash) + mv tempfile.crt "certs/${keyhash}.pem" + rm -f tempfile.cer "${tempfile}" + echo "Created ${keyhash}.pem" +done + +# Remove blacklisted files +# MD5 Collision Proof of Concept CA +if test -f certs/8f111d69.pem; then + echo "Certificate 8f111d69 is not trusted! Removing..." + rm -f certs/8f111d69.pem +fi + +# Finally, generate the bundle and clean up. +cat certs/*.pem > ${BUNDLE} +rm -r "${TEMPDIR}" +EOF + +chmod +x $PKG/bin/make-ca.sh + +# script to remove expired certificates from a directory +cat > $PKG/bin/remove-expired-certs.sh << "EOF" +#!/bin/bash +# Begin /bin/remove-expired-certs.sh +# +# Version 20120211 + +# Make sure the date is parsed correctly on all systems +function mydate() +{ + local y=$( echo $1 | cut -d" " -f4 ) + local M=$( echo $1 | cut -d" " -f1 ) + local d=$( echo $1 | cut -d" " -f2 ) + local m + + if [ ${d} -lt 10 ]; then d="0${d}"; fi + + case $M in + Jan) m="01";; + Feb) m="02";; + Mar) m="03";; + Apr) m="04";; + May) m="05";; + Jun) m="06";; + Jul) m="07";; + Aug) m="08";; + Sep) m="09";; + Oct) m="10";; + Nov) m="11";; + Dec) m="12";; + esac + + certdate="${y}${m}${d}" +} + +OPENSSL="`which openssl`" +DIR=/etc/ssl/certs + +if [ $# -gt 0 ]; then + DIR="$1" +fi + +certs=$( find ${DIR} -type f -name "*.pem" -o -name "*.crt" ) +today=$( date +%Y%m%d ) + +for cert in $certs; do + notafter=$( $OPENSSL x509 -enddate -in "${cert}" -noout ) + date=$( echo ${notafter} | sed 's/^notAfter=//' ) + mydate "$date" + + if [ ${certdate} -lt ${today} ]; then + echo "${cert} expired on ${certdate}! Removing..." + rm -f "${cert}" + fi +done +EOF + +chmod +x $PKG/bin/remove-expired-certs.sh +} diff --git a/talimatname/temel/coreutils/talimat b/talimatname/temel/coreutils/talimat new file mode 100644 index 000000000..fed7ccac7 --- /dev/null +++ b/talimatname/temel/coreutils/talimat @@ -0,0 +1,49 @@ +# Tanım: Temel sistem özelliklerini göstermek ve ayarlamak için kullanılan yardımcı programlar +# URL: http://www.gnu.org/software/coreutils/ +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=coreutils +surum=8.25 +devir=2 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-i18n-2.patch) + +derle() { +cd $isim-$surum + +patch -Np1 -i ../$isim-$surum-i18n-2.patch + +FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr \ +--libexecdir=/lib --bindir=/bin --sbindir=/sbin \ +--enable-no-install-program=kill,uptime + +FORCE_UNSAFE_CONFIGURE=1 make || FORCE_UNSAFE_CONFIGURE=1 make -j1 +if [ -f /tools/bin/su ];then + make NON_ROOT_USERNAME=nobody check-root + + echo "dummy:x:1000:nobody" >> /etc/group + chown -Rv nobody . + + su-tools nobody -s /bin/bash -c "make -k RUN_EXPENSIVE_TESTS=yes check"||true + + sed -i '/dummy/d' /etc/group +fi +make DESTDIR=$PKG install + +mkdir $PKG/sbin +mkdir -p $PKG/usr/share/man/man8 + +mv -v $PKG/bin/chroot $PKG/sbin + +mv -v $PKG/usr/share/man/man1/chroot.1 $PKG/usr/share/man/man8/chroot.8 +sed -i s/\"1\"/\"8\"/1 $PKG/usr/share/man/man8/chroot.8 + +rm -rf $PKG/usr/share/info/dir + +mkdir -p $PKG/usr/bin +mv $PKG/bin/env $PKG/usr/bin +mv $PKG/bin/install $PKG/usr/bin +} diff --git a/talimatname/temel/cpio/talimat b/talimatname/temel/cpio/talimat new file mode 100644 index 000000000..426c34b0b --- /dev/null +++ b/talimatname/temel/cpio/talimat @@ -0,0 +1,29 @@ +# Tanım: Dosyaları bir cpio veya tar arşivinin içine veya dışına kopyalar. +# URL: http://www.gnu.org/software/cpio/ +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=cpio +surum=2.11 +devir=1 + +kaynak=( http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.bz2) + +derle() { + cd $isim-$surum + sed -i -e '/gets is a/d' gnu/stdio.in.h + ./configure \ + --prefix=/usr \ + --bindir=/bin \ + --libexecdir=/tmp \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --enable-mt --with-rmt=/usr/sbin/rmt + make + make DESTDIR=$PKG install + if [ -f $PKG/usr/share/info/dir ]; then + rm $PKG/usr/share/info/dir + fi + rm -r $PKG/tmp +} diff --git a/talimatname/temel/curl/talimat b/talimatname/temel/curl/talimat new file mode 100644 index 000000000..3d0614491 --- /dev/null +++ b/talimatname/temel/curl/talimat @@ -0,0 +1,46 @@ +# Tanım: Utility for transferring files with URL syntax to many protocols +# URL: http://curl.haxx.se/ +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=curl +surum=7.47.1 +devir=1 + +kaynak=(http://curl.haxx.se/download/$isim-$surum.tar.lzma) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --bindir=/bin \ + --with-ca-path=/etc/ssl/certs \ + --enable-threaded-resolver + make + make DESTDIR=$PKG install + + find docs \( -name Makefile\* \ + -o -name \*.1 \ + -o -name \*.3 \) \ + -exec rm {} \; + + install -v -d -m755 $PKG/usr/share/doc/curl-$surum + cp -v -R docs/* \ + $PKG/usr/share/doc/curl-$surum + + # reorganise the libs + mkdir $PKG/lib + mv $PKG/usr/lib/libcurl.so.4.4.0 \ + $PKG/lib/ + for LIB in libcurl.so{,.4} + do + ln -sv libcurl.so.4.4.0 $PKG/lib/$LIB + rm $PKG/usr/lib/$LIB + ln -sv ../../lib/libcurl.so.4.4.0 \ + $PKG/usr/lib/$LIB + done + + ln -sv ../../lib/libcurl.so.4.4.0 \ + $PKG/usr/lib/libcurl.so.4.4.0 + +} diff --git a/talimatname/temel/derleme.sira b/talimatname/temel/derleme.sira new file mode 100644 index 000000000..05c43cc5a --- /dev/null +++ b/talimatname/temel/derleme.sira @@ -0,0 +1,79 @@ +glibc +tzdata +zlib +file +binutils +gmp +mpfr +mpc +gcc +bzip2 +pkg-config +ncurses +attr +acl +sed +psmisc +procps-ng +e2fsprogs +iana-etc +m4 +bison +flex +grep +readline +bash +bc +libtool +gdbm +expat +inetutils +perl +autoconf +automake +coreutils +diffutils +gawk +findutils +gettext +gperf +groff +xz +less +gzip +iproute2 +kmod +libpipeline +make +patch +pam +libcap +shadow +sysklogd +sysvinit +tar +texinfo +eudev +util-linux +man-db +nasm +openssl +libarchive +lzip +lz4 +kbd +curl +cpio +pciutils +lzo +lvm2 +wget +rsync +gpm +openssh +dialog +squashfs +dhcpcd +sudo +nano +ca-certificates diff --git a/talimatname/temel/dhcpcd/dhcpcd.kur-kos b/talimatname/temel/dhcpcd/dhcpcd.kur-kos new file mode 100644 index 000000000..73ff1ce8f --- /dev/null +++ b/talimatname/temel/dhcpcd/dhcpcd.kur-kos @@ -0,0 +1 @@ +chmod 1777 /var/tmp diff --git a/talimatname/temel/dhcpcd/talimat b/talimatname/temel/dhcpcd/talimat new file mode 100755 index 000000000..fed09dde1 --- /dev/null +++ b/talimatname/temel/dhcpcd/talimat @@ -0,0 +1,23 @@ +# Tanım: Connect your computer to a network which uses DHCP to assign network addresses. +# URL: http://roy.marples.name/projects/dhcpcd +# Paketçi: milisarge@gmail.com +# Gerekler: +# Grup: temel + +isim=dhcpcd +surum=6.10.1 +devir=1 + +kaynak=(http://roy.marples.name/downloads/$isim/$isim-$surum.tar.xz) + +derle() { + cd $isim-$surum + ./configure --prefix= \ + --libexecdir=/lib/dhcpcd \ + --dbdir=/var/tmp + make + make DESTDIR=$PKG install + sed -i "s;/var/lib;/run;g" dhcpcd-hooks/50-dhcpcd-compat + install -v -m 644 dhcpcd-hooks/50-dhcpcd-compat $PKG/lib/dhcpcd/dhcpcd-hooks/ + rm -r $PKG/var/tmp +} diff --git a/talimatname/temel/dialog/talimat b/talimatname/temel/dialog/talimat new file mode 100644 index 000000000..c74b2f276 --- /dev/null +++ b/talimatname/temel/dialog/talimat @@ -0,0 +1,20 @@ +# Tanım: To create nice user interfaces to shell scripts or other scripting languages. +# URL: http://hightek.org/dialog/ +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=dialog +surum=1.2.20140911 +devir=1 + +kaynak=(ftp://dickey.his.com/dialog/$isim-1.2-20140911.tgz) + +derle() { + cd $isim-1.2-20140911 + ./configure --prefix=/usr \ + --enable-nls --bindir=/bin \ + --with-ncursesw \ + --mandir=/usr/share/man + make + make DESTDIR=$PKG install +} diff --git a/talimatname/temel/diffutils/talimat b/talimatname/temel/diffutils/talimat new file mode 100644 index 000000000..d039dbc89 --- /dev/null +++ b/talimatname/temel/diffutils/talimat @@ -0,0 +1,20 @@ +# Tanım: Programs that show the differences between files or directories. +# URL: http://www.gnu.org/software/diffutils/ +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=diffutils +surum=3.3 +devir=1 + +kaynak=( http://ftp.gnu.org/gnu/$isim/diffutils-$surum.tar.xz ) + +derle() { + cd diffutils-$surum + sed -i 's:= @mkdir_p@:= /bin/mkdir -p:' po/Makefile.in.in + ./configure --prefix=/usr \ + --bindir=/bin + make + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/e2fsprogs/talimat b/talimatname/temel/e2fsprogs/talimat new file mode 100644 index 000000000..e67f98425 --- /dev/null +++ b/talimatname/temel/e2fsprogs/talimat @@ -0,0 +1,46 @@ +# Tanım: Utilities for handling the ext2,3 and 4 files system. +# URL: http://e2fsprogs.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=e2fsprogs +surum=1.42.13 +devir=1 + +kaynak=(http://prdownloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum + +sed -e '/int.*old_desc_blocks/s/int/blk64_t/' \ + -e '/if (old_desc_blocks/s/super->s_first_meta_bg/desc_blocks/' \ + -i lib/ext2fs/closefs.c + +mkdir -v build +cd build +LIBS=-L/tools/lib \ +CFLAGS=-I/tools/include \ +PKG_CONFIG_PATH=/tools/lib/pkgconfig \ +../configure --prefix=/usr --with-root-prefix="" --libdir=/lib \ +--bindir=/bin --sbindir=/sbin \ +--enable-elf-shlibs --disable-libblkid --disable-libuuid --disable-uuidd \ +--disable-fsck +make +# somes tests may fails +# make check||true +make DESTDIR=$PKG install install-libs || make -j1 DESTDIR=$PKG install install-libs + +chmod -v u+w $PKG/lib/{libcom_err,libe2p,libext2fs,libss}.a + +gunzip -v $PKG/usr/share/info/libext2fs.info.gz + +makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo + +install -v -m644 doc/com_err.info $PKG/usr/share/info + +rm -rf $PKG/usr/share/info/dir + +mkdir $PKG/usr/lib +mv $PKG/lib/pkgconfig \ +$PKG/usr/lib +} diff --git a/talimatname/temel/eudev/eudev.kos-kur b/talimatname/temel/eudev/eudev.kos-kur new file mode 100644 index 000000000..22e793e5f --- /dev/null +++ b/talimatname/temel/eudev/eudev.kos-kur @@ -0,0 +1 @@ +rm -f /etc/udev/hwdb.bin diff --git a/talimatname/temel/eudev/talimat b/talimatname/temel/eudev/talimat new file mode 100644 index 000000000..d6e675a61 --- /dev/null +++ b/talimatname/temel/eudev/talimat @@ -0,0 +1,64 @@ +# Tanım: The Eudev package contains programs for dynamic creation of device nodes. +# URL: http://www.gentoo.org/proj/en/eudev/ +# Paketçi: milisarge +# Gerekler: + +isim=eudev +surum=3.1.5 +devir=1 + +kaynak=(http://dev.gentoo.org/~blueness/eudev/$isim-$surum.tar.gz + http://anduin.linuxfromscratch.org/sources/other/udev-lfs-20140408.tar.bz2) + +derle() { +cd $isim-$surum +sed -r -i 's|/usr(/bin/test)|\1|' test/udev-test.pl + +if [ -d /tools ];then + cat > config.cache << "EOF" + HAVE_BLKID=1 + BLKID_LIBS="-lblkid" + BLKID_CFLAGS="-I/tools/include" +EOF +fi + +./configure --prefix=/usr --bindir=/sbin \ +--sbindir=/sbin --libdir=/usr/lib \ +--sysconfdir=/etc --libexecdir=/lib \ +--with-rootprefix= \ +--with-rootlibdir=/lib \ +--enable-split-usr \ +--enable-hwdb \ +--disable-introspection \ +--disable-gudev \ +--disable-static \ +--config-cache \ +--disable-gtk-doc-html \ +--with-firmware-path=/lib/firmware +if [ -d /tools ];then + LIBRARY_PATH=/tools/lib make +else + make +fi +mkdir -pv $PKG/lib/{firmware,udev/devices/pts} +mkdir -pv $PKG/lib/udev/rules.d +mkdir -pv $PKG/etc/udev/rules.d +if [ -d /tools ];then + make LD_LIBRARY_PATH=/tools/lib DESTDIR=$PKG install +else + make DESTDIR=$PKG install +fi +# man pages +pushd man +make DESTDIR=$PKG install-man7 install-man8 + +cd $SRC +make -j1 -f udev-lfs-20140408/Makefile.lfs DESTDIR=$PKG install + +# DB +if [ -d /tools ];then + LD_LIBRARY_PATH=/tools/lib $PKG/sbin/udevadm hwdb --update --root=$PKG +else + $PKG/sbin/udevadm hwdb --update --root=$PKG +fi +} diff --git a/talimatname/temel/expat/talimat b/talimatname/temel/expat/talimat new file mode 100644 index 000000000..570b12f8e --- /dev/null +++ b/talimatname/temel/expat/talimat @@ -0,0 +1,17 @@ +# Tanım: The Expat package contains a stream oriented C library for parsing XML. +# URL: http://expat.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=expat +surum=2.1.0 +devir=1 + +kaynak=(http://downloads.sourceforge.net/$isim/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make DESTDIR=$PKG install +} diff --git a/talimatname/temel/file/talimat b/talimatname/temel/file/talimat new file mode 100644 index 000000000..ee738a618 --- /dev/null +++ b/talimatname/temel/file/talimat @@ -0,0 +1,18 @@ +# Tanım: Utility for determining the type of a given file or files. +# URL: ftp://ftp.fu-berlin.de/unix/tools/file/ +# Paketçi: milisarge +# Gerekler: + +isim=file +surum=5.25 +devir=1 + +kaynak=(ftp://ftp.astron.com/pub/file/file-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr + make + make check + make DESTDIR=$PKG install +} diff --git a/talimatname/temel/findutils/talimat b/talimatname/temel/findutils/talimat new file mode 100644 index 000000000..da52cd7df --- /dev/null +++ b/talimatname/temel/findutils/talimat @@ -0,0 +1,26 @@ +# Tanım: GNU utilities to locate files +# URL: http://www.gnu.org/software/findutils/ +# Paketçi: milisarge +# Gerekler: + +isim=findutils +surum=4.6.0 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/findutils/findutils-$surum.tar.gz) + +derle() +{ + cd findutils-$surum + ./configure --prefix=/usr \ + --libexecdir=/lib/findutils \ + --localstatedir=/var/lib/locate \ + --libdir=/lib --bindir=/bin + + make + # make check + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/info/dir + sed -i 's/find:=${BINDIR}/find:=\/bin/' $PKG/bin/updatedb +} diff --git a/talimatname/temel/flex/talimat b/talimatname/temel/flex/talimat new file mode 100644 index 000000000..e1dd34434 --- /dev/null +++ b/talimatname/temel/flex/talimat @@ -0,0 +1,36 @@ +# Tanım: A tool for generating text-scanning programs +# URL: http://flex.sourceforge.net +# Paketçi: milisarge +# Gerekler: + +isim=flex +surum=2.5.39 +devir=1 + +kaynak=(http://prdownloads.sourceforge.net/flex/flex-$surum.tar.xz) + +derle() { +cd flex-$surum +sed -i -e '/test-bison/d' tests/Makefile.in + +./configure --prefix=/usr \ +--libdir=/lib --bindir=/bin --sbindir=/sbin \ +--docdir=/usr/share/doc/flex-$surum + +make +make -k check||true + +make DESTDIR=$PKG install + +ln -sv libfl.a $PKG/lib/libl.a +cat > $PKG/bin/lex << "EOF" +#!/bin/sh +# Begin /bin/lex +exec /bin/flex -l "$@" +# End /bin/lex +EOF + +chmod -v 755 $PKG/bin/lex + +rm -r $PKG/usr/share/{info,doc} +} diff --git a/talimatname/temel/gawk/talimat b/talimatname/temel/gawk/talimat new file mode 100644 index 000000000..f389c8513 --- /dev/null +++ b/talimatname/temel/gawk/talimat @@ -0,0 +1,22 @@ +# Tanım: The Gawk package contains programs for manipulating text files. +# URL: http://www.gnu.org/software/gawk/ +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=gawk +surum=4.1.3 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/gawk/gawk-$surum.tar.xz) + +derle() { + cd gawk-$surum + ./configure --prefix=/usr + make + # Some checks fails + make check || true + make DESTDIR=$PKG install + rm -rf $PKG/usr/share/info/dir +} + + diff --git a/talimatname/temel/gcc/talimat b/talimatname/temel/gcc/talimat new file mode 100644 index 000000000..6d3b63997 --- /dev/null +++ b/talimatname/temel/gcc/talimat @@ -0,0 +1,101 @@ +# Tanım: GNU compiler collection, which includes the C, C++, fortran and objc compilers. +# URL: http://gcc.gnu.org +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=gcc +surum=5.3.0 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/gcc/gcc-$surum/gcc-$surum.tar.bz2) + +derle() +{ +cd gcc-$surum + +mkdir -v ../gcc-build +cd ../gcc-build + +SED=sed \ +../gcc-$surum/configure --prefix=/usr \ + --enable-languages=c,c++,objc,fortran \ + --disable-multilib --disable-bootstrap --with-system-zlib + +make + +make DESTDIR=$PKG install + +mkdir $PKG/lib + +ln -sv ../usr/bin/cpp $PKG/lib/cpp + +ln -sv gcc $PKG/usr/bin/cc + + +install -dm755 $PKG/usr/share/gdb/auto-load/usr/lib +install -dm755 $PKG/usr/lib/bfd-plugins +cd $PKG/usr/lib/bfd-plugins + +case `uname -m` in + i?86) sed -i "s|-L$SRC[^ ]* ||g" \ + $PKG/usr/lib/{libstdc++.la,libsupc++.la} + mv -v $PKG/usr/lib/*gdb.py \ + $PKG/usr/share/gdb/auto-load/usr/lib + ln -sfv ../../libexec/gcc/i686-pc-linux-gnu/$surum/liblto_plugin.so;; + x86_64) + sed -i "s|-L$SRC[^ ]* ||g" \ + $PKG/usr/lib64/{libstdc++.la,libsupc++.la} + mv -v $PKG/usr/lib64/*gdb.py \ + $PKG/usr/share/gdb/auto-load/usr/lib + ln -sfv ../../libexec/gcc/x86_64-unknown-linux-gnu/$surum/liblto_plugin.so;; +esac + +rm -rf $PKG/usr/share/info/dir + + +# Move the needed runtime libraries +case `uname -m` in + i?86) mkdir -pv $PKG/usr/lib + mv -v $PKG/usr/lib/libgfortran.{a,la} \ + $PKG/lib/ + ln -sv ../../lib/libgfortran.{la,a} $PKG/usr/lib + mv -v $PKG/usr/lib/libgfortran.so{,.3,.3.0.0} \ + $PKG/lib/ + ln -svf ../../lib/libgfortran.so{,.3,.3.0.0} $PKG/usr/lib + mv -v $PKG/usr/lib/libgcc_s.so{,.1} \ + $PKG/lib + ln -sv ../../lib/libgcc_s.so{,.1} $PKG/usr/lib + mv -v $PKG/usr/lib/libstdc++.* \ + $PKG/lib/ + mv -v $PKG/usr/lib/libsupc++.{la,a} \ + $PKG/lib + ln -sv ../../lib/libstdc++.so{,.6,.6.0.30} \ + $PKG/usr/lib + ln -sv ../../lib/libstdc++.{a,la} \ + $PKG/usr/lib + ln -sv ../../lib/libsupc++.{la,a} \ + $PKG/usr/lib;; + + x86_64) mkdir -pv $PKG/usr/lib64 + mv -v $PKG/usr/lib64/libgfortran.{a,la} \ + $PKG/lib + ln -sv ../../lib/libgfortran.{la,a} $PKG/usr/lib64 + mv -v $PKG/usr/lib64/libgfortran.so{,.3,.3.0.0} \ + $PKG/lib + ln -sv ../../lib/libgfortran.so{,.3,.3.0.0} $PKG/usr/lib64 + mv -v $PKG/usr/lib64/libgcc_s.so{,.1} \ + $PKG/lib + ln -sv ../../lib/libgcc_s.so{,.1} $PKG/usr/lib64 + mv -v $PKG/usr/lib64/libstdc++.* \ + $PKG/lib + mv -v $PKG/usr/lib64/libsupc++.{la,a} \ + $PKG/lib + ln -sv ../../lib/libstdc++.so{,.6,.6.0.30} \ + $PKG/usr/lib64 + ln -sv ../../lib/libstdc++.{a,la} \ + $PKG/usr/lib64 + ln -sv ../../lib/libsupc++.{la,a} \ + $PKG/usr/lib64;; +esac + +} diff --git a/talimatname/temel/gdbm/talimat b/talimatname/temel/gdbm/talimat new file mode 100644 index 000000000..435e9f76c --- /dev/null +++ b/talimatname/temel/gdbm/talimat @@ -0,0 +1,26 @@ +# Tanım: The GDBM package contains the GNU Database Manager. +# URL: http://www.gnu.org/software/gdbm/gdbm.html +# Paketçi: milisarge +# Gerekler: + +isim=gdbm +surum=1.11 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/gdbm/gdbm-$surum.tar.gz) + +derle() { +cd gdbm-$surum +./configure --prefix=/usr --libdir=/lib \ +--bindir=/bin --enable-libgdbm-compat + +make + +make check + +make BINOWN=root BINGRP=root prefix=$PKG/usr \ +libdir=$PKG/lib bindir=$PKG/bin install + +rm -rf $PKG/usr/share/info/dir + +} diff --git a/talimatname/temel/gettext/talimat b/talimatname/temel/gettext/talimat new file mode 100644 index 000000000..fbffa7094 --- /dev/null +++ b/talimatname/temel/gettext/talimat @@ -0,0 +1,21 @@ +# Tanım: Utilities for internationalization and localization. +# URL: http://www.gnu.org/software/gettext/ +# Paketçi: milisarge +# Gerekler: + +isim=gettext +surum=0.19.7 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/gettext/gettext-$surum.tar.xz) +derle() +{ +cd gettext-$surum +./configure --prefix=/usr \ +--docdir=/usr/share/doc/gettext-$surum +make +make check||true +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +chmod 0755 $PKG/usr/lib/preloadable_libintl.so +} diff --git a/talimatname/temel/glibc/glibc.locales.supported b/talimatname/temel/glibc/glibc.locales.supported new file mode 100644 index 000000000..6af107094 --- /dev/null +++ b/talimatname/temel/glibc/glibc.locales.supported @@ -0,0 +1,18 @@ +# This file names the currently supported and somewhat tested locales. +# If you have any additions please file a glibc bug report. +SUPPORTED-LOCALES=\ +cs_CZ.UTF-8/UTF-8 \ +de_DE.UTF-8/UTF-8 \ +en_GB.UTF-8/UTF-8 \ +en_HK.UTF-8/UTF-8 \ +en_PH.UTF-8/UTF-8 \ +en_US.UTF-8/UTF-8 \ +es_MX.UTF-8/UTF-8 \ +fa_IR/UTF-8 \ +fr_FR.UTF-8/UTF-8 \ +it_CH.UTF-8/UTF-8 \ +it_IT.UTF-8/UTF-8 \ +ja_JP.EUC-JP/EUC-JP \ +ru_RU/UTF-8 \ +tr_TR.UTF-8/UTF-8 \ +zh_CN.GB18030/GB18030 \ diff --git a/talimatname/temel/glibc/talimat b/talimatname/temel/glibc/talimat new file mode 100644 index 000000000..72393dab8 --- /dev/null +++ b/talimatname/temel/glibc/talimat @@ -0,0 +1,106 @@ +# Tanım: The Glibc package contains the main C library. +# URL: https://www.gnu.org/software/libc/ +# Paketçi: milisarge +# Gerekler: + +kernelsurum=4.4 +isim=glibc +surum=2.23 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/kernel/v4.x/linux-$kernelversion.tar.xz + http://www.linuxfromscratch.org/patches/downloads/$isim/glibc-$surum-fhs-1.patch + http://ftp.gnu.org/gnu/glibc/glibc-$surum.tar.xz glibc.locales.supported ) + +derle() { + +# Headers +cd linux-$kernelversion +make mrproper +make headers_check +make INSTALL_HDR_PATH=dest headers_install +find dest/include \( -name .install -o -name ..install.cmd \) -delete +mkdir -p $PKG/usr/include +cp -rv dest/include/* $PKG/usr/include + +cd ../glibc-$surum + +patch -Np1 -i ../glibc-$surum-fhs-1.patch + +mkdir -v ../glibc-build +cd ../glibc-build + +../glibc-$surum/configure --prefix=/usr \ +--disable-profile \ +--enable-kernel=2.6.32 \ +--enable-obsolete-rpc + +make || make -j1 + +# make -k check 2>&1 | tee glibc-check-log +# grep Error glibc-check-log + +make install_root=$PKG install +rm -rf $PKG/usr/share/info/dir + +mkdir -p $PKG/etc +cp -v ../glibc-$surum/nscd/nscd.conf $PKG/etc/nscd.conf +mkdir -pv $PKG/var/cache/nscd + +touch $PKG/etc/ld.so.conf + +mkdir -pv $PKG/usr/lib/locale + +cp $SRC/glibc.locales.supported \ +../glibc-$surum/localedata/SUPPORTED + +make install_root=$PKG localedata/install-locales + +cat > $PKG/etc/nsswitch.conf << "EOF" +# Begin /etc/nsswitch.conf + +passwd: files +group: files +shadow: files + +hosts: files dns +networks: files + +protocols: files +services: files +ethers: files +rpc: files + +# End /etc/nsswitch.conf +EOF + + +cat > $PKG/etc/ld.so.conf << "EOF" +# Begin /etc/ld.so.conf +/lib +/lib64 +/usr/lib +/usr/lib64 +/usr/local/lib +/usr/local/lib64 + +# Add an include directory +include /etc/ld.so.conf.d/*.conf +# End of /etc/ld.so.conf +EOF + +if [ "`uname -m`" == "i686" ];then + cat > $PKG/etc/ld.so.conf << "EOF" +# Begin /etc/ld.so.conf +/lib +/usr/lib +/usr/local/lib + +# Add an include directory +include /etc/ld.so.conf.d/*.conf +# End of /etc/ld.so.conf +EOF +fi + +mkdir $PKG/etc/ld.so.conf.d +} diff --git a/talimatname/temel/gmp/talimat b/talimatname/temel/gmp/talimat new file mode 100644 index 000000000..800752e2e --- /dev/null +++ b/talimatname/temel/gmp/talimat @@ -0,0 +1,34 @@ +# Tanım: A free library for arbitrary precision arithmetic. +# URL: http://gmplib.org/ +# Paketçi: milisarge +# Gerekler: + +isim=gmp +surum=6.1.0 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) + +derle() { + cd gmp-$surum + case `uname -m` in + i?86) + ABI=32 ./configure --build=i686-pc-linux-gnu \ + --prefix=/usr --enable-cxx --libdir=/lib ;; + *) + ./configure --build=x86_64-unknown-linux-gnu \ + --prefix=/usr --enable-cxx --libdir=/lib ;; + esac + make + # make check 2>&1 | tee gmp-check-log + # awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log + make DESTDIR=$PKG install + + rm -rf $PKG/usr/share/info/dir + + # Documentation + #mkdir -p $PKG/usr/share/doc/gmp-${surum} + + #cp doc/{isa_abi_headache,configuration} doc/*.html \ + #$PKG/usr/share/doc/gmp-${surum} +} diff --git a/talimatname/temel/gperf/talimat b/talimatname/temel/gperf/talimat new file mode 100644 index 000000000..86e736469 --- /dev/null +++ b/talimatname/temel/gperf/talimat @@ -0,0 +1,18 @@ +# Tanım: Gperf generates a perfect hash function from a key set. +# URL: http://www.gnu.org/software/gperf/gperf.html +# Paketçi: milisarge +# Gerekler: + +isim=gperf +surum=3.0.4 +devir=1 + +kaynak=(ftp://ftp.sunet.se/pub/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--docdir=/usr/share/doc/$isim-$surum +make +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/gpm/gpm.service.kur-kos b/talimatname/temel/gpm/gpm.service.kur-kos new file mode 100644 index 000000000..11c633cac --- /dev/null +++ b/talimatname/temel/gpm/gpm.service.kur-kos @@ -0,0 +1,4 @@ +if [ ! -f etc/sysconfig/mouse ]; then + echo "MDEVICE=\"/dev/input/mice\" +PROTOCOL=\"imps2\"" > etc/sysconfig/mouse +fi diff --git a/talimatname/temel/gpm/talimat b/talimatname/temel/gpm/talimat new file mode 100644 index 000000000..da52ab97c --- /dev/null +++ b/talimatname/temel/gpm/talimat @@ -0,0 +1,31 @@ +# Tanım: A free library for arbitrary precision arithmetic. +# URL: http://unix.schottelius.org/gpm +# Paketçi: milisarge +# Gerekler: + +isim=gpm +surum=1.20.7 +devir=2 + +kaynak=(http://www.nico.schottelius.org/software/$isim/archives/$isim-$surum.tar.bz2) + +derle() { + source /etc/blfs-bootscripts + wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + tar xvf $scripts-$scriptsversion.tar.bz2 + + cd $isim-$surum + ./autogen.sh + ./configure --prefix=/usr \ + --sysconfdir=/etc \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + LDFLAGS="-lm" make + make ROOT=$PKG install + ln -sv libgpm.so.2.1.0 $PKG/usr/lib/libgpm.so.1 + ln -sv libgpm.so.2.1.0 $PKG/usr/lib/libgpm.so + install -v -m644 conf/gpm-root.conf $PKG/etc + + cd ../$scripts-$scriptsversion + make DESTDIR=$PKG install-gpm +} diff --git a/talimatname/temel/grep/talimat b/talimatname/temel/grep/talimat new file mode 100644 index 000000000..06099cf00 --- /dev/null +++ b/talimatname/temel/grep/talimat @@ -0,0 +1,21 @@ +# Tanım: Searches input(s) file(s) for lines containing a match to a specified pattern. +# URL: http://www.gnu.org/software/grep/ +# Paketçi: milisarge +# Gerekler: + +isim=grep +surum=2.23 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/grep/grep-$surum.tar.xz) + +derle() +{ +cd grep-$surum + +./configure --prefix=/usr --bindir=/bin +make +make check || true +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/groff/talimat b/talimatname/temel/groff/talimat new file mode 100644 index 000000000..83b830e3e --- /dev/null +++ b/talimatname/temel/groff/talimat @@ -0,0 +1,26 @@ +# Tanım: The Groff package contains programs for processing and formatting text. +# URL: http://www.gnu.org/software/groff/ +# Paketçi: milisarge +# Gerekler: + +isim=groff +surum=1.22.3 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/groff/groff-$surum.tar.gz) + +derle() +{ +cd groff-$surum + +PAGE="A4" ./configure --prefix=/usr + +make || make -j1 + +make prefix=$PKG/usr \ +infodir=$PKG/usr/share/info install + +ln -sv eqn $PKG/usr/bin/geqn +ln -sv tbl $PKG/usr/bin/gtbl +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/gzip/talimat b/talimatname/temel/gzip/talimat new file mode 100644 index 000000000..1c29f7031 --- /dev/null +++ b/talimatname/temel/gzip/talimat @@ -0,0 +1,21 @@ +# Tanım: The Gzip package contains programs for compressing and decompressing files. +# URL: http://www.gzip.org/ +# Paketçi: milisarge +# Gerekler: + +isim=gzip +surum=1.6 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/gzip/gzip-$surum.tar.xz) + +derle() +{ +cd gzip-$surum +./configure --prefix=/usr \ + --bindir=/bin --libdir=/lib +make +make -k check || true +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/iana-etc/talimat b/talimatname/temel/iana-etc/talimat new file mode 100644 index 000000000..80c284e03 --- /dev/null +++ b/talimatname/temel/iana-etc/talimat @@ -0,0 +1,21 @@ +# Tanım: The Iana-Etc package provides data for network services and protocols. +# URL: http://www.sethwklein.net/projects/iana-etc/ +# Paketçi: milisarge +# Gerekler: + +isim=iana-etc +surum=2.30 +devir=1 + +kaynak=(http://sethwklein.net/iana-etc-2.30.tar.bz2) + +derle() +{ +cd iana-etc-$surum + +make + +make DESTDIR=$PKG install + +} + diff --git a/talimatname/temel/inetutils/talimat b/talimatname/temel/inetutils/talimat new file mode 100644 index 000000000..bc4d29d2b --- /dev/null +++ b/talimatname/temel/inetutils/talimat @@ -0,0 +1,31 @@ +# Tanım: The Inetutils package contains programs for basic networking. +# URL: http://www.gnu.org/software/inetutils/ +# Paketçi: milisarge +# Gerekler: + +isim=inetutils +surum=1.9.4 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/inetutils/inetutils-$surum.tar.xz) + +derle() +{ +cd inetutils-$surum + +./configure --prefix=/usr \ +-libexecdir=/sbin \ +--bindir=/bin \ +--sbindir=/sbin \ +--localstatedir=/var \ +--disable-logger \ +--disable-whois \ +--disable-servers +make +make check || true +make DESTDIR=$PKG install + +mv -v $PKG/bin/traceroute $PKG/sbin +mv -v $PKG/bin/ifconfig $PKG/sbin +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/iproute2/talimat b/talimatname/temel/iproute2/talimat new file mode 100644 index 000000000..885bb07d4 --- /dev/null +++ b/talimatname/temel/iproute2/talimat @@ -0,0 +1,27 @@ +# Tanım: Programs for basic and advanced network routing. +# URL: http://linux-net.osdl.org/index.php/Iproute2 +# Paketçi: milisarge +# Gerekler: + +isim=iproute2 +surum=4.4.0 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/utils/net/$isim/iproute2-$surum.tar.xz) + +derle() +{ +cd iproute2-$surum +sed -i '/^TARGETS/s@arpd@@g' misc/Makefile +sed -i /ARPD/d Makefile +sed -i 's/arpd.8//' man/man8/Makefile + +sed -i 's/tipc //' Makefile + +make SBINDIR=/sbin MANDIR=/usr/share/man INFODIR=/usr/share/info \ + DESTDIR=$PKG +make SBINDIR=/sbin \ + INFODIR=/usr/share/info DESTDIR=$PKG \ + install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/kbd/talimat b/talimatname/temel/kbd/talimat new file mode 100644 index 000000000..b1a659ea4 --- /dev/null +++ b/talimatname/temel/kbd/talimat @@ -0,0 +1,28 @@ +# Tanım: The Kbd package contains key-table files, console fonts, and keyboard utilities +# URL: ftp://devel.altlinux.org/legion/kbd/ +# Paketçi: milisarge +# Gerekler: + +isim=kbd +surum=2.0.3 +devir=2 + +kaynak=(http://ftp.altlinux.com/pub/people/legion/kbd/kbd-$surum.tar.xz \ + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-backspace-1.patch) + +derle() +{ +cd kbd-$surum + +patch -Np1 -i ../$isim-$surum-backspace-1.patch + +sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure +sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in + +PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr \ +--bindir=/bin --datadir=/lib/kbd + +make +make check +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/kmod/talimat b/talimatname/temel/kmod/talimat new file mode 100644 index 000000000..4cd7be25a --- /dev/null +++ b/talimatname/temel/kmod/talimat @@ -0,0 +1,30 @@ +# Tanım: The Kmod package contains libraries and utilities for loading kernel modules. +# URL: http://www.kernel.org/pub/linux/kernel/people/rusty/modules +# Paketçi: milisarge +# Gerekler: + +isim=kmod +surum=22 +devir=1 + +kaynak=(http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-$surum.tar.xz ) + +derle() +{ +cd $isim-$surum +./configure --prefix=/usr \ +--bindir=/bin \ +--sysconfdir=/etc \ +--with-rootlibdir=/lib \ +--disable-manpages \ +--with-xz \ +--with-zlib + +make +make DESTDIR=$PKG install +mkdir $PKG/sbin +for target in depmod insmod modinfo modprobe rmmod; do + ln -sv ../bin/kmod $PKG/sbin/$target +done +ln -sv kmod $PKG/bin/lsmod +} diff --git a/talimatname/temel/less/talimat b/talimatname/temel/less/talimat new file mode 100644 index 000000000..597f6aee5 --- /dev/null +++ b/talimatname/temel/less/talimat @@ -0,0 +1,19 @@ +# Tanım: The Less package contains a text file viewer. +# URL: http://www.greenwoodsoftware.com/less/ +# Paketçi: milisarge +# Gerekler: + +isim=less +surum=458 +devir=1 + +kaynak=(http://www.greenwoodsoftware.com/less/less-$surum.tar.gz) + +derle() +{ +cd less-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc +make +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/libarchive/talimat b/talimatname/temel/libarchive/talimat new file mode 100644 index 000000000..37c9d5be2 --- /dev/null +++ b/talimatname/temel/libarchive/talimat @@ -0,0 +1,22 @@ +# Tanım: farklı arşiv tiplerini uygulayan kütüphane +# URL: http://people.freebsd.org/~kientzle/libarchive +# Paketçi: milisarge +# Gerekler: + +isim=libarchive +surum=3.3.2 +devir=1 + +kaynak=(http://www.libarchive.org/downloads/libarchive-$surum.tar.gz) + +derle() { + cd $isim-$surum + autoreconf -fi + ./configure \ + --prefix=/usr \ + --without-xml2 \ + --without-nettle \ + --disable-static + make + make DESTDIR=$PKG install +} diff --git a/talimatname/temel/libcap/talimat b/talimatname/temel/libcap/talimat new file mode 100644 index 000000000..cf97b5b71 --- /dev/null +++ b/talimatname/temel/libcap/talimat @@ -0,0 +1,30 @@ +# Tanım: POSIX 1003.1e capabilities library +# URL: http://www.kernel.org/pub/linux/libs/security/linux-privs/ +# Paketçi: milisarge +# Gerekler: + +isim=libcap +surum=2.25 +devir=1 + +kaynak=( https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-$surum.tar.xz) + +derle() { +cd libcap-$surum +sed -i 's:LIBDIR:PAM_&:g' pam_cap/Makefile +sed -i '/install.*STALIBNAME/d' libcap/Makefile +make +make RAISE_SETFCAP=no \ +prefix=/usr \ +LIBDIR=/usr/lib \ +SBINDIR=/sbin \ +PAM_LIBDIR=/lib \ +DESTDIR=$PKG install + +mkdir -p $PKG/lib +_lib="" +mv -v $PKG/usr/lib${_lib}/libcap.so.* \ +$PKG/lib +ln -sfv ../../lib/libcap.so.2 $PKG/usr/lib${_lib}/libcap.so +} + diff --git a/talimatname/temel/libpipeline/talimat b/talimatname/temel/libpipeline/talimat new file mode 100644 index 000000000..9b0fb3f7a --- /dev/null +++ b/talimatname/temel/libpipeline/talimat @@ -0,0 +1,23 @@ +# Tanım: C library for manipulating pipelines of subprocesses in a flexible way +# URL: http://libpipeline.nongnu.org/ +# Paketçi: milisarge +# Gerekler: + +isim=libpipeline +surum=1.4.1 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/libpipeline/libpipeline-$surum.tar.gz) + +derle() +{ +cd $isim-$surum +PKG_CONFIG_PATH=/tools/lib/pkgconfig \ +./configure --prefix=/usr \ +--libdir=/lib +make +make DESTDIR=$PKG install +mkdir $PKG/usr/lib +mv $PKG/lib/pkgconfig \ +$PKG/usr/lib +} diff --git a/talimatname/temel/libtool/talimat b/talimatname/temel/libtool/talimat new file mode 100644 index 000000000..5e488fc9f --- /dev/null +++ b/talimatname/temel/libtool/talimat @@ -0,0 +1,19 @@ +# Tanım: The GNU generic library support script. +# URL: http://www.gnu.org/software/libtool/ +# Paketçi: milisarge +# Gerekler: + +isim=libtool +surum=2.4.6 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/libtool/libtool-$surum.tar.xz) + +derle() +{ +cd libtool-* +./configure --prefix=/usr +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/lvm2/lvm2.okubeni b/talimatname/temel/lvm2/lvm2.okubeni new file mode 100644 index 000000000..cdf9fe1a0 --- /dev/null +++ b/talimatname/temel/lvm2/lvm2.okubeni @@ -0,0 +1,8 @@ +Check the following option in the kernel configuration: +Vérifiez que le kernel est correctement configuré: +Device Drivers ---> + Multiple devices driver support (RAID and LVM): Y + Device mapper support: Y or M + Crypt target support: (optional) + Snapshot target: (optional) + Mirror target: (optional) diff --git a/talimatname/temel/lvm2/talimat b/talimatname/temel/lvm2/talimat new file mode 100644 index 000000000..84235508c --- /dev/null +++ b/talimatname/temel/lvm2/talimat @@ -0,0 +1,24 @@ +# Tanım: Allows spanning of file systems across multiple physical disks and partitions. +# URL: http://sourceware.org/lvm2/ +# Paketçi: milisarge +# Gerekler: + +isim=lvm2 +surum=2.02.141 +devir=1 + +kaynak=(ftp://sources.redhat.com/pub/lvm2/LVM2.$surum.tgz) +derle() { +cd LVM2.$surum +./configure \ +--prefix=/usr \ +--exec-prefix= \ +--with-confdir=/etc \ +--mandir=/usr/share/man \ +--enable-applib \ +--enable-cmdlib \ +--enable-pkgconfig \ +--enable-udev_sync +make +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/lz4/talimat b/talimatname/temel/lz4/talimat new file mode 100644 index 000000000..5222fbf81 --- /dev/null +++ b/talimatname/temel/lz4/talimat @@ -0,0 +1,17 @@ +# Tanım: Very fast lossless compression algorithm +# Url: https://github.com/Cyan4973/lz4 +# Paketçi: milisarge +# Gerekler: + +isim=lz4 +surum=r131 +devir=1 + +kaynak=(https://github.com/Cyan4973/lz4/archive/r131.tar.gz) + +derle() { +cd $isim-$surum +make PREFIX=/usr + +make install PREFIX=/usr DESTDIR=$PKG +} diff --git a/talimatname/temel/lzip/talimat b/talimatname/temel/lzip/talimat new file mode 100644 index 000000000..b6be01b5d --- /dev/null +++ b/talimatname/temel/lzip/talimat @@ -0,0 +1,17 @@ +# Tanım: Lzip is a lossless data compressor with a user interface similar to the one of gzip or bzip2 +# URL: download.savannah.gnu.org +# Paketçi: milisarge +# Gerekler: + +isim=lzip +surum=1.18-rc1 +devir=1 + +kaynak=(http://download.savannah.gnu.org/releases/$isim/$isim-$surum.tar.gz) +derle() +{ +cd $isim-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/lzo/talimat b/talimatname/temel/lzo/talimat new file mode 100644 index 000000000..f1366a470 --- /dev/null +++ b/talimatname/temel/lzo/talimat @@ -0,0 +1,19 @@ +# Tanım: Portable lossless data compression library. +# URL: http://www.oberhumer.com/opensource/lzo +# Paketçi: milisarge +# Gerekler: + +isim=lzo +surum=2.09 +devir=1 + +kaynak=( http://www.oberhumer.com/opensource/$isim/download/$isim-$surum.tar.gz) + +derle() { + cd $isim-$surum + ./configure --prefix=/usr \ + --enable-shared \ + --docdir=/usr/share/doc/lzo-$surum + make + make DESTDIR=$PKG install +} diff --git a/talimatname/temel/m4/talimat b/talimatname/temel/m4/talimat new file mode 100644 index 000000000..c2bb4f846 --- /dev/null +++ b/talimatname/temel/m4/talimat @@ -0,0 +1,20 @@ +# Tanım: The M4 package contains a macro processor +# URL: http://www.seindal.dk/rene/gnu/ +# Paketçi: milisarge +# Gerekler: + +isim=m4 +surum=1.4.17 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/m4/m4-$surum.tar.xz) + +derle() +{ +cd m4-$surum +./configure --prefix=/usr +make +make check || true +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/make/talimat b/talimatname/temel/make/talimat new file mode 100644 index 000000000..f168b8157 --- /dev/null +++ b/talimatname/temel/make/talimat @@ -0,0 +1,18 @@ +# Tanım: The Make package contains a program for compiling packages. +# URL: http://www.gnu.org/software/make/ +# Paketçi: milisarge +# Gerekler: + +isim=make +surum=4.1 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/make/make-$surum.tar.bz2) +derle() +{ +cd make-$surum +./configure --prefix=/usr +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/man-db/talimat b/talimatname/temel/man-db/talimat new file mode 100644 index 000000000..e49b11109 --- /dev/null +++ b/talimatname/temel/man-db/talimat @@ -0,0 +1,40 @@ +# Tanım: The Man-DB package contains programs for finding and viewing man pages. +# URL: http://savannah.nongnu.org/projects/man-db +# Paketçi: milisarge +# Gerekler: + +isim=man-db +surum=2.7.2 +devir=1 + +kaynak=(http://savannah.nongnu.org/download/man-db/man-db-$surum.tar.xz) + +derle() +{ +cd man-db-$surum +PKG_CONFIG_PATH="/usr/lib/pkgconfig" ./configure --prefix=/usr \ +--libexecdir=/usr/lib \ +--docdir=/usr/share/doc/man-$surum \ +--sysconfdir=/etc --disable-setuid \ +--with-browser=/usr/bin/lynx --with-vgrind=/usr/bin/vgrind \ +--with-grap=/usr/bin/grap + +make +# Certains test fails +make -k check || true +make DESTDIR=$PKG install +cat >> convert-mans << "EOF" +#!/bin/sh -e +FROM="$1" +TO="$2" +shift ; shift +while [ $# -gt 0 ] +do + FILE="$1" + shift + iconv -f "$FROM" -t "$TO" "$FILE" >.tmp.iconv + mv .tmp.iconv "$FILE" +done +EOF +install -m755 convert-mans $PKG/usr/bin +} diff --git a/talimatname/temel/mpc/talimat b/talimatname/temel/mpc/talimat new file mode 100644 index 000000000..d3c1f2f01 --- /dev/null +++ b/talimatname/temel/mpc/talimat @@ -0,0 +1,20 @@ +# Tanım: Library for the arithmetic of complex numbers with arbitrarily high precision. +# URL: http://www.multiprecision.org/ +# Paketçi: milisarge +# Gerekler: + +isim=mpc +surum=1.0.3 +devir=1 + +kaynak=(http://www.multiprecision.org/mpc/download/mpc-$surum.tar.gz) + +derle() +{ +cd mpc-$surum +./configure --prefix=/usr --libdir=/lib +make +make check +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/mpfr/talimat b/talimatname/temel/mpfr/talimat new file mode 100644 index 000000000..f18a82c87 --- /dev/null +++ b/talimatname/temel/mpfr/talimat @@ -0,0 +1,26 @@ +# Tanım: The MPFR package contains functions for multiple precision math +# URL: http://www.mpfr.org/ +# Paketçi: milisarge +# Gerekler: + +isim=mpfr +surum=3.1.3 +devir=2 + +kaynak=(http://www.mpfr.org/mpfr-current/mpfr-$surum.tar.xz + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-upstream_fixes-1.patch) + +derle() +{ +cd mpfr-$surum +patch -Np1 -i ../$isim-$surum-upstream_fixes-1.patch +./configure --prefix=/usr --enable-thread-safe \ + --libdir=/lib \ + --docdir=/usr/share/doc/mpfr-$surum +make +make check +make DESTDIR=$PKG install +#make html +#make DESTDIR=$PKG install-html +#rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/nano/talimat b/talimatname/temel/nano/talimat new file mode 100644 index 000000000..62a18840e --- /dev/null +++ b/talimatname/temel/nano/talimat @@ -0,0 +1,27 @@ +# Tanım: A simple text editor which aims to replace Pico, the default editor in the Pine package. +# URL: http://www.nano-editor.org/ +# Paketçi: milisarge +# Gerekler: + +isim=nano +surum=2.5.2 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--enable-utf8 \ +--enable-color \ +--enable-multibuffer \ +--enable-nanorc \ +--docdir=/usr/share/doc/nano-$surum \ +--disable-x +make +make DESTDIR=$PKG install +mkdir -p $PKG/etc/nano +install -v -m644 -D doc/nanorc.sample $PKG/etc/nano/nanorc.sample +rm $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/nasm/talimat b/talimatname/temel/nasm/talimat new file mode 100755 index 000000000..7168d47c1 --- /dev/null +++ b/talimatname/temel/nasm/talimat @@ -0,0 +1,28 @@ +# Tanım: 80x86 assembler designed for portability and modularity. +# URL: http://nasm.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=nasm +surum=2.11.06 +devir=1 + +kaynak=( ftp://ftp.debian.org/debian/pool/main/n/nasm/nasm_2.11.06-1really2.11.05.orig.tar.xz + http://www.nasm.us/pub/nasm/releasebuilds/$surum/nasm-$surum-xdoc.tar.xz) + +derle() { + cd $isim-2.11.05 + ./configure --prefix=/usr\ + --mandir=/usr/share/man + make + mkdir -p $PKG/usr/bin + mkdir -p $PKG/usr/share/man/man1 + make INSTALLROOT=$PKG install + +mkdir -pv $PKG/usr/share/doc/nasm-$surum/html +cd ../$isim-2.11.06 +cp -v doc/html/*.html $PKG/usr/share/doc/nasm-$surum/html +cp -v doc/*.{txt,ps,pdf} $PKG/usr/share/doc/nasm-$surum +mkdir -pv $PKG/usr/share/info +cp -v doc/info/* $PKG/usr/share/info +} diff --git a/talimatname/temel/ncurses/talimat b/talimatname/temel/ncurses/talimat new file mode 100644 index 000000000..aa18a634a --- /dev/null +++ b/talimatname/temel/ncurses/talimat @@ -0,0 +1,63 @@ +# Tanım: Libraries for terminal-independent handling of character screens. +# URL: http://www.gnu.org/software/ncurses/ncurses.html +# Paketçi: milisarge +# Gerekler: + +isim=ncurses +surum=6.0 +devir=1 + +kaynak=(ftp://invisible-island.net/ncurses/ncurses-$surum.tar.gz) + +derle() +{ +cd ncurses-$surum + +sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in + +./configure --prefix=/usr --mandir=/usr/share/man \ +-infodir=/usr/share/info --without-normal \ +--with-shared --bindir=/bin --sbindir=/sbin \ +--libdir=/lib --without-debug --enable-pc-files \ +--enable-widec --with-install-prefix=$PKG + +make + +make install + +mkdir -p $PKG/lib + +for lib in ncurses form panel menu ; do \ + rm -vf $PKG/lib/lib${lib}.so ; \ + echo "INPUT(-l${lib}w)" >$PKG/lib/lib${lib}.so ; \ + ln -sfv lib${lib}w.a $PKG/lib/lib${lib}.a ; \ +done +ln -sfv libncurses++w.a $PKG/lib/libncurses++.a +rm -vf $PKG/usr/lib/libcursesw.so +echo "INPUT(-lncursesw)" >$PKG/lib/libcursesw.so +ln -sfv libncurses.so $PKG/lib/libcurses.so +ln -sfv libncursesw.a $PKG/lib/libcursesw.a +ln -sfv libncurses.a $PKG/lib/libcurses.a + +make distclean + +./configure --prefix=/usr --with-shared --without-normal \ +--mandir=/usr/share/man --infodir=/usr/share/info \ +--bindir=/bin --sbindir=/sbin --libdir=/lib \ +--without-debug --without-cxx-binding --with-install-prefix=$PKG + +make sources libs + +cp -av lib/lib*.so.6* $PKG/lib + +rm -rf $PKG/usr/lib/terminfo + +mkdir $PKG/lib/ncurses +for DIR in terminfo tabset +do + mv -v $PKG/usr/share/$DIR \ + $PKG/lib/ncurses + ln -sv ../../lib/ncurses/$DIR $PKG/usr/share/$DIR +done + +} diff --git a/talimatname/temel/openssh/openssh.okubeni b/talimatname/temel/openssh/openssh.okubeni new file mode 100644 index 000000000..ff47d61cb --- /dev/null +++ b/talimatname/temel/openssh/openssh.okubeni @@ -0,0 +1,439 @@ +Pour lancer le service ssh + +- 1. installer soit le port: openssh.service +- 2. La page + http://www.linuxfromscratch.org/blfs/view/svn/postlfs/openssh.html + +Pour plus d'infos + +Astuces diverses: + +- Créer une nouvelle paire de clé (privée/publique) +$ ssh-keygen -t dsa +Enter file in which to save the key (/home/thierry/.ssh/id_dsa): +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /home/thierry/.ssh/id_dsa. +Your public key has been saved in /home/thierry/.ssh/id_dsa.pub. +The key fingerprint is: +87:66:b7:a0:f6:0e:6a:71:2c:5d:ee:5f:17:2a:b7:2f thierry@nutyx + +Pour l'envoyer directement sur le serveur ssh: + +$ cat ~/.ssh/id_dsa.pub | ssh user@remotehost "cat - >> ~/.ssh/authorized_keys" + +- Une autre façon de l'envoyer: + +$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@remotehost + +- Eviter le message lastlog: + +$ ssh -T user@hostname.com + +- Piping + +Exemple de serialisation d'un process de sauvegarde au travers ssh: + +$ ufsdump 0uf - /dev/md/rdsk/d33 | ssh r280n "dd obs=32k ibs=32k of=/dev/rmt/0n" + +- rsync à travers ssh: + +$ rsync -avz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \ +remoteuser@remotehost:/remote/dir /this/dir/ + +- X-forwarding ou lancer le serveur X à distance à travers ssh + +$ ssh -X thierry@remotehost +Warning: untrusted X11 forwarding setup failed: xauth key data not generated +Warning: No xauth data; using fake authentication data for X11 forwarding. + +- Port forwarding / Redirection de ports entre 2 hosts: + +Set up a localforward from the remote machine port 25 to a local port 9025: +Rediriger un locaforward depuis la machine à distance port 25 sur la machine locale port 9025: + +$ ssh -L 9025:localhost:25 thierry@remotehost + +- No command: + +Parfois on souhaite un config avec un forward utilisant un shell + +$ ssh -N -L 9025:localhost:25 patrick@remotehost + +- KeepAlive: + +Getting tired of those timeouts by the firewall? Have ssh send a keepalive +Raz le bol des timeouts des routeurs / parefeu ? ssh peut envoyer un signal "keepalive" + +Ajoutez ds votre $HOME/.ssh/ssh_config + +KeepAlive yes +ServerAliveInterval 60 + +- Définir un nouveau socket pour proxy + +Sometimes it's interesting to start a socks daemon. You can configure this in your browser to surf as it seems to come from the remote machine. +Il est parfois intéressant de démarrer un démon socket. Vous pouvez configurer cela dans votre navigateur et faire transiter TOUTES les requêtes comme si elles venaient de la +machine à distance. + +$ ssh -D 9999 patrick@remotehost + +- Passer à travers les proxy http: + +Les pares feu des entreprises ne permettent très souvent que l'accès à l'extérieur via le port http. Plus d'info sur http://www.agroman.net/corkscrew/ + +ProxyCommand /usr/bin/corkscrew proxy-ip 8080 %h %p ~/.ssh/myauth + +- Chaining ssh hopping: + +Host pc1.example.org pc2.example.org +ForwardAgent yes +ProxyCommand ssh -qax bastion.example.org /usr/bin/nc -w 120 %h %p + +- Netcat mode: + +Starting from openssh 5.4: we can have ssh act as netcat. (-W) This connects stdio on the client to a single port forward on the server. This allows, for example, using ssh as a +ProxyCommand to route connections via intermediate servers.” + +sh -p 443 -W remotehost2:23 patrick@remotehost +Trying remotehost2... +Connected to remotehost2. +Escape character is '^]'. + +User Name : ^] +telnet> close +$ + +- Mounting over ssh: + +Sometimes it's nice to mount a remote directory over ssh. Fuse and sshfs are your friend +Parfois il est très agrèable de pouvoir monter un dossier à distance à travers ssh, les ports fuse et sshfs sont vos amis. + +$ sshfs remote-user@remote.server:/remote/directory /mnt/remote-fs/ + +- VPN Tunneling + +Did you know that ssh can do layer 2 and 3 VPN tunneling? +Check out ssh -w. Example from manpage: + +$ ssh -f -w 0:1 192.168.1.15 true +$ ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252 + +- SSH http multiplexer: + +sslh lets one accept both HTTPS and SSH connections on the same port. It makes it possible to connect to an SSH server on port 443 (e.g. from inside a corporate firewall) while +still serving HTTPS on that port. http://www.rutschle.net/tech/sslh.shtml + +- Speed + +Compression + +If you are working on a slow link, compression (-C) and using a simple cipher (-c blowfish) saves you speed + +$ ssh -C -c blowfish patrick@remotehost + +- Multiplexing - ControlMaster: + +Another great way to speed up ssh is to re-use the same connection when you connect multiple times to the same host + +$ mkdir –p ~/.ssh/connections +$ chmod 700 ~/.ssh/connections + +Add this to your ~/.ssh/config file: +Host * +ControlMaster auto +ControlPath ~/.ssh/connections/%r_%h_%p + +-- Managing keys + +- Ignorer les Hostkeys: + +Quand vous installez et ré-installez sans arrêt, vous souhaitez certainement vous débarassez de ce message "hostfile key verification": + +$ ssh user@host -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null + +- Vérifier si une clé (hostkey) existe: + +$ ssh-keygen -F 192.168.2.152 +# Host 192.168.2.152 found: line 31 type RSA +192.168.2.152 ssh-rsa +AAAAB3NzaC1yc2EAAAABIwAAAQEAwHH15HpeJo21wyqpe2iFM8/0CtoYnE9DDXfCewws7iMhM+vgp7pjnaC83IgAt7G/x/VDHcbnyuI4odrGSEAE5wm7LNuT6uSfQMbXCayE+uoOIrAVhf41ZnAFQrs/+Mutk5LFEjPPNhuriq5ltBT4UwMlYQMa5z/SzmxV0ZAGXks5GMDz0o89yUwRarRfsGudASEtzUxgnxnOo5STBMZOdQ0GNEVdfJDgfJDAOi34T1FidpCqAtm8akYuB+Qsj3/hDQmIT+GsKYaGNZvz8ZNnPBAc9kWlS6VqXXNreyEeu7AmHDWXjMP3NW1tsibmZ8zeOSZdmEVEiuaYCIvERDq3MQ== + +- Supprimer une hostkey: + +$ ssh-keygen -R 192.168.2.152 +/home/thierry/.ssh/known_hosts updated. +Original contents retained as /home/thierry/.ssh/known_hosts.old + +- Récupérer la clé publique à distance + +$ ssh-keyscan remotehost +# remotehost SSH-2.0-OpenSSH_5.2 +remotehost ssh-rsa +AAAAB3NzaC1yc2EAAAABIwAAAQEAyREFGMBB6Qi1uoEYIk4GlqLXdS26moAxmV69UX0icQjp0Rw53xZ/2L0ZQwhsUiFV1vq4QfZNeUO142IzBgSspgsJZ7wJq213tsE7WIJGIBqvWnhU3vJuL9wgYT8f6BAvLoEfapFhLy24TDmn2DXldJAYgo8MnUbRrJlvnhQZPpd5cDWCXkzPGQE8r7REZsAWbWNlVOFRvZioPoGCGYMtsDWSBelBISGkedoNpTSpRkMmBAnsHBfvIzDPoTDYL4PZR0jJ8MaJrDhRtD4caRw4HVyhzSa3/FCpcm09PyBRabH/CyxNSOZjLc2+N9Ph9AKeTNgvmxP70wx668XaGYwCrQ== + +- ssh DNS keys + + +Bridging the gap +Image courtesy by Wouter Horré + + +Patrick Debois +Independent IT-consultant +Bridging the gap between projects and operations +by using Agile techniques both in development,project management and system administration. + +availability: January 2013 +Just Enough Developed Infrastructure +ssh tricks - the usual and beyond + SSH is an amazing beast. I nearly use it everyday and I'm amazed every time I learn something new. The following is a list of my tricks in the bag. It starts with the usual +tricks that you find all over the place, but I hope there will be some new tricks for you too. + +What's your best trick? Share it in the comments with the world. Nobody can know enough of ssh! +The basics: +Password-less login: + +This is usually the first thing start doing when want automation with ssh + +#Create a new keypair +$ ssh-keygen -t dsa +Generating public/private dsa key pair. +Enter file in which to save the key (/Users/patrick/.ssh/id_dsa): +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /Users/patrick/.ssh/id_dsa. +Your public key has been saved in /Users/patrick/.ssh/id_dsa.pub. +The key fingerprint is: +87:66:b7:a0:f6:0e:6a:71:2c:5d:ee:5f:17:2a:b7:2f patrick@localhost +The key's randomart image is: ++--[ DSA 1024]----+ +| | +| | +| | +| .. | +| o oS o . | +| o ++.+ . . . | +| ++. o + . | +| .o o. +Eo | +| .. .o.. .o. | ++-----------------+ +$ cat ~/.ssh/id_dsa.pub | ssh user@remotehost "cat - >> ~/.ssh/authorized_keys" +$ ssh user@remotehost + +Install your keys on a remote server: + +$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@remotehost +#Alternative +$ cat ~/.ssh/id_dsa.pub | ssh user@remotehost "cat - >> ~/.ssh/authorized_keys" + +Passphrase automation: + +If you have protected your keys with a passphrase (which you should), then it is annoying to re-enter that all the time. You can avoid that by running your environment inside an +ssh-agent and using ssh-add to enter the passphrase once. + +$ ssh-add ~/.ssh/id_dsa +Need passphrase for /home/mah/.ssh/id_dsa (you@example.com). +Enter passphrase: +$ + +Pseudo Terminal : + +some commands like sudo require a pseudo terminal to be activated + +$ ssh -t patrick@remotehost sudo cat /etc/passwd + +Avoid lastlog: + +Log in without appearing in lastlog/w and who output. + +$ ssh -T user@hostname.com + +Piping + +Example of using piping to backup over the network + +$ ufsdump 0uf - /dev/md/rdsk/d33 | ssh r280n "dd obs=32k ibs=32k of=/dev/rmt/0n" + +Rsync over ssh + +$ rsync -avz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/ + +Tunnels and firewall-piercings: +X-forwarding: + +$ ssh -X patrick@remotehost +Warning: untrusted X11 forwarding setup failed: xauth key data not generated +Warning: No xauth data; using fake authentication data for X11 forwarding. +Last login: Fri Aug 27 20:27:40 2010 + +Port forwarding: + +Set up a localforward from the remote machine port 25 to a local port 9025 + +$ ssh -L 9025:localhost:25 patrick@remotehost + +No command: + +Sometimes you just want to setup a forward with having a shell + +$ ssh -N -L 9025:localhost:25 patrick@remotehost + +KeepAlive: + +Getting tired of those timeouts by the firewall? Have ssh send a keepalive/ + +Put the following options in your $HOME/.ssh/ssh_config + + KeepAlive yes + ServerAliveInterval 60 + +Socks Daemon for proxying: (-D) + +Sometimes it's interesting to start a socks daemon. You can configure this in your browser to surf as it seems to come from the remote machine. + +$ ssh -D 9999 patrick@remotehost + +Tunneling over an http proxy: + +Corporate firewalls often only allow http to go outside. See corkscrew + +ProxyCommand /usr/bin/corkscrew proxy-ip 8080 %h %p ~/.ssh/myauth + +Chaining ssh hopping: + +Host pc1.example.org pc2.example.org +ForwardAgent yes +ProxyCommand ssh -qax bastion.example.org /usr/bin/nc -w 120 %h %p + +Netcat mode: + +Starting from openssh 5.4: we can have ssh act as netcat. (-W) This connects stdio on the client to a single port forward on the server. This allows, for example, using ssh as a +ProxyCommand to route connections via intermediate servers.” + +$ ssh -p 443 -W remotehost2:23 patrick@remotehost +Trying remotehost2... +Connected to remotehost2. +Escape character is '^]'. + +User Name : ^] +telnet> close +$ + +Mounting over ssh: + +Sometimes it's nice to mount a remote directory over ssh. Fuse and sshfs are your friend + +$ sshfs remote-user@remote.server:/remote/directory /mnt/remote-fs/ + +http://fuse.sourceforge.net/sshfs.html +VPN Tunneling: + +Did you know that ssh can do layer 2 and 3 VPN tunneling? + +Check out ssh -w. Example from manpage: + +$ ssh -f -w 0:1 192.168.1.15 true +$ ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252 + +SSH http multiplexer: + +sslh lets one accept both HTTPS and SSH connections on the same port. It makes it possible to connect to an SSH server on port 443 (e.g. from inside a corporate firewall) while +still serving HTTPS on that port. http://www.rutschle.net/tech/sslh.shtml +Speed +Compression + +If you are working on a slow link, compression (-C) and using a simple cipher (-c blowfish) saves you speed + +$ ssh -C -c blowfish patrick@remotehost + +Multiplexing - ControlMaster: + +Another great way to speed up ssh is to re-use the same connection when you connect multiple times to the same host + +$ mkdir –p ~/.ssh/connections +$ chmod 700 ~/.ssh/connections + +Add this to your ~/.ssh/config file: +Host * +ControlMaster auto +ControlPath ~/.ssh/connections/%r_%h_%p + +Managing keys +Ignore Hostkeys: + +When you're re-installing a machine over and over again, you often want to get rid of the hostfile key verification. This is what you need: + +$ ssh user@host -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null + +Check if hostkey exists: + +k$ ssh-keygen -F 192.168.2.152 +# Host 192.168.2.152 found: line 31 type RSA +192.168.2.152 ssh-rsa +AAAAB3NzaC1yc2EAAAABIwAAAQEAwHH15HpeJo21wyqpe2iFM8/0CtoYnE9DDXfCewws7iMhM+vgp7pjnaC83IgAt7G/x/VDHcbnyuI4odrGSEAE5wm7LNuT6uSfQMbXCayE+uoOIrAVhf41ZnAFQrs/+Mutk5LFEjPPNhuriq5ltBT4UwMlYQMa5z/SzmxV0ZAGXks5GMDz0o89yUwRarRfsGudASEtzUxgnxnOo5STBMZOdQ0GNEVdfJDgfJDAOi34T1FidpCqAtm8akYuB+Qsj3/hDQmIT+GsKYaGNZvz8ZNnPBAc9kWlS6VqXXNreyEeu7AmHDWXjMP3NW1tsibmZ8zeOSZdmEVEiuaYCIvERDq3MQ== + +Remove a hostkey: + +$ ssh-keygen -R 192.168.2.152 +/Users/patrick/.ssh/known_hosts updated. +Original contents retained as /Users/patrick/.ssh/known_hosts.old + +Get hostkey of remote server: + +$ ssh-keyscan remotehost +# remotehost SSH-2.0-OpenSSH_5.2 +remotehost ssh-rsa +AAAAB3NzaC1yc2EAAAABIwAAAQEAyREFGMBB6Qi1uoEYIk4GlqLXdS26moAxmV69UX0icQjp0Rw53xZ/2L0ZQwhsUiFV1vq4QfZNeUO142IzBgSspgsJZ7wJq213tsE7WIJGIBqvWnhU3vJuL9wgYT8f6BAvLoEfapFhLy24TDmn2DXldJAYgo8MnUbRrJlvnhQZPpd5cDWCXkzPGQE8r7REZsAWbWNlVOFRvZioPoGCGYMtsDWSBelBISGkedoNpTSpRkMmBAnsHBfvIzDPoTDYL4PZR0jJ8MaJrDhRtD4caRw4HVyhzSa3/FCpcm09PyBRabH/CyxNSOZjLc2+N9Ph9AKeTNgvmxP70wx668XaGYwCrQ== + +- SSH DNS Keys + +Instead of using your local hostfile, you can store your keys in DNS. Have a look at http://freshmeat.net/projects/sshfp/ to do the job. +Then you can specify ssh needs to: + +$ ssh localhost -o "VerifyHostKeyDNS=yes" +yes authenticity of host 'localhost (127.0.0.1)' can't be established. +RSA key fingerprint is 2d:d3:29:bd:4d:e2:7d:a3:b0:15:96:26:d4:60:13:34. +Matching host key fingerprint found in DNS. +Are you sure you want to continue connecting (yes/no)? + +- SSH Escape Sequences: + +It often happens to me that I'm working into an ssh shell that used forwarding. I always thought there was no way to change the forwarding rules and that I had to logout. It +seems not! SSh has an internal shell activated by a tilde. Seeing is believing! + +Escape sequences are only recognized after a newline and are initiated with a tilde (~) unless you modify it with the -e flag. + +Hit ENTER ~? on a running ssh session to see a list of escapes: + +~. – terminate connection +~B – send a BREAK to the remote system +~C – open a command line +~R – Request rekey (SSH protocol 2 only) +~^Z – suspend ssh +~# – list forwarded connections +~& – background ssh (when waiting for connections to terminate) +~? – this message +~~ – send the escape character by typing it twice +(Note that escapes are only recognized immediately after newline.) +~. and ~# are particularly useful. + +- Visualiser la clé: + +Every host key has it's own visual fingerprint + +$ ssh -o VisualHostKey=yes thierry@localhost +Host key fingerprint is 9f:a0:03:c1:63:8b:b8:c6:d6:83:cb:22:33:cb:83:cc ++--[ RSA 2048]----+ +| | +| . | +| = | +| . o + | +|. . o S | +|..o . . o . | +|== o o o | +|@E. . . | +|+B. | ++-----------------+ + + diff --git a/talimatname/temel/openssh/talimat b/talimatname/temel/openssh/talimat new file mode 100644 index 000000000..03a635e5a --- /dev/null +++ b/talimatname/temel/openssh/talimat @@ -0,0 +1,54 @@ +# Tanım: Free version of the SSH connectivity tools +# URL: http://www.openssh.org/ +# Paketçi: milisarge +# Gerekler: + +isim=openssh +surum=7.1p2 +devir=1 + +kaynak=(ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/$isim-$surum.tar.gz + http://downloads.nutyx.org/files/patchs/openssh-server/service-saravane-01.patch) + +derle() { +source /etc/blfs-bootscripts +wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + +unset MAKEFLAGS +cd $isim-$surum + +install -v -m700 -d $PKG/var/lib/sshd + +chown -v root:sys $PKG/var/lib/sshd + +./configure --prefix=/usr \ +--sysconfdir=/etc/ssh \ +--datadir=/usr/share/sshd \ +--with-md5-passwords \ +--with-privsep-path=/var/lib/sshd \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info + +make DESTDIR=$PKG install + +if [ -f /etc/pam.d/login ]; then + mkdir -p $PKG/etc/pam.d + sed 's@d/login@d/sshd@g' /etc/pam.d/login > $PKG/etc/pam.d/sshd + chmod 644 $PKG/etc/pam.d/sshd +fi + +install -v -m755 contrib/ssh-copy-id $PKG/usr/bin +install -v -m644 contrib/ssh-copy-id.1 \ +$PKG/usr/share/man/man1 + +install -v -m755 -d $PKG/usr/share/doc/$isim-$surum +install -v -m644 INSTALL LICENCE OVERVIEW README* \ +$PKG/usr/share/doc/$isim-$surum + +cd $SRC + +tar xf $scripts-$scriptsversion.tar.bz2 +cd $SRC/$scripts-$scriptsversion +patch -Np1 -i ../service-saravane-01.patch +make DESTDIR=$PKG install-sshd +} diff --git a/talimatname/temel/openssl/talimat b/talimatname/temel/openssl/talimat new file mode 100644 index 000000000..72b43dfe1 --- /dev/null +++ b/talimatname/temel/openssl/talimat @@ -0,0 +1,42 @@ +# Tanım: The Open Source toolkit for Secure Sockets Layer and Transport Layer Security. +# URL: http://www.openssl.org/ +# Paketçi: milisarge +# Gerekler: + +isim=openssl +surum=1.0.2f +devir=1 + +kaynak=(ftp://ftp.openssl.org/source/$isim-$surum.tar.gz) + +derle() { +unset MAKEFLAGS + +cd $isim-$surum + +./config --prefix=/usr \ + --openssldir=/etc/ssl \ + shared zlib-dynamic + +make +make INSTALL_PREFIX=$PKG MANDIR=/usr/share/man \ +MANSUFFIX=ssl install + +cp -v -r certs $PKG/etc/ssl + +mv $PKG/usr/bin \ +$PKG + +mv $PKG/usr/lib* \ +$PKG/lib + +mkdir $PKG/usr/lib + +mv $PKG/lib/pkgconfig \ +$PKG/usr/lib + +for file in libcrypto.pc openssl.pc libssl.pc + do + sed -i "s/lib64/lib/" $PKG/usr/lib/pkgconfig/$file +done +} diff --git a/talimatname/temel/pam/talimat b/talimatname/temel/pam/talimat new file mode 100644 index 000000000..10624dd88 --- /dev/null +++ b/talimatname/temel/pam/talimat @@ -0,0 +1,34 @@ +# Tanım: Pluggable Authentication Modules to choose how applications authenticate users. +# URL: http://www.kernel.org/pub/libs/pam +# Paketçi: milisarge +# Gerekler: + +isim=pam +surum=1.2.1 +devir=1 + +kaynak=(http://linux-pam.org/library/Linux-PAM-$surum.tar.bz2) + +derle() { +if [ "`uname -m`" == "x86_64" ]; then + LIB=lib64 +else + LIB=lib +fi + +mkdir -p $PKG/etc/pam.d +cd Linux-PAM-$surum +./configure --prefix=/usr --sysconfdir=/etc \ +--enable-securedir=/$LIB/security \ +--docdir=/usr/share/doc/Linux-PAM-$surum \ +--disable-nis --libdir=/usr/lib +make +make DESTDIR=$PKG install +chmod -v 4755 $PKG/sbin/unix_chkpwd + +for file in pam pam_misc pamc +do + mv -v $PKG/usr/lib/lib${file}.so.* $PKG/$LIB && + ln -sfv ../../$LIB/$(readlink $PKG/usr/lib/lib${file}.so) $PKG/usr/lib/lib${file}.so +done +} diff --git a/talimatname/temel/patch/talimat b/talimatname/temel/patch/talimat new file mode 100644 index 000000000..4f31e1057 --- /dev/null +++ b/talimatname/temel/patch/talimat @@ -0,0 +1,19 @@ +# Tanım: The GNU patch tool +# URL: http://www.gnu.org/software/patch/patch.html +# Paketçi: milisarge +# Gerekler: + +isim=patch +surum=2.7.5 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/patch/patch-$surum.tar.xz) + +derle() +{ +cd patch-$surum +./configure --prefix=/usr +make +make prefix=$PKG/usr \ +mandir=$PKG/usr/share/man install +} diff --git a/talimatname/temel/pciutils/pciutils.kur-kos b/talimatname/temel/pciutils/pciutils.kur-kos new file mode 100644 index 000000000..1a8d4faee --- /dev/null +++ b/talimatname/temel/pciutils/pciutils.kur-kos @@ -0,0 +1 @@ +/usr/sbin/update-pciids diff --git a/talimatname/temel/pciutils/talimat b/talimatname/temel/pciutils/talimat new file mode 100644 index 000000000..21fc9740b --- /dev/null +++ b/talimatname/temel/pciutils/talimat @@ -0,0 +1,29 @@ +# Tanım: PCI bus configuration space access library and tools +# URL: http://atrey.karlin.mff.cuni.cz/~mj/pciutils.html +# Paketçi: milisarge +# Gerekler: + +isim=pciutils +surum=3.4.1 +devir=1 + +kaynak=(ftp://ftp.kernel.org/pub/software/utils/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +make OPT="$CFLAGS -fPIC -DPIC" \ +ZLIB=no \ +PREFIX=/usr \ +SHAREDIR=/usr/share/misc \ +MANDIR=/usr/share/man \ +SHARED=yes all + +mkdir -p $PKG/usr/share/man +mkdir -p $PKG/usr/lib +make PREFIX=$PKG/usr \ +SHAREDIR=$PKG/usr/share/misc \ +MANDIR=$PKG/usr/share/man \ +SHARED=yes ZLIB=no \ +install install-lib +chmod -v 755 $PKG/usr/lib/libpci.so.$surum +} diff --git a/talimatname/temel/perl/talimat b/talimatname/temel/perl/talimat new file mode 100644 index 000000000..5d1a1c300 --- /dev/null +++ b/talimatname/temel/perl/talimat @@ -0,0 +1,58 @@ +# Tanım: The Perl package contains the Practical Extraction and Report Language. +# URL: http://www.perl.org/ +# Paketçi: milisarge +# Gerekler: + +isim=perl +surum=5.22.1 +devir=1 + +kaynak=(http://ftp.funet.fi/pub/CPAN/src/$isim-$surum.tar.bz2) + +derle() +{ +cd $isim-$surum + +if [ "`uname -m`" == "x86_64" ]; then + _ARCH="-Dcccdlflags='-fPIC'" +else + _ARCH="" +fi + +echo "127.0.0.1 localhost $(hostname)" > /etc/hosts +export BUILD_ZLIB=False +export BUILD_BZIP2=0 + + +sh Configure -des -Dusethreads \ + -Dprefix=/usr -Duseshrplib -Dscriptdir=/usr/bin \ + -Dvendorbin=/usr/bin -Dsitebin=/usr/bin \ + -Dvendorprefix=/usr -Dinc_version_list=none \ + -Darchlib=/usr/lib/share/perl5/base \ + -Dprivlib=/usr/lib/share/perl5/base \ + -Dvendorlib=/usr/lib/share/perl5/vendor \ + -Dvendorarch=/usr/lib/perl5/vendor \ + -Dsitelib=/usr/lib/perl5/site \ + -Dsitearch=/usr/lib/perl5/site \ + -Dman1dir=/usr/share/man/man1 \ + -Dman3dir=/usr/share/man/man3 \ + -Dpager="/usr/bin/less isR" ${_ARCH} + +make +# Only when we are building a new base + +if [ -L /tools ]; then + make -k test || true +fi + +make DESTDIR=$PKG install +find $PKG -iname 'TODO*' -or \ + -iname 'Change*' -or \ + -iname 'README*' -or \ + -name '*.bs' -or \ + -name .packlist -or \ + -name perllocal.pod | xargs rm +find $PKG -depth -empty -exec rmdir {} \; +chmod -R +w $PKG +unset BUILD_ZLIB BUILD_BZIP2 +} diff --git a/talimatname/temel/pkg-config/talimat b/talimatname/temel/pkg-config/talimat new file mode 100644 index 000000000..56135235c --- /dev/null +++ b/talimatname/temel/pkg-config/talimat @@ -0,0 +1,21 @@ +# Tanım: A system for managing library compile/link flags. +# URL: http://pkgconfig.freedesktop.org/ +# Paketçi: milisarge +# Gerekler: + +isim=pkg-config +surum=0.29 +devir=1 + +kaynak=(http://pkgconfig.freedesktop.org/releases/pkg-config-$surum.tar.gz) +derle() +{ +cd pkg-config-$surum +./configure --prefix=/usr \ +--with-internal-glib \ +--disable-host-tool \ +--docdir=/usr/share/doc/pkg-config-$surum +make +make DESTDIR=$PKG install +rm -r $PKG/usr/share/doc +} diff --git a/talimatname/temel/procps-ng/talimat b/talimatname/temel/procps-ng/talimat new file mode 100644 index 000000000..cca190073 --- /dev/null +++ b/talimatname/temel/procps-ng/talimat @@ -0,0 +1,31 @@ +# Tanım: Utilities for monitoring your system and its processes. +# URL: http://procps.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=procps-ng +surum=3.3.11 +devir=1 + +kaynak=(http://downloads.sourceforge.net/project/$isim/Production/$isim-$surum.tar.xz) + +derle() +{ +cd $isim-$surum + +./configure --prefix=/usr \ +--exec-prefix= \ +--libdir=/lib --bindir=/bin --sbindir=/sbin \ +--docdir=/usr/share/doc/procps-ng-$surum \ +--disable-static \ +--disable-skill \ +--disable-kill +make +make DESTDIR=$PKG install + +mkdir -p $PKG/usr/lib + +mv $PKG/lib/pkgconfig \ +$PKG/usr/lib/ +rm -r $PKG/usr/share/doc +} diff --git a/talimatname/temel/psmisc/talimat b/talimatname/temel/psmisc/talimat new file mode 100644 index 000000000..0114f148f --- /dev/null +++ b/talimatname/temel/psmisc/talimat @@ -0,0 +1,18 @@ +# Tanım: Set of some small useful utilities that use the proc filesystem. +# URL: http://psmisc.sourceforge.net/ +# Paketçi: milisarge +# Gerekler: + +isim=psmisc +surum=22.21 +devir=1 + +kaynak=(http://prdownloads.sourceforge.net/psmisc/psmisc-$surum.tar.gz) + +derle() +{ +cd psmisc-$surum +./configure --prefix=/usr --libdir=/lib --bindir=/bin +make +make DESTDIR=$PKG install +} diff --git a/talimatname/temel/readline/talimat b/talimatname/temel/readline/talimat new file mode 100644 index 000000000..aff608df6 --- /dev/null +++ b/talimatname/temel/readline/talimat @@ -0,0 +1,47 @@ +# Tanım: Set of libraries that offers command-line editing and history capabilities. +# URL: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html +# Paketçi: milisarge +# Gerekler: + +isim=readline +surum=6.3 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/readline/readline-$surum.tar.gz + http://www.linuxfromscratch.org/patches/downloads/$isim/$isim-$surum-upstream_fixes-3.patch) + +derle() +{ +cd readline-$surum +patch -Np1 -i ../$isim-$surum-upstream_fixes-3.patch + +sed -i '/MV.*old/d' Makefile.in +sed -i '/{OLDSUFF}/c:' support/shlib-install + +./configure --prefix=/usr \ +--docdir=/usr/share/doc/readline-$surum + +make SHLIB_LIBS=-lncurses + +make DESTDIR=$PKG install + +mkdir -p $PKG/lib + +mv -v $PKG/usr/lib/lib{readline,history}.so.* \ +$PKG/lib + +rm -rf $PKG/usr/share/info/dir + +mkdir -p $PKG/usr/share/doc/readline-$surum +install -v -m644 doc/*.{ps,pdf,html,dvi} \ +$PKG/usr/share/doc/readline-$surum + +rm -rv $PKG/usr/bin + +ln -sfv ../../lib/libreadline.so.6 \ +$PKG/usr/lib/libreadline.so + +ln -sfv ../../lib/libhistory.so.6 \ +$PKG/usr/lib/libhistory.so +rm -r $PKG/usr/share/{doc,info} +} diff --git a/talimatname/temel/rsync/rsync.kur-kos b/talimatname/temel/rsync/rsync.kur-kos new file mode 100644 index 000000000..86775d46e --- /dev/null +++ b/talimatname/temel/rsync/rsync.kur-kos @@ -0,0 +1,12 @@ +if [ ! -f /etc/rsyncd.conf ]; then + cat > /etc/rsyncd.conf << "EOF" +# use chroot = yes +# [site] +# path = /root/x.org +# comment = Site web +# auth users = milisx +# read only = yes +# exclude from = /etc/milis_rsync_exclude_files.txt +# secrets file = /etc/rsyncd.secrets +EOF +fi diff --git a/talimatname/temel/rsync/rsync.okubeni b/talimatname/temel/rsync/rsync.okubeni new file mode 100644 index 000000000..c827fc0cf --- /dev/null +++ b/talimatname/temel/rsync/rsync.okubeni @@ -0,0 +1,27 @@ +Pour lancer le service rsync, 2 choix: + +- 1. installer soit le port: rsync.service +- 2. http://www.linuxfromscratch.org/blfs/view/svn/basicnet/rsync.html + En bas de la page, télécharger et lancer + make install-rsyncd dans le dossier où sont les fichiers extraits. + +Voici un fichier de configuration basique: + +cat > /etc/rsyncd.conf << "EOF" +# This is a basic rsync configuration file +# It exports a single module without user authentication. + +motd file = /home/rsync/welcome.msg +use chroot = yes + +[localhost] + path = /home/rsync + comment = Default rsync module + read only = yes + list = yes + uid = rsyncd + gid = rsyncd + +EOF + +Vous trouverez plus d'information sur http://rsync.samba.org/documentation.html diff --git a/talimatname/temel/rsync/talimat b/talimatname/temel/rsync/talimat new file mode 100644 index 000000000..715c9a331 --- /dev/null +++ b/talimatname/temel/rsync/talimat @@ -0,0 +1,29 @@ +# Tanım: Synchronizing files over a network by sending just the differences in the files. +# URL: http://samba.anu.edu.au/rsync/ +# Paketçi: milisarge +# Gerekler: + +isim=rsync +surum=3.1.2 +devir=1 + +kaynak=( http://rsync.samba.org/ftp/$isim/$isim-$surum.tar.gz ) + +derle() { +source /etc/blfs-bootscripts +wget http://www.linuxfromscratch.org/blfs/downloads/svn/$scripts-$scriptsversion.tar.bz2 + +cd $isim-$surum +./configure --prefix=/usr \ +-mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install + +# service +cd $SRC + +tar xf $scripts-$scriptsversion.tar.bz2 +cd $SRC/$scripts-$scriptsversion +make DESTDIR=$PKG install-rsyncd +} diff --git a/talimatname/temel/sed/talimat b/talimatname/temel/sed/talimat new file mode 100644 index 000000000..1356c32ea --- /dev/null +++ b/talimatname/temel/sed/talimat @@ -0,0 +1,22 @@ +# Tanım: Takes text input, do some operation on it, and outputs the modified text. +# URL: http://www.gnu.org/software/sed//sed.html +# Paketçi: milisarge +# Gerekler: + +isim=sed +surum=4.2.2 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/sed/sed-$surum.tar.bz2) + +derle() +{ +cd sed-$surum +./configure --prefix=/usr --bindir=/bin \ +--libdir=/lib --htmldir=/usr/share/doc/sed-$surum +make +make html +make check +make DESTDIR=$PKG install +rm -r $PKG/usr/share/info +} diff --git a/talimatname/temel/shadow/talimat b/talimatname/temel/shadow/talimat new file mode 100644 index 000000000..830ffc045 --- /dev/null +++ b/talimatname/temel/shadow/talimat @@ -0,0 +1,222 @@ +# Tanım: The Shadow package contains programs for handling passwords in a secure way. +# URL: http://shadow.pld.org.pl/ +# Paketçi: milisarge +# Gerekler: + +isim=shadow +surum=4.2.1 +devir=1 + +kaynak=( http://pkg-shadow.alioth.debian.org/releases/shadow-$surum.tar.xz) + +derle() +{ +cd shadow-$surum + +sed -i 's/groups$(EXEEXT) //' src/Makefile.in +find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; + +sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ + -e 's@/var/spool/mail@/var/mail@' etc/login.defs + +sed -i 's/1000/999/' etc/useradd + +./configure --sysconfdir=/etc +make +make DESTDIR=$PKG install +sed -i 's/yes/no/' $PKG/etc/default/useradd +sed -i 's/GROUP/# GROUP/' $PKG/etc/default/useradd +mv -v $PKG/usr/bin/* $PKG/bin +mv -v $PKG/usr/sbin/* $PKG/sbin +# +# Following sed comment appropriate lines in etc/login.defs, and stop login +# from performing these functions. First backup the etc/login.defs +install -v -m644 $PKG/etc/login.defs{,.orig} +for FUNCTION in FAIL_DELAY FAILLOG_ENAB \ + LASTLOG_ENAB \ + MAIL_CHECK_ENAB \ + OBSCURE_CHECKS_ENAB \ + PORTTIME_CHECKS_ENAB \ + QUOTAS_ENAB \ + CONSOLE MOTD_FILE \ + FTMP_FILE NOLOGINS_FILE \ + ENV_HZ PASS_MIN_LEN \ + SU_WHEEL_ONLY \ + CRACKLIB_DICTPATH \ + PASS_CHANGE_TRIES \ + PASS_ALWAYS_WARN \ + CHFN_AUTH ENCRYPT_METHOD \ + ENVIRON_FILE +do + sed -i "s/^${FUNCTION}/# &/" $PKG/etc/login.defs +done + +# +# Configuration files for pam +mkdir -p $PKG/etc/pam.d +cat > $PKG/etc/pam.d/system-account << "EOF" +# Begin /etc/pam.d/system-account + +account required pam_unix.so + +# End /etc/pam.d/system-account +EOF + +cat > $PKG/etc/pam.d/system-auth << "EOF" +# Begin /etc/pam.d/system-auth + +auth required pam_unix.so + +# End /etc/pam.d/system-auth +EOF + +cat > $PKG/etc/pam.d/system-password << "EOF" +# Begin /etc/pam.d/system-password + +# use sha512 hash for encryption, use shadow, and try to use any previously +# defined authentication token (chosen password) set by any prior module +password required pam_pwhistory.so retry=3 +password required pam_unix.so sha512 shadow try_first_pass + +# End /etc/pam.d/system-password +EOF + +cat > $PKG/etc/pam.d/system-session << "EOF" +# Begin /etc/pam.d/system-session + +session required pam_unix.so +session optional pam_loginuid.so +session optional pam_ck_connector.so nox11 + +# End /etc/pam.d/system-session +EOF + +cat > $PKG/etc/pam.d/login << "EOF" +# Begin /etc/pam.d/login + +# Set failure delay before next prompt to 3 seconds +auth optional pam_faildelay.so delay=3000000 + +# Check to make sure that the user is allowed to login +auth requisite pam_nologin.so + +# Check to make sure that root is allowed to login +# Disabled by default. You will need to create /etc/securetty +# file for this module to function. See man 5 securetty. +#auth required pam_securetty.so + +# Additional group memberships - disabled by default +#auth optional pam_group.so + +# include the default auth settings +auth include system-auth + +# check access for the user +account required pam_access.so + +# include the default account settings +account include system-account + +# Set default environment variables for the user +session required pam_env.so + +# Set resource limits for the user +session required pam_limits.so + +# Display date of last login - Disabled by default +#session optional pam_lastlog.so + +# Display the message of the day - Disabled by default +#session optional pam_motd.so + +# Check user's mail - Disabled by default +#session optional pam_mail.so standard quiet + +# include the default session and password settings +session include system-session +password include system-password + +# End /etc/pam.d/login +EOF + +cat > $PKG/etc/pam.d/passwd << "EOF" +# Begin /etc/pam.d/passwd + +password include system-password + +# End /etc/pam.d/passwd +EOF + +cat > $PKG/etc/pam.d/su << "EOF" +# Begin /etc/pam.d/su + +# always allow root +auth sufficient pam_rootok.so +auth include system-auth + +# include the default account settings +account include system-account + +# Set default environment variables for the service user +session required pam_env.so + +# include system session defaults +session include system-session + +# End /etc/pam.d/su +EOF + +cat > $PKG/etc/pam.d/chage << "EOF" +#Begin /etc/pam.d/chage + +# always allow root +auth sufficient pam_rootok.so + +# include system defaults for auth account and session +auth include system-auth +account include system-account +session include system-session + +# Always permit for authentication updates +password required pam_permit.so + +# End /etc/pam.d/chage +EOF + +for PROGRAM in chfn chgpasswd chpasswd chsh groupadd groupdel \ + groupmems groupmod newusers useradd userdel usermod +do + install -v -m644 $PKG/etc/pam.d/chage $PKG/etc/pam.d/${PROGRAM} + sed -i "s/chage/$PROGRAM/" $PKG/etc/pam.d/${PROGRAM} +done + +# Backup others +[ -f $PKG/pam.d/other ] && install -v -m644 $PKG/etc/pam.d/other{,.orig} + +# Other +# +cat > $PKG/etc/pam.d/other << "EOF" +# Begin /etc/pam.d/other + +auth required pam_warn.so +auth required pam_deny.so +account required pam_warn.so +account required pam_deny.so +password required pam_warn.so +password required pam_deny.so +session required pam_warn.so +session required pam_deny.so + +# End /etc/pam.d/other +EOF + +# Replace the login and ressource limits file +if [ -f $PKG/etc/login.access ]; then + mv -v $PKG/etc/login.access{,.NOUSE} +fi +if [ -f $PKG/etc/limits ]; then + mv -v $PKG/etc/limits{,.NOUSE} +fi +rm $PKG/usr/share/man/man8/nologin.8 +rm $PKG/sbin/nologin +} diff --git a/talimatname/temel/squashfs/talimat b/talimatname/temel/squashfs/talimat new file mode 100644 index 000000000..0ca7347d3 --- /dev/null +++ b/talimatname/temel/squashfs/talimat @@ -0,0 +1,17 @@ +# Tanım: Squashfs is a compressed read-only filesystem for Linux. +# URL: http://squashfs.sourceforge.net/ +# Paketçi: milisarge@gmail.com +# Gerekler: + +isim=squashfs +surum=4.3 +devir=2 + +kaynak=(http://downloads.sourceforge.net/sourceforge/$isim/$isim$surum.tar.gz) + +derle() { +cd $isim$surum/squashfs-tools +make XZ_SUPPORT=1 LZO_SUPPORT=1 LZMA_XZ_SUPPORT=1 LZA_SUPPORT=1 +mkdir -p $PKG/bin +make INSTALL_DIR=$PKG/bin install +} diff --git a/talimatname/temel/sudo/talimat b/talimatname/temel/sudo/talimat new file mode 100644 index 000000000..1701d914e --- /dev/null +++ b/talimatname/temel/sudo/talimat @@ -0,0 +1,46 @@ +# Tanım: Give certain users (or groups) the ability to run some commands as root. +# URL: http://www.sudo.ws +# Paketçi: milisarge +# Gerekler: + +isim=sudo +surum=1.8.15 +devir=1 + +kaynak=(http://www.sudo.ws/sudo/dist/$isim-$surum.tar.gz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--libexecdir=/usr/lib \ +--docdir=/usr/share/doc/sudo-$surum \ +--with-all-insults \ +--with-env-editor \ +--without-sendmail \ +--with-passprompt="[sudo] password for %p: " + +make +make DESTDIR=$PKG install + +mkdir -pv $PKG/etc/pam.d + +cat > $PKG/etc/pam.d/sudo << "EOF" && +# Begin /etc/pam.d/sudo + +# include the default auth settings +auth include system-auth + +# include the default account settings +account include system-account + +# Set default environment variables for the service user +session required pam_env.so + +# include system session defaults +session include system-session + +# End /etc/pam.d/sudo +EOF +chmod 644 $PKG/etc/pam.d/sudo +echo "%wheel ALL=(ALL) ALL" >> $PKG/etc/sudoers +} diff --git a/talimatname/temel/sysklogd/talimat b/talimatname/temel/sysklogd/talimat new file mode 100644 index 000000000..27fb60044 --- /dev/null +++ b/talimatname/temel/sysklogd/talimat @@ -0,0 +1,40 @@ +# Tanım: For logging system messages, such as those given by the kernel. +# URL: http://www.infodrom.org/projects/sysklogd/ +# Paketçi: milisarge +# Gerekler: + +isim=sysklogd +surum=1.5.1 +devir=1 + +kaynak=(http://www.infodrom.org/projects/sysklogd/download/sysklogd-$surum.tar.gz) + +derle() +{ +cd sysklogd-$surum + +sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c + +mkdir -p $PKG/{/sbin,etc,usr/share/man/man{5,8}} + +make + +make BINDIR=$PKG/sbin MANDIR=$PKG/usr/share/man install + +cat > $PKG/etc/syslog.conf << "EOF" +# Begin /etc/syslog.conf + +auth,authpriv.* -/var/log/auth.log +*.*;auth,authpriv.none -/var/log/sys.log +daemon.* -/var/log/daemon.log +kern.* -/var/log/kern.log +mail.* -/var/log/mail.log +user.* -/var/log/user.log +local7.* -/var/log/pkg-get.log +cron.* -/var/log/cron.log +*.emerg * + +# End /etc/syslog.conf +EOF +} + diff --git a/talimatname/temel/sysvinit/talimat b/talimatname/temel/sysvinit/talimat new file mode 100644 index 000000000..f5465c418 --- /dev/null +++ b/talimatname/temel/sysvinit/talimat @@ -0,0 +1,59 @@ +# Tanım: Programs for controlling the startup, running, and shutdown of the system. +# URL: ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/ +# Paketçi: milisarge +# Gerekler: + +isim=sysvinit +surum=2.88dsf +devir=2 + +kaynak=(http://ftp.twaren.net/Unix/NonGNU/sysvinit/sysvinit-$surum.tar.bz2 + http://www.linuxfromscratch.org/patches/lfs/development/sysvinit-2.88dsf-consolidated-1.patch) + +derle() +{ +cd sysvinit-$surum +patch -Np1 -i ../sysvinit-2.88dsf-consolidated-1.patch + +make -C src + +mkdir -p $PKG/{sbin,bin,usr/{bin,include,share/man/man{1,5,8}}} + +make -C src ROOT=$PKG install + +rm -r $PKG/usr/bin +rm -r $PKG/usr/share/man/man1 + +mkdir $PKG/etc + +cat > $PKG/etc/inittab << "EOF" +# Begin /etc/inittab +# id:3 (defaut si installation de base) +# lxdm, sddm ou kdm: id:5 + +id:3:initdefault: + +si::sysinit:/etc/rc.d/init.d/rc S + +l0:0:wait:/etc/rc.d/init.d/rc 0 +l1:S1:wait:/etc/rc.d/init.d/rc 1 +l2:2:wait:/etc/rc.d/init.d/rc 2 +l3:3:wait:/etc/rc.d/init.d/rc 3 +l4:4:wait:/etc/rc.d/init.d/rc 4 +l5:5:wait:/etc/rc.d/init.d/rc 5 +l6:6:wait:/etc/rc.d/init.d/rc 6 + +ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -h now + +su:S016:once:/sbin/sulogin + +1:2345:respawn:/sbin/agetty --noclear tty1 9600 +2:2345:respawn:/sbin/agetty tty2 9600 +3:2345:respawn:/sbin/agetty tty3 9600 +4:2345:respawn:/sbin/agetty tty4 9600 +5:2345:respawn:/sbin/agetty tty5 9600 +6:2345:respawn:/sbin/agetty tty6 9600 + +# End /etc/inittab +EOF +} diff --git a/talimatname/temel/tar/talimat b/talimatname/temel/tar/talimat new file mode 100644 index 000000000..f9ee3c11c --- /dev/null +++ b/talimatname/temel/tar/talimat @@ -0,0 +1,21 @@ +# Tanım: The Tar package contains an archiving program. +# URL: http://www.gnu.org/software/tar/tar.html +# Paketçi: milisarge +# Gerekler: + +isim=tar +surum=1.28 +devir=2 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) + +derle() +{ +cd $isim-$surum + +FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr --bindir=/bin --libexecdir=/sbin + +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/texinfo/talimat b/talimatname/temel/texinfo/talimat new file mode 100644 index 000000000..e86a620fc --- /dev/null +++ b/talimatname/temel/texinfo/talimat @@ -0,0 +1,19 @@ +# Tanım: Texinfo is the official documentation format of the GNU project. +# URL: http://www.gnu.org/software/texinfo +# Paketçi: milisarge +# Gerekler: + +isim=texinfo +surum=6.1 +devir=1 + +kaynak=(http://ftp.gnu.org/gnu/$isim/texinfo-$surum.tar.xz) + +derle() +{ +cd texinfo-* +./configure --prefix=/usr +make +make install DESTDIR=$PKG +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/tzdata/talimat b/talimatname/temel/tzdata/talimat new file mode 100644 index 000000000..32b46fd97 --- /dev/null +++ b/talimatname/temel/tzdata/talimat @@ -0,0 +1,21 @@ +# Tanım: The zoneinfo database or IANA Time Zone +# URL: http://www.gnu.org/software/libc/ +# Paketçi: milisarge +# Gerekler: + +isim=tzdata +surum=2016a +devir=1 + +kaynak=(http://www.iana.org/time-zones/repository/releases/$isim$surum.tar.gz) +derle() { +timezones=('africa' 'antarctica' 'asia' 'australasia' + 'europe' 'northamerica' 'southamerica' + 'pacificnew' 'etcetera' 'backward' + 'systemv') +zic -y ./yearistype -d $PKG/usr/share/zoneinfo ${timezones[@]} +zic -y ./yearistype -d $PKG/usr/share/zoneinfo/posix ${timezones[@]} +zic -y ./yearistype -d $PKG/usr/share/zoneinfo/right -L leapseconds ${timezones[@]} +zic -y ./yearistype -d $PKG/usr/share/zoneinfo -p Europe/Istanbul +install -m444 -t $PKG/usr/share/zoneinfo iso3166.tab zone.tab +} diff --git a/talimatname/temel/util-linux/talimat b/talimatname/temel/util-linux/talimat new file mode 100644 index 000000000..64ed2b038 --- /dev/null +++ b/talimatname/temel/util-linux/talimat @@ -0,0 +1,42 @@ +# Tanım: System utilities for handling file systems consoles partitions and messages. +# URL: http://freshmeat.net/projects/util-linux/ +# Paketçi: milisarge +# Gerekler: + +isim=util-linux +surum=2.27.1 +devir=1 +kaynak=(http://www.kernel.org/pub/linux/utils/util-linux/v${version:0:4}/util-linux-$surum.tar.xz + ) + +derle() +{ +cd util-linux-$surum + +mkdir -pv $PKG/var/lib/hwclock +./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \ + --docdir=/usr/share/doc/$isim-$surum \ + --disable-chfn-chsh \ + --disable-login \ + --disable-nologin \ + --disable-su \ + --disable-setpriv \ + --disable-runuser \ + --disable-pylibmount \ + --disable-static \ + --without-python \ + --without-systemd \ + --without-systemdsystemunitdir + +make +make DESTDIR=$PKG install + +mv $PKG/usr/bin/* $PKG/bin/ +rm -r $PKG/usr/bin + +mv $PKG/usr/sbin/* $PKG/sbin/ +rm -r $PKG/usr/sbin +rm -r $PKG/usr/share/{doc,bash-completion} +rm $PKG/sbin/{mkfs.bfs,mkfs.minix,fsck.minix} +rm $PKG/usr/share/man/man8/{fsck.minix,mkfs.bfs,mkfs.minix}.8 +} diff --git a/talimatname/temel/wget/talimat b/talimatname/temel/wget/talimat new file mode 100644 index 000000000..a14210f52 --- /dev/null +++ b/talimatname/temel/wget/talimat @@ -0,0 +1,23 @@ +# Tanım: Utility for non-interactive download of files using HTTP, HTTPS and FTP. +# URL: http://www.gnu.org/software/wget/ +# Paketçi: milisarge +# Gerekler: + +isim=wget +surum=1.17.1 +devir=2 + +kaynak=(http://ftp.gnu.org/gnu/$isim/$isim-$surum.tar.xz) + +derle() { +cd $isim-$surum +./configure --prefix=/usr \ +--sysconfdir=/etc \ +--with-ssl=openssl \ +--disable-debug \ +--mandir=/usr/share/man \ +--infodir=/usr/share/info +make +make DESTDIR=$PKG install +rm -rf $PKG/usr/share/info/dir +} diff --git a/talimatname/temel/xz/talimat b/talimatname/temel/xz/talimat new file mode 100644 index 000000000..085770a6f --- /dev/null +++ b/talimatname/temel/xz/talimat @@ -0,0 +1,28 @@ +# Tanım: Free general-purpose data compression software with high compression ratio. +# URL: http://tukaani.org/xz/ +# Paketçi: milisarge +# Gerekler: + +isim=xz +surum=5.2.2 +devir=1 + +kaynak=(http://tukaani.org/xz/xz-$surum.tar.xz) +derle() +{ +cd xz-$surum + +sed -e '/mf\.buffer = NULL/a next->coder->mf.size = 0;' \ + -i src/liblzma/lz/lz_encoder.c + +./configure --prefix=/usr \ +--bindir=/bin \ + --docdir=/usr/share/doc/xz-$surum +make +make pkgconfigdir=/usr/lib/pkgconfig DESTDIR=$PKG install +mkdir -pv $PKG/{,usr/}lib +mv -v $PKG/usr/lib/liblzma.so.* \ +$PKG/lib +ln -svf ../../lib/liblzma.so.$surum $PKG/usr/lib/liblzma.so +rm -r $PKG/usr/share/doc/ +} diff --git a/talimatname/temel/zlib/talimat b/talimatname/temel/zlib/talimat new file mode 100644 index 000000000..bfa390604 --- /dev/null +++ b/talimatname/temel/zlib/talimat @@ -0,0 +1,47 @@ +# Tanım: The Zlib package contains compression and decompression routines used by some programs. +# URL: http://www.zlib.net/ +# Paketçi: milisarge +# Gerekler: + +isim=zlib +surum=1.2.8 +devir=1 + +kaynak=(http://www.zlib.net/zlib-$surum.tar.xz) + +derle() { + +if [ -L /bin/pwd ];then + mv -v /tools/bin/ld /tools/bin/ld-old + mv -v /tools/$(uname -m)-pc-linux-gnu/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld-old + mv -v /tools/bin/ld-new /tools/bin/ld + ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld + + gcc -dumpspecs | sed -e 's@/tools@@g' \ + -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ + -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ + `dirname $(gcc --print-libgcc-file-name)`/specs + + echo 'int main(){}' > dummy.c + cc dummy.c -v -Wl,--verbose &> dummy.log + readelf -l a.out | grep ': /lib' + + grep -o '/lib.*/crt[1in].*succeeded' dummy.log + grep -B1 '^ /usr/include' dummy.log + grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g' + grep "/lib.*/libc.so.6 " dummy.log + grep found dummy.log + rm -v dummy.c a.out dummy.log +fi + +cd zlib-$surum +./configure --prefix=/usr +make +make check +make prefix=$PKG/usr install + +mkdir -p $PKG/lib +mv -v $PKG/usr/lib/libz.so.* $PKG/lib +ln -sfv ../../lib/libz.so.$surum $PKG/usr/lib/libz.so +} +