LinuxQuestions.org
Share your knowledge at the LQ Wiki.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Distributions > Slackware
User Name
Password
Slackware This Forum is for the discussion of Slackware Linux.

Notices


Reply
  Search this Thread
Old 10-16-2017, 07:54 AM   #1
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Rep: Reputation: Disabled
How to simulate a PrintScreen keypress in a shell script?


I want to include in ~/.xinitrc a command that simulates a Print Screen keypress, to avoid doing it manually before typing startx (I need that to mute espeakup, a text to speech program, else I would hear what's displayed on the tty even in a graphical environment).

But what command? showkey tells me that the keycode is 99.

Under X I could use xdotool for instance, but I need to do that in text mode.

Also, espeakup is a daemon that has to be started by root, so a regular user is not allowed to stop it.

An internet search didn't give me any clue.

Last edited by Didier Spaier; 10-16-2017 at 08:08 AM.
 
Old 10-16-2017, 10:20 AM   #2
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Didier Spaier --

I thought this would be an easy one

On linux the Magic SysRq Key might make fooling with the [SysRq + PrtSc] Key a little scary.

There does seem to be a sysctl to turn off the Magic SysRq Key( kernel.sysrq=0 ).

However, `showkey -a` gives me nothing when I press [PrtSc].

Maybe one of the 'standard' ANSI Escape Sequences for PrintScreen ( Esc[i or ... ) from the bottom of ANSI Escape Sequences will work for your startup script ?

If so, I've done this sort of thing in scripts:

Code:
PrtSc="$(echo -ne "\033[i")"
echo -n "$PrtSc"
HTH.

EDIT: to send the keystroke back to the app, you'll need something like expect or a small C-Program to simulate the keystroke ( once you find the key ).
EDIT: there is a small C-Program Here: https://unix.stackexchange.com/quest...a-shell-script

-- kjh

This is what I see in my $PrtSc Varb:

# echo -n "$PrtSc" |hd
Code:
# Offset   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   Text
# ======   == == == == == == == == == == == == == == == ==   ================
00000000   1b 5b 69                                          .[i

Last edited by kjhambrick; 10-16-2017 at 10:29 AM.
 
1 members found this post helpful.
Old 10-16-2017, 11:05 AM   #3
GazL
LQ Veteran
 
Registered: May 2008
Posts: 6,897

Rep: Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018Reputation: 5018
One possibility might be using the uinput module. See /usr/src/linux/Documentation/input/uinput.rst

I'm a little surprised to find that you'd need to inject keypresses in order to toggle screen reading. One would think that espeakup would provide a control mechanism for that somehow.
 
1 members found this post helpful.
Old 10-16-2017, 01:25 PM   #4
rknichols
Senior Member
 
Registered: Aug 2009
Distribution: Rocky Linux
Posts: 4,776

Rep: Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212Reputation: 2212
Quote:
Originally Posted by GazL View Post
I'm a little surprised to find that you'd need to inject keypresses in order to toggle screen reading. One would think that espeakup would provide a control mechanism for that somehow.
Can't you just "echo 1 >/speakup/silent" ? I'm just going by the sketchy documentation in spkguide.txt, which just says, "Most of the names are self explanatory," for the contents of the /speakup directory.

Last edited by rknichols; 10-16-2017 at 01:27 PM.
 
2 members found this post helpful.
Old 10-16-2017, 01:51 PM   #5
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Original Poster
Rep: Reputation: Disabled
Thanks for responding khjambrick, GazL, and rnichols

Quote:
Originally Posted by kjhambrick View Post
EDIT: to send the keystroke back to the app, you'll need something like expect or a small C-Program to simulate the keystroke ( once you find the key ).
EDIT: there is a small C-Program Here: https://unix.stackexchange.com/quest...a-shell-script
Yes I saw this. But I'd prefer a shell command if at all possible.

Quote:
Originally Posted by GazL View Post
One possibility might be using the uinput module. See /usr/src/linux/Documentation/input/uinput.rst
Yes that is also suggested in the post linked to by khjambrick, but I have the same objection.

Quote:
I'm a little surprised to find that you'd need to inject keypresses in order to toggle screen reading.

One would think that espeakup would provide a control mechanism for that somehow.
Well I don't need to inject a keypress, the user can just press the key. But that's boring to have to do that every time before typing startx.

On a technical note, actually two pieces of software come into play here:
  • The speakup Linux driver, cf. /usr/src/linux/staging /speakup
  • The synthesizer. In Slint we use the software synthesizer espeak.
speakup comunicates with userland through a sys interface whose root is /sys/accessibility/speakup and with the soft synthesizer through /sys/accessibility/speakup/soft.The files in /sys/accessibility/speakup/soft are 666 so I can e.g. minimize the volume with "echo 0 > /sys/accessibility/speakup/soft" but it is not completely muted.

My assumption is that I should echo a value to some file in /speakup as just suggested by rnichols, but they are all writable only by root.

I could have a look in the code to see how Print Screen is handled as after all the key press is done by a regular user.If only I was able to read C code...

I could end up requesting help from Samuel Thibault, one of the writers of spkguide.txt (also found in /usr/src/linux/drivers/staging /speakup).

Last edited by Didier Spaier; 10-16-2017 at 02:01 PM.
 
Old 10-16-2017, 03:51 PM   #6
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Quote:
Originally Posted by Didier Spaier View Post
Thanks for responding khjambrick, GazL, and rnichols
You're welcome, Didier Spaier.

I build and installed the portaudio and espeak SBo Packages for Slackware64 14.2 ... espeak is kinda kool ...

Takes some getting used to the 'accent' but I can understand most of the text when I run:
Code:
# man espeak |espeak -a 20 -v en-us+f4
Quote:
Originally Posted by Didier Spaier
On a technical note, actually two pieces of software come into play here:
  • The speakup Linux driver, cf. /usr/src/linux/staging /speakup
  • The synthesizer. In Slint we use the software synthesizer espeak.
speakup comunicates with userland through a sys interface whose root is /sys/accessibility/speakup and with the soft synthesizer through /sys/accessibility/speakup/soft.The files in /sys/accessibility/speakup/soft are 666 so I can e.g. minimize the volume with "echo 0 > /sys/accessibility/speakup/soft" but it is not completely muted.

My assumption is that I should echo a value to some file in /speakup as just suggested by rnichols, but they are all writable only by root.
Looking at The Speakup User's Guide, it looks like /speakup is a symlink to the /sys/accessibility/speakup/ directory ?
Code:
5.  The Speakup Sys System

The Speakup screen reader also creates a speakup subdirectory as a part
of the sys system.

As a convenience, run as root

ln -s /sys/accessibility/speakup /speakup

to directly access speakup parameters from /speakup. 
You can see these entries by typing the command:

ls -1 /speakup/*
Q1: Did you create the symlink ?

Q2: Instead of `ls -1 /speakup/*` what if you type:

Code:
ls -lad $(find /speakup -type f)
Q3: Are ALL the files under your /speakup/ directory writable only by root ?

I ask because further down in the The Speakup User's Guide, it says:

Code:
Looking at entries in the Speakup sys system can be useful in many
ways.  For example, you might wish to know what level your volume is set
at.  You could type:

cat /speakup/KWD/vol
# Replace KWD with the keyword for your synthesizer, E.G., ltlk for LiteTalk.
5

The number five which comes back is the level at which the synthesizer
volume is set at.
Q4: If the /speakup/soft/vol file is world-writable, What happens if you type as 'yourself' ?
Code:
echo 0 > /speakup/soft/vol
HTH ...

-- kjh

Last edited by kjhambrick; 10-16-2017 at 03:53 PM. Reason: ls-lad -> ls -lad
 
Old 10-16-2017, 05:10 PM   #7
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Original Poster
Rep: Reputation: Disabled
Quote:
I build and installed the portaudio and espeak SBo Packages for Slackware64 14.2 ... espeak is kinda kool ...
You can also get a package from here:
http://slackware.uk/slint/x86_64/slint-testing/slint/
for espeak and espeakup. Not for portaudio as we use pulseaudio instead, included in Slackware and Slint.

1) I didn't, but I just did now. Honestly I fail to see why and how that would matters.

2)
Code:
didier[~]$ ls -lad $(find /speakup -type f)
drwxr-xr-x 84 didier users 45056 oct.  16 21:44 .
didier[~]$
Which does not mean much. But:
Code:
didier[/sys/accessibility/speakup]$ ls -l
total 0
-rw-r--r-- 1 root root 4096 oct.  16 21:48 attrib_bleep
-rw-r--r-- 1 root root 4096 oct.  16 21:48 bell_pos
-rw-r--r-- 1 root root 4096 oct.  16 21:48 bleep_time
-rw-r--r-- 1 root root 4096 oct.  16 21:48 bleeps
-rw-r--r-- 1 root root 4096 oct.  16 21:48 cursor_time
-rw-r--r-- 1 root root 4096 oct.  16 21:48 delimiters
-rw-r--r-- 1 root root 4096 oct.  16 21:48 ex_num
drwxr-xr-x 2 root root    0 oct.  16 21:48 i18n
-rw-r--r-- 1 root root 4096 oct.  16 21:48 key_echo
-rw-r--r-- 1 root root 4096 oct.  16 21:48 keymap
-rw-r--r-- 1 root root 4096 oct.  16 21:48 no_interrupt
-rw-r--r-- 1 root root 4096 oct.  16 21:48 punc_all
-rw-r--r-- 1 root root 4096 oct.  16 21:48 punc_level
-rw-r--r-- 1 root root 4096 oct.  16 21:48 punc_most
-rw-r--r-- 1 root root 4096 oct.  16 21:48 punc_some
-rw-r--r-- 1 root root 4096 oct.  16 21:48 reading_punc
-rw-r--r-- 1 root root 4096 oct.  16 21:48 repeats
-rw-r--r-- 1 root root 4096 oct.  16 21:48 say_control
-rw-r--r-- 1 root root 4096 oct.  16 21:48 say_word_ctl
--w------- 1 root root 4096 oct.  16 21:48 silent
drwxr-xr-x 2 root root    0 oct.  16 21:48 soft
-rw-r--r-- 1 root root 4096 oct.  16 21:48 spell_delay
-rw-r--r-- 1 root root 4096 oct.  16 21:43 synth
--w------- 1 root root 4096 oct.  16 21:48 synth_direct
-r--r--r-- 1 root root 4096 oct.  16 21:48 version
didier[/sys/accessibility/speakup]$
didier[/sys/accessibility/speakup]$ ls -l soft i18n/
i18n/:
total 0
-rw-r--r-- 1 root root 4096 oct.  16 21:59 announcements
-rw-r--r-- 1 root root 4096 oct.  16 21:59 characters
-rw-r--r-- 1 root root 4096 oct.  16 21:59 chartab
-rw-r--r-- 1 root root 4096 oct.  16 21:59 colors
-rw-r--r-- 1 root root 4096 oct.  16 21:59 ctl_keys
-rw-r--r-- 1 root root 4096 oct.  16 21:59 formatted
-rw-r--r-- 1 root root 4096 oct.  16 21:59 function_names
-rw-r--r-- 1 root root 4096 oct.  16 21:59 key_names
-rw-r--r-- 1 root root 4096 oct.  16 21:59 states

soft:
total 0
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 caps_start
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 caps_stop
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 delay_time
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 direct
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 freq
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 full_time
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 jiffy_delta
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 pitch
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 punct
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 rate
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 tone
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 trigger_time
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 voice
-rw-rw-rw- 1 root root 4096 oct.  16 21:43 vol
didier[/sys/accessibility/speakup]$
3) See above: all but those in subdirs i18/ and soft/

4) Same as echo 0 > /sys/accessibility/speakup/soft/vol (low volume but not mute).

Last edited by Didier Spaier; 10-16-2017 at 05:16 PM.
 
Old 10-17-2017, 08:39 AM   #8
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Didier Spaier --

Well, I am at a loss.

Looking at rknichols suggestion, I wonder what does happen if you:
Code:
echo 1 > /sys/accessibility/speakup/silent
As rknichols said, the docs say "Most of the names are self explanatory." ( maybe so, but not for me ).

I do wonder about the permissions of "/sys/accessibility/speakup/silent" on your system:
Code:
--w------- 1 root root 4096 oct.  16 21:48 silent
Why are the permissions write-only for root ?

Oh well, I did use this an an excuse to play with uinput a little bit.

The Old Code in Kernel Docs - Section 1.7.4.3. uinput old interface mostly works.

The modified version below compiles and I can inject a KEY_SYSRQ ( aka [PrtSc] = ScanKey 99 ) into the Keyboard Buffer but only as root and I can't say I've got a handle on what I am doing ( yet )

When I execute ./inject-sysrq as in a KDE Konsole as root, I get the ksnapshot Dialog as defined in [System Settings]->[Shortcuts and Gestures]->[Custom Shortcuts]->[Preset Actions]->[PrintScreen].

And as a BIG bonus, it doesn't crash my system

But if I had to inject a keystroke, I would be more inclined go with a small `expect` script, myself.

Sorry about wasting your time ...

-- kjh

This code will run as root and it does inject a KEY_SYSRQ ( aka [PrtSc] KeyPress ) into the Keyboard buffer.

See: /usr/include/linux/input-event-codes.h for a list of all the KEY_* ScanCodes.

Code:
/* inject-sysrq.c
 *
 * copied from https://www.kernel.org/doc/html/v4.12/input/uinput.html and modified a tad by kjh
 *
 * compile:  gcc -o inject-sysrq inject-sysrq.c
 * execute:  ./inject-sysrq                    # only runs as root !
/*

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

#include <sys/ioctl.h>
#include <linux/input.h>
#include <linux/uinput.h>

void emit( int fd, int type, int code, int val )
{
   struct input_event ie;

   ie.type = type;
   ie.code = code;
   ie.value = val;
   /* timestamp values below are ignored */
   ie.time.tv_sec = 0;
   ie.time.tv_usec = 0;

   write( fd, &ie, sizeof( ie ));
}
int main( void )
{
   struct uinput_user_dev uud;
   int version, rc, fd;

   if (( fd = open( "/dev/uinput", O_WRONLY | O_NONBLOCK) ) < 0 )
   {
      fprintf( stderr, "Unable to open /dev/uinput - errno = %d - %s\n", errno, strerror( errno ));
      return( 1 );
   }

   // EDIT:  2017-10-17 09:03 AM. Reason: handle ioctl UI_GET_VERSION errors 

   if (( rc = ioctl(fd, UI_GET_VERSION, &version)) != 0 )
   {
      fprintf( stderr, "ioctl( fd = %d, UI_GET_VERSION ) error = %d - %s\n", fd, errno, strerror( errno ));
      return( 2 ) ;
   }

   // fprintf( stderr, "ioctl( fd = %d, UI_GET_VERSION ) = version %d\n", fd, version );

   if ( version >= 5 ) 
   {
      /* use UI_DEV_SETUP */
      fprintf( stderr, "ioctl wrong version = %d - %s\n", version );
      return( 3 );
   }

   /*
    * The ioctls below will enable the device that is about to be
    * created, to pass key events, in this case the space key.
    */
   ioctl( fd, UI_SET_EVBIT, EV_KEY );
   ioctl( fd, UI_SET_KEYBIT, KEY_SYSRQ );

   memset( &uud, 0, sizeof( uud ));
   snprintf( uud.name, UINPUT_MAX_NAME_SIZE, "uinput old interface" );
   write( fd, &uud, sizeof( uud ));

   ioctl(fd, UI_DEV_CREATE);

   /*
    * On UI_DEV_CREATE the kernel will create the device node for this
    * device. We are inserting a pause here so that userspace has time
    * to detect, initialize the new device, and can start listening to
    * the event, otherwise it will not notice the event we are about
    * to send. This pause is only needed in our example code!
    */
   //
   // kjh pounded but I get no key injection when I do ...
   sleep(1);
   // kjh pounded 
   //
   /* Key press, report the event, send key release, and report again */
   emit( fd, EV_KEY, KEY_SYSRQ,  1 );
   emit( fd, EV_SYN, SYN_REPORT, 0 );
   emit( fd, EV_KEY, KEY_SYSRQ,  0 );
   emit( fd, EV_SYN, SYN_REPORT, 0 );

   /*
    * Give userspace some time to read the events before we destroy the
    * device with UI_DEV_DESTOY.
    */
   //
   // kjh pounded -- this does not seem to be necessary ...
   // sleep(1);
   // kjh pounded 
   //
   ioctl( fd, UI_DEV_DESTROY );

   close(fd);
   return 0;
}

Last edited by kjhambrick; 10-17-2017 at 09:05 AM. Reason: handle ioctl UI_GET_VERSION errors
 
Old 10-17-2017, 10:13 AM   #9
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Didier Spaier --

Now, this is interesting ...

See attached.png

I ran ./inject-sysrq as root via Putty from a Win7 VMWare Guest logged into my Slackware64 14.2 System ( the VMWare Workstation Host ).

Apparently, Win7 received the KEY_SYSRQ ( aka PrintScreen ) Key via the inject-sysrq program !

-- kjh
Attached Thumbnails
Click image for larger version

Name:	inject-sysreq-via-putty-from-Win7-VMWare-Guest.png
Views:	47
Size:	147.8 KB
ID:	26123  
 
Old 10-21-2017, 08:45 AM   #10
yustin
LQ Newbie
 
Registered: Dec 2012
Distribution: Slackware
Posts: 7

Rep: Reputation: Disabled
i like this idea of using fifo

https://stackoverflow.com/questions/...e-to-a-process
 
Old 10-24-2017, 11:52 AM   #11
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Original Poster
Rep: Reputation: Disabled
I ended up installing python-uinput and writing this script:
Code:
import uinput

def main():
    events = (
        uinput.KEY_SYSRQ,
        )
        
    with uinput.Device(events) as device:
        device.emit_click(uinput.KEY_SYSRQ)

if __name__ == "__main__":
    main()
The name KEY_SYSRQ corresponds to the key code 99 as shown in this file, and the PrintScreen key has the code 99, as says showkey.

To use this as regular user and out as laziness, I modified this udev rule so that the mode be 0666. I should have created a group uinput instead and put myself in it.

I mark this thread as SOLVED although I now realize that it was bad idea from the beginning as if speakup was already stopped that will restart it. Oh, well...

Anyway, thanks all, at least I have learned a few things in the process.

Last edited by Didier Spaier; 10-24-2017 at 12:26 PM.
 
1 members found this post helpful.
Old 10-25-2017, 08:11 AM   #12
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Thanks for the info Didier Spaier

I certainly like the idea of using a python pip A LOT more than a C-Program -- especially since the C-Structures and the interface for uinput have changed since Kernel 4.4.x.

Did you write a SlackBuild for python-uinput ?

I would sure like to snag a copy if you did

Thanks again.

-- kjh
 
Old 10-25-2017, 08:26 AM   #13
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Original Poster
Rep: Reputation: Disabled
Hello,

Quote:
Originally Posted by kjhambrick View Post
Did you write a SlackBuild for python-uinput ?

I would sure like to snag a copy if you did
Not really, just a SLKBUILD (attached), but you get the idea.
Attached Files
File Type: txt SLKBUILD.txt (1.3 KB, 44 views)
 
Old 10-25-2017, 04:57 PM   #14
kjhambrick
Senior Member
 
Registered: Jul 2005
Location: Round Rock, TX
Distribution: Slackware64 15.0 + Multilib
Posts: 2,159

Rep: Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512Reputation: 1512
Nice !

That's all I need to know to make a standard set forSBo

Thanks !!

-- kjh
 
Old 10-25-2017, 05:39 PM   #15
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,056

Original Poster
Rep: Reputation: Disabled
Hello,

You are welcome.

Also here with a package and the source archive.
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
how to write a shell script to simulate the built-in linux commands? linuxFreshMan Linux - General 3 11-09-2010 07:22 AM
how to simulate the keystroke in shell script saurin Linux - General 1 09-15-2009 11:43 PM
Is there a way to test for a keypress during a bash script? davecs Linux - Software 10 02-27-2007 11:50 AM
How to simulate a keypress.. fw12 Linux - General 1 11-13-2006 03:13 PM
How to simulate keypress in Linux? htlin Linux - Software 3 07-19-2005 10:22 AM

LinuxQuestions.org > Forums > Linux Forums > Linux - Distributions > Slackware

All times are GMT -5. The time now is 05:54 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration