Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Об открытом коде, линуксе, windows и программировании
Начать новую тему   Ответить на тему   вывод темы на печать

Об открытом коде, линуксе, windows и программировании

Автор
Сообщение
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.08 17:33.51
Ответить с цитатой
Хорошо. Тогда (жестом доброй воли Podmigivanie) - мое решение:

Fakir был прав, с небольшой поправкой: rpm -qf <file>, тут действительно программирование никакое.

Но часто бывает нужно найти по определенному шаблону. Тогда делаем примерно так:
for a in `rpm -qa`; do for b in `rpm -ql $a`; do echo $a---$b; done ; done | grep <шаблон>

Это дольше, но зато совпадения - по произвольному регэкспу
Посмотреть профиль Отправить личное сообщение
Упуату
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 23.05.2006
Сообщения: 3421


Статус: Offline
СообщениеДобавлено: 2006.06.08 20:39.48
Ответить с цитатой
Ммм. А где решение для других Linux-ов?
Посмотреть профиль Отправить личное сообщение
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 07:36.28
Ответить с цитатой
Ммм. А где решение хоть для какого виндовса хоть с какими ограничениями?

Разговор, напомню, шел о преимуществах (недостатках) линукса в области программирования по сравнению с виндовс.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 07:49.22
Ответить с цитатой
Я не понимаю зачем требовать код, или xdsl желает посмотреть алгоритм обхода дерева файловой системы? алгоритм построения дерева вызовов библиотек? Surprised
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Fakir
Шадринский лавочник™


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 12665
Откуда: Шадринск

Статус: Offline
СообщениеДобавлено: 2006.06.09 07:54.18
Ответить с цитатой
xdsl писал(а):
Разговор, напомню, шел о преимуществах (недостатках) линукса в области программирования по сравнению с виндовс.

Ну и как с такими общими вопросами соотносится решение такой сугубо прикладной системной задачи? Confused
Посмотреть профиль Отправить личное сообщение ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:12.51
Ответить с цитатой
Это обычные задачи системного программирования.

Вот еще одна задачка:
Создать программу управления сервисами с возможностями запуска, остановки, перезагрузки сервиса, получения информации о запущенных (незапущенных) сервисах, организации и отмены запуска сервисов во время загрузки системы.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 08:18.27
Ответить с цитатой
xdsl писал(а):
системного программирования

А, вот где собака порылась...

xdsl писал(а):
Создать программу управления сервисами

http://www.nirsoft.net/utils/serviwin.html

и, до кучи,
) net help Ржу
) tasklist
) netstat

http://www.microsoft.com/windows2000/techinfo/howitworks/management/w2kservices.asp
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral


Последний раз редактировалось: andy ice (2006.06.09 08:20.46), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:20.45
Ответить с цитатой
andy ice писал(а):
Я не понимаю зачем требовать код, или xdsl желает посмотреть алгоритм обхода дерева файловой системы? алгоритм построения дерева вызовов библиотек? Surprised


Вы знаете какой-то лучший метод сравнивать эффективность решения в области программирования, кроме сравнения программного кода, его стабильности, скорости работы, объема наконец? Метод в студию!

Кстати, moishe предложил использовать msi, что вас не устроило? Должно быть эффективно, наверное.
Посмотреть профиль Отправить личное сообщение
Петрович
Ведущий банщик


Пол: Пол:Муж.
Зарегистрирован: 31.08.2005
Сообщения: 1392
Откуда: Сибирь...

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:20.54
Ответить с цитатой
Ну часть этих функций позволяет использовать утилита net, входящая в поставку ОС. Кстати по поводу предыдущей задачи - предоставьте пожалуйста код "программы", работающей с базой данныйх rpm без использования утилиты rpm Smile
Посмотреть профиль Отправить личное сообщение ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 08:21.41
Ответить с цитатой
А и еще вопрос, почему xdsl старательно обходит тему прикладного программирования?
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:24.01
Ответить с цитатой

Исходник программы, решающий задачу, плиз. Ссылками мы все рассыпаться горазды:
man chkconfig
man service
man grep
man sed
Посмотреть профиль Отправить личное сообщение
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:33.22
Ответить с цитатой
Петрович писал(а):
Ну часть этих функций позволяет использовать утилита net, входящая в поставку ОС. Кстати по поводу предыдущей задачи - предоставьте пожалуйста код "программы", работающей с базой данныйх rpm без использования утилиты rpm Smile


