1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# sear.c
sear.c is used as a lightweight replacement for [SearX](https://en.wikipedia.org/wiki/Searx) that proxies and caches search results
from the Google web search engine. The main advantages over SearX are speed and simplicity.
## instructions for debian and ubuntu systems
First add my software distribution repository [prog.sijanec.eu](https://prog.sijanec.eu) into your APT sources list.
```
apt install sear.c
service sear.c start
```
## requirements
* a POSIX system
* GNU C library (uses `tdestroy(3)` if compiled without `SC_OLD_STORAGE`)
* GNU compiler collection (it's written in GNU C - it uses nested functions)
* GNU Make
* libxml2-dev (for the simple HTML/1.0 client and HTML parser)
* libmicrohttpd-dev (for serving results - use a reverse proxy, such as nginx, for HTTPS)
* xxd (for converting HTML pages into C arrays when compiling from source)
## compiling from source
```
make prepare
make
```
## instructions
* run the daemon - it starts listening on HTTP port 7327 (remember it by picturing phone keyboard buttons with letters SEAR (; ) - port can be set with the environment variable `SC_PORT`
* optional: create a reverse proxy for HTTPS
* navigate to [http://localhost:7327](http://localhost:7327) and do a couple of searches to see if everything works
* the horseshoe button redirects directly to the first result without wasting time on the results page. use if you feel lucky. (BP)
* the painting button performs a search for images. PRIVACY WARNING: images are loaded directly from servers (not from google)
* program writes all logs to standard error (and to `/logs.html` if compiled with `SC_LOGMEM`)
* setting the h parameter will rewrite links to HTTP from HTTPS
* setting the l parameter with a number will limit number of displayed links to that number.
* upstream engines sometimes respond with a CAPTCHA after repediated requests. set the environment variable `SC_FALLBACK` to a URL prefix (`http://fallback.example:7327/search?`) to HTTP redirect clients in case of such upstream errors.
* shipped systemd unit loads environment variables from `/etc/sear.c` if it exists as `VAR=VAL`.
## prebuilt binaries
apart from the usual debian distribution, there are also prebuilt binaries built for amd64, arm64, i386 and armel, as well as debian packages.
before downloading, check that the build passed, indicated below on the badge:
[![Build Status](https://jenkins.sijanec.eu/job/sear.c/badge/icon)](https://jenkins.sijanec.eu/job/sear.c/)
* amd64: <https://amd64.sijanec.eu/prog/sear.c>
* arm64: <https://arm64.sijanec.eu/prog/sear.c>
* armel: <https://armel.sijanec.eu/prog/sear.c>
* i386: *only published in debian package repository because they are built on my personal laptop*
## screenshots
![screenshot in chromium 0](https://cdn.sijanec.eu/img/2021/04/sear.c_prtsc.png)
![screenshot in chromium 2](https://cdn.sijanec.eu/img/2021/04/sear.c_prtsc2.png)
![screenshot in chromium 3](https://cdn.sijanec.eu/img/2021/04/sear.c_prtsc3.png)
![screenshot in chromium 4](https://cdn.sijanec.eu/img/2021/04/sear.c_prtsc4.png)
![screenshot in chromium 5](https://cdn.sijanec.eu/img/2021/04/sear.c_prtsc5.png)
# additional information
* valgrind reports a memory leak, leak is bigger with every API search query. run `make valgrind` and you'll see it. I was unable to find the bug, but it just bothers me. I wrote a small bug PoC (test/bug) but I could not replicate the bug (`cd tmp/bug; make; make valgrind; less valgrind-out.txt` - process exits with no leaks possible). Example output from sear.c valgrind with one request done is included in test/bug/example-valgrind.txt. Such small memory leak is not a problem, since we store all extracted data from the query indefinetley anyways, but it's still pretty dumb to leak memory.
* memory allocations are not checked for failures. This needs to be done to use fanalyzer
* __attribute__s such as nonnull are not set in struct members of query types and in functions such as htmlspecialchars but `if (!arg) return NULL` is done instead, which is poor coding style and fanalyzing can't be done in this case. This needs to be fixed to use fanalyzer.
|