* espeakup release coming soon @ William Hubbs ` Jude DaShiell ` Samuel Thibault 0 siblings, 2 replies; 17+ messages in thread From: William Hubbs @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Hey all, sorry I haven't been around a lot, Gentoo and now a new job have been taking a lot of my time, but I haven't forgotten about this project. I want to do a new espeakup release, hopefully in the next few days, so, I need to know if there are any patches that we need. Can folks take a look at it and let me know if anything is missing? Thanks, William https://github.com/williamh/espeakup ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon espeakup release coming soon William Hubbs @ ` Jude DaShiell ` William Hubbs ` Samuel Thibault ` Samuel Thibault 1 sibling, 2 replies; 17+ messages in thread From: Jude DaShiell @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Would it be possible to have espeakup not use a sound card directly but go through pulseaudio when pulseaudio is installed? I'm asking since the best pair of speakers I have is usb and espeakup cannot use them. I can get vlc to use the usb speakers but not espeakup. On Sun, 6 Mar 2016, William Hubbs wrote: > Date: Sun, 6 Mar 2016 13:54:59 > From: William Hubbs <w.d.hubbs@gmail.com> > Reply-To: Speakup is a screen review system for Linux. > <speakup@linux-speakup.org> > To: Speakup is a screen review system for Linux. <speakup@linux-speakup.org> > Subject: espeakup release coming soon > > Hey all, > > sorry I haven't been around a lot, Gentoo and now a new job have been > taking a lot of my time, but I haven't forgotten about this project. > > I want to do a new espeakup release, hopefully in the next few days, so, > I need to know if there are any patches that we need. Can folks take a > look at it and let me know if anything is missing? > > Thanks, > > William > > https://github.com/williamh/espeakup > > _______________________________________________ > Speakup mailing list > Speakup@linux-speakup.org > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup -- ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Jude DaShiell @ ` William Hubbs ` Samuel Thibault 1 sibling, 0 replies; 17+ messages in thread From: William Hubbs @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Espeakup doesn't have any audio code in it; it uses espeak's audio support. In order to do this, you should look at configuring espeak to use pulseaudio. Thanks, William On Sun, Mar 06, 2016 at 02:22:40PM -0500, Jude DaShiell wrote: > Would it be possible to have espeakup not use a sound card directly but > go through pulseaudio when pulseaudio is installed? I'm asking since > the best pair of speakers I have is usb and espeakup cannot use them. I > can get vlc to use the usb speakers but not espeakup. > > On Sun, 6 Mar 2016, William Hubbs wrote: > > > Date: Sun, 6 Mar 2016 13:54:59 > > From: William Hubbs <w.d.hubbs@gmail.com> > > Reply-To: Speakup is a screen review system for Linux. > > <speakup@linux-speakup.org> > > To: Speakup is a screen review system for Linux. <speakup@linux-speakup.org> > > Subject: espeakup release coming soon > > > > Hey all, > > > > sorry I haven't been around a lot, Gentoo and now a new job have been > > taking a lot of my time, but I haven't forgotten about this project. > > > > I want to do a new espeakup release, hopefully in the next few days, so, > > I need to know if there are any patches that we need. Can folks take a > > look at it and let me know if anything is missing? > > > > Thanks, > > > > William > > > > https://github.com/williamh/espeakup > > > > _______________________________________________ > > Speakup mailing list > > Speakup@linux-speakup.org > > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup > > -- > > _______________________________________________ > Speakup mailing list > Speakup@linux-speakup.org > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Jude DaShiell ` William Hubbs @ ` Samuel Thibault ` Chris Brannon ` Mark Peveto 1 sibling, 2 replies; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. [-- Attachment #1: Type: text/plain, Size: 336 bytes --] Hello, currently espeakup uses daemon() to do the daemonizing stuff. Unfortunately, daemon() does things not very appropriately, and there is notably a delay between the parent exit()ing and the child writing the pid file. The attached patch reimplements it properly, espeakup then notably plays much more nicely with systemd. Samuel [-- Attachment #2: daemon --] [-- Type: text/plain, Size: 3996 bytes --] --- a/espeakup.c +++ b/espeakup.c @@ -24,6 +24,8 @@ #include <string.h> #include <unistd.h> #include <pthread.h> +#include <fcntl.h> +#include <sys/file.h> #include "espeakup.h" @@ -42,21 +44,94 @@ const int defaultVolume = 5; char *defaultVoice = NULL; int debug = 0; +int espeakup_start_daemon(void) +{ + int fds[2]; + pid_t pid; + char c; + + if (pipe(fds) < 0) { + perror("pipe"); + exit(1); + } + pid = fork(); + + if (pid < 0) { + perror("fork"); + exit(1); + } + if (pid) { + /* Parent, just wait for daemon */ + if (read(fds[0], &c, 1) < 0) { + printf("Espeakup is already running!\n"); + exit(1); + } + exit(c); + } + + + /* Child, create new session */ + setsid(); + pid = fork(); + if (pid) + /* Intermediate child, just exit */ + exit(0); + + /* Child */ + if (chdir("/") < 0) { + c = 1; + (void) write(fds[1], &c, 1); + exit(1); + } + return fds[1]; +} + int espeakup_is_running(void) { - int rc; - FILE *pidFile; + int pidFile; + int n; + char s[16]; pid_t pid; - rc = 0; - pidFile = fopen(pidPath, "r"); - if (pidFile) { - fscanf(pidFile, "%d", &pid); - fclose(pidFile); - if (!kill(pid, 0) || errno != ESRCH) - rc = 1; + pidFile = open(pidPath, O_RDWR|O_CREAT, 0666); + if (pidFile < 0) { + printf("Can not work with the pid file %s: %s\n", pidPath, strerror(errno)); + return -1; + } + + if (flock(pidFile, LOCK_EX) < 0) { + printf("Can not lock the pid file %s: %s\n", pidPath, strerror(errno)); + goto error; + } + n = read(pidFile, s, sizeof(s)-1); + if (n < 0) { + printf("Can not read the pid file %s: %s\n", pidPath, strerror(errno)); + goto error; + } + s[n] = 0; + n = sscanf(s, "%d", &pid); + if (n == 1 && (!kill(pid, 0) || errno != ESRCH)) + { + /* Already running */ + close(pidFile); + return 1; } - return rc; + if (ftruncate(pidFile, 0) < 0) { + printf("Could not truncate the pid file %s: %s\n", pidPath, strerror(errno)); + goto error; + } + lseek(pidFile, 0, SEEK_SET); + n = snprintf(s, sizeof(s), "%d", getpid()); + if (write(pidFile, s, n) < 0) { + printf("Could not write to the pid file %s: %s\n", pidPath, strerror(errno)); + goto error; + } + close(pidFile); + return 0; + +error: + close(pidFile); + return -1; } int create_pid_file(void) @@ -91,6 +166,8 @@ void espeakup_sighandler(int sig) int main(int argc, char **argv) { + int fd, null; + char ret; pthread_t queue_thread_id; struct synth_t s = { .voice = "", @@ -99,27 +176,37 @@ int main(int argc, char **argv) /* process command line options */ process_cli(argc, argv); + if (!debug) + fd = espeakup_start_daemon(); + /* Is the espeakup daemon running? */ if (espeakup_is_running()) { printf("Espeakup is already running!\n"); - return 1; + ret = 1; + goto out; } /* open the softsynth. */ if (! open_softsynth()) { perror("Unable to open the softsynth device"); - return 3; + ret = 3; + goto out; + } + + if (!debug) { + /* Shut down stdout/stderr */ + null = open("/dev/null", O_RDWR); + dup2(null, STDIN_FILENO); + dup2(null, STDOUT_FILENO); + dup2(null, STDERR_FILENO); + if (null > 2) + close(null); } /* register signal handler */ signal(SIGINT, espeakup_sighandler); signal(SIGTERM, espeakup_sighandler); - if (!debug) { - /* become a daemon */ - daemon(0, 1); - } - /* initialize espeak */ espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0); @@ -138,19 +225,23 @@ int main(int argc, char **argv) /* Spawn our queue-processing thread. */ int err = pthread_create(&queue_thread_id, NULL, &queue_runner, &s); if (err != 0) { - return 4; + ret = 4; + goto out; } if (!debug) { - /* We are now ready, write our pid file. */ - if (create_pid_file() < 0) { - perror("Unable to create pid file"); - return 2; - } + /* We are now ready, notify parent */ + ret = 0; + (void) write(fd, &ret, 1); + close(fd); } /* run the main loop */ main_loop(&s); - return 0; + +out: + if (!debug) + (void) write(fd, &ret, 1); + return ret; } ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault @ ` Chris Brannon ` Samuel Thibault ` Mark Peveto 1 sibling, 1 reply; 17+ messages in thread From: Chris Brannon @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Samuel Thibault <samuel.thibault@ens-lyon.org> writes: > currently espeakup uses daemon() to do the daemonizing stuff. > Unfortunately, daemon() does things not very appropriately, and there > is notably a delay between the parent exit()ing and the child writing > the pid file. Why not just use the -d option when starting espeakup? This causes it to stay in the foreground. No pid file is written, etc. The long option name is --debug. I'd argue that that is a bit of a misnomer, since all it really does is cause espeakup to stay in the foreground. Maybe it should have been called --dontfork instead. I thought systemd preferred non-forking daemons? Anyway, -d is what I use to run espeakup under runit, and it has worked well in practice for over a year. -- Chris ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Chris Brannon @ ` Samuel Thibault ` Chris Brannon 0 siblings, 1 reply; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Chris Brannon, on Wed 20 Jul 2016 17:07:26 -0700, wrote: > > currently espeakup uses daemon() to do the daemonizing stuff. > > Unfortunately, daemon() does things not very appropriately, and there > > is notably a delay between the parent exit()ing and the child writing > > the pid file. > > Why not just use the -d option when starting espeakup? Because at some point we need to fix bugs, not walk away from them. Samuel ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault @ ` Chris Brannon ` Samuel Thibault 0 siblings, 1 reply; 17+ messages in thread From: Chris Brannon @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Samuel Thibault <samuel.thibault@ens-lyon.org> writes: >> Why not just use the -d option when starting espeakup? > > Because at some point we need to fix bugs, not walk away from them. Ok, that's a good point. Your patch looks reasonable to me. It does not apply to the current master branch for espeakup. I would be happy to do the work of merging it and sending a pull request to WilliamH on github, acknowledging you as the source of the patch. That's just busy work. Anyway, let me know if you want me to do that or if you'd rather do the busy work yourself. -- Chris ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Chris Brannon @ ` Samuel Thibault 0 siblings, 0 replies; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Chris Brannon, on Thu 21 Jul 2016 01:03:59 -0700, wrote: > Anyway, let me know if you want me to do that or if you'd rather do the > busy work yourself. Please do :) Samuel ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault ` Chris Brannon @ ` Mark Peveto ` Samuel Thibault 1 sibling, 1 reply; 17+ messages in thread From: Mark Peveto @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Samuel, I've got the patch saved in my home directory. I have the current version of espeakup installed, but not the current version of espeak. What, if anything, do I need to do with the patch at this point? How do I run it? Would updating to the current espeak be advisable? I'm assuming so, but I don't wanna just assume. Everything happens after coffee! Mark Peveto Registered Linux user number 600552 Sent from sonar using alpine 2.20.13 On Thu, 21 Jul 2016, Samuel Thibault wrote: > Hello, > > currently espeakup uses daemon() to do the daemonizing stuff. > Unfortunately, daemon() does things not very appropriately, and there > is notably a delay between the parent exit()ing and the child writing > the pid file. The attached patch reimplements it properly, espeakup then > notably plays much more nicely with systemd. > > Samuel > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Mark Peveto @ ` Samuel Thibault ` Mark Peveto 0 siblings, 1 reply; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Hello, Mark Peveto, on Thu 21 Jul 2016 10:00:15 -0500, wrote: > What, if anything, do I need to do with the patch at this point? Well, what do you want to do? I you don't have any issue with espeakup startup, you don't need the patch :) Samuel ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault @ ` Mark Peveto ` Chris Brannon ` Samuel Thibault 0 siblings, 2 replies; 17+ messages in thread From: Mark Peveto @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. What i have an issue with is this. In trying to get console speech in manjaro based distros, the newest version of espeak won't work well with espeakup. I'm wondering if the pach would help? Everything happens after coffee! Mark Peveto Registered Linux user number 600552 Sent from sonar using alpine 2.20.13 On Thu, 21 Jul 2016, Samuel Thibault wrote: > Hello, > > Mark Peveto, on Thu 21 Jul 2016 10:00:15 -0500, wrote: > > What, if anything, do I need to do with the patch at this point? > > Well, what do you want to do? > I you don't have any issue with espeakup startup, you don't need the > patch :) > > Samuel > _______________________________________________ > Speakup mailing list > Speakup@linux-speakup.org > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Mark Peveto @ ` Chris Brannon ` Samuel Thibault 1 sibling, 0 replies; 17+ messages in thread From: Chris Brannon @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Mark Peveto <southernprince73@gmail.com> writes: > What i have an issue with is this. In trying to get console speech in > manjaro based distros, the newest version of espeak won't work well > with > espeakup. I'm wondering if the pach would help? If you're talking about espeak-ng, no it won't. The problem is in their audio code. I've found at least some of the issues, and I'm working with them to get them fixed. -- Chris ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Mark Peveto ` Chris Brannon @ ` Samuel Thibault 1 sibling, 0 replies; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Mark Peveto, on Thu 21 Jul 2016 11:27:06 -0500, wrote: > What i have an issue with is this. In trying to get console speech in manjaro based distros, the newest version of espeak won't work well with > espeakup. I'm wondering if the pach would help? It can't help, it has nothing to do with espeak :) Samuel ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon espeakup release coming soon William Hubbs ` Jude DaShiell @ ` Samuel Thibault ` William Hubbs ` William Hubbs 1 sibling, 2 replies; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. [-- Attachment #1: Type: text/plain, Size: 855 bytes --] Hello, William Hubbs, on Sun 06 Mar 2016 12:54:59 -0600, wrote: > I want to do a new espeakup release, hopefully in the next few days, so, > I need to know if there are any patches that we need. Can folks take a > look at it and let me know if anything is missing? Good idea to ask :) We have a few patches in Debian: - keystrokes uses interpret-as="characters" when the kernel reports just one character. This allows to use espeak's internationalized spelling of letters, instead of having to maintain spelling ourself in speakup. - pidfile makes espeakup write the pidfile only after it is really finished starting. We need this to properly report that the daemon hasn't actually started when it failed to e.g. open voices. - voice fixes using language names as espeakup parameter instead of voice names, just like the espeak program does. Samuel [-- Attachment #2: keystrokes --] [-- Type: text/plain, Size: 837 bytes --] Fix spelling keystrokes and char-by-char echo. --- espeakup-0.71.orig/synth.c +++ espeakup-0.71/synth.c @@ -121,7 +121,29 @@ { espeak_ERROR rc; - rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, - NULL); + if (s->len == 1) + { + char *buf; + int n; + n = asprintf(&buf, "<say-as interpret-as=\"characters\">%c</say-as>", s->buf[0]); + if (n == -1) + { + /* D'oh. Not much to do on allocation failure. + * Perhaps espeak will happen to say the character */ + rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, + NULL); + } + else + { + rc = espeak_Synth(buf, n + 1, 0, POS_CHARACTER, 0, espeakSSML, NULL, + NULL); + free(buf); + } + } + else + { + rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, + NULL); + } return rc; } [-- Attachment #3: pidfile --] [-- Type: text/plain, Size: 591 bytes --] Create pidfile after espeakup is really ready. --- espeakup-0.71.orig/espeakup.c +++ espeakup-0.71/espeakup.c @@ -118,12 +118,6 @@ if (!debug) { /* become a daemon */ daemon(0, 1); - - /* write our pid file. */ - if (create_pid_file() < 0) { - perror("Unable to create pid file"); - return 2; - } } /* initialize espeak */ @@ -147,6 +141,14 @@ return 4; } + if (!debug) { + /* We are now ready, write our pid file. */ + if (create_pid_file() < 0) { + perror("Unable to create pid file"); + return 2; + } + } + /* run the main loop */ main_loop(&s); [-- Attachment #4: voice --] [-- Type: text/plain, Size: 400 bytes --] --- a/synth.c +++ b/synth.c @@ -91,6 +91,13 @@ espeak_ERROR set_voice(struct synth_t * espeak_ERROR rc; rc = espeak_SetVoiceByName(voice); + if (rc != EE_OK) + { + espeak_VOICE voice_select; + memset(&voice_select, 0, sizeof(voice_select)); + voice_select.languages = voice; + rc = espeak_SetVoiceByProperties(&voice_select); + } if (rc == EE_OK) strcpy(s->voice, voice); return rc; ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault @ ` William Hubbs ` Samuel Thibault ` William Hubbs 1 sibling, 1 reply; 17+ messages in thread From: William Hubbs @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Hi, do you know who wrote these patches? I would like to make sure I give proper credit in the logs. Thanks, William On Sun, Mar 06, 2016 at 08:37:17PM +0100, Samuel Thibault wrote: > Hello, > > William Hubbs, on Sun 06 Mar 2016 12:54:59 -0600, wrote: > > I want to do a new espeakup release, hopefully in the next few days, so, > > I need to know if there are any patches that we need. Can folks take a > > look at it and let me know if anything is missing? > > Good idea to ask :) > > We have a few patches in Debian: > > - keystrokes uses interpret-as="characters" when the kernel reports just > one character. This allows to use espeak's internationalized spelling of > letters, instead of having to maintain spelling ourself in speakup. > - pidfile makes espeakup write the pidfile only after it is really > finished starting. We need this to properly report that the daemon > hasn't actually started when it failed to e.g. open voices. > - voice fixes using language names as espeakup parameter instead of > voice names, just like the espeak program does. > > Samuel > Fix spelling keystrokes and char-by-char echo. > > --- espeakup-0.71.orig/synth.c > +++ espeakup-0.71/synth.c > @@ -121,7 +121,29 @@ > { > espeak_ERROR rc; > > - rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, > - NULL); > + if (s->len == 1) > + { > + char *buf; > + int n; > + n = asprintf(&buf, "<say-as interpret-as=\"characters\">%c</say-as>", s->buf[0]); > + if (n == -1) > + { > + /* D'oh. Not much to do on allocation failure. > + * Perhaps espeak will happen to say the character */ > + rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, > + NULL); > + } > + else > + { > + rc = espeak_Synth(buf, n + 1, 0, POS_CHARACTER, 0, espeakSSML, NULL, > + NULL); > + free(buf); > + } > + } > + else > + { > + rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, > + NULL); > + } > return rc; > } > Create pidfile after espeakup is really ready. > > --- espeakup-0.71.orig/espeakup.c > +++ espeakup-0.71/espeakup.c > @@ -118,12 +118,6 @@ > if (!debug) { > /* become a daemon */ > daemon(0, 1); > - > - /* write our pid file. */ > - if (create_pid_file() < 0) { > - perror("Unable to create pid file"); > - return 2; > - } > } > > /* initialize espeak */ > @@ -147,6 +141,14 @@ > return 4; > } > > + if (!debug) { > + /* We are now ready, write our pid file. */ > + if (create_pid_file() < 0) { > + perror("Unable to create pid file"); > + return 2; > + } > + } > + > /* run the main loop */ > main_loop(&s); > > --- a/synth.c > +++ b/synth.c > @@ -91,6 +91,13 @@ espeak_ERROR set_voice(struct synth_t * > espeak_ERROR rc; > > rc = espeak_SetVoiceByName(voice); > + if (rc != EE_OK) > + { > + espeak_VOICE voice_select; > + memset(&voice_select, 0, sizeof(voice_select)); > + voice_select.languages = voice; > + rc = espeak_SetVoiceByProperties(&voice_select); > + } > if (rc == EE_OK) > strcpy(s->voice, voice); > return rc; > _______________________________________________ > Speakup mailing list > Speakup@linux-speakup.org > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` William Hubbs @ ` Samuel Thibault 0 siblings, 0 replies; 17+ messages in thread From: Samuel Thibault @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. William Hubbs, on Sun 06 Mar 2016 16:02:49 -0600, wrote: > do you know who wrote these patches? I would like to make sure I give > proper credit in the logs. I did for all of them :) Samuel ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: espeakup release coming soon ` Samuel Thibault ` William Hubbs @ ` William Hubbs 1 sibling, 0 replies; 17+ messages in thread From: William Hubbs @ UTC (permalink / raw) To: Speakup is a screen review system for Linux. Hi all, this is just a quick update to let you know that I have encorporated all of the patches I have into espeakup and the release will happen later today. Thanks, William ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~ UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
espeakup release coming soon William Hubbs
` Jude DaShiell
` William Hubbs
` Samuel Thibault
` Chris Brannon
` Samuel Thibault
` Chris Brannon
` Samuel Thibault
` Mark Peveto
` Samuel Thibault
` Mark Peveto
` Chris Brannon
` Samuel Thibault
` Samuel Thibault
` William Hubbs
` Samuel Thibault
` William Hubbs
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).