Для системщиков есть librpm и librpm-devel. Могу решить и с их использованием.

Однако все это уже давно напоминает игру в одни ворота. Ни строчки кода для виндовс я так и не увидел. Может пора кончать флудить и заняться конструктивом?
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 08:34.40
Ответить с цитатой
xdsl писал(а):
Создать программу управления сервисами с возможностями запуска, остановки, перезагрузки сервиса, получения информации о запущенных (незапущенных) сервисах, организации и отмены запуска сервисов во время загрузки системы.

Управление компьютером / Службы и приложения / Службы.

Зачем еще что-то сочинять? Мало того, данная оснастка позволяет управлять любым компьютером в локальной сети.

А писать аналоги мне просто жаль времени.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:37.57
Ответить с цитатой
andy ice писал(а):
А и еще вопрос, почему xdsl старательно обходит тему прикладного программирования?


Я до нее еще не дошел. Нечего оставлять в подвешенном состоянии текущий вопрос. Вот разберемся, что в линуксе лучше (хуже) решать системные задачи, перейдем к прикладным.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 08:42.28
Ответить с цитатой
Приведеные выше примеры никак не отображают лучшесть или хужесть решения системных задач. Потому что они решаются по другому. И всё. С сервисами ответ зачтен?
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 08:45.37
Ответить с цитатой
andy ice писал(а):

Управление компьютером / Службы и приложения / Службы.

Зачем еще что-то сочинять? Мало того, данная оснастка позволяет управлять любым компьютером в локальной сети.

А писать аналоги мне просто жаль времени.


Утилитами в линуксе я то-же решаю эту задачу. А если еще и ssh - то управляю любым компьютером в локальной сети (столь-же любым, сколько и вы, уважаемый). Но это все не разговор о преимуществах-недостатках программирования в разных осях.

Код для линукса я готов предоставить, но кода для виндовс нету, сравнивать не с чем, значит надо прекращать этот бессмыссленный флуд. Предоставите код, продолжим дискуссию.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.09 08:58.39
Ответить с цитатой
andy ice писал(а):
писать аналоги мне просто жаль времени

_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2006.06.09 09:44.34
Ответить с цитатой
Зачем писать программу, если аналогичная уже есть? Разве что ты - студент, которому дали задание. Управление сервисами под win 2000/XP/2003 достаточно удобное.
Другое дело - win 95/98. В свое время мне понадобилось управление процессами (не сервисами, там нет сервисов) в win98 с интерфейсом командной строки. Написал.

/* PROCESS.C
// Process manager for Windows 9x
*/
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

#define BY_PATH   0
#define BY_NAME   1
#define BY_PID   2

int showhelp(void);
HANDLE openlist(void);
int showlist(void);
int killproc(PROCESSENTRY32 *pe);
int kill(char *name,int by);

int showhelp(void) {
printf("USAGE:\nshow list: process -l\nkill process: process -k {-f <pathname> | -n <name> | -p <pid> }\n");
return(-1);
}//=============================================

HANDLE openlist(void) {
PROCESSENTRY32 pe;
HANDLE h;

h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if((h==NULL)||(h==INVALID_HANDLE_VALUE)) {
   printf("Cannot load snapshot\n");
   ExitProcess(-3);
}
while(!Process32First(h,&pe)) {
   CloseHandle(h);
   h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
}
return(h);
}//=============================================

int showlist(void) {
HANDLE h;
PROCESSENTRY32 pe;

h=openlist();
Process32First(h,&pe);
printf("%u: %s\n",pe.th32ProcessID,pe.szExeFile);
while(Process32Next(h,&pe)) printf("%u: %s\n",pe.th32ProcessID,pe.szExeFile);
CloseHandle(h);
return(0);
}//=============================================

int killproc(PROCESSENTRY32 *pe) {
HMODULE hm;

hm=OpenProcess(PROCESS_TERMINATE,FALSE,pe->th32ProcessID);
if(hm==NULL) {
   printf("Cannot open process");
   return(0);
}
if(TerminateProcess(hm,0)) {
   CloseHandle(hm);
   return(1);
}
else printf("Cannot kill process\n");
CloseHandle(hm);
return(0);
}//=============================================

