SESSION.C
上传用户:wesley
上传日期:2007-01-07
资源大小:266k
文件大小:7k
源码类别:

通讯/手机编程

开发平台:

C/C++

  1. /* Copyright (C) 1992 Peter Edward Cann, all rights reserved.
  2.  * MicroSoft QuickC
  3.  */
  4. #include<stdio.h>
  5. #include<bios.h>
  6. #include<dos.h>
  7. #include<fcntl.h>
  8. #include<systypes.h>
  9. #include<sysstat.h>
  10. #include<signal.h>
  11. #include<process.h>
  12. #include"port.h"
  13. sendchar(c)
  14. unsigned char c;
  15. {
  16. while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
  17. if(kbhit())
  18. getch();
  19. outp(basereg, c);
  20. }
  21. int follow;
  22. quit()
  23. {
  24. cleanup(0);
  25. exit(99);
  26. }
  27. sendstr(str)
  28. char *str;
  29. {
  30. int i;
  31. for(i=0;str[i]!='';++i)
  32. if(str[i]=='n')
  33. {
  34. sendchar('r');
  35. sendchar('n');
  36. }
  37. else
  38. sendchar(str[i]);
  39. }
  40. portgets(str)
  41. char *str;
  42. {
  43. int i;
  44. i=0;
  45. while(i<255)
  46. {
  47. while(follow==index)
  48. {
  49. if(!(inp(basereg+MSTATREG)&DCDMASK))
  50. return(-1);
  51. if(kbhit())
  52. getch();
  53. }
  54. str[i]=buf[follow++];
  55. follow%=TBUFSIZ;
  56. if(str[i]=='b')
  57. if(i>0)
  58. {
  59. i-=2;
  60. sendchar('b');
  61. sendchar(' ');
  62. sendchar('b');
  63. }
  64. else
  65. {
  66. i--;
  67. sendchar(0x07);
  68. }
  69. else
  70. sendchar(str[i]);
  71. if((str[i]=='r')||(str[i]=='n'))
  72. {
  73. sendchar('r');
  74. sendchar('n');
  75. str[i]='';
  76. break;
  77. }
  78. i++;
  79. }
  80. str[255]='';
  81. return(0);
  82. }
  83. getlegalpath(str, dirstr)
  84. char *str, *dirstr;
  85. {
  86. char str1[256];
  87. int i;
  88. if(portgets(str1)==-1)
  89. return(-1);
  90. if(dirstr[0])
  91. {
  92. for(i=0;i<255;++i)
  93. {
  94. if(str1[i]=='')
  95. break;
  96. if((str1[i]=='.')&&(str1[i+1]=='.'))
  97. {
  98. str[0]='';
  99. return(0);
  100. }
  101. }
  102. sprintf(str, "%s\%s", dirstr, str1);
  103. }
  104. else
  105. strcpy(str, str1);
  106. }
  107. main(argc, argv)
  108. int argc;
  109. char **argv;
  110. {
  111. long timestamp;
  112. int i, j, outfd, ok, c, run, result;
  113. char str[256], udir[256], ddir[256];
  114. index=follow=0;
  115. printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.n");
  116. if(!strcmp(getenv("REMOTE"), "YES"))
  117. {
  118. printf("You appear to be already logged in remotely, judging by the environmentn");
  119. printf("variable REMOTE, so this is probably a very bad idea.n");
  120. printf("Are you sure you want to run SESSION? (y or n) --> ");
  121. if(getchar()!='y') /* Note getchar() and not getch()! */
  122. {
  123. printf("I didn't think so!n");
  124. exit(99);
  125. }
  126. else
  127. printf("OK, you're the boss!");
  128. }
  129. printf("Control-C to Exit.n");
  130. if((argc!=5)&&(argc!=3))
  131. {
  132. printf("USAGE: session <comnum> <bps> [<download dir> <upload dir>]n");
  133. exit(1);
  134. }
  135. if(argc==5)
  136. {
  137. strcpy(ddir, argv[3]);
  138. strcpy(udir, argv[4]);
  139. }
  140. else
  141. {
  142. ddir[0]='';
  143. udir[0]='';
  144. }
  145. comnum=atoi(argv[1])-1;
  146. speed=atoi(argv[2]);
  147. databits='8';
  148. parity='n';
  149. stopbits='1';
  150. setport();
  151. readset();
  152. setup();
  153. signal(SIGINT, quit);
  154. run=1;
  155. while(run)
  156. {
  157. sendstr("nn     DOWNLOAD:  (1) Xmodem   (2) Xmodem CRC   (3) Xmodem CRC 1Knn");
  158. sendstr("       UPLOAD:  (4) Xmodem   (5) Xmodem CRC 1K Optionalnn");
  159. if(argc==5)
  160. sendstr("                   (q) Quitnn             ---> ");
  161. else
  162. sendstr("                 (s) Shell        (q) Quitnn             ---> ");
  163. while(index==follow)
  164. {
  165. if(!(inp(basereg+MSTATREG)&DCDMASK))
  166. {
  167. run=0;
  168. break;
  169. }
  170. if(kbhit())
  171. getch();
  172. }
  173. if(!run)
  174. break;
  175. c=buf[follow++];
  176. follow%=TBUFSIZ;
  177. switch(c)
  178. {
  179. case 'q':
  180. case 'Q':
  181. sendstr("Quitn");
  182. run=0;
  183. break;
  184. case 's':
  185. case 'S':
  186. if(argc==5)
  187. {
  188. sendstr("Shell not available with restricted directory.n");
  189. break;
  190. }
  191. sendstr("Shelln");
  192. printf("Entering command.com remote shell.n");
  193. sprintf(str, "COM%d", comnum+1);
  194. putenv("PROMPT=REMOTE>$p$g");
  195. putenv("REMOTE=YES");
  196. cleanup(INHCTL);
  197. spawnlp(P_WAIT, "c:\command.com", "command.com", str, "/e:01024", NULL);
  198. putenv("REMOTE=NO");
  199. setup();
  200. break;
  201. case '1':
  202. sendstr("Xmodem Download.nSource file pathname? (Blank to cancel)n --> ");
  203. if((result=getlegalpath(str, ddir))==-1)
  204. {
  205. run=0;
  206. break;
  207. }
  208. if(!strlen(str))
  209. break;
  210. cleanup(INHCTL);
  211. result=spawnlp(P_WAIT, "xmodems", "xmodems", argv[1], argv[2], "1", str, NULL);
  212. setup();
  213. sendstr("Press any key to continue: --> ");
  214. while(follow==index)
  215. {
  216. if(!(inp(basereg+MSTATREG)&DCDMASK))
  217. {
  218. run=0;
  219. break;
  220. }
  221. if(kbhit())
  222. getch();
  223. }
  224. follow=index;
  225. sprintf(str, "Exit code = %d.n", result);
  226. sendstr(str);
  227. break;
  228. case '2':
  229. sendstr("Xmodem CRC Download.nSource file pathname? (Blank to cancel)n --> ");
  230. if((result=getlegalpath(str, ddir))==-1)
  231. {
  232. run=0;
  233. break;
  234. }
  235. if(!strlen(str))
  236. break;
  237. cleanup(INHCTL);
  238. result=spawnlp(P_WAIT, "xmcrcs", "xmcrcs", argv[1], argv[2], "1", str, NULL);
  239. setup();
  240. sendstr("Press any key to continue: --> ");
  241. while(follow==index)
  242. {
  243. if(!(inp(basereg+MSTATREG)&DCDMASK))
  244. {
  245. run=0;
  246. break;
  247. }
  248. if(kbhit())
  249. getch();
  250. }
  251. follow=index;
  252. sprintf(str, "Exit code = %d.n", result);
  253. sendstr(str);
  254. break;
  255. case '3':
  256. sendstr("Xmodem CRC 1k Download.nSource file pathname? (Blank to cancel)n --> ");
  257. if((result=getlegalpath(str, ddir))==-1)
  258. {
  259. run=0;
  260. break;
  261. }
  262. if(!strlen(str))
  263. break;
  264. cleanup(INHCTL);
  265. result=spawnlp(P_WAIT, "xmcrc1ks", "xmcrc1ks", argv[1], argv[2], "1", str, NULL);
  266. setup();
  267. sendstr("Press any key to continue: --> ");
  268. while(follow==index)
  269. {
  270. if(!(inp(basereg+MSTATREG)&DCDMASK))
  271. {
  272. run=0;
  273. break;
  274. }
  275. if(kbhit())
  276. getch();
  277. }
  278. follow=index;
  279. sprintf(str, "Exit code = %d.n", result);
  280. sendstr(str);
  281. break;
  282. case '4':
  283. sendstr("Xmodem Upload.nTarget file pathname? (Blank to cancel)n --> ");
  284. if((result=getlegalpath(str, udir))==-1)
  285. {
  286. run=0;
  287. break;
  288. }
  289. if(!strlen(str))
  290. break;
  291. cleanup(INHCTL);
  292. result=spawnlp(P_WAIT, "xmodemr", "xmodemr", argv[1], argv[2], "1", str, NULL);
  293. setup();
  294. sendstr("Press any key to continue: --> ");
  295. while(follow==index)
  296. {
  297. if(!(inp(basereg+MSTATREG)&DCDMASK))
  298. {
  299. run=0;
  300. break;
  301. }
  302. if(kbhit())
  303. getch();
  304. }
  305. follow=index;
  306. sprintf(str, "Exit code = %d.n", result);
  307. sendstr(str);
  308. break;
  309. case '5':
  310. sendstr("Xmodem CRC Upload, 1k Optional.nTarget file pathname? (Blank to cancel)n --> ");
  311. if((result=getlegalpath(str, udir))==-1)
  312. {
  313. run=0;
  314. break;
  315. }
  316. if(!strlen(str))
  317. break;
  318. cleanup(INHCTL);
  319. result=spawnlp(P_WAIT, "xmcrc1kr", "xmcrc1kr", argv[1], argv[2], "1", str, NULL);
  320. setup();
  321. sendstr("Press any key to continue: --> ");
  322. while(follow==index)
  323. {
  324. if(!(inp(basereg+MSTATREG)&DCDMASK))
  325. {
  326. run=0;
  327. break;
  328. }
  329. if(kbhit())
  330. getch();
  331. }
  332. follow=index;
  333. sprintf(str, "Exit code = %d.n", result);
  334. sendstr(str);
  335. break;
  336. }
  337. }
  338. cleanup(INHCTL);
  339. exit(0);
  340. }