Автор Тема: C and PROCFS  (Прочетена 2818 пъти)

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #15 -: Jan 22, 2009, 19:51 »
С това съм съгласен, но от друга страна не ти е гарантирано, че можеш да ги ползваш. Иначе ако държиш да ползваш *кхъм* странни начини за задаване на конфигурация сега ми хрумна друг вариант - що по дяволите не си отвориш един tcp сокет и не си ги четеш/пишеш с nc :) Ето - проблемите с граничните случаи ти се разрешават, от друга страна си е доста portable решение. Пък и дали е nc host/echo shit|nc host или cat/echo няма толкова значение. Така апропо ще отпадне ограничението за мрежата. Въобще живо чудо :)
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #16 -: Jan 22, 2009, 20:46 »
socket-а е транспорт, а не интерфейс.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #17 -: Jan 22, 2009, 21:12 »
Обаче върши работа :)

Дори автентикация и криптиране може да се направят.
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #18 -: Jan 22, 2009, 21:16 »
И какво, ще чакаш двадесет сокета? А как ще познаеш до какви сокети имаш достъп (нещо като ls)? И аутентикацията и криптирането са properties (днес нещо не ми идват думите на български, извинявам се) на транспорта.

Днес ми се струва, че пишеш без да мислиш :)
« Последна редакция: Jan 22, 2009, 21:23 от tarator »
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #19 -: Jan 22, 2009, 21:25 »
Във вашия plan9 как разбирате кой клиентски сокет има право да се връзва от отдалечена машина?
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #20 -: Jan 22, 2009, 21:27 »
Ако разбирам въпроса ти правилно, за такива неща няма стандартна конвенция.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #21 -: Jan 22, 2009, 21:31 »
Добре де, ако решите все пак по някакъв принцип да приемате заявки само от определен процес на определен хост, как го решавате тоя проблем? Без значение дали има определени стандарти за това. Не се заяждам, просто ми е интересна философията.
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #22 -: Jan 22, 2009, 21:34 »
Всеки клиент трябва да докаже, че е този за който се представя. Ако може да го докаже, какво значение има от кой хост го прави? Защо трябва сървъра да се тревожи от такива маловажни неща като наличието на мрежа или топологията й?
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #23 -: Jan 22, 2009, 21:40 »
А как го доказва?

Предполагам има някакъв механизъм за авторизация там...в смисъл дали има някакъв механизъм, по който хостовете си обменят информация за процесите вървящи там по някакъв отделен data channel и някакъв план9-ски протокол, или авторизацията става в рамките на връзката, осъществена между клиента и сървъра.
Активен

"Knowledge is power" - France is Bacon

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
Re: C and PROCFS
« Отговор #24 -: Jan 22, 2009, 21:49 »
Сега малко да поясна каква е точно ситуацията.
Структурата на програма изглежда долу-горе така

               |-->connect_to_tcp_server()
               |            |
               |            |-->read_to_local_buffer()
               |                      |
               |                      |-->filter()-->write_circular_buffer
               |                           |
               |                           |<-->Interface_za_config()   
               |
main()--->master_thread
       |
       |
       |--->while(1)-->listen_tcp_sock
                              |
                              |-->child_thread()
                                       |
                                       |-->read_circular_buffer_and_send
                                       
Тук просто ми трябва бърз и удобен интерфейс за конфигурация on-fly на филтрите
Имам няколко идеи за това.
1. Още един tcp_sock_listen на нов порт. Но тук се ограничаваме само до TCP
    и това не е лесно достъпен интерфейс.
2. Даже си мисля за sqlite
3. Прост файл.
4. И тук си помислих и за procfs :):):):)