int kill(char* name,int by) {
HANDLE h;
PROCESSENTRY32 pe;
int i,found;
long pid;

h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process32First(h,&pe);
switch(by) {
case BY_PATH: found=strcmpi(name,pe.szExeFile); break;
case BY_NAME:
   for(i=strlen(pe.szExeFile);pe.szExeFile[i]!='\\';i--);
   found=strcmpi(name,&(pe.szExeFile[i+1]));
   break;
case BY_PID:
   pid=atol(name);
   if(pid==(long)pe.th32ProcessID) found=0;
   else found=1;
}
i=0;
if(found==0) {
   i=killproc(&pe);
   if(by!=BY_NAME) {
      CloseHandle(h);
      return(i);
   }
}
while(Process32Next(h,&pe)) {
   switch(by) {
   case BY_PATH: found=strcmpi(name,pe.szExeFile); break;
   case BY_NAME:
      for(i=strlen(pe.szExeFile);pe.szExeFile[i]!='\\';i--);
      found=strcmpi(name,&(pe.szExeFile[i+1]));
      break;
   case BY_PID:
      if(pid==(long)pe.th32ProcessID) found=0;
      else found=1;
   }
   if(found==0) {
      i+=killproc(&pe);
      if(by!=BY_NAME) {
         CloseHandle(h);
         return(i);
      }
   }
}
CloseHandle(h);
if(by==BY_NAME) return(i);
printf("Cannot find process\n");
return(-2);
}//=============================================

int main(int argc,char *argv[]) {
if(argc<2) return(showhelp());
if((argv[1][0]=='-')||(argv[1][0]=='/')) {
   SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
   switch(argv[1][1]) {
   case 'l': return(showlist());
   case 'k':
      if(argc<4) return(showhelp());
      if((argv[2][0]!='-')&&(argv[2][0]!='/')) return(showhelp());
      switch(argv[2][1]) {
      case 'f': return(kill(argv[3],BY_PATH));
      case 'n': return(kill(argv[3],BY_NAME));
      case 'p': return(kill(argv[3],BY_PID));
      default: return(showhelp());
      }
   default: return(showhelp());
   }
}
return(showhelp());
}//=============================================
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2006.06.09 10:04.22
Ответить с цитатой
Потом мне захотелось смотреть/убивать процессы не только на локальной машине, но и через сеть. Пришлось написать телнет-сервер для вин98. Получилось довольно длинно (около 400 строк), поэтому постить не буду, но если интересно, могу выслать на мыло любому желающему, обращайтесь.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
nicko
Запомнил кнопки...



Зарегистрирован: 14.06.2005
Сообщения: 253


Статус: Offline
СообщениеДобавлено: 2006.06.09 11:39.29
Ответить с цитатой
Упуату писал(а):
Ммм. А где решение для других Linux-ов?


Хочешь, например, для Slackware:

# grep "crti.o" /var/log/packages/*
glibc-2.3.2-i486-1:usr/lib/crti.o

Кстати никто не мешает использовать rpm под слакой, хотя этот дистрибутив и не rmp-based.
Посмотреть профиль Отправить личное сообщение
Упуату
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 23.05.2006
Сообщения: 3421


Статус: Offline
СообщениеДобавлено: 2006.06.09 12:05.46
Ответить с цитатой
nicko писал(а):
/var/log/packages/
У меня нет такого пути на сервере. Значит решение не является общим.
Посмотреть профиль Отправить личное сообщение
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.09 13:06.05
Ответить с цитатой
moishe писал(а):
В свое время мне понадобилось управление процессами (не сервисами, там нет сервисов) в win98 с интерфейсом командной строки.

Согласны ли вы (в контексте темы) с тем, что под линуксом это решается значительно проще, или требуется алаверды?
Посмотреть профиль Отправить личное сообщение
nicko
Запомнил кнопки...



Зарегистрирован: 14.06.2005
Сообщения: 253


Статус: Offline
СообщениеДобавлено: 2006.06.09 14:24.00
Ответить с цитатой
Упуату писал(а):
nicko писал(а):
/var/log/packages/
У меня нет такого пути на сервере. Значит решение не является общим.


И что? Найди решение для своего дистра.

Каждый пользуется теми инструментами, которые удобнее для него лично.
Посмотреть профиль Отправить личное сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2006.06.09 17:31.03
Ответить с цитатой
xdsl писал(а):
Согласны ли вы (в контексте темы) с тем, что под линуксом это решается значительно проще, или требуется алаверды?
Абсолютно согласен. В win9x управление процессами организовано исключительно криво. В линуксе все гораздо проще и понятнее, даже если не учитывать, что ps и kill - стандартные системные утилиты.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2006.06.09 17:35.38
Ответить с цитатой
А, ладно. Вот он, телнет-сервер. Убрал оттуда все лишнее (у меня он изначально решал более общие задачи, чем поддержка командного интерпретатора), получилось 250 строк.

