mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-23 19:39:06 +00:00
imap and pop3 clients
git-svn-id: https://conky.svn.sourceforge.net/svnroot/conky/trunk/conky1@626 7f574dfc-610e-0410-a909-a81674777703
This commit is contained in:
parent
2713d6f818
commit
589602aacf
@ -1,5 +1,8 @@
|
||||
# $Id$
|
||||
|
||||
2006-05-08
|
||||
* Added simple POP3/IMAP mail clients
|
||||
|
||||
2006-04-23
|
||||
* Added support for PowerBook batteries
|
||||
* Fixed broken $if/$else stuff
|
||||
|
241
README
241
README
@ -153,7 +153,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
|
||||
on_bottom
|
||||
Set conky on the bottom of all other applications
|
||||
Set Conky on the bottom of all other applications
|
||||
|
||||
|
||||
border_margin
|
||||
@ -213,6 +213,13 @@ CONFIGURATION SETTINGS
|
||||
at command line
|
||||
|
||||
|
||||
imap Default global IMAP server. Arguments are: "host user pass [-i
|
||||
interval] [-f folder] [-p port] [-e command]". Default port is
|
||||
143, default folder is 'INBOX', default interval is 5 minutes.
|
||||
If the password is supplied as '*', you will be prompted to
|
||||
enter the password when Conky starts.
|
||||
|
||||
|
||||
no_buffers
|
||||
Substract (file system) buffers from used memory?
|
||||
|
||||
@ -301,7 +308,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
own_window_hints undecorated,below,above,sticky,skip_taskbar,skip_pager
|
||||
If own_window is yes, you may use these window manager hints to
|
||||
affect the way conky displays. Notes: Use own_window_type desk-
|
||||
affect the way Conky displays. Notes: Use own_window_type desk-
|
||||
top as another way to implement many of these hints implicitly.
|
||||
If you use own_window_type override, window manager hints have
|
||||
no meaning and are ignored.
|
||||
@ -315,12 +322,18 @@ CONFIGURATION SETTINGS
|
||||
Pad percentages to this many decimals (0 = no padding)
|
||||
|
||||
|
||||
pop3 Default global POP3 server. Arguments are: "host user pass [-i
|
||||
interval] [-p port] [-e command]". Default port is 110, default
|
||||
interval is 5 minutes. If the password is supplied as '*', you
|
||||
will be prompted to enter the password when Conky starts.
|
||||
|
||||
|
||||
stippled_borders
|
||||
Border stippling (dashing) in pixels
|
||||
|
||||
|
||||
total_run_times
|
||||
Total number of times for Conky to update before quitting. Zero
|
||||
Total number of times for Conky to update before quitting. Zero
|
||||
makes Conky run forever
|
||||
|
||||
|
||||
@ -356,7 +369,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
xmms_player
|
||||
Use specified player/plugin for the xmms status variables. Valid
|
||||
items are: none, xmms, bmp, audacious and infopipe. (default is
|
||||
items are: none, xmms, bmp, audacious and infopipe. (default is
|
||||
none). Note that bmpx is currently handled separately.
|
||||
|
||||
|
||||
@ -364,7 +377,7 @@ CONFIGURATION SETTINGS
|
||||
|
||||
|
||||
VARIABLES
|
||||
Colors are parsed using XParsecolor(), there might be a list of them:
|
||||
Colors are parsed using XParsecolor(), there might be a list of them:
|
||||
/usr/X11R6/lib/X11/rgb.txt. Also, http://sedition.com/perl/rgb.html
|
||||
[http://sedition.com/perl/rgb.html]. Color can be also in #rrggbb for-
|
||||
mat (hex). Note that when displaying bytes, power is 1024 and not 1000
|
||||
@ -415,12 +428,12 @@ VARIABLES
|
||||
|
||||
|
||||
apm_battery_time
|
||||
Display remaining APM battery life in hh:mm:ss or "unknown" if
|
||||
Display remaining APM battery life in hh:mm:ss or "unknown" if
|
||||
AC adapterstatus is on-line or charging (FreeBSD only)
|
||||
|
||||
|
||||
battery (num)
|
||||
Remaining capacity in ACPI or APM battery. ACPI battery number
|
||||
Remaining capacity in ACPI or APM battery. ACPI battery number
|
||||
can be given as argument (default is BAT0).
|
||||
|
||||
|
||||
@ -460,28 +473,28 @@ VARIABLES
|
||||
|
||||
|
||||
cpu (cpuN)
|
||||
CPU usage in percents. For SMP machines, the CPU number can be
|
||||
CPU usage in percents. For SMP machines, the CPU number can be
|
||||
provided as an argument. cpu0 is the total usage, and >=cpu1 are
|
||||
individual CPUs.
|
||||
|
||||
|
||||
cpubar (cpu number) (height),(width)
|
||||
Bar that shows CPU usage, height is bar's height in pixels. See
|
||||
Bar that shows CPU usage, height is bar's height in pixels. See
|
||||
$cpu for more info on SMP.
|
||||
|
||||
|
||||
cpugraph (cpu number) (height),(width) (gradient colour 1) (gradient
|
||||
cpugraph (cpu number) (height),(width) (gradient colour 1) (gradient
|
||||
colour 2)
|
||||
CPU usage graph, with optional colours in hex, minus the #. See
|
||||
CPU usage graph, with optional colours in hex, minus the #. See
|
||||
$cpu for more info on SMP.
|
||||
|
||||
|
||||
diskio Displays current disk IO.
|
||||
|
||||
|
||||
diskiograph (height),(width) (gradient colour 1) (gradient colour 2)
|
||||
diskiograph (height),(width) (gradient colour 1) (gradient colour 2)
|
||||
(scale)
|
||||
Disk IO graph, colours defined in hex, minus the #. If scale is
|
||||
Disk IO graph, colours defined in hex, minus the #. If scale is
|
||||
non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -495,7 +508,7 @@ VARIABLES
|
||||
|
||||
downspeedgraph net (height),(width) (gradient colour 1) (gradient
|
||||
colour 2) (scale)
|
||||
Download speed graph, colours defined in hex, minus the #. If
|
||||
Download speed graph, colours defined in hex, minus the #. If
|
||||
scale is non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -504,13 +517,13 @@ VARIABLES
|
||||
|
||||
exec command
|
||||
Executes a shell command and displays the output in conky. warn-
|
||||
ing: this takes a lot more resources than other variables. I'd
|
||||
ing: this takes a lot more resources than other variables. I'd
|
||||
recommend coding wanted behaviour in C and posting a patch.
|
||||
|
||||
|
||||
execbar command
|
||||
Same as exec, except if the first value return is a value
|
||||
between 0-100, it will use that number for a bar. The size for
|
||||
Same as exec, except if the first value return is a value
|
||||
between 0-100, it will use that number for a bar. The size for
|
||||
the bar is currently fixed, but that may change in the future.
|
||||
|
||||
|
||||
@ -519,7 +532,7 @@ VARIABLES
|
||||
|
||||
|
||||
execi interval command
|
||||
Same as exec but with specific interval. Interval can't be less
|
||||
Same as exec but with specific interval. Interval can't be less
|
||||
than update_interval in configuration. See also $texeci
|
||||
|
||||
|
||||
@ -542,19 +555,19 @@ VARIABLES
|
||||
|
||||
|
||||
freq_dyn
|
||||
Returns CPU frequency in MHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
Returns CPU frequency in MHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
x86/amd64.
|
||||
|
||||
|
||||
freq_dyn_g
|
||||
Returns CPU frequency in GHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
Returns CPU frequency in GHz, but is calculated by counting to
|
||||
clock cycles to complete an instruction. Only available for
|
||||
x86/amd64.
|
||||
|
||||
|
||||
fs_bar (height),(width) fs
|
||||
Bar that shows how much space is used on a file system. height
|
||||
Bar that shows how much space is used on a file system. height
|
||||
is the height in pixels. fs is any file on that file system.
|
||||
|
||||
|
||||
@ -575,8 +588,8 @@ VARIABLES
|
||||
|
||||
|
||||
head logfile lines (interval)
|
||||
Displays first N lines of supplied text text file. If interval
|
||||
is not supplied, Conky assumes 2x Conky's interval. Max of 30
|
||||
Displays first N lines of supplied text text file. If interval
|
||||
is not supplied, Conky assumes 2x Conky's interval. Max of 30
|
||||
lines can be displayed, or until the text buffer is filled.
|
||||
|
||||
|
||||
@ -585,93 +598,113 @@ VARIABLES
|
||||
|
||||
|
||||
i2c (dev) type n
|
||||
I2C sensor from sysfs (Linux 2.6). dev may be omitted if you
|
||||
have only one I2C device. type is either in (or vol) meaning
|
||||
I2C sensor from sysfs (Linux 2.6). dev may be omitted if you
|
||||
have only one I2C device. type is either in (or vol) meaning
|
||||
voltage, fan meaning fan or temp/tempf (first in C, second in F)
|
||||
meaning temperature. n is number of the sensor. See
|
||||
meaning temperature. n is number of the sensor. See
|
||||
/sys/bus/i2c/devices/ on your local computer.
|
||||
|
||||
|
||||
i8k_ac_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
whether ac power is on, as listed in /proc/i8k (translated to
|
||||
human-readable). Beware that this is by default not enabled by
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
whether ac power is on, as listed in /proc/i8k (translated to
|
||||
human-readable). Beware that this is by default not enabled by
|
||||
i8k itself.
|
||||
|
||||
|
||||
i8k_bios
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the bios version as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_buttons_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the volume buttons status as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_cpu_temp
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the cpu temperature in Celsius, as reported by /proc/i8k.
|
||||
|
||||
|
||||
i8k_cpu_tempf
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the cpu temperature in Farenheit, as reported by /proc/i8k.
|
||||
|
||||
|
||||
i8k_left_fan_rpm
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the left fan's rate of rotation, in revolutions per minute as
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the left fan's rate of rotation, in revolutions per minute as
|
||||
listed in /proc/i8k. Beware, some laptops i8k reports these fans
|
||||
in reverse order.
|
||||
|
||||
|
||||
i8k_left_fan_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the left fan status as listed in /proc/i8k (translated to human-
|
||||
readable). Beware, some laptops i8k reports these fans in
|
||||
readable). Beware, some laptops i8k reports these fans in
|
||||
reverse order.
|
||||
|
||||
|
||||
i8k_right_fan_rpm
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan's rate of rotation, in revolutions per minute as
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan's rate of rotation, in revolutions per minute as
|
||||
listed in /proc/i8k. Beware, some laptops i8k reports these fans
|
||||
in reverse order.
|
||||
|
||||
|
||||
i8k_right_fan_status
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan status as listed in /proc/i8k (translated to
|
||||
human-readable). Beware, some laptops i8k reports these fans in
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the right fan status as listed in /proc/i8k (translated to
|
||||
human-readable). Beware, some laptops i8k reports these fans in
|
||||
reverse order.
|
||||
|
||||
|
||||
i8k_serial
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
your laptop serial number as listed in /proc/i8k.
|
||||
|
||||
|
||||
i8k_version
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
If running the i8k kernel driver for Inspiron laptops, displays
|
||||
the version formatting of /proc/i8k.
|
||||
|
||||
|
||||
if_running (process)
|
||||
if PROCESS is running, display everything if_running and the
|
||||
if PROCESS is running, display everything if_running and the
|
||||
matching $endif
|
||||
|
||||
|
||||
if_existing (file)
|
||||
if FILE exists, display everything between if_existing and the
|
||||
if FILE exists, display everything between if_existing and the
|
||||
matching $endif
|
||||
|
||||
|
||||
if_mounted (mountpoint)
|
||||
if MOUNTPOINT is mounted, display everything between if_mounted
|
||||
if MOUNTPOINT is mounted, display everything between if_mounted
|
||||
and the matching $endif
|
||||
|
||||
|
||||
imap_messages (args)
|
||||
Displays the number of messages in your global IMAP inbox by
|
||||
default. You can define individual IMAP inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 110,
|
||||
default interval is 5 minutes. If the password is supplied as
|
||||
'*', you will be prompted to enter the password when Conky
|
||||
starts.
|
||||
|
||||
|
||||
imap_unseen (args)
|
||||
Displays the number of unseen messages in your global IMAP inbox
|
||||
by default. You can define individual IMAP inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 110,
|
||||
default interval is 5 minutes. If the password is supplied as
|
||||
'*', you will be prompted to enter the password when Conky
|
||||
starts.
|
||||
|
||||
|
||||
kernel Kernel version
|
||||
|
||||
|
||||
@ -688,8 +721,8 @@ VARIABLES
|
||||
Machine, i686 for example
|
||||
|
||||
|
||||
mails Mail count in mail spool. You can use program like fetchmail to
|
||||
get mails from some server using your favourite protocol. See
|
||||
mails Mail count in mail spool. You can use program like fetchmail to
|
||||
get mails from some server using your favourite protocol. See
|
||||
also new_mails.
|
||||
|
||||
|
||||
@ -786,22 +819,42 @@ VARIABLES
|
||||
|
||||
pb_battery item
|
||||
If running on Apple powerbook/ibook, display information on bat-
|
||||
tery status. The item parameter specifies, what information to
|
||||
tery status. The item parameter specifies, what information to
|
||||
display. Exactly one item must be specified. Valid items are:
|
||||
|
||||
status: Display if battery is fully charged, charging, discharg-
|
||||
ing or absent (running on AC)
|
||||
|
||||
percent: Display charge of battery in percent, if charging or
|
||||
discharging. Nothing will be displayed, if battery is fully
|
||||
percent: Display charge of battery in percent, if charging or
|
||||
discharging. Nothing will be displayed, if battery is fully
|
||||
charged or absent.
|
||||
|
||||
time: Display the time remaining until the battery will be fully
|
||||
charged or discharged at current rate. Nothing is displayed, if
|
||||
battery is absent or if it's present but fully charged and not
|
||||
charged or discharged at current rate. Nothing is displayed, if
|
||||
battery is absent or if it's present but fully charged and not
|
||||
discharging.
|
||||
|
||||
|
||||
pop3_unseen (args)
|
||||
Displays the number of unseen messages in your global POP3 inbox
|
||||
by default. You can define individual POP3 inboxes seperately by
|
||||
passing arguments to this object. Arguments are: "host user pass
|
||||
[-i interval] [-p port] [-e command]". Default port is 110,
|
||||
default interval is 5 minutes. If the password is supplied as
|
||||
'*', you will be prompted to enter the password when Conky
|
||||
starts.
|
||||
|
||||
|
||||
pop3_used (args)
|
||||
Displays the amount of space (in MiB, 2^20) used in your global
|
||||
POP3 inbox by default. You can define individual POP3 inboxes
|
||||
seperately by passing arguments to this object. Arguments are:
|
||||
"host user pass [-i interval] [-p port] [-e command]". Default
|
||||
port is 110, default interval is 5 minutes. If the password is
|
||||
supplied as '*', you will be prompted to enter the password when
|
||||
Conky starts.
|
||||
|
||||
|
||||
pre_exec shell command
|
||||
Executes a shell command one time before conky displays anything
|
||||
and puts output as text.
|
||||
@ -865,20 +918,20 @@ VARIABLES
|
||||
lservice - local service name from /etc/services
|
||||
|
||||
The connection index provides you with access to each connection
|
||||
in the port monitor. The monitor will return information for
|
||||
index values from 0 to n-1 connections. Values higher than n-1
|
||||
are simply ignored. For the "count" item, the connection index
|
||||
in the port monitor. The monitor will return information for
|
||||
index values from 0 to n-1 connections. Values higher than n-1
|
||||
are simply ignored. For the "count" item, the connection index
|
||||
must be omitted. It is required for all other items.
|
||||
|
||||
Examples:
|
||||
|
||||
${tcp_portmon 6881 6999 count} - displays the number of connec-
|
||||
${tcp_portmon 6881 6999 count} - displays the number of connec-
|
||||
tions in the bittorrent port range
|
||||
|
||||
${tcp_portmon 22 22 rip 0} - displays the remote host ip of the
|
||||
${tcp_portmon 22 22 rip 0} - displays the remote host ip of the
|
||||
first sshd connection
|
||||
|
||||
${tcp_portmon 22 22 rip 9} - displays the remote host ip of the
|
||||
${tcp_portmon 22 22 rip 9} - displays the remote host ip of the
|
||||
tenth sshd connection
|
||||
|
||||
${tcp_portmon 1 1024 rhost 0} - displays the remote host name of
|
||||
@ -887,22 +940,22 @@ VARIABLES
|
||||
${tcp_portmon 1 1024 rport 4} - displays the remote host port of
|
||||
the fifth connection on a privileged port
|
||||
|
||||
${tcp_portmon 1 65535 lservice 14} - displays the local service
|
||||
${tcp_portmon 1 65535 lservice 14} - displays the local service
|
||||
name of the fifteenth connection in the range of all ports
|
||||
|
||||
Note that port monitor variables which share the same port range
|
||||
actually refer to the same monitor, so many references to a sin-
|
||||
gle port range for different items and different indexes all use
|
||||
the same monitor internally. In other words, the program avoids
|
||||
the same monitor internally. In other words, the program avoids
|
||||
creating redundant monitors.
|
||||
|
||||
texeci interval command
|
||||
Runs a command at an interval inside a thread and displays the
|
||||
output. Same as $execi, except the command is run inside a
|
||||
thread. Use this if you have a slow script to keep Conky updat-
|
||||
ing. You should make the interval slightly longer then the time
|
||||
it takes your script to execute. For example, if you have a
|
||||
script that take 5 seconds to execute, you should make the
|
||||
Runs a command at an interval inside a thread and displays the
|
||||
output. Same as $execi, except the command is run inside a
|
||||
thread. Use this if you have a slow script to keep Conky updat-
|
||||
ing. You should make the interval slightly longer then the time
|
||||
it takes your script to execute. For example, if you have a
|
||||
script that take 5 seconds to execute, you should make the
|
||||
interval at least 6 seconds. See also $execi.
|
||||
|
||||
|
||||
@ -917,21 +970,21 @@ VARIABLES
|
||||
|
||||
|
||||
time (format)
|
||||
Local time, see man strftime to get more information about for-
|
||||
Local time, see man strftime to get more information about for-
|
||||
mat
|
||||
|
||||
|
||||
totaldown net
|
||||
Total download, overflows at 4 GB on Linux with 32-bit arch and
|
||||
there doesn't seem to be a way to know how many times it has
|
||||
Total download, overflows at 4 GB on Linux with 32-bit arch and
|
||||
there doesn't seem to be a way to know how many times it has
|
||||
already done that before conky has started.
|
||||
|
||||
|
||||
top type, num
|
||||
This takes arguments in the form:top (name) (number) Basically,
|
||||
processes are ranked from highest to lowest in terms of cpu
|
||||
usage, which is what (num) represents. The types are: "name",
|
||||
"pid", "cpu", and mem". There can be a max of 10 processes
|
||||
This takes arguments in the form:top (name) (number) Basically,
|
||||
processes are ranked from highest to lowest in terms of cpu
|
||||
usage, which is what (num) represents. The types are: "name",
|
||||
"pid", "cpu", and mem". There can be a max of 10 processes
|
||||
listed.
|
||||
|
||||
|
||||
@ -955,9 +1008,9 @@ VARIABLES
|
||||
Upload speed in kilobytes with one decimal
|
||||
|
||||
|
||||
upspeedgraph net (height),(width) (gradient colour 1) (gradient colour
|
||||
upspeedgraph net (height),(width) (gradient colour 1) (gradient colour
|
||||
2) (scale)
|
||||
Upload speed graph, colours defined in hex, minus the #. If
|
||||
Upload speed graph, colours defined in hex, minus the #. If
|
||||
scale is non-zero, it becomes the scale for the graph.
|
||||
|
||||
|
||||
@ -981,7 +1034,7 @@ VARIABLES
|
||||
|
||||
|
||||
voffset (pixels)
|
||||
Change vertical offset by N pixels. Negative values will cause
|
||||
Change vertical offset by N pixels. Negative values will cause
|
||||
text to overlap. See also $offset.
|
||||
|
||||
|
||||
@ -994,12 +1047,12 @@ VARIABLES
|
||||
|
||||
|
||||
xmms_channels
|
||||
xmms / bmp / audacious / infopipe: number of audio channels of
|
||||
xmms / bmp / audacious / infopipe: number of audio channels of
|
||||
current tune
|
||||
|
||||
|
||||
xmms_filename
|
||||
xmms / bmp / audacious / infopipe: full path and filename of
|
||||
xmms / bmp / audacious / infopipe: full path and filename of
|
||||
current tune
|
||||
|
||||
|
||||
@ -1009,17 +1062,17 @@ VARIABLES
|
||||
|
||||
|
||||
xmms_length
|
||||
xmms / bmp / audacious / infopipe: total length of current tune
|
||||
xmms / bmp / audacious / infopipe: total length of current tune
|
||||
as MM:SS
|
||||
|
||||
|
||||
xmms_length_seconds
|
||||
xmms / bmp / audacious / infopipe: total length of current tune
|
||||
xmms / bmp / audacious / infopipe: total length of current tune
|
||||
in seconds
|
||||
|
||||
|
||||
xmms_playlist_position
|
||||
xmms / bmp / audacious / infopipe: playlist position of current
|
||||
xmms / bmp / audacious / infopipe: playlist position of current
|
||||
tune
|
||||
|
||||
|
||||
@ -1028,12 +1081,12 @@ VARIABLES
|
||||
|
||||
|
||||
xmms_position
|
||||
xmms / bmp / audacious / infopipe: MM:SS position of current
|
||||
xmms / bmp / audacious / infopipe: MM:SS position of current
|
||||
tune
|
||||
|
||||
|
||||
xmms_position_seconds
|
||||
xmms / bmp / audacious / infopipe: position of current tune in
|
||||
xmms / bmp / audacious / infopipe: position of current tune in
|
||||
seconds
|
||||
|
||||
|
||||
@ -1051,13 +1104,13 @@ VARIABLES
|
||||
|
||||
|
||||
ibm_temps N
|
||||
If running the IBM ACPI, displays the temperatures from the IBM
|
||||
If running the IBM ACPI, displays the temperatures from the IBM
|
||||
temperature sensors (N=0..7) Sensor 0 is on the CPU, 3 is on the
|
||||
GPU.
|
||||
|
||||
|
||||
ibm_volume
|
||||
If running the IBM ACPI, displays the "master" volume, con-
|
||||
If running the IBM ACPI, displays the "master" volume, con-
|
||||
trolled by the volume keys (0-14).
|
||||
|
||||
|
||||
@ -1080,11 +1133,11 @@ FILES
|
||||
BUGS
|
||||
Drawing to root or some other desktop window directly doesn't work with
|
||||
all window managers. Especially doesn't work well with Gnome and it has
|
||||
been reported that it doesn't work with KDE either. Nautilus can be
|
||||
disabled from drawing to desktop with program gconf-editor. Uncheck
|
||||
show_desktop in /apps/nautilus/preferences/. There is -w switch in
|
||||
Conky to set some specific window id. You might find xwininfo -tree
|
||||
useful to find the window to draw to. You can also use -o argument
|
||||
been reported that it doesn't work with KDE either. Nautilus can be
|
||||
disabled from drawing to desktop with program gconf-editor. Uncheck
|
||||
show_desktop in /apps/nautilus/preferences/. There is -w switch in
|
||||
Conky to set some specific window id. You might find xwininfo -tree
|
||||
useful to find the window to draw to. You can also use -o argument
|
||||
which makes Conky to create its own window.
|
||||
|
||||
SEE ALSO
|
||||
|
@ -16,7 +16,7 @@
|
||||
<varlistentry>
|
||||
<term><command><option>on_bottom</option></command></term>
|
||||
<listitem>
|
||||
Set conky on the bottom of all other applications
|
||||
Set Conky on the bottom of all other applications
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
@ -118,6 +118,13 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>imap</option></command></term>
|
||||
<listitem>
|
||||
Default global IMAP server. Arguments are: "host user pass [-i interval] [-f folder] [-p port] [-e command]". Default port is 143, default folder is 'INBOX', default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>no_buffers</option></command></term>
|
||||
<listitem>
|
||||
@ -266,7 +273,7 @@
|
||||
<option>undecorated,below,above,sticky,skip_taskbar,skip_pager</option>
|
||||
</term>
|
||||
<listitem>
|
||||
If own_window is yes, you may use these window manager hints to affect the way conky displays.
|
||||
If own_window is yes, you may use these window manager hints to affect the way Conky displays.
|
||||
Notes: Use own_window_type desktop as another way to implement many of these hints implicitly.
|
||||
If you use own_window_type override, window manager hints have no meaning and are ignored.
|
||||
<para></para></listitem>
|
||||
@ -286,6 +293,13 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>pop3</option></command></term>
|
||||
<listitem>
|
||||
Default global POP3 server. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><command><option>stippled_borders</option></command></term>
|
||||
<listitem>
|
||||
|
28
doc/conky.1
28
doc/conky.1
@ -136,7 +136,7 @@ Boolean value, if true, Conky will be forked to background when started
|
||||
|
||||
.TP
|
||||
\fBon_bottom\fR
|
||||
Set conky on the bottom of all other applications
|
||||
Set Conky on the bottom of all other applications
|
||||
|
||||
.TP
|
||||
\fBborder_margin\fR
|
||||
@ -194,6 +194,10 @@ Gap between right or left border of screen, same as passing -x at command line
|
||||
\fBgap_y\fR
|
||||
Gap between top or bottom border of screen, same as passing -y at command line
|
||||
|
||||
.TP
|
||||
\fBimap\fR
|
||||
Default global IMAP server. Arguments are: "host user pass [-i interval] [-f folder] [-p port] [-e command]". Default port is 143, default folder is 'INBOX', default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBno_buffers\fR
|
||||
Substract (file system) buffers from used memory?
|
||||
@ -276,7 +280,7 @@ If own_window_transparent no, set a specified background colour (defaults to bla
|
||||
|
||||
.TP
|
||||
\fBown_window_hints\fR \fBundecorated,below,above,sticky,skip_taskbar,skip_pager\fR
|
||||
If own_window is yes, you may use these window manager hints to affect the way conky displays.
|
||||
If own_window is yes, you may use these window manager hints to affect the way Conky displays.
|
||||
Notes: Use own_window_type desktop as another way to implement many of these hints implicitly.
|
||||
If you use own_window_type override, window manager hints have no meaning and are ignored.
|
||||
|
||||
@ -288,6 +292,10 @@ Print text to stdout.
|
||||
\fBpad_percents\fR
|
||||
Pad percentages to this many decimals (0 = no padding)
|
||||
|
||||
.TP
|
||||
\fBpop3\fR
|
||||
Default global POP3 server. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBstippled_borders\fR
|
||||
Border stippling (dashing) in pixels
|
||||
@ -596,6 +604,14 @@ if FILE exists, display everything between if_existing and the matching $endif
|
||||
\fBif_mounted\fR \fB(mountpoint)\fR
|
||||
if MOUNTPOINT is mounted, display everything between if_mounted and the matching $endif
|
||||
|
||||
.TP
|
||||
\fBimap_messages\fR \fB(args)\fR
|
||||
Displays the number of messages in your global IMAP inbox by default. You can define individual IMAP inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBimap_unseen\fR \fB(args)\fR
|
||||
Displays the number of unseen messages in your global IMAP inbox by default. You can define individual IMAP inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBkernel\fR
|
||||
Kernel version
|
||||
@ -732,6 +748,14 @@ rate. Nothing is displayed, if battery is
|
||||
absent or if it's present but fully charged
|
||||
and not discharging.
|
||||
|
||||
.TP
|
||||
\fBpop3_unseen\fR \fB(args)\fR
|
||||
Displays the number of unseen messages in your global POP3 inbox by default. You can define individual POP3 inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBpop3_used\fR \fB(args)\fR
|
||||
Displays the amount of space (in MiB, 2^20) used in your global POP3 inbox by default. You can define individual POP3 inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
.TP
|
||||
\fBpre_exec\fR \fBshell command\fR
|
||||
Executes a shell command one time before conky displays anything and puts output as text.
|
||||
|
@ -617,6 +617,26 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>imap_messages</option></command>
|
||||
<option>(args)</option>
|
||||
</term>
|
||||
<listitem>
|
||||
Displays the number of messages in your global IMAP inbox by default. You can define individual IMAP inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>imap_unseen</option></command>
|
||||
<option>(args)</option>
|
||||
</term>
|
||||
<listitem>
|
||||
Displays the number of unseen messages in your global IMAP inbox by default. You can define individual IMAP inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>kernel</option></command>
|
||||
@ -905,6 +925,28 @@
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>pop3_unseen</option></command>
|
||||
<option>(args)</option>
|
||||
</term>
|
||||
<listitem>
|
||||
Displays the number of unseen messages in your global POP3 inbox by default. You can define individual POP3 inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>pop3_used</option></command>
|
||||
<option>(args)</option>
|
||||
</term>
|
||||
<listitem>
|
||||
Displays the amount of space (in MiB, 2^20) used in your global POP3 inbox by default. You can define individual POP3 inboxes seperately by passing arguments to this object. Arguments are: "host user pass [-i interval] [-p port] [-e command]". Default port is 110, default interval is 5 minutes. If the password is supplied as '*', you will be prompted to enter the password when Conky starts.
|
||||
|
||||
<para></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>
|
||||
<command><option>pre_exec</option></command>
|
||||
|
890
src/conky.c
890
src/conky.c
@ -17,6 +17,7 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <termios.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#if HAVE_DIRENT_H
|
||||
@ -870,6 +871,12 @@ enum text_object_type {
|
||||
OBJ_upspeedgraph,
|
||||
OBJ_uptime,
|
||||
OBJ_uptime_short,
|
||||
OBJ_imap,
|
||||
OBJ_imap_messages,
|
||||
OBJ_imap_unseen,
|
||||
OBJ_pop3,
|
||||
OBJ_pop3_unseen,
|
||||
OBJ_pop3_used,
|
||||
#if defined(__FreeBSD__) && (defined(i386) || defined(__i386__))
|
||||
OBJ_apm_adapter,
|
||||
OBJ_apm_battery_time,
|
||||
@ -950,24 +957,22 @@ enum text_object_type {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct thread_info_s {
|
||||
pthread_t thread;
|
||||
};
|
||||
|
||||
struct text_object {
|
||||
int type;
|
||||
int a, b;
|
||||
unsigned int c, d, e;
|
||||
float f;
|
||||
char global_mode;
|
||||
union {
|
||||
char *s; /* some string */
|
||||
int i; /* some integer */
|
||||
long l; /* some other integer */
|
||||
unsigned int sensor;
|
||||
unsigned int sensor;
|
||||
struct net_stat *net;
|
||||
struct fs_stat *fs;
|
||||
unsigned char loadavg[3];
|
||||
unsigned int cpu_index;
|
||||
struct mail_s *mail;
|
||||
struct {
|
||||
struct fs_stat *fs;
|
||||
int w, h;
|
||||
@ -1061,6 +1066,416 @@ void replace_thread(struct thread_info_s *new_thread, int pos) // this isn't eve
|
||||
}
|
||||
}
|
||||
|
||||
#define MAXDATASIZE 1000
|
||||
|
||||
void *imap_thread(struct mail_s* mail)
|
||||
{ // pthreads are really beginning to piss me off
|
||||
double update_time;
|
||||
int run_code = threads_runnable;
|
||||
update_time = get_time();
|
||||
int sockfd, numbytes;
|
||||
char recvbuf[MAXDATASIZE];
|
||||
char sendbuf[MAXDATASIZE];
|
||||
char *reply;
|
||||
int fail = 0;
|
||||
unsigned int old_unseen = UINT_MAX;
|
||||
struct hostent *he;
|
||||
struct sockaddr_in their_addr; // connector's address information
|
||||
if ((he = gethostbyname(mail->host)) == NULL) { // get the host info
|
||||
herror("gethostbyname");
|
||||
exit(1);
|
||||
}
|
||||
while (threads_runnable == run_code && fail < 5) {
|
||||
update_time = get_time();
|
||||
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
perror("socket");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
|
||||
their_addr.sin_family = AF_INET; // host byte order
|
||||
their_addr.sin_port = htons(mail->port); // short, network byte order
|
||||
their_addr.sin_addr = *((struct in_addr *) he->h_addr);
|
||||
memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
|
||||
|
||||
if (connect
|
||||
(sockfd, (struct sockaddr *) &their_addr,
|
||||
sizeof(struct sockaddr)) == -1) {
|
||||
perror("connect");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
struct timeval timeout;
|
||||
int res;
|
||||
fd_set fdset;
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ERR("IMAP connection failed: timeout\n");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "* OK") != recvbuf) {
|
||||
ERR("IMAP connection failed, probably not an IMAP server\n");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
strncpy(sendbuf, "a1 login ", MAXDATASIZE);
|
||||
strncat(sendbuf, mail->user,
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, " ", MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, mail->pass,
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, "\n", MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send a1");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv a1");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "a1 OK") == NULL) {
|
||||
ERR("IMAP server login failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
strncpy(sendbuf, "a2 STATUS ", MAXDATASIZE);
|
||||
strncat(sendbuf, mail->folder,
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, " (MESSAGES UNSEEN)\n",
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send a2");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv a2");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "a2 OK") == NULL) {
|
||||
ERR("IMAP status failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
// now we get the data
|
||||
reply = strstr(recvbuf, " (MESSAGES ");
|
||||
reply += 2;
|
||||
*strchr(reply, ')') = '\0';
|
||||
if (reply == NULL) {
|
||||
ERR("Error parsing IMAP response: %s", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
} else {
|
||||
sscanf(reply, "MESSAGES %u UNSEEN %u",
|
||||
&mail->messages,
|
||||
&mail->unseen);
|
||||
}
|
||||
strncpy(sendbuf, "a3 logout\n", MAXDATASIZE);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send a3");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv a3");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "a3 OK") == NULL) {
|
||||
ERR("IMAP logout failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
close(sockfd);
|
||||
if (strlen(mail->command) > 1 && mail->unseen > old_unseen) { // new mail goodie
|
||||
if (system(mail->command) == -1) {
|
||||
perror("system()");
|
||||
}
|
||||
}
|
||||
fail = 0;
|
||||
old_unseen = mail->unseen;
|
||||
mail->last_update = update_time;
|
||||
usleep(100); // prevent race condition
|
||||
if (get_time() - mail->last_update >
|
||||
mail->interval) {
|
||||
continue;
|
||||
} else {
|
||||
unsigned int delay =
|
||||
1000000.0 * (mail->interval -
|
||||
(get_time() -
|
||||
mail->last_update));
|
||||
if (delay < update_interval * 500000) {
|
||||
delay = update_interval * 1000000;
|
||||
}
|
||||
usleep(delay);
|
||||
}
|
||||
}
|
||||
ERR("exiting imap thread");
|
||||
pthread_exit(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *pop3_thread(struct mail_s *mail)
|
||||
{ // pthreads are really beginning to piss me off
|
||||
double update_time;
|
||||
int run_code = threads_runnable;
|
||||
update_time = get_time();
|
||||
int sockfd, numbytes;
|
||||
char recvbuf[MAXDATASIZE];
|
||||
char sendbuf[MAXDATASIZE];
|
||||
char *reply;
|
||||
int fail = 0;
|
||||
unsigned int old_unseen = UINT_MAX;
|
||||
struct hostent *he;
|
||||
struct sockaddr_in their_addr; // connector's address information
|
||||
if ((he = gethostbyname(mail->host)) == NULL) { // get the host info
|
||||
herror("gethostbyname");
|
||||
exit(1);
|
||||
}
|
||||
while (threads_runnable == run_code && fail < 5) {
|
||||
update_time = get_time();
|
||||
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
|
||||
perror("socket");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
|
||||
their_addr.sin_family = AF_INET; // host byte order
|
||||
their_addr.sin_port = htons(mail->port); // short, network byte order
|
||||
their_addr.sin_addr = *((struct in_addr *) he->h_addr);
|
||||
memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
|
||||
|
||||
if (connect
|
||||
(sockfd, (struct sockaddr *) &their_addr,
|
||||
sizeof(struct sockaddr)) == -1) {
|
||||
perror("connect");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
struct timeval timeout;
|
||||
int res;
|
||||
fd_set fdset;
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ERR("POP3 connection failed: timeout\n");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "+OK ") != recvbuf) {
|
||||
ERR("POP3 connection failed, probably not a POP3 server\n");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
strncpy(sendbuf, "USER ", MAXDATASIZE);
|
||||
strncat(sendbuf, mail->user,
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, "\n", MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send USER");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv USER");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "+OK ") == NULL) {
|
||||
ERR("POP3 server login failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
strncpy(sendbuf, "PASS ", MAXDATASIZE);
|
||||
strncat(sendbuf, mail->pass,
|
||||
MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
strncat(sendbuf, "\n", MAXDATASIZE - strlen(sendbuf) - 1);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send PASS");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv PASS");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "+OK ") == NULL) {
|
||||
ERR("POP3 server login failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
strncpy(sendbuf, "STAT\n", MAXDATASIZE);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send STAT");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv STAT");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "+OK ") == NULL) {
|
||||
ERR("POP3 status failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
// now we get the data
|
||||
reply = recvbuf + 4;
|
||||
if (reply == NULL) {
|
||||
ERR("Error parsing POP3 response: %s", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
} else {
|
||||
sscanf(reply, "%u %u", &mail->unseen,
|
||||
&mail->used);
|
||||
}
|
||||
strncpy(sendbuf, "QUIT\n", MAXDATASIZE);
|
||||
if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) {
|
||||
perror("send QUIT");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
timeout.tv_sec = 60; // 60 second timeout i guess
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fdset);
|
||||
FD_SET(sockfd, &fdset);
|
||||
res = select(sockfd + 1, &fdset, NULL, NULL, &timeout);
|
||||
if (res > 0) {
|
||||
if ((numbytes =
|
||||
recv(sockfd, recvbuf, MAXDATASIZE - 1,
|
||||
0)) == -1) {
|
||||
perror("recv QUIT");
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
recvbuf[numbytes] = '\0';
|
||||
if (strstr(recvbuf, "+OK") == NULL) {
|
||||
ERR("POP3 logout failed: %s\n", recvbuf);
|
||||
fail++;
|
||||
break;
|
||||
}
|
||||
close(sockfd);
|
||||
if (strlen(mail->command) > 1 && mail->unseen > old_unseen) { // new mail goodie
|
||||
if (system(mail->command) == -1) {
|
||||
perror("system()");
|
||||
}
|
||||
}
|
||||
fail = 0;
|
||||
old_unseen = mail->unseen;
|
||||
mail->last_update = update_time;
|
||||
usleep(100); // prevent race condition
|
||||
if (get_time() - mail->last_update >
|
||||
mail->interval) {
|
||||
continue;
|
||||
} else {
|
||||
unsigned int delay =
|
||||
1000000.0 * (mail->interval -
|
||||
(get_time() -
|
||||
mail->last_update));
|
||||
if (delay < update_interval * 500000) {
|
||||
delay = update_interval * 1000000;
|
||||
}
|
||||
usleep(delay);
|
||||
}
|
||||
}
|
||||
ERR("exiting pop3 thread");
|
||||
pthread_exit(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void *threaded_exec(struct text_object *obj) { // pthreads are really beginning to piss me off
|
||||
double update_time;
|
||||
int run_code = threads_runnable;
|
||||
@ -1132,6 +1547,32 @@ static void free_text_objects(unsigned int count, struct text_object *objs)
|
||||
free(objs[i].data.s);
|
||||
break;
|
||||
case OBJ_utime:
|
||||
case OBJ_imap:
|
||||
free(info.mail);
|
||||
break;
|
||||
case OBJ_imap_unseen:
|
||||
if (!objs[i].global_mode) {
|
||||
free(objs[i].data.mail);
|
||||
}
|
||||
break;
|
||||
case OBJ_imap_messages:
|
||||
if (!objs[i].global_mode) {
|
||||
free(objs[i].data.mail);
|
||||
}
|
||||
break;
|
||||
case OBJ_pop3:
|
||||
free(info.mail);
|
||||
break;
|
||||
case OBJ_pop3_unseen:
|
||||
if (!objs[i].global_mode) {
|
||||
free(objs[i].data.mail);
|
||||
}
|
||||
break;
|
||||
case OBJ_pop3_used:
|
||||
if (!objs[i].global_mode) {
|
||||
free(objs[i].data.mail);
|
||||
}
|
||||
break;
|
||||
case OBJ_if_existing:
|
||||
case OBJ_if_mounted:
|
||||
case OBJ_if_running:
|
||||
@ -2027,6 +2468,244 @@ static struct text_object *construct_text_object(const char *s, const char *arg,
|
||||
(void) scan_bar(arg, &obj->data.pair.a, &obj->data.pair.b);
|
||||
END OBJ(seti_credit, INFO_SETI) END
|
||||
#endif
|
||||
OBJ(imap_unseen, 0)
|
||||
if (arg) {
|
||||
// proccss
|
||||
obj->data.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(arg, "%128s %128s %128s", obj->data.mail->host, obj->data.mail->user, obj->data.mail->pass) != 3) {
|
||||
ERR("Scanning IMAP args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (obj->data.mail->pass[0] == '*' && obj->data.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", obj->data.mail->user, obj->data.mail->host);
|
||||
scanf("%128s", obj->data.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(arg, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &obj->data.mail->interval);
|
||||
} else {
|
||||
obj->data.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(arg, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &obj->data.mail->port);
|
||||
} else {
|
||||
obj->data.mail->port = 143; // default imap port
|
||||
}
|
||||
tmp = strstr(arg, "-f ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%s", obj->data.mail->folder);
|
||||
} else {
|
||||
strncpy(obj->data.mail->folder, "INBOX", 128); // default imap inbox
|
||||
}
|
||||
tmp = strstr(arg, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(obj->data.mail->command, tmp+1, len);
|
||||
} else {
|
||||
obj->data.mail->command[0] = '\0';
|
||||
}
|
||||
obj->data.mail->pos = -1;
|
||||
obj->global_mode = 0;
|
||||
} else {
|
||||
obj->global_mode = 1;
|
||||
}
|
||||
END
|
||||
OBJ(imap_messages, 0)
|
||||
if (arg) {
|
||||
// proccss
|
||||
obj->data.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(arg, "%128s %128s %128s", obj->data.mail->host, obj->data.mail->user, obj->data.mail->pass) != 3) {
|
||||
ERR("Scanning IMAP args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (obj->data.mail->pass[0] == '*' && obj->data.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", obj->data.mail->user, obj->data.mail->host);
|
||||
scanf("%128s", obj->data.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(arg, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &obj->data.mail->interval);
|
||||
} else {
|
||||
obj->data.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(arg, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &obj->data.mail->port);
|
||||
} else {
|
||||
obj->data.mail->port = 143; // default imap port
|
||||
}
|
||||
tmp = strstr(arg, "-f ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%s", obj->data.mail->folder);
|
||||
} else {
|
||||
strncpy(obj->data.mail->folder, "INBOX", 128); // default imap inbox
|
||||
}
|
||||
tmp = strstr(arg, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(obj->data.mail->command, tmp+1, len);
|
||||
} else {
|
||||
obj->data.mail->command[0] = '\0';
|
||||
}
|
||||
obj->data.mail->pos = -1;
|
||||
obj->global_mode = 0;
|
||||
} else {
|
||||
obj->global_mode = 1;
|
||||
}
|
||||
END
|
||||
OBJ(pop3_unseen, 0)
|
||||
if (arg) {
|
||||
// proccss
|
||||
obj->data.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(arg, "%128s %128s %128s", obj->data.mail->host, obj->data.mail->user, obj->data.mail->pass) != 3) {
|
||||
ERR("Scanning POP3 args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (obj->data.mail->pass[0] == '*' && obj->data.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", obj->data.mail->user, obj->data.mail->host);
|
||||
scanf("%128s", obj->data.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(arg, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &obj->data.mail->interval);
|
||||
} else {
|
||||
obj->data.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(arg, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &obj->data.mail->port);
|
||||
} else {
|
||||
obj->data.mail->port = 110; // default pop3 port
|
||||
}
|
||||
tmp = strstr(arg, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(obj->data.mail->command, tmp+1, len);
|
||||
} else {
|
||||
obj->data.mail->command[0] = '\0';
|
||||
}
|
||||
obj->data.mail->pos = -1;
|
||||
obj->global_mode = 0;
|
||||
} else {
|
||||
obj->global_mode = 1;
|
||||
}
|
||||
END
|
||||
OBJ(pop3_used, 0)
|
||||
if (arg) {
|
||||
// proccss
|
||||
obj->data.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(arg, "%128s %128s %128s", obj->data.mail->host, obj->data.mail->user, obj->data.mail->pass) != 3) {
|
||||
ERR("Scanning POP3 args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (obj->data.mail->pass[0] == '*' && obj->data.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", obj->data.mail->user, obj->data.mail->host);
|
||||
scanf("%128s", obj->data.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(arg, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &obj->data.mail->interval);
|
||||
} else {
|
||||
obj->data.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(arg, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &obj->data.mail->port);
|
||||
} else {
|
||||
obj->data.mail->port = 110; // default pop3 port
|
||||
}
|
||||
tmp = strstr(arg, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(obj->data.mail->command, tmp+1, len);
|
||||
} else {
|
||||
obj->data.mail->command[0] = '\0';
|
||||
}
|
||||
obj->data.mail->pos = -1;
|
||||
obj->global_mode = 0;
|
||||
} else {
|
||||
obj->global_mode = 1;
|
||||
}
|
||||
END
|
||||
#ifdef MPD
|
||||
OBJ(mpd_artist, INFO_MPD)
|
||||
END OBJ(mpd_title, INFO_MPD)
|
||||
@ -2822,7 +3501,91 @@ static void generate_text_internal(char *p, int p_max_size, struct text_object *
|
||||
}
|
||||
snprintf(p, p_max_size, "%s", obj->data.execi.buffer);
|
||||
}
|
||||
#endif
|
||||
#endif /* HAVE_POPEN */
|
||||
OBJ(imap_unseen) {
|
||||
if (obj->global_mode) { // this means we use info
|
||||
if (info.mail->pos < 0) {
|
||||
info.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(info.mail->thread_info.thread), NULL, (void*)imap_thread, (void*) info.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
info.mail->pos = register_thread(&(info.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", info.mail->unseen);
|
||||
} else { // this means we use obj
|
||||
if (obj->data.mail->pos < 0) {
|
||||
obj->data.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(obj->data.mail->thread_info.thread), NULL, (void*)imap_thread, (void*) obj->data.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
obj->data.mail->pos = register_thread(&(obj->data.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", obj->data.mail->unseen);
|
||||
}
|
||||
}
|
||||
OBJ(imap_messages) {
|
||||
if (obj->global_mode) { // this means we use info
|
||||
if (info.mail->pos < 0) {
|
||||
info.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(info.mail->thread_info.thread), NULL, (void*)imap_thread, (void*) info.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
info.mail->pos = register_thread(&(info.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", info.mail->messages);
|
||||
} else { // this means we use obj
|
||||
if (obj->data.mail->pos < 0) {
|
||||
obj->data.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(obj->data.mail->thread_info.thread), NULL, (void*)imap_thread, (void*) obj->data.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
obj->data.mail->pos = register_thread(&(obj->data.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", obj->data.mail->messages);
|
||||
}
|
||||
}
|
||||
OBJ(pop3_unseen) {
|
||||
if (obj->global_mode) { // this means we use info
|
||||
if (info.mail->pos < 0) {
|
||||
info.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(info.mail->thread_info.thread), NULL, (void*)pop3_thread, (void*) info.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
info.mail->pos = register_thread(&(info.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", info.mail->unseen);
|
||||
} else { // this means we use obj
|
||||
if (obj->data.mail->pos < 0) {
|
||||
obj->data.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(obj->data.mail->thread_info.thread), NULL, (void*)pop3_thread, (void*) obj->data.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
obj->data.mail->pos = register_thread(&(obj->data.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%u", obj->data.mail->unseen);
|
||||
}
|
||||
}
|
||||
OBJ(pop3_used) {
|
||||
if (obj->global_mode) { // this means we use info
|
||||
if (info.mail->pos < 0) {
|
||||
info.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(info.mail->thread_info.thread), NULL, (void*)pop3_thread, (void*) info.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
info.mail->pos = register_thread(&(info.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%.1f", info.mail->used/1024.0/1024.0);
|
||||
} else { // this means we use obj
|
||||
if (obj->data.mail->pos < 0) {
|
||||
obj->data.mail->last_update = current_update_time;
|
||||
if (pthread_create(&(obj->data.mail->thread_info.thread), NULL, (void*)pop3_thread, (void*) obj->data.mail)) {
|
||||
ERR("Error starting thread");
|
||||
}
|
||||
obj->data.mail->pos = register_thread(&(obj->data.mail->thread_info));
|
||||
}
|
||||
snprintf(p, p_max_size, "%.1f", obj->data.mail->used/1024.0/1024.0);
|
||||
}
|
||||
}
|
||||
OBJ(fs_bar) {
|
||||
if (obj->data.fs != NULL) {
|
||||
if (obj->data.fs->size == 0)
|
||||
@ -5300,6 +6063,121 @@ else if (strcasecmp(name, a) == 0 || strcasecmp(name, b) == 0)
|
||||
CONF_ERR;
|
||||
}
|
||||
#endif
|
||||
CONF("imap") {
|
||||
if (value) {
|
||||
info.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(value, "%128s %128s %128s", info.mail->host, info.mail->user, info.mail->pass) != 3) {
|
||||
ERR("Scanning IMAP args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (info.mail->pass[0] == '*' && info.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", info.mail->user, info.mail->host);
|
||||
scanf("%128s", info.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(value, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &info.mail->interval);
|
||||
} else {
|
||||
info.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(value, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &info.mail->port);
|
||||
} else {
|
||||
info.mail->port = 143; // default imap port
|
||||
}
|
||||
tmp = strstr(value, "-f ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%s", info.mail->folder);
|
||||
} else {
|
||||
strncpy(info.mail->folder, "INBOX", 128); // default imap inbox
|
||||
}
|
||||
tmp = strstr(value, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(info.mail->command, tmp+1, len);
|
||||
} else {
|
||||
info.mail->command[0] = '\0';
|
||||
}
|
||||
info.mail->pos = -1;
|
||||
} else {
|
||||
CONF_ERR;
|
||||
}
|
||||
}
|
||||
CONF("pop3") {
|
||||
if (value) {
|
||||
info.mail = malloc(sizeof(struct mail_s));
|
||||
char *tmp;
|
||||
if (sscanf(value, "%128s %128s %128s", info.mail->host, info.mail->user, info.mail->pass) != 3) {
|
||||
ERR("Scanning POP3 args failed");
|
||||
}
|
||||
// see if password needs prompting
|
||||
if (info.mail->pass[0] == '*' && info.mail->pass[1] == '\0') {
|
||||
int fp = fileno(stdin);
|
||||
struct termios term;
|
||||
tcgetattr(fp, &term);
|
||||
term.c_lflag &= ~ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
printf("Mailbox password (%s@%s): ", info.mail->user, info.mail->host);
|
||||
scanf("%128s", info.mail->pass);
|
||||
printf("\n");
|
||||
term.c_lflag |= ECHO;
|
||||
tcsetattr(fp, TCSANOW, &term);
|
||||
}
|
||||
// now we check for optional args
|
||||
tmp = strstr(value, "-i ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%f", &info.mail->interval);
|
||||
} else {
|
||||
info.mail->interval = 300; // 5 minutes
|
||||
}
|
||||
tmp = strstr(value, "-p ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
sscanf(tmp, "%u", &info.mail->port);
|
||||
} else {
|
||||
info.mail->port = 110; // default pop3 port
|
||||
}
|
||||
tmp = strstr(value, "-e ");
|
||||
if (tmp) {
|
||||
tmp += 3;
|
||||
int len = 1024;
|
||||
if (tmp[0] == '\'') {
|
||||
len = strstr(tmp+1, "'") - tmp - 1;
|
||||
if (len > 1024) {
|
||||
len = 1024;
|
||||
}
|
||||
}
|
||||
strncpy(info.mail->command, tmp+1, len);
|
||||
} else {
|
||||
info.mail->command[0] = '\0';
|
||||
}
|
||||
info.mail->pos = -1;
|
||||
} else {
|
||||
CONF_ERR;
|
||||
}
|
||||
}
|
||||
#ifdef MPD
|
||||
CONF("mpd_host") {
|
||||
if (value)
|
||||
|
23
src/conky.h
23
src/conky.h
@ -102,6 +102,27 @@ struct fs_stat {
|
||||
long long free;
|
||||
};
|
||||
|
||||
struct thread_info_s {
|
||||
pthread_t thread;
|
||||
};
|
||||
|
||||
struct mail_s { // for imap and pop3
|
||||
unsigned int unseen;
|
||||
unsigned int messages;
|
||||
unsigned int used;
|
||||
unsigned int quota;
|
||||
unsigned int port;
|
||||
float interval;
|
||||
double last_update;
|
||||
char host[128];
|
||||
char user[128];
|
||||
char pass[128];
|
||||
char command[1024];
|
||||
char folder[128];
|
||||
int pos;
|
||||
struct thread_info_s thread_info;
|
||||
} mail;
|
||||
|
||||
/*struct cpu_stat {
|
||||
unsigned int user, nice, system, idle, iowait, irq, softirq;
|
||||
int cpu_avg_samples;
|
||||
@ -258,6 +279,8 @@ struct information {
|
||||
float loadavg[3];
|
||||
|
||||
int new_mail_count, mail_count;
|
||||
struct mail_s* mail;
|
||||
int mail_running;
|
||||
#ifdef SETI
|
||||
float seti_prog;
|
||||
float seti_credit;
|
||||
|
Loading…
Reference in New Issue
Block a user