summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt54
-rw-r--r--src/maingui/backdrop.cpp93
-rw-r--r--src/maingui/backdrop.h13
-rw-r--r--src/maingui/main.cpp1
-rw-r--r--src/maingui/printergui.cpp5
-rw-r--r--src/maingui/pwgui.cpp (renamed from src/pwgui/pwgui.cpp)64
-rw-r--r--src/maingui/pwgui.h40
-rw-r--r--src/maingui/pwgui.ui135
-rw-r--r--src/pwgui/pwgui.h32
-rw-r--r--src/pwgui/pwgui.ui145
-rw-r--r--src/util.c38
-rw-r--r--src/util.h10
12 files changed, 379 insertions, 251 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0745441..c120736 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,6 +21,11 @@ SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
FIND_PACKAGE(Qt4 REQUIRED)
FIND_PACKAGE(Cups REQUIRED)
+# include Qt modules
+#SET(QT_USE_QTDBUS TRUE)
+SET(QT_USE_QTNETWORK TRUE)
+#SET(QT_USE_QTWEBKIT TRUE)
+
# some includes
INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}
@@ -34,11 +39,13 @@ INCLUDE_DIRECTORIES(
# printergui (maingui)
FILE(GLOB MAINGUI_SRCS
src/maingui/*.cpp
+ src/*.c
)
# password gui (printpwgui
FILE(GLOB PWGUI_SRCS
src/pwgui/*.cpp
+ src/*.c
)
################################################################################
@@ -50,59 +57,23 @@ FILE(GLOB MAINGUI_UIS
src/maingui/*.ui
)
-FILE(GLOB PWGUI_UIS
- src/pwgui/*.ui
-)
-
-# .qrc files
-#SET(MAINGUI_RCS pvsmgr.qrc)
-#SET(PWGUI_RCS pvsclient.qrc)
-
# includes all header files that should be treated with moc
SET(MAINGUI_MOC_HDRS
src/maingui/printergui.h
src/maingui/backdrop.h
+ src/maingui/pwgui.h
)
-SET(PWGUI_MOC_HDRS
- src/pwgui/pwgui.h
-)
-
-# i18n
-#FILE(GLOB MAINGUI_TSS
-# i18n/server/*.ts
-#)
-
-#FILE(GLOB PWGUI_TSS
-# i18n/client/*.ts
-#)
-
-
-# include Qt modules
-#SET(QT_USE_QTDBUS TRUE)
-#SET(QT_USE_QTNETWORK TRUE)
-#SET(QT_USE_QTWEBKIT TRUE)
-
# add some useful macros and variables
# (QT_USE_FILE is a variable defined by FIND_PACKAGE( Qt4 ) that contains
# a path to CMake script)
INCLUDE(${QT_USE_FILE})
-# this will run rcc on .qrc files
-#QT4_ADD_RESOURCES(MAINGUI_RC_SRCS ${MAINGUI_RCS})
-#QT4_ADD_RESOURCES(PWGUI_RC_SRCS ${PWGUI_RCS})
-
# this will run uic on .ui files
QT4_WRAP_UI(MAINGUI_UI_HDRS ${MAINGUI_UIS})
-QT4_WRAP_UI(PWGUI_UI_HDRS ${PWGUI_UIS})
# this will run moc
QT4_WRAP_CPP(MAINGUI_MOC_SRCS ${MAINGUI_MOC_HDRS})
-QT4_WRAP_CPP(PWGUI_MOC_SRCS ${PWGUI_MOC_HDRS})
-
-# i18n, run lupdate and lrelease)
-#QT4_CREATE_TRANSLATION(MAINGUI_QMS ${MAINGUI_SRCS} ${MAINGUI_UI_HDRS} ${MAINGUI_TSS})
-#QT4_CREATE_TRANSLATION(PWGUI_QMS ${PWGUI_SRCS} ${PWGUI_UI_HDRS} ${PWGUI_TSS})
################################################################################
# Build
@@ -113,15 +84,10 @@ ADD_EXECUTABLE(printergui
${MAINGUI_MOC_SRCS}
${MAINGUI_UI_HDRS}
${MAINGUI_RC_SRCS}
- ${MAINGUI_QMS}
)
ADD_EXECUTABLE(printpwgui
${PWGUI_SRCS}
- ${PWGUI_MOC_SRCS}
- ${PWGUI_UI_HDRS}
- ${PWGUI_RC_SRCS}
- ${PWGUI_QMS}
)
# link
@@ -130,10 +96,6 @@ TARGET_LINK_LIBRARIES(printergui
${CUPS_LIBRARIES}
)
-TARGET_LINK_LIBRARIES(printpwgui
- ${QT_LIBRARIES}
-)
-
# install
INSTALL(TARGETS printergui printpwgui RUNTIME DESTINATION bin)
diff --git a/src/maingui/backdrop.cpp b/src/maingui/backdrop.cpp
index 4a907e8..db16b01 100644
--- a/src/maingui/backdrop.cpp
+++ b/src/maingui/backdrop.cpp
@@ -1,4 +1,6 @@
#include "backdrop.h"
+#include "../util.h"
+#include "pwgui.h"
#include <QApplication>
#include <QDesktopWidget>
@@ -6,11 +8,18 @@
#include <QPaintEvent>
#include <QPixmap>
#include <QRgb>
+#include <QLocalServer>
+#include <QLocalSocket>
+#include <sys/stat.h>
+
+static const QString strTest("test");
Backdrop::Backdrop() :
QWidget(NULL),
screenshot(NULL),
- mainWindow(NULL)
+ mainWindow(NULL),
+ server(NULL),
+ pwgui(NULL)
{
QPixmap shot = QPixmap::grabWindow(QApplication::desktop()->winId());
if (!shot.isNull() && shot.height() > 0) {
@@ -34,6 +43,75 @@ Backdrop::Backdrop() :
screenshot = new QPixmap(shot);
this->resize(screenshot->width(), screenshot->height());
this->setWindowFlags(Qt::Tool | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
+
+ char sockPath[500];
+ if (NULL != util_sockPath(-1, -1, sockPath, sizeof sockPath)) {
+ QString path = QString::fromUtf8(sockPath);
+ QFile::remove(path);
+ server = new QLocalServer(this);
+ if (server->listen(sockPath)) {
+ chmod(sockPath, 0600);
+ QObject::connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
+ }
+ }
+ QObject::connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()));
+}
+
+QLocalSocket* Backdrop::getClient()
+{
+ QObject *sender = QObject::sender();
+ if (sender == NULL || sender->property("test").toString() != strTest)
+ return NULL;
+ return (QLocalSocket*)sender;
+}
+
+void Backdrop::newConnection()
+{
+ QLocalSocket *client;
+ while ((client = server->nextPendingConnection())) {
+ client->setProperty("test", strTest);
+ QObject::connect(client, SIGNAL(readyRead()), this, SLOT(incomingData()));
+ QObject::connect(client, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(closeConnection()));
+ QObject::connect(client, SIGNAL(disconnected()), this, SLOT(closeConnection()));
+ }
+}
+
+void Backdrop::closeConnection()
+{
+ QLocalSocket *client = getClient();
+ client->close();
+ client->waitForDisconnected(50);
+ client->deleteLater();
+}
+
+void Backdrop::incomingData()
+{
+ QLocalSocket *client = getClient();
+ char buffer[100];
+ while (client->canReadLine()) {
+ if (client->readLine(buffer, sizeof buffer) > 0) {
+ if (strcmp(buffer, "open") == 0) {
+ if (pwgui == NULL) {
+ pwgui = new PwGui(this);
+ }
+ if (pwgui->isVisible()) {
+ client->write("busy\n");
+ } else {
+ pwgui->exec();
+ if (pwgui->isCancelled()) {
+ server->blockSignals(true);
+ client->write("cancel\n");
+ client->waitForBytesWritten(1000);
+ client->close();
+ client->waitForDisconnected(50);
+ QApplication::exit(0);
+ }
+ // Got some credentials, send to back end
+ client->write(pwgui->getUser().toUtf8() += '\0' += pwgui->getPassword() += '\0');
+ }
+ }
+ }
+ }
}
Backdrop::~Backdrop()
@@ -49,8 +127,19 @@ void Backdrop::paintEvent(QPaintEvent * event)
void Backdrop::mouseReleaseEvent(QMouseEvent * event)
{
- if (mainWindow != NULL) {
+ if (pwgui != NULL && pwgui->isVisible()) {
+ pwgui->raise();
+ pwgui->activateWindow();
+ } else if (mainWindow != NULL && mainWindow->isVisible()) {
mainWindow->raise();
mainWindow->activateWindow();
}
}
+
+void Backdrop::aboutToQuit()
+{
+ if (server != NULL) {
+ QFile::remove(server->serverName());
+ server->close();
+ }
+}
diff --git a/src/maingui/backdrop.h b/src/maingui/backdrop.h
index b798a89..7df6d40 100644
--- a/src/maingui/backdrop.h
+++ b/src/maingui/backdrop.h
@@ -4,6 +4,9 @@
#include <QWidget>
class QPixmap;
+class QLocalServer;
+class QLocalSocket;
+class PwGui;
class Backdrop : public QWidget
{
@@ -12,6 +15,16 @@ class Backdrop : public QWidget
private:
const QPixmap * screenshot;
QWidget * mainWindow;
+ QLocalServer * server;
+ PwGui * pwgui;
+
+ QLocalSocket* getClient();
+
+private slots:
+ void newConnection();
+ void closeConnection();
+ void incomingData();
+ void aboutToQuit();
protected:
virtual void paintEvent(QPaintEvent * event);
diff --git a/src/maingui/main.cpp b/src/maingui/main.cpp
index 25f81a0..be4099b 100644
--- a/src/maingui/main.cpp
+++ b/src/maingui/main.cpp
@@ -38,7 +38,6 @@ int main(int argc, char *argv[])
return a.exec();
}
-
static Backdrop* showGrayBackground()
{
Backdrop *bg = new Backdrop;
diff --git a/src/maingui/printergui.cpp b/src/maingui/printergui.cpp
index 21e03f4..2506fd6 100644
--- a/src/maingui/printergui.cpp
+++ b/src/maingui/printergui.cpp
@@ -212,7 +212,7 @@ void PrinterGui::closeEvent(QCloseEvent * e)
cupsCancelJob(ui->printerList->currentItem()->text(0).toUtf8().constData(), jobId);
jobId = 0;
}
- QCoreApplication::instance()->exit(0);
+ QApplication::exit(0);
}
QDialog::closeEvent(e);
}
@@ -313,7 +313,6 @@ void PrinterGui::on_buttonPrint_clicked()
ui->lineEditCopies->setEnabled(false);
ui->printerList->setEnabled(false);
}
-
}
void PrinterGui::bgTimer_timeout()
@@ -324,7 +323,7 @@ void PrinterGui::bgTimer_timeout()
}
if (++this->bgTimeout > 120) {
// Job was sent, GUI is invisible, quit after a few seconds
- QCoreApplication::instance()->exit(0);
+ QApplication::exit(0);
}
}
diff --git a/src/pwgui/pwgui.cpp b/src/maingui/pwgui.cpp
index 193341b..635ca42 100644
--- a/src/pwgui/pwgui.cpp
+++ b/src/maingui/pwgui.cpp
@@ -2,16 +2,16 @@
#include "ui_pwgui.h"
#include <QMessageBox>
#include <QTimer>
-#include <QDesktopWidget>
+#include <QDialog>
#include <unistd.h>
#define BUFLEN 400
// ____________________________________________________________________________
-PwGui::PwGui(int pfd, char *user, QWidget *parent) :
- QMainWindow(parent),
+PwGui::PwGui(QWidget *parent) :
+ QDialog(parent),
ui(new Ui::PwGui),
- pipefd(pfd)
+ cancelled(true)
{
// Initialize UI
initializeUI(user);
@@ -25,10 +25,23 @@ PwGui::~PwGui()
delete ui;
}
+const QString PwGui::getUser() const
+{
+ return ui->lineEditUser->text();
+}
+
+const QString PwGui::getPassword() const
+{
+ return ui->lineEditPass->text();
+}
+
// ____________________________________________________________________________
void PwGui::initializeUI(char *user)
{
ui->setupUi(this);
+ this->setWindowModality(Qt::ApplicationModal);
+ // Put always on top
+ this->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint);
// Prefill username
if (user != NULL) {
@@ -41,37 +54,44 @@ void PwGui::initializeUI(char *user)
/* Main Window properties */
- // Disable close button
- this->setWindowFlags((this->windowFlags() & ~Qt::WindowCloseButtonHint) | Qt::WindowStaysOnTopHint);
// center dialog on screen center
QRect desktopRect = QApplication::desktop()->screenGeometry(this);
this->move( desktopRect.width()/2-this->width()/2,
desktopRect.height()/2-this->height()/2 );
- this->show();
- this->showNormal();
- this->raise();
- this->activateWindow();
}
// ____________________________________________________________________________
void PwGui::on_accept()
{
- char buffer[BUFLEN + 1];
- int len = snprintf(buffer, BUFLEN, "%s%c%s%c", ui->lineEditUser->text().toUtf8().constData(), 0, ui->lineEditPass->text().toUtf8().constData(), 0);
- if (len > BUFLEN) {
- len = BUFLEN;
- }
- buffer[len] = '\0';
- ::write(pipefd, buffer, len);
- ::close(pipefd);
- // Quit with code 0
- QCoreApplication::instance()->exit(0);
+ cancelled = false;
+ this->close();
}
// ____________________________________________________________________________
void PwGui::on_reject()
{
- // Quit with code 1
- QCoreApplication::instance()->exit(1);
+ this->close();
}
+void PwGui::keyPressEvent(QKeyEvent * e)
+{
+ if(e->key() != Qt::Key_Escape) {
+ QMainWindow::keyPressEvent(e);
+ return;
+ }
+ this->close();
+}
+
+void PwGui::hideEvent(QHideEvent * e)
+{
+ this->close();
+}
+
+int PwGui::exec() {
+ cancelled = true;
+ this->show();
+ this->showNormal();
+ this->raise();
+ this->activateWindow();
+ return QDialog::exec();
+}
diff --git a/src/maingui/pwgui.h b/src/maingui/pwgui.h
new file mode 100644
index 0000000..fa3f465
--- /dev/null
+++ b/src/maingui/pwgui.h
@@ -0,0 +1,40 @@
+#ifndef AUTHENTICATION_H
+#define AUTHENTICATION_H
+
+#include <QDialog>
+#include <QDebug>
+
+namespace Ui
+{
+class PwGui;
+}
+
+class QTimer;
+
+class PwGui : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit PwGui(QWidget *parent = 0);
+ ~PwGui();
+ const QString getUser() const;
+ const QString getPassword() const;
+ const bool isCancelled() const { return cancelled; };
+ int exec();
+
+protected:
+ void hideEvent(QHideEvent * e);
+ void keyPressEvent(QKeyEvent * e);
+
+private slots:
+ void on_accept();
+ void on_reject();
+
+private:
+ Ui::PwGui *ui;
+ void initializeUI(char *username);
+ bool cancelled;
+};
+
+#endif // AUTHENTICATION_H
diff --git a/src/maingui/pwgui.ui b/src/maingui/pwgui.ui
new file mode 100644
index 0000000..32678a8
--- /dev/null
+++ b/src/maingui/pwgui.ui
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PwGui</class>
+ <widget class="QDialog" name="PwGui">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>310</width>
+ <height>160</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Drucken - Authentifizierung</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Benutzername</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditUser">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Passwort</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEditPass">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelStatus">
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="text">
+ <string>Bitte Anmelden</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/pwgui/pwgui.h b/src/pwgui/pwgui.h
deleted file mode 100644
index 348c5a1..0000000
--- a/src/pwgui/pwgui.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef AUTHENTICATION_H
-#define AUTHENTICATION_H
-
-#include <QMainWindow>
-#include <QDebug>
-
-namespace Ui
-{
-class PwGui;
-}
-
-class QTimer;
-
-class PwGui : public QMainWindow
-{
- Q_OBJECT
-
-public:
- explicit PwGui(int pfd, char *user, QWidget *parent = 0);
- ~PwGui();
-
-private slots:
- void on_accept();
- void on_reject();
-
-private:
- Ui::PwGui *ui;
- void initializeUI(char *username);
- int pipefd;
-};
-
-#endif // AUTHENTICATION_H
diff --git a/src/pwgui/pwgui.ui b/src/pwgui/pwgui.ui
deleted file mode 100644
index 236df30..0000000
--- a/src/pwgui/pwgui.ui
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>PwGui</class>
- <widget class="QMainWindow" name="PwGui">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>310</width>
- <height>160</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="windowTitle">
- <string>Drucken - Authentifizierung</string>
- </property>
- <widget class="QWidget" name="verticalLayoutWidget">
- <property name="geometry">
- <rect>
- <x>9</x>
- <y>9</y>
- <width>291</width>
- <height>141</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Benutzername</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEditUser">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Passwort</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLineEdit" name="lineEditPass">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QLabel" name="labelStatus">
- <property name="layoutDirection">
- <enum>Qt::LeftToRight</enum>
- </property>
- <property name="frameShape">
- <enum>QFrame::Panel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="text">
- <string>Bitte Anmelden</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/util.c b/src/util.c
new file mode 100644
index 0000000..9e7c892
--- /dev/null
+++ b/src/util.c
@@ -0,0 +1,38 @@
+#include "util.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <string.h>
+#include <pwd.h>
+#include <stdio.h>
+
+char *util_userHome(int uid, char *buffer, size_t len)
+{
+ struct passwd pwd;
+ struct passwd *res;
+ char b[1000];
+ getpwuid_r(uid, &pwd, b, sizeof b, &res);
+ if (res == NULL || res->pw_dir == NULL)
+ return NULL;
+ int printret = snprintf(buffer, len, "%s", res->pw_dir);
+ if (printret < 0 || printret >= (int)len)
+ return NULL;
+ buffer[len-1] = '\0';
+ return buffer;
+}
+
+char *util_sockPath(int uid, int pid, char *buffer, size_t len)
+{
+ char home[120];
+ if (uid == -1) {
+ uid = (int)getuid();
+ }
+ if (pid == -1) {
+ pid = (int)getpid();
+ }
+ if (util_userHome(uid, home, sizeof home) == NULL)
+ return NULL;
+ int printret = snprintf(buffer, len, "%s/.printergui.%d", pid);
+ if (printret < 0 || printret >= (int)len)
+ return NULL;
+ return buffer;
+}
diff --git a/src/util.h b/src/util.h
new file mode 100644
index 0000000..cc7d4b7
--- /dev/null
+++ b/src/util.h
@@ -0,0 +1,10 @@
+#ifndef UTIL_H_
+#define UTIL_H_
+
+#include <stdlib.h>
+
+char *util_userHome(int uid, char *buffer, size_t len);
+
+char *util_sockPath(int uid, int pid, char *buffer, size_t len);
+
+#endif /* UTIL_H_ */