/* TLNTSRV.C
// Telnet server for Windows 9x
*/
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

#define CSRV_SERVER_PORT   23
#define CSRV_MAX_BUFSIZE   65535
#define CSRV_PBUF_SIZE      256
#define WM_SERVER_ACCEPT   WM_USER+101
#define WM_CLIENT_SEND      WM_USER+102
#define WM_PROCESS_STOP      WM_USER+103

typedef struct {
SOCKET cs; // сокет, через который идет общение с удаленным клиентом
unsigned char *sbuf; // буфер для данных, поступающих через сокет
DWORD sbuflen; // размер сокетного буфера
DWORD sdatalen; // размер данных в сокетном буфере
unsigned char *pbuf; // буфер для данных, поступающих через пайп
DWORD pbuflen; // размер пайпового буфера
DWORD pdatalen; // размер данных в пайповом буфере
HANDLE process; // консольный процесс
HANDLE srvout; // другой конец входного потока процесса
HANDLE srvin; // другой конец выходнго потока процесса
HANDLE thread; // поток, ждущий данных от процесса
HANDLE start; // стартовый поток процесса
HWND wnd; // окно, принимающее сообщение от сокета
} csrvSession;

LRESULT CALLBACK ChldProc(HWND wnd,unsigned int mes,WPARAM wp,LPARAM lp);
LRESULT CALLBACK WndProc(HWND wnd,unsigned int mes,WPARAM wp,LPARAM lp);
DWORD WINAPI onServerAccept(void *param);
DWORD WINAPI CommandOutput(void *param);
int StartSession(csrvSession *css);

LPSTR CSRV_CLASS="TLNTSRV_LISTENER_CLASS";
LPSTR CHILD_CLASS="TLNTSRV_SESSION_CLASS";
SOCKET ss;
unsigned short port;
HINSTANCE hi;
HANDLE heap;
HWND mwnd;

LRESULT CALLBACK WndProc(HWND wnd,unsigned int mes,WPARAM wp,LPARAM lp) {
switch(mes) {
case WM_CLOSE:
case WM_QUERYENDSESSION:
   WSAAsyncSelect(ss,wnd,0,0);
   DestroyWindow(wnd);
   return(TRUE);
case WM_DESTROY:
   closesocket(ss);
   PostQuitMessage(0);
case WM_QUIT: return(0);
case WM_CREATE: {
   WSADATA wsaData;
   SOCKADDR_IN sa;
   if(WSAStartup(MAKEWORD(2,0),&wsaData)!=0) return(-1);
   ss=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   sa.sin_family=AF_INET;
   sa.sin_addr.s_addr=INADDR_ANY;
   sa.sin_port=htons(port);
   if(bind(ss,(SOCKADDR *)&sa,sizeof(SOCKADDR_IN))!=0) return(-1);
   if(WSAAsyncSelect(ss,wnd,WM_SERVER_ACCEPT,FD_ACCEPT)!=0) return(-1);
   if(listen(ss,2)!=0) return(-1);
   }
   return(0);
case WM_SERVER_ACCEPT: {
   DWORD tid;
   CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)onServerAccept,NULL,0,&tid);
   }
   return(0);
}
return(DefWindowProc(wnd,mes,wp,lp));
}//=============================================

LRESULT CALLBACK ChldProc(HWND wnd,unsigned int mes,WPARAM wp,LPARAM lp) {
switch(mes) {
case WM_DESTROY: {
   csrvSession *css;
   css=(csrvSession *)GetWindowLong(wnd,GWL_USERDATA);
   if(css!=NULL) {
      WSAAsyncSelect(css->cs,wnd,0,0);
      closesocket(css->cs);
      TerminateThread(css->thread,0);
      TerminateProcess(css->process,0);
      CloseHandle(css->srvin);
      CloseHandle(css->srvout);
      if(css->sbuf!=NULL) HeapFree(heap,0,css->sbuf);
      if(css->pbuf!=NULL) HeapFree(heap,0,css->pbuf);
      HeapFree(heap,0,css);
   }}
   PostQuitMessage(0);
case WM_QUIT:
   return(0);
case WM_CLIENT_SEND: {
   csrvSession *css;
   css=(csrvSession *)GetWindowLong(wnd,GWL_USERDATA);
   if(css==NULL) return(0);
   switch(LOWORD(lp)) {
   case FD_READ: {
      DWORD len;
      GetExitCodeProcess(css->process,&len);
      if(len!=STILL_ACTIVE) break;
      if(ioctlsocket(css->cs,FIONREAD,&len)==SOCKET_ERROR) break;
      if(len==0) return(0);
      len+=css->sdatalen;
      if(len>CSRV_MAX_BUFSIZE) break;
      if(len>css->sbuflen) {
         if(css->sbuf==NULL) css->sbuf=HeapAlloc(heap,0,len);
         else css->sbuf=HeapReAlloc(heap,0,css->sbuf,len);
         if(css->sbuf==NULL) break;
         css->sbuflen=HeapSize(heap,0,css->sbuf);
      }
      if(recv(css->cs,&css->sbuf[css->sdatalen],len-css->sdatalen,0)==SOCKET_ERROR) break;
      css->sdatalen=len;
      if(len<2) return(0);
      if((css->sbuf[len-2]!='\r')||(css->sbuf[len-1]!='\n')) return(0);
      if(!WriteFile(css->srvout,css->sbuf,len,&(css->sdatalen),NULL)) break;
      css->sdatalen=0;
      }
      return(0);
   }}
case WM_PROCESS_STOP:
   DestroyWindow(wnd);
   return(0);
}
return(DefWindowProc(wnd,mes,wp,lp));
}//=============================================

DWORD WINAPI onServerAccept(void *param) {
SOCKADDR_IN sa;
MSG msg;
csrvSession *css;

css=(csrvSession *)HeapAlloc(heap,HEAP_ZERO_MEMORY,sizeof(csrvSession));
if(css==NULL) return(0);
css->cs=accept(ss,(SOCKADDR *)&sa,NULL);
if(css->cs==INVALID_SOCKET) {
   HeapFree(heap,0,css);
   return(0);
}
css->wnd=CreateWindowEx(WS_EX_TOOLWINDOW,CHILD_CLASS,NULL,WS_POPUP,0,0,0,0,mwnd,NULL,hi,NULL);
if(!IsWindow(css->wnd)) {
   closesocket(css->cs);
   HeapFree(heap,0,css);
   return(0);
}
SetWindowLong(css->wnd,GWL_USERDATA,(long)css);
if(WSAAsyncSelect(css->cs,css->wnd,WM_CLIENT_SEND,FD_READ|FD_CLOSE)!=0) {
   closesocket(css->cs);
   HeapFree(heap,0,css);
   return(0);
}
if(!StartSession(css)) {
   closesocket(css->cs);
   if(css->pbuf!=NULL) HeapFree(heap,0,css->pbuf);
   HeapFree(heap,0,css);
   return(0);
}
ResumeThread(css->start);
ResumeThread(css->thread);
css->sdatalen=0;
while(GetMessage(&msg,NULL,0,0xFFFF)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
return(0);
}//=============================================

DWORD WINAPI CommandOutput(void *param) {
csrvSession *css;

css=(csrvSession *)param;
while(ReadFile(css->srvin,css->pbuf,css->pbuflen,&(css->pdatalen),NULL)) 
   if(css->pdatalen>0) send(css->cs,css->pbuf,css->pdatalen,0);
PostMessage(css->wnd,WM_PROCESS_STOP,0,0);
return(0);
}//=============================================

int StartSession(csrvSession *css) {
PROCESS_INFORMATION pi;
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
DWORD i;
HANDLE htmp,farin,farout,farerr;

css->pbuf=HeapAlloc(heap,0,CSRV_PBUF_SIZE);
if(css->pbuf==NULL) return(0);
css->pbuflen=HeapSize(heap,0,css->pbuf);
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
if(!CreatePipe(&htmp,&farout,&sa,0)) return(0);
if(!DuplicateHandle(GetCurrentProcess(),farout,GetCurrentProcess(),&farerr,0,TRUE,DUPLICATE_SAME_ACCESS)) return(0);
if(!DuplicateHandle(GetCurrentProcess(),htmp,GetCurrentProcess(),&(css->srvin),0,FALSE,DUPLICATE_SAME_ACCESS)) return(0);
CloseHandle(htmp);
if(!CreatePipe(&farin,&htmp,&sa,0)) return(0);
if(!DuplicateHandle(GetCurrentProcess(),htmp,GetCurrentProcess(),&(css->srvout),0,FALSE,DUPLICATE_SAME_ACCESS)) return(0);
CloseHandle(htmp);
css->thread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CommandOutput,css,CREATE_SUSPENDED,&i);
if(css->thread==NULL) return(0);
memset(&si,0,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
si.hStdInput=farin;
si.hStdOutput=farout;
si.hStdError=farerr;
if(!CreateProcess(NULL,"command.com",NULL,NULL,TRUE,CREATE_SUSPENDED|CREATE_NEW_CONSOLE,NULL,"C:\\",&si,&pi)) return(0);
CloseHandle(farin);
CloseHandle(farout);
CloseHandle(farerr);
css->process=pi.hProcess;
css->start=pi.hThread;
return(-1);
}//=============================================

int APIENTRY WinMain(HINSTANCE hinst,HINSTANCE prhi,LPSTR cmd,int ncmd) {
MSG msg;
WNDCLASS wc;

mwnd=FindWindow(CSRV_CLASS,NULL);
if(IsWindow(mwnd)) {
   if(stricmp(cmd,"STOP")==0) PostMessage(mwnd,WM_CLOSE,0,0);
   return(0);
}
if(cmd!=NULL) port=(unsigned short)atoi(cmd);
if((port==0)||(port>16383)) port=CSRV_SERVER_PORT;
hi=hinst;
heap=GetProcessHeap();
memset(&wc,0,sizeof(WNDCLASS));
wc.lpfnWndProc=WndProc;
wc.hInstance=hi;
wc.lpszClassName=CSRV_CLASS;
RegisterClass(&wc);
wc.lpfnWndProc=ChldProc;
wc.lpszClassName=CHILD_CLASS;
RegisterClass(&wc);
mwnd=CreateWindowEx(WS_EX_TOOLWINDOW,CSRV_CLASS,NULL,WS_POPUP,0,0,0,0,NULL,NULL,hi,NULL);
if(!IsWindow(mwnd)) return(0);
while(GetMessage(&msg,NULL,0,0)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
WSACleanup();
return(0);
}//=============================================

Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.18 22:22.24
Ответить с цитатой
Появились мысли о первом задании г-на xdsl-я. Почему сразу это в голову не пришло мне не ясно, ну да лучше поздно, чем никогда:

Итак.

xdsl требует написать программу, которая бы показывала соответствие программе некогего файла. При чем сам отказывается предоставить какой-либо алгоритм или код или что иное. Потому приходится заниматься предположениями. Во-первых сразу скажу, что как в виндовсе сделать такое штатно мне не известно. Впрочем и в линуксе штатно сиё тоже не сделать. Как оказалось. Ибо нужно использовать пакет RPM, да еще так использовать, чтобы устанавливаемые программы были в требуемом формате. Если есть возможность получения информации (а она скорее всего есть, просто никому не надо наверно) из msi-файлов, то, соответственно, можно написать аналог RPM для виндовс, только использующий *.msi вместо *.rpm и сравнивать уже исходный код двух этих пакетов - RPM и якобы-win-rpm. Смысла в требовании предоставить код для обращения к этим утилитам (что, видимо, пытался требовать xdsl) смысла не вижу.

А а наиболее общем виде, как мне мыслится, есть только один вариант, причем и для вин и для лин он подходит (не на всех лин-ах есть rpm): перед установкой программы делать слепок системы, возможно даже сделать первый запуск, потом сделать второй слепок системы, и разницу сохранять в БД. Больше вариантов не вижу. Между вин и лин в таком случае всего одна разница - если нужно, конечно, в виндовсе нужно еще и разницу в реестре сохранять.

Дополнения / вопросы будут?
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.22 22:18.54
Ответить с цитатой
andy ice писал(а):
При чем сам отказывается предоставить какой-либо алгоритм или код или что иное

xdsl писал(а):
for a in `rpm -qa`; do for b in `rpm -ql $a`; do echo $a---$b; done ; done | grep <шаблон>
Cool
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.23 22:06.44
Ответить с цитатой
andy ice писал(а):
Смысла в требовании предоставить код для обращения к этим утилитам (что, видимо, пытался требовать xdsl) смысла не вижу.

может смешно. хотя уже не смешно, уже как-то..
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Страница 6 из 6
Начать новую тему   Ответить на тему   вывод темы на печать
На страницу Пред.  1, 2, 3, 4, 5, 6
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Об открытом коде, линуксе, windows и программировании

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы