ckustr.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:7k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. /*
  2.  * ckustr.c - string extraction/restoration routines
  3. */
  4. #include <stdio.h>
  5. #include <sysexits.h>
  6. #include <varargs.h>
  7. #include <paths.h>
  8. /*
  9.   STR_FILE must be defined as a quoted string on the cc command line,
  10.   for example:
  11.    -DSTR_FILE=\"/usr/local/lib/cku196.sr\"
  12.   This is the file where the strings go, and where C-Kermit looks for them
  13.   at runtime.
  14. */
  15. #ifdef STR_FILE
  16. char *StringFile = STR_FILE;
  17. #else
  18. char *StringFile = "/usr/local/lib/cku196.sr";
  19. #endif /* STR_FILE */
  20. /*
  21.  * If _PATH_CTIMED is defined (in <paths.h>) then use that definition.  2.11BSD
  22.  * has this defined but 2.10BSD and other systems do not.
  23. */
  24. #ifndef _PATH_CTIMED
  25. #define _PATH_CTIMED STR_CTIMED
  26. #endif
  27. extern int errno;
  28. static int strfile = -1, ourpid = 0;
  29. #define BUFLEN 256
  30. errprep(offset, buf)
  31. unsigned short offset;
  32. char *buf;
  33. {
  34. register int pid = getpid();
  35. if (pid != ourpid) {
  36. ourpid = pid;
  37. if (strfile >= 0) {
  38. close(strfile);
  39. strfile = -1;
  40. }
  41. }
  42. if (strfile < 0) {
  43.         char *p, *getenv();
  44. if (p = getenv("KSTR"))
  45.   if (strlen(p))
  46.     StringFile = p;
  47. strfile = open(StringFile, 0);
  48. if (strfile < 0) {
  49. oops:
  50. fprintf(stderr, "Cannot find %srn", StringFile);
  51. exit(EX_OSFILE);
  52. }
  53. }
  54. if (lseek(strfile, (long) offset, 0) < 0
  55. || read(strfile, buf, BUFLEN) <= 0)
  56. goto oops;
  57. }
  58. /* extracted string front end for printf() */
  59. /*VARARGS1*/
  60. strprerror(fmt, va_alist)
  61. int fmt;
  62. va_dcl
  63. {
  64. va_list ap;
  65. char buf[BUFLEN];
  66. errprep(fmt, buf);
  67. va_start(ap);
  68. vprintf(buf, ap);
  69. va_end(ap);
  70. }
  71. /* extracted string front end for sprintf() */
  72. /*VARARGS1*/
  73. strsrerror(fmt, obuf, va_alist)
  74. int fmt;
  75. char *obuf;
  76. va_dcl
  77. {
  78. char buf[BUFLEN];
  79. va_list ap;
  80. errprep(fmt, buf);
  81. va_start(ap);
  82. vsprintf(obuf, buf, ap);
  83. va_end(ap);
  84. }
  85. /* extracted string front end for fprintf() */
  86. /*VARARGS1*/
  87. strfrerror(fmt, fd, va_alist)
  88. int fmt;
  89. FILE *fd;
  90. va_dcl
  91. {
  92. va_list ap;
  93. char buf[BUFLEN];
  94. errprep(fmt, buf);
  95. va_start(ap);
  96. vfprintf(fd, buf, ap);
  97. va_end(ap);
  98. }
  99. /* extracted string front end for perror() */
  100. strperror(fmt)
  101. int fmt;
  102. {
  103. char buf[BUFLEN];
  104. register int saverr = errno;
  105. errprep(fmt, buf);
  106. errno = saverr;
  107. perror(buf);
  108. }
  109. perror(str)
  110. char *str;
  111. {
  112. printf("%s: errno %dn", str, errno);
  113. }
  114. /*
  115.  * The following is needed _only_ on systems which do not have the C library
  116.  * stubs for the ctime() and getpw*() functions.  In 2.11BSD these are
  117.  * present in the libstubs.a library and accessed via "-lstubs" at link time.
  118.  *
  119.  * 2.10BSD's cpp has the BSD2_10 symbol builtin.  Other systems without
  120.  * libstubs.a will need to define (via a -D option in CFLAGS) 'BSD2_10'.
  121. */
  122. #ifdef BSD2_10
  123. #include <sys/types.h>
  124. #include <sys/time.h>
  125. #include <pwd.h>
  126. #include <utmp.h>
  127. #define SEND_FD W[1]
  128. #define RECV_FD R[0]
  129. #define CTIME 1
  130. #define ASCTIME 2
  131. #define TZSET 3
  132. #define LOCALTIME 4
  133. #define GMTIME 5
  134. #define OFFTIME 6
  135. #define GETPWENT        7
  136. #define GETPWNAM        8
  137. #define GETPWUID        9
  138. #define SETPASSENT      10
  139. #define ENDPWENT        11
  140. static int R[2], W[2], inited;
  141. static char result[256 + 4];
  142. static struct tm tmtmp;
  143. static struct passwd _pw, *getandfixpw();
  144. char *
  145. ctime(t)
  146. time_t *t;
  147. {
  148. u_char fnc = CTIME;
  149. sewer();
  150. write(SEND_FD, &fnc, sizeof fnc);
  151. write(SEND_FD, t, sizeof (*t));
  152. getb(RECV_FD, result, 26);
  153. return(result);
  154. }
  155. char *
  156. asctime(tp)
  157. struct tm *tp;
  158. {
  159. u_char fnc = ASCTIME;
  160. sewer();
  161. write(SEND_FD, &fnc, sizeof fnc);
  162. write(SEND_FD, tp, sizeof (*tp));
  163. getb(RECV_FD, result, 26);
  164. return(result);
  165. }
  166. void
  167. tzset()
  168. {
  169. u_char fnc = TZSET;
  170. sewer();
  171. write(SEND_FD, &fnc, sizeof fnc);
  172. }
  173. struct tm *
  174. localtime(tp)
  175. time_t *tp;
  176. {
  177. u_char fnc = LOCALTIME;
  178. sewer();
  179. write(SEND_FD, &fnc, sizeof fnc);
  180. write(SEND_FD, tp, sizeof (*tp));
  181. getb(RECV_FD, &tmtmp, sizeof tmtmp);
  182. getb(RECV_FD, result, 24);
  183. tmtmp.tm_zone = result;
  184. return(&tmtmp);
  185. }
  186. struct tm *
  187. gmtime(tp)
  188. time_t *tp;
  189. {
  190. u_char fnc = GMTIME;
  191. sewer();
  192. write(SEND_FD, &fnc, sizeof fnc);
  193. write(SEND_FD, tp, sizeof (*tp));
  194. getb(RECV_FD, &tmtmp, sizeof tmtmp);
  195. getb(RECV_FD, result, 24);
  196. tmtmp.tm_zone = result;
  197. return(&tmtmp);
  198. }
  199. struct tm *
  200. offtime(clock, offset)
  201. time_t *clock;
  202. long offset;
  203. {
  204. u_char fnc = OFFTIME;
  205. sewer();
  206. write(SEND_FD, &fnc, sizeof fnc);
  207. write(SEND_FD, clock, sizeof (*clock));
  208. write(SEND_FD, &offset, sizeof offset);
  209. getb(RECV_FD, &tmtmp, sizeof tmtmp);
  210. tmtmp.tm_zone = "";
  211. return(&tmtmp);
  212. }
  213. struct passwd *
  214. getpwent()
  215. {
  216. u_char fnc = GETPWENT;
  217. sewer();
  218. write(SEND_FD, &fnc, sizeof fnc);
  219. return(getandfixpw());
  220. }
  221. struct passwd *
  222. getpwnam(nam)
  223. char *nam;
  224. {
  225. u_char fnc = GETPWNAM;
  226. char lnam[UT_NAMESIZE + 1];
  227. int len;
  228. len = strlen(nam);
  229. if (len > UT_NAMESIZE)
  230. len = UT_NAMESIZE;
  231. bcopy(nam, lnam, len);
  232. lnam[len] = '';
  233. sewer();
  234. write(SEND_FD, &fnc, 1);
  235. write(SEND_FD, &len, sizeof (int));
  236. write(SEND_FD, lnam, len);
  237. return(getandfixpw());
  238. }
  239. struct passwd *
  240. getpwuid(uid)
  241. uid_t uid;
  242. {
  243. u_char fnc = GETPWUID;
  244. sewer();
  245. write(SEND_FD, &fnc, sizeof fnc);
  246. write(SEND_FD, &uid, sizeof (uid_t));
  247. return(getandfixpw());
  248. }
  249. setpwent()
  250. {
  251. return(setpassent(0));
  252. }
  253. setpassent(stayopen)
  254. int stayopen;
  255. {
  256. u_char fnc = SETPASSENT;
  257. int sts;
  258. sewer();
  259. write(SEND_FD, &fnc, sizeof fnc);
  260. write(SEND_FD, &stayopen, sizeof (int));
  261. getb(RECV_FD, &sts, sizeof (int));
  262. return(sts);
  263. }
  264. void
  265. endpwent()
  266. {
  267. u_char fnc = ENDPWENT;
  268. sewer();
  269. write(SEND_FD, &fnc, sizeof fnc);
  270. return;
  271. }
  272. /* setpwfile() is deprecated */
  273. void
  274. setpwfile(file)
  275. char *file;
  276. {
  277. return;
  278. }
  279. struct passwd *
  280. getandfixpw()
  281. {
  282. short sz;
  283. getb(RECV_FD, &sz, sizeof (int));
  284. if (sz == 0)
  285. return(NULL);
  286. getb(RECV_FD, &_pw, sizeof (_pw));
  287. getb(RECV_FD, result, sz);
  288. _pw.pw_name += (int)result;
  289. _pw.pw_passwd += (int)result;
  290. _pw.pw_class += (int)result;
  291. _pw.pw_gecos += (int)result;
  292. _pw.pw_dir += (int)result;
  293. _pw.pw_shell += (int)result;
  294. return(&_pw);
  295. }
  296. getb(f, p, n)
  297. register int f, n;
  298. register char *p;
  299. {
  300. int i;
  301. while (n)
  302. {
  303. i = read(f, p, n);
  304. if (i <= 0)
  305. return;
  306. p += i;
  307. n -= i;
  308. }
  309. }
  310. sewer()
  311. {
  312. register int pid, ourpid = getpid();
  313. if (inited == ourpid)
  314. return;
  315. if (inited)
  316. {
  317. close(SEND_FD);
  318. close(RECV_FD);
  319. }
  320. pipe(W);
  321. pipe(R);
  322. pid = vfork();
  323. if (pid == 0)
  324. { /* child */
  325. alarm(0); /* cancel alarms */
  326. dup2(W[0], 0); /* parent write side to our stdin */
  327. dup2(R[1], 1); /* parent read side to our stdout */
  328. close(SEND_FD); /* copies made, close the... */
  329. close(RECV_FD); /* originals now */
  330. execl(_PATH_CTIMED, "ctimed", 0);
  331. _exit(EX_OSFILE);
  332. }
  333. if (pid == -1)
  334. abort(); /* nothing else really to do */
  335. close(W[0]); /* close read side of SEND channel */
  336. close(R[1]); /* close write side of RECV channel */
  337. inited = ourpid; /* don't do this again in this proc */
  338. }
  339. XXctime()
  340. {
  341. if (SEND_FD)
  342. close(SEND_FD);
  343. if (RECV_FD)
  344. close(RECV_FD);
  345. SEND_FD = RECV_FD = 0;
  346. inited = 0;
  347. }
  348. #endif /* BSD2_10 */