mirror of
https://github.com/0intro/wmii
synced 2024-11-26 15:49:37 +03:00
94 lines
1.7 KiB
C
94 lines
1.7 KiB
C
/*
|
|
* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
|
|
* See LICENSE file for license details.
|
|
*/
|
|
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "wmii.h"
|
|
|
|
static pid_t mypid;
|
|
static char *mysockfile;
|
|
|
|
File *wmii_create_ixpfile(IXPServer * s, char *key, char *val)
|
|
{
|
|
File *f = ixp_create(s, key);
|
|
if (f && !is_directory(f)) {
|
|
size_t l = val ? strlen(val) : 0;
|
|
f->content = l ? strdup(val) : 0;
|
|
f->size = l;
|
|
return f;
|
|
}
|
|
/* forbidden, file is directory */
|
|
return 0;
|
|
}
|
|
|
|
void wmii_get_ixppath(File * f, char *path, size_t size)
|
|
{
|
|
char buf[512];
|
|
|
|
buf[0] = 0;
|
|
if (path)
|
|
cext_strlcpy(buf, path, sizeof(buf));
|
|
snprintf(path, size, "%s/", f->name);
|
|
if (buf[0] != 0)
|
|
cext_strlcat(path, buf, size);
|
|
if (f->parent)
|
|
wmii_get_ixppath(f->parent, path, size);
|
|
}
|
|
|
|
void wmii_move_ixpfile(File * f, File * to_parent)
|
|
{
|
|
File *p = f->parent;
|
|
File *fil = p->content;
|
|
|
|
/* detach */
|
|
if (p->content == f)
|
|
p->content = fil->next;
|
|
else {
|
|
while (fil->next != f)
|
|
fil = fil->next;
|
|
fil->next = f->next;
|
|
}
|
|
f->next = 0;
|
|
|
|
|
|
/* attach */
|
|
if (!to_parent->content)
|
|
to_parent->content = f;
|
|
else {
|
|
for (fil = to_parent->content; fil->next; fil = fil->next);
|
|
fil->next = f;
|
|
}
|
|
f->parent = to_parent;
|
|
}
|
|
|
|
static void exit_cleanup()
|
|
{
|
|
if (mypid == getpid())
|
|
unlink(mysockfile);
|
|
}
|
|
|
|
IXPServer *wmii_setup_server(char *sockfile)
|
|
{
|
|
IXPServer *s;
|
|
|
|
if (!sockfile) {
|
|
fprintf(stderr, "%s\n", "libwmii: no socket file provided");
|
|
exit(1);
|
|
}
|
|
mysockfile = sockfile;
|
|
mypid = getpid();
|
|
s = init_server(sockfile, exit_cleanup);
|
|
if (!s) {
|
|
perror("libwmii: cannot initialize IXP server");
|
|
exit(1);
|
|
}
|
|
return s;
|
|
}
|