Май доста се отклоних от темата C and PROCFS :(. Тя май трябваше да е
Бърз и универсален интерфейс за конфиг.

П.П. Става дума за видео обработка. Конф. интефейса ще подържа само един
потребител.
П.П.2 И да добавя някой от филтрите са адаптивни и се самопроменят и това трябва да се вижда и от интерфейса
« Последна редакция: Jan 22, 2009, 22:30 от sandman_7920 »
Активен

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #25 -: Jan 22, 2009, 22:00 »
Повечето неща в Plan9 са файлови системи. Има authentication сървър, който в общи линии може само да потвърди "да, този който говори с теб е същия за който се представя". Файловата система си решава дали след това да допусне клиента да си говори с нея. Никой не вярва на никой друг освен на authentication сървъра. Забавното е, че клиента и сървъра могат да се вържат към различни authentication servers и пак потвърждението да е успешно (стига информацията за потребителя в двата auth servers да е същата).
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #26 -: Jan 22, 2009, 22:25 »
sandman, направи го с прост файл.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
Re: C and PROCFS
« Отговор #27 -: Jan 22, 2009, 22:28 »
:):):) И аз до това заключение стигнах (просто ми беше мерак за нещо по-екзотично). Благодаря на всички за отговорите.
Активен

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #28 -: Jan 22, 2009, 22:48 »
Ето как би изглеждало нещо подобно с npfs за 9p. Трябва да извикаш fsstart с директорията, където искаш да бъде монтирано дървото. Предполагам, че с fuse ще е дори и по-лесно и кратко.

Трябва да промениш confread и confwrite да правят каквото искаш. Ако искаш повече файлове, дефинирай операции за тях и ги добави в fsstart. Ако искаш да поддържаш повече от един потребител ще трябва да дефинираш повече операции.

П.П. Не гарантирам, че кода ще работи, надрасках го набързо и ме мързи да го тествам. :)

Код:
#define _XOPEN_SOURCE 600
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
#include <assert.h>
#include "npfs.h"

static Npfile* dirfirst(Npfile *);
static Npfile* dirnext(Npfile *, Npfile *);
static int confread(Npfilefid *, u64, u32, u8*, Npreq *);
static int confwrite(Npfilefid *, u64, u32, u8*, Npreq *);
static int confwstat(Npfile *, Npstat *);
static void connclose(Npconn *);

static Npsrv *srv;
static Npfile *root;
static Npfile *conf;

static Npdirops rootops = {
.first = dirfirst,
.next = dirnext,
};

static Npfileops confops = {
.read = confread,
.write = confwrite,
.wstat = confwstat,
};

static int
fsstart(char *mntpt) {
Npuser *user;
char *opts, *s;

user = np_unix_users->uid2user(np_unix_users, geteuid());
root = npfile_alloc(NULL, strdup(""), 0755|Dmdir, 0, &rootops, NULL);
root->parent = root;
npfile_incref(root);
root->atime = time(NULL);
root->mtime = root->atime;
root->uid = user;
root->gid = user->dfltgroup;
root->muid = user;

conf = npfile_alloc(root, strdup("conf"), 0644, 1, &confops, NULL);
npfile_incref(conf);
root->dirfirst = conf;
root->dirlast = conf;

srv = np_pipesrv_create(1);
if (!srv)
return -1;

npfile_init_srv(srv, root);
np_pipesrv_mount(srv, mntpt, user->uname, 0, NULL);

return 0;
}

static Npfile*
dirfirst(Npfile *dir)
{
if (dir->dirfirst)
npfile_incref(dir->dirfirst);

return dir->dirfirst;
}

static Npfile*
dirnext(Npfile *dir, Npfile *prevchild)
{
if (prevchild->next)
npfile_incref(prevchild->next);

return prevchild->next;
}

static int
confread(Npfilefid* file, u64 offset, u32 count, u8* data, Npreq *req)
{
char buf[128];

/* print your configuration here */
snprintf(buf, sizeof(buf), "tarator");
len = strlen(buf);
if (offset > len)
return 0;

if (offset+count > len)
count = len - offset;

memmove(data, buf+offset, count)
return count;
}

static int
confwrite(Npfilefid* file, u64 offset, u32 count, u8* data, Npreq *req)
{
/* the content is in data */
return 0;
}

static int
confwstat(Npfile* file, Npstat* stat)
{
return 1;
}

« Последна редакция: Jan 25, 2009, 03:00 от tarator »
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 6425
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #29 -: Jan 25, 2009, 02:55 »
Напълно извън темата.
----------------------------------------------------


Най-после доживях и Таратора да помогне на някой. Последните три дни следя темата с голям интерес, въпреки че не вдявам нищо от приказките ви с Гейта. Така много, много повече ми харесваш. А и в темата на Тую за man/info си конструктивен, което направо не е за вярване.

Продължавай в същия дух и ще ти стана голям фен! А като се прибереш ще те чакат бири  [_]3
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear