source: branches/samba-3.0/source/ndpsmb/os2api.c@ 578

Last change on this file since 578 was 5, checked in by Yuri Dario, 18 years ago

OS/2 client code, initial import.

  • Property svn:eol-style set to native
File size: 3.7 KB
Line 
1#define INCL_LONGLONG
2#define INCL_DOS
3#define INCL_DOSPROCESS
4#define INCL_DOSPROFILE
5#define INCL_DOSMISC
6#define INCL_DOSMODULEMGR
7//_SMB_H
8#include <os2.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <errno.h>
12#include <types.h>
13#include <InnoTekLIBC/backend.h>
14#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
15#include "local.h"
16#include "xfile.h"
17#include "pstring.h"
18#include "debug.h"
19
20APIRET (APIENTRY * xDosPerfSysCall)(ULONG ulCommand, ULONG ulParm1, ULONG ulParm2, ULONG ulParm3) = NULL;
21APIRET (APIENTRY * xDosQuerySysState)(ULONG func, ULONG arg1, ULONG pid, ULONG _res_, PVOID buf, ULONG bufsz) = NULL;
22HMODULE doscalls = 0;
23
24int os2_init(void)
25{
26 HMODULE dllhandle;
27 int rc = 0;
28 char failname[CCHMAXPATH+1];
29 if (doscalls == 0)
30 {
31 rc = DosLoadModule(failname, sizeof(failname), "DOSCALL1", &doscalls);
32 if (rc)
33 {
34 DEBUG(0,("Cant load DOSCALL1: %s (%d)\n", failname, rc));
35 return rc;
36 }
37 rc = DosQueryProcAddr(doscalls, 976, NULL, (PFN *)&xDosPerfSysCall);
38 if (rc)
39 {
40 DEBUG(0,("Cant load xDosPerfSysCall (%d)\n", rc));
41 xDosPerfSysCall = NULL;
42 }
43 rc = DosQueryProcAddr(doscalls, 368, NULL, (PFN *)&xDosQuerySysState);
44 if (rc)
45 {
46 DEBUG(0,("Cant load xDosQuerySysState (%d)\n", rc));
47 xDosQuerySysState = NULL;
48 }
49 }
50 return 0;
51}
52
53int os2_ftruncate(int fd, off_t size)
54{
55 // We call there __libc_Back_ioFileSizeSet directly instead of
56 // ftruncate to force it not to zero expanding files to optimize
57 // samba performance when copying files
58 int rc = __libc_Back_ioFileSizeSet(fd, size, 0);
59 if (rc < 0)
60 {
61 errno = -rc;
62 return -1;
63 }
64 return 0;
65}
66
67#define CMD_KI_RDCNT (0x63)
68
69typedef struct _CPUUTIL {
70 ULONG ulTimeLow; /* Low 32 bits of time stamp */
71 ULONG ulTimeHigh; /* High 32 bits of time stamp */
72 ULONG ulIdleLow; /* Low 32 bits of idle time */
73 ULONG ulIdleHigh; /* High 32 bits of idle time */
74 ULONG ulBusyLow; /* Low 32 bits of busy time */
75 ULONG ulBusyHigh; /* High 32 bits of busy time */
76 ULONG ulIntrLow; /* Low 32 bits of interrupt time */
77 ULONG ulIntrHigh; /* High 32 bits of interrupt time */
78} CPUUTIL;
79
80// very simple random data gatherer derived from openssl
81void os2_randget(char * buffer, int length)
82{
83 QWORD qwTime;
84 ULONG SysVars[QSV_FOREGROUND_PROCESS];
85 int done = 0;
86
87 if (!buffer || length <= 0)
88 {
89 return;
90 }
91
92 DosTmrQueryTime(&qwTime);
93 memcpy(buffer, &qwTime, sizeof(qwTime) > length ? length : sizeof(qwTime));
94 done += sizeof(qwTime);
95 if (done >= length)
96 {
97 return;
98 }
99
100 if (xDosPerfSysCall)
101 {
102 CPUUTIL util;
103 if (xDosPerfSysCall(CMD_KI_RDCNT, (ULONG)&util, 0, 0) == 0)
104 {
105 memcpy(buffer + done, &util, sizeof(util) > length - done ? length - done : sizeof(util));
106 done += sizeof(util);
107 if (done >= length)
108 {
109 return;
110 }
111 }
112 }
113
114#if 0
115 if (xDosQuerySysState)
116 {
117 char *tmp = (char *)malloc(256 * 1024);
118 if (tmp)
119 {
120 if (xDosQuerySysState(0x1F, 0, 0, 0, tmp, 256 * 1024) == 0)
121 {
122 memcpy(buffer + done, tmp, 256 * 1024 > length - done ? length - done : 256 * 1024);
123 done += 256 * 1024;
124 }
125 free(tmp);
126 }
127 }
128 if (done >= length)
129 {
130 return;
131 }
132#endif
133
134 DosQuerySysInfo(1, QSV_FOREGROUND_PROCESS, SysVars, sizeof(SysVars));
135 memcpy(buffer + done, SysVars, sizeof(SysVars) > length - done ? length - done : sizeof(SysVars));
136}
137
138#include <InnoTekLIBC/tcpip.h>
139#undef close
140int debug_close(char * file, char * function, int line, int h )
141{
142 int os2socket = -1;
143 PLIBCSOCKETFH pFHSocket = __libc_TcpipFH(h);
144 if (pFHSocket) os2socket = pFHSocket->iSocket;
145 DEBUG(0,("close(%d (%d)) on %s:%s(%d)\n", h, os2socket, file, function, line));
146 return close(h);
147}
Note: See TracBrowser for help on using the repository browser.