ecuutil.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451
  1. /*+-----------------------------------------------------------------------
  2. ecuutil.c -- utility routines for extended calling unit
  3. wht@wht.net
  4. Defined functions:
  5. arg_token(parsestr, termchars)
  6. ascii_name_to_hex(name)
  7. ascii_to_hex(ascii)
  8. base_name(fullname)
  9. build_arg_array(cmd, arg, arg_max_quan, narg_rtn)
  10. build_str_array(str, arg, arg_max_quan, narg_rtn)
  11. build_valid_baud_string()
  12. cfree(p, num, size)
  13. disp_line_termio(fd, text)
  14. disp_stat(st)
  15. disp_termio(ttt, text)
  16. find_shell_chars(command)
  17. get_curr_dir(cdir, cdir_max)
  18. get_home_dir(home_dir)
  19. graphic_char_text(ch, incl_3char)
  20. hex_to_ascii_name(char_val)
  21. make_ecu_subdir()
  22. mem_cpy(dest, src, len)
  23. mkdir_auto(dirfn)
  24. mode_map(mode, mode_str)
  25. pad_zstr_to_len(zstr, len)
  26. perror_errmsg(str)
  27. Rdchk(fd)
  28. skip_ld_break(zstr)
  29. str_classify(sc, str)
  30. str_token(parsestr, termchars)
  31. strerror(err_no)
  32. strip_trail_break(zstr)
  33. yes_or_no(strarg)
  34. Some of these routines are the first coding I did in C
  35. and they just aren't worth improving ... like pad_zstr_to_len().
  36. Don't be too harsh on me.
  37. ------------------------------------------------------------------------*/
  38. /*+:EDITS:*/
  39. /*:04-26-2000-11:15-wht@bob-RELEASE 4.42 */
  40. /*:04-05-1998-17:32-wht@kepler-move feval code to get_uname_sys/nodename */
  41. /*:11-21-1997-05:18-wht@kepler-remove parity bit in graphic_char_text */
  42. /*:11-20-1997-15:35-wht@kepler-add more shell chars to find_shell_chars() */
  43. /*:02-09-1997-20:20-wht@yuriatin-add base_name */
  44. /*:01-24-1997-02:37-wht@yuriatin-SOURCE RELEASE 4.00 */
  45. /*:10-11-1996-02:35-wht@gyro-sunos can live off of CFG_FionreadInFilioH */
  46. /*:10-11-1996-02:09-wht@yuriatin-add CFG_FionreadInFilioH */
  47. /*:09-11-1996-20:00-wht@yuriatin-3.48-major telnet,curses,structural overhaul */
  48. /*:08-20-1996-12:39-wht@kepler-locale/ctype fixes from ache@nagual.ru */
  49. /*:07-31-1996-16:33-wht@kepler-apply Andrey Chernov FreeBSD getwd() patch */
  50. /*:01-01-1996-18:34-wht@kepler-massage disp_termio for CSIZE */
  51. /*:12-28-1995-12:54-wht@kepler-Andrey Chernov FreeBSD fixes */
  52. /*:12-06-1995-13:30-wht@n4hgf-termecu w/errno -1 consideration */
  53. /*:11-23-1995-11:20-wht@kepler-source control 3.37 for tsx-11 */
  54. /*:11-14-1995-10:23-wht@kepler-3.37.80-source control point: SOCKETS */
  55. /*:10-14-1995-17:08-wht@kepler-'struct termio' to 'struct TERMIO' */
  56. /*:10-14-1995-16:55-wht@kepler-except FreeBSD, print max of 8 c_cc */
  57. /*:10-14-1995-16:17-wht@kepler-add build_valid_baud_string */
  58. /*:09-17-1995-16:28-wht@kepler-remove obsolete #if 0 code */
  59. /*:06-15-1995-07:09-wht@kepler-dynamic CFG_HasStrerror */
  60. /*:03-12-1995-01:03-wht@kepler-use ECU_MAXPN and clean up get_curr_dir */
  61. /*:03-12-1995-00:57-wht@kepler-get_home_dir now a void function */
  62. /*:03-11-1995-17:51-wht@kepler-type for getwd for Linux */
  63. /*:01-12-1995-15:19-wht@n4hgf-apply Andrew Chernov 8-bit clean+FreeBSD patch */
  64. /*:06-03-1994-16:42-wht@kepler-non-termios disp_termio handled iflag badly */
  65. /*:05-29-1994-05:06-wht@n4hgf-2-char input to ascii_name_to_hex now working */
  66. /*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  67. /*:04-07-1994-13:41-wht@n4hgf-fix LINUX get_curr_dir */
  68. /*:12-12-1993-14:22-wht@fep-MOTSVR3 support */
  69. /*:11-12-1993-11:00-wht@n4hgf-Linux changes by bob@vancouver.zadall.com */
  70. /*:10-02-1993-22:03-wht@n4hgf-some nitpicking cleanup */
  71. /*:07-24-1993-14:12-wht@n4hgf-reorganize ascii_ctlstr */
  72. /*:01-30-1993-12:17-wht@n4hgf-remove gcc < 1.40 bug workaround */
  73. /*:09-10-1992-13:59-wht@n4hgf-ECU release 3.20 */
  74. /*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  75. /*:05-08-1992-02:42-wht@n4hgf-select-based Nap was buggy on EINTR */
  76. /*:04-05-1992-15:31-wht@n4hgf-no more use of memmove in any environment */
  77. /*:02-22-1992-16:19-wht@n4hgf-build arg/str array now handles zero tokens */
  78. /*:11-26-1991-19:36-wht@n4hgf-add str_classify and yes_or_no uses it */
  79. /*:09-01-1991-12:46-wht@n4hgf2-show sun flow control bit */
  80. /*:08-30-1991-20:09-wht@n4hgf2-sun Nap was not returning a value */
  81. /*:08-25-1991-14:39-wht@n4hgf-SVR4 port thanks to aega84!lh */
  82. /*:08-17-1991-14:11-root@n4hgf-ascii_to_hex supports "csi" */
  83. /*:08-13-1991-13:53-wht@n4hgf-UNIX and ISC nap() broken; XENIX still wins */
  84. /*:07-25-1991-12:57-wht@n4hgf-ECU release 3.10 */
  85. /*:04-16-1991-15:45-wht@n4hgf-gcc cannot use memmove */
  86. /*:03-18-1991-22:31-wht@n4hgf-ISC 2.2 has mkdir() */
  87. /*:02-03-1991-14:23-wht@n4hgf-hack workaround for get_home_dir under x286 */
  88. /*:01-25-1991-16:23-wht@n4hgf-source name wrong in headers */
  89. /*:12-26-1990-14:32-wht@n4hgf-use memmove or Duff's Device in mem_cpy() */
  90. /*:12-04-1990-00:58-wht@n4hgf-allow alternating between str/arg_token */
  91. /*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  92. #include "ecu.h"
  93. #include "termecu.h"
  94. #include "ecufork.h"
  95. #include "ecukey.h"
  96. #include "ecu_pwd.h"
  97. #include <sys/utsname.h>
  98. #if defined(SVR4)
  99. #include <sys/termiox.h>
  100. extern int hx_flag;
  101. #endif
  102. /*
  103. * system independence for strerror functionality
  104. */
  105. #if !defined(CFG_HasStrerror)
  106. extern char *sys_errlist[];
  107. extern int sys_nerr;
  108. #endif
  109. char curr_dir[ECU_MAXPN]; /* current working directory of process */
  110. char *str_token_static = (char *)0;
  111. static char *ascii_ctlstr[] =
  112. {
  113. "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
  114. "BS ", "HT ", "NL ", "VT ", "FF ", "CR ", "SO ", "SI ",
  115. "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
  116. "CAN", "EM ", "SUB", "ESC", "FS ", "GS ", "RS ", "US ", "SP "
  117. };
  118. char *valid_baud_string = "";
  119. static char uname_rtnstring[128];
  120. /*+-------------------------------------------------------------------------
  121. mem_cpy(dest,src,len) - memcpy() with non-destructive overlapping copy
  122. use Duff's device for speed
  123. --------------------------------------------------------------------------*/
  124. void
  125. mem_cpy(dest, src, len)
  126. char *dest;
  127. char *src;
  128. int len;
  129. {
  130. int itmp = (len + 15) / 16;
  131. if ((unsigned long)dest > (unsigned long)src)
  132. {
  133. dest += len;
  134. src += len;
  135. switch (len % 16)
  136. {
  137. case 0:
  138. do
  139. {
  140. *--dest = *--src;
  141. case 15: *--dest = *--src;
  142. case 14: *--dest = *--src;
  143. case 13: *--dest = *--src;
  144. case 12: *--dest = *--src;
  145. case 11: *--dest = *--src;
  146. case 10: *--dest = *--src;
  147. case 9: *--dest = *--src;
  148. case 8: *--dest = *--src;
  149. case 7: *--dest = *--src;
  150. case 6: *--dest = *--src;
  151. case 5: *--dest = *--src;
  152. case 4: *--dest = *--src;
  153. case 3: *--dest = *--src;
  154. case 2: *--dest = *--src;
  155. case 1: *--dest = *--src;
  156. }
  157. while (--itmp > 0);
  158. }
  159. }
  160. else
  161. {
  162. switch (len % 16)
  163. {
  164. case 0:
  165. do
  166. {
  167. *dest++ = *src++;
  168. case 15: *dest++ = *src++;
  169. case 14: *dest++ = *src++;
  170. case 13: *dest++ = *src++;
  171. case 12: *dest++ = *src++;
  172. case 11: *dest++ = *src++;
  173. case 10: *dest++ = *src++;
  174. case 9: *dest++ = *src++;
  175. case 8: *dest++ = *src++;
  176. case 7: *dest++ = *src++;
  177. case 6: *dest++ = *src++;
  178. case 5: *dest++ = *src++;
  179. case 4: *dest++ = *src++;
  180. case 3: *dest++ = *src++;
  181. case 2: *dest++ = *src++;
  182. case 1: *dest++ = *src++;
  183. }
  184. while (--itmp > 0);
  185. }
  186. }
  187. } /* end of mem_cpy */
  188. /*+-------------------------------------------------------------------------
  189. skip_ld_break(zstr) - skip leading spaces and tabs
  190. --------------------------------------------------------------------------*/
  191. char *
  192. skip_ld_break(zstr)
  193. char *zstr;
  194. {
  195. while (isspace((uchar) * zstr))
  196. zstr++;
  197. return (zstr);
  198. } /* end of skip_ld_break */
  199. /*+-------------------------------------------------------------------------
  200. strip_trail_break(zstr) - strip trailing spaces and tabs
  201. --------------------------------------------------------------------------*/
  202. void
  203. strip_trail_break(zstr)
  204. char *zstr;
  205. {
  206. int itmp = strlen(zstr);
  207. char *zptr = zstr + itmp - 1;
  208. while (itmp && isspace((uchar) * zptr))
  209. {
  210. *zptr-- = 0;
  211. itmp--;
  212. }
  213. } /* end of strip_trail_break */
  214. /*+-----------------------------------------------------------------------
  215. pad_zstr_to_len(zstr,len)
  216. pads with spaces to specified length, unless already longer than
  217. len in which case the string is truncated to 'len' characters.
  218. ------------------------------------------------------------------------*/
  219. void
  220. pad_zstr_to_len(zstr, len)
  221. char *zstr;
  222. int len;
  223. {
  224. int izstr;
  225. izstr = strlen(zstr);
  226. if (izstr >= len)
  227. zstr[len] = 0;
  228. else
  229. {
  230. while (izstr < len)
  231. zstr[izstr++] = 0x20;
  232. zstr[izstr] = 0;
  233. }
  234. } /* end of pad_zstr_to_len */
  235. /*+-----------------------------------------------------------------------
  236. arg_token(parsestr,termchars)
  237. Get next token from string parsestr ((char *)0 on 2nd, 3rd, etc.
  238. calls), where tokens are nonempty strings separated by runs of chars
  239. from termchars. Writes nulls into parsestr to end tokens.
  240. termchars need not remain constant from call to call.
  241. Treats multiple occurrences of a termchar as one delimiter (does not
  242. allow null fields).
  243. ------------------------------------------------------------------------*/
  244. char *
  245. arg_token(parsestr, termchars)
  246. char *parsestr;
  247. char *termchars;
  248. {
  249. char *parseptr;
  250. char *token;
  251. if (!parsestr && !str_token_static)
  252. return ((char *)0);
  253. if (parsestr)
  254. {
  255. str_token_static = (char *)0;
  256. parseptr = parsestr;
  257. }
  258. else
  259. parseptr = str_token_static;
  260. while (*parseptr)
  261. {
  262. if (!strchr(termchars, *parseptr))
  263. break;
  264. parseptr++;
  265. }
  266. if (!*parseptr)
  267. {
  268. str_token_static = (char *)0;
  269. return ((char *)0);
  270. }
  271. token = parseptr;
  272. /*
  273. * tokens beginning with apostrophe or quotes kept together
  274. */
  275. if (*token == '\'')
  276. {
  277. token++;
  278. parseptr++;
  279. while (*parseptr)
  280. {
  281. if (*parseptr == '\'')
  282. {
  283. str_token_static = parseptr + 1;
  284. *parseptr = 0;
  285. return (token);
  286. }
  287. parseptr++;
  288. }
  289. str_token_static = (char *)0;
  290. return (token);
  291. }
  292. else if (*token == '"')
  293. {
  294. token++;
  295. parseptr++;
  296. while (*parseptr)
  297. {
  298. if (*parseptr == '"')
  299. {
  300. str_token_static = parseptr + 1;
  301. *parseptr = 0;
  302. return (token);
  303. }
  304. parseptr++;
  305. }
  306. str_token_static = (char *)0;
  307. return (token);
  308. }
  309. while (*parseptr)
  310. {
  311. if (strchr(termchars, *parseptr))
  312. {
  313. *parseptr = 0;
  314. str_token_static = parseptr + 1;
  315. while (*str_token_static)
  316. {
  317. if (!strchr(termchars, *str_token_static))
  318. break;
  319. str_token_static++;
  320. }
  321. return (token);
  322. }
  323. parseptr++;
  324. }
  325. str_token_static = (char *)0;
  326. return (token);
  327. } /* end of arg_token */
  328. /*+-------------------------------------------------------------------------
  329. build_arg_array(cmd,arg,arg_max_quan,&narg)
  330. --------------------------------------------------------------------------*/
  331. void
  332. build_arg_array(cmd, arg, arg_max_quan, narg_rtn)
  333. char *cmd;
  334. char **arg;
  335. int arg_max_quan;
  336. int *narg_rtn;
  337. {
  338. int narg;
  339. str_token_static = (char *)0;
  340. memset((char *)arg, 0, sizeof(char *) * arg_max_quan);
  341. if (!(arg[0] = arg_token(cmd, " \t\r\n")))
  342. {
  343. *narg_rtn = 0;
  344. return;
  345. }
  346. for (narg = 1; narg < arg_max_quan; ++narg)
  347. {
  348. if (!(arg[narg] = arg_token((char *)0, " \t\r\n")))
  349. break;
  350. }
  351. *narg_rtn = narg;
  352. } /* end of build_arg_array */
  353. /*+-----------------------------------------------------------------------
  354. str_token(parsestr,termchars)
  355. Get next token from string parsestr ((char *)0 on 2nd, 3rd, etc.
  356. calls), where tokens are nonempty strings separated by runs of chars
  357. from termchars. Writes nulls into parsestr to end tokens.
  358. termchars need not remain constant from call to call.
  359. Treats each occurrence of a termchar as delimiter (allows null
  360. fields).
  361. ------------------------------------------------------------------------*/
  362. char *
  363. str_token(parsestr, termchars)
  364. char *parsestr;
  365. char *termchars;
  366. {
  367. char *termptr;
  368. char *parseptr;
  369. char *token;
  370. if (!parsestr && !str_token_static)
  371. return ((char *)0);
  372. if (parsestr)
  373. {
  374. str_token_static = (char *)0;
  375. parseptr = parsestr;
  376. }
  377. else
  378. parseptr = str_token_static;
  379. while (*parseptr)
  380. {
  381. for (termptr = termchars; *termptr != 0; termptr++)
  382. {
  383. if (*parseptr == *termptr)
  384. goto FOUND_TERM;
  385. }
  386. if (!*termptr)
  387. break;
  388. parseptr++;
  389. }
  390. if (!*parseptr)
  391. {
  392. str_token_static = (char *)0;
  393. return ((char *)0);
  394. }
  395. FOUND_TERM:
  396. token = parseptr;
  397. while (*parseptr)
  398. {
  399. for (termptr = termchars; *termptr;)
  400. {
  401. if (*parseptr == *termptr++)
  402. {
  403. str_token_static = parseptr + 1;
  404. *parseptr = 0;
  405. return (token);
  406. }
  407. }
  408. parseptr++;
  409. }
  410. str_token_static = (char *)0;
  411. return (token);
  412. } /* end of str_token */
  413. /*+-------------------------------------------------------------------------
  414. build_str_array(str,arg,arg_max_quan,&narg)
  415. --------------------------------------------------------------------------*/
  416. void
  417. build_str_array(str, arg, arg_max_quan, narg_rtn)
  418. char *str;
  419. char **arg;
  420. int arg_max_quan;
  421. int *narg_rtn;
  422. {
  423. int narg;
  424. str_token_static = (char *)0;
  425. memset((char *)arg, 0, sizeof(char *) * arg_max_quan);
  426. if (!(arg[0] = str_token(str, " \t\r\n")))
  427. {
  428. *narg_rtn = 0;
  429. return;
  430. }
  431. for (narg = 1; narg < arg_max_quan; ++narg)
  432. {
  433. if (!(arg[narg] = str_token((char *)0, " \t\r\n")))
  434. break;
  435. }
  436. *narg_rtn = narg;
  437. } /* end of build_str_array */
  438. /*+-----------------------------------------------------------------------
  439. graphic_char_text(character,incl_3char) - Make all chars "printable"
  440. returns pointer to a static string containing printable version
  441. of a character. If control char, printed as "^A", etc.
  442. if incl_3char set true, then space + ASCII assignment (e.g. "NUL") is
  443. appended to the string for non-printable graphics
  444. ------------------------------------------------------------------------*/
  445. char *
  446. graphic_char_text(ch, incl_3char)
  447. uchar ch;
  448. int incl_3char;
  449. {
  450. static char gg[16];
  451. ch &= 0x7F;
  452. if (isprint(ch))
  453. {
  454. gg[0] = ch;
  455. gg[1] = 0;
  456. }
  457. else
  458. {
  459. gg[0] = '^';
  460. if (ch == 0x7F)
  461. {
  462. gg[1] = '?';
  463. if (incl_3char)
  464. strcpy(&gg[2], " DEL");
  465. else
  466. gg[2] = 0;
  467. }
  468. else
  469. {
  470. gg[1] = ch + 0x40;
  471. if (incl_3char)
  472. {
  473. gg[2] = 0x20;
  474. strcpy(gg + 3, ascii_ctlstr[ch]);
  475. gg[7] = 0;
  476. }
  477. else
  478. gg[2] = 0;
  479. }
  480. }
  481. return (gg);
  482. } /* end of graphic_char_text */
  483. /*+-----------------------------------------------------------------------
  484. mode_map(mode,mode_str) build drwxrwxrwx string
  485. ------------------------------------------------------------------------*/
  486. char *
  487. mode_map(mode, mode_str)
  488. unsigned short mode;
  489. char *mode_str;
  490. {
  491. unsigned ftype = mode & S_IFMT;
  492. char *rtn;
  493. static char result[12];
  494. rtn = (mode_str == (char *)0) ? result : mode_str;
  495. /* drwxrwxrwx */
  496. /* 0123456789 */
  497. strcpy(rtn, "----------");
  498. switch (ftype)
  499. {
  500. case S_IFIFO:
  501. *rtn = 'p';
  502. break; /* FIFO (named pipe) */
  503. case S_IFDIR:
  504. *rtn = 'd';
  505. break; /* directory */
  506. case S_IFCHR:
  507. *rtn = 'c';
  508. break; /* character special */
  509. case S_IFBLK:
  510. *rtn = 'b';
  511. break; /* block special */
  512. case S_IFREG:
  513. *rtn = '-';
  514. break; /* regular */
  515. #if defined(S_IFLNK)
  516. case S_IFLNK:
  517. *rtn = 'l';
  518. break; /* symbolic link */
  519. #endif
  520. #if defined(S_IFSOCK)
  521. case S_IFSOCK:
  522. *rtn = 's';
  523. break; /* socket */
  524. #endif
  525. #if defined(S_IFNAM)
  526. case S_IFNAM: /* name space entry */
  527. #if defined(S_IFNAM)
  528. if (mode & S_INSEM) /* semaphore */
  529. {
  530. *rtn = 's';
  531. break;
  532. }
  533. #endif
  534. #if defined(S_INSHD)
  535. if (mode & S_INSHD) /* shared memory */
  536. {
  537. *rtn = 'm';
  538. break;
  539. }
  540. break;
  541. #endif
  542. #endif
  543. default:
  544. *rtn = '?';
  545. break; /* ??? */
  546. }
  547. if (mode & 000400)
  548. *(rtn + 1) = 'r';
  549. if (mode & 000200)
  550. *(rtn + 2) = 'w';
  551. if (mode & 000100)
  552. *(rtn + 3) = 'x';
  553. if (mode & 004000)
  554. *(rtn + 3) = 's';
  555. if (mode & 000040)
  556. *(rtn + 4) = 'r';
  557. if (mode & 000020)
  558. *(rtn + 5) = 'w';
  559. if (mode & 000010)
  560. *(rtn + 6) = 'x';
  561. if (mode & 002000)
  562. *(rtn + 6) = 's';
  563. if (mode & 000004)
  564. *(rtn + 7) = 'r';
  565. if (mode & 000002)
  566. *(rtn + 8) = 'w';
  567. if (mode & 000001)
  568. *(rtn + 9) = 'x';
  569. if (mode & 001000)
  570. *(rtn + 9) = 't';
  571. return (rtn);
  572. } /* end of mode_map */
  573. /*+-----------------------------------------------------------------------
  574. disp_termio(ttt,text) - display termio 'ttt' on console/plog
  575. ------------------------------------------------------------------------*/
  576. void
  577. disp_termio(ttt, text)
  578. struct TERMIO *ttt;
  579. char *text;
  580. {
  581. int flag;
  582. int i_cc;
  583. char *bitrate;
  584. char dbits;
  585. char parity;
  586. pprintf("---------> %s\n", text);
  587. #if defined(CFG_TermiosLineio)
  588. flag = ttt->c_iflag;
  589. pprintf("iflag: %07o IGNBRK:%d BRKINT:%d IGNPAR:%d ",
  590. flag,
  591. (flag & IGNBRK) ? 1 : 0,
  592. (flag & BRKINT) ? 1 : 0,
  593. (flag & IGNPAR) ? 1 : 0);
  594. pprintf("PARENB:%d PARMRK:%d INPCK:%d ISTRIP:%d\n",
  595. (flag & PARENB) ? 1 : 0,
  596. (flag & PARMRK) ? 1 : 0,
  597. (flag & INPCK) ? 1 : 0,
  598. (flag & ISTRIP) ? 1 : 0);
  599. pprintf(" INLCR:%d IGNCR:%d ICRNL:%d ",
  600. (flag & INLCR) ? 1 : 0,
  601. (flag & IGNCR) ? 1 : 0,
  602. (flag & ICRNL) ? 1 : 0);
  603. pprintf("IXON:%d IXANY:%d IXOFF:%d\n",
  604. (flag & IXON) ? 1 : 0,
  605. (flag & IXANY) ? 1 : 0,
  606. (flag & IXOFF) ? 1 : 0);
  607. flag = ttt->c_oflag;
  608. pprintf("oflag: %07o OPOST:%d ONLCR:%d\n",
  609. flag,
  610. (flag & OPOST) ? 1 : 0,
  611. (flag & ONLCR) ? 1 : 0);
  612. flag = ttt->c_lflag;
  613. pprintf("lflag: %07o ISIG:%d ICANON:%d ECHO:%d ECHOE:%d\n",
  614. flag,
  615. (flag & ISIG) ? 1 : 0,
  616. (flag & ICANON) ? 1 : 0,
  617. (flag & ECHO) ? 1 : 0,
  618. (flag & ECHOE) ? 1 : 0);
  619. pprintf(" ECHOK:%d ECHONL:%d NOFLSH:%d",
  620. (flag & ECHOK) ? 1 : 0,
  621. (flag & ECHONL) ? 1 : 0,
  622. (flag & NOFLSH) ? 1 : 0);
  623. #else
  624. flag = ttt->c_iflag;
  625. pprintf("iflag: %07o IGNBRK:%d BRKINT:%d IGNPAR:%d ",
  626. flag,
  627. (flag & IGNBRK) ? 1 : 0,
  628. (flag & BRKINT) ? 1 : 0,
  629. (flag & IGNPAR) ? 1 : 0);
  630. pprintf("PARENB:%d PARMRK:%d INPCK:%d ISTRIP:%d\n",
  631. (flag & PARENB) ? 1 : 0,
  632. (flag & PARMRK) ? 1 : 0,
  633. (flag & INPCK) ? 1 : 0,
  634. (flag & ISTRIP) ? 1 : 0);
  635. pprintf(" INLCR:%d IGNCR:%d ICRNL:%d IUCLC:%d ",
  636. (flag & INLCR) ? 1 : 0,
  637. (flag & IGNCR) ? 1 : 0,
  638. (flag & ICRNL) ? 1 : 0,
  639. (flag & IUCLC) ? 1 : 0);
  640. pprintf("IXON:%d IXANY:%d IXOFF:%d\n",
  641. (flag & IXON) ? 1 : 0,
  642. (flag & IXANY) ? 1 : 0,
  643. (flag & IXOFF) ? 1 : 0);
  644. flag = ttt->c_oflag;
  645. pprintf("oflag: %07o OPOST:%d OLCUC:%d ONLCR:%d OCRNL:%d ",
  646. flag,
  647. (flag & OPOST) ? 1 : 0,
  648. (flag & OLCUC) ? 1 : 0,
  649. (flag & ONLCR) ? 1 : 0,
  650. (flag & OCRNL) ? 1 : 0);
  651. pprintf("ONOCR:%d ONLRET:%d OFDEL:%d\n",
  652. (flag & ONOCR) ? 1 : 0,
  653. (flag & ONLRET) ? 1 : 0,
  654. (flag & OFDEL) ? 1 : 0);
  655. flag = ttt->c_lflag;
  656. pprintf("lflag: %07o ISIG:%d ICANON:%d XCASE:%d ECHO:%d ECHOE:%d\n",
  657. flag,
  658. (flag & ISIG) ? 1 : 0,
  659. (flag & ICANON) ? 1 : 0,
  660. (flag & XCASE) ? 1 : 0,
  661. (flag & ECHO) ? 1 : 0,
  662. (flag & ECHOE) ? 1 : 0);
  663. pprintf(" ECHOK:%d ECHONL:%d NOFLSH:%d",
  664. (flag & ECHOK) ? 1 : 0,
  665. (flag & ECHONL) ? 1 : 0,
  666. (flag & NOFLSH) ? 1 : 0);
  667. #if defined(XCLUDE)
  668. pprintf(" XCLUDE:%d", (flag & XCLUDE) ? 1 : 0);
  669. #endif
  670. #endif
  671. pprintf("\n");
  672. flag = ttt->c_cflag;
  673. pprintf("cflag: %07o ", ttt->c_cflag);
  674. switch (ecugetspeed(ttt))
  675. {
  676. case B0:
  677. bitrate = "HUP";
  678. break;
  679. case B50:
  680. bitrate = "50";
  681. break;
  682. case B75:
  683. bitrate = "75";
  684. break;
  685. case B110:
  686. bitrate = "110";
  687. break;
  688. case B134:
  689. bitrate = "134.5";
  690. break;
  691. case B150:
  692. bitrate = "150";
  693. break;
  694. case B200:
  695. bitrate = "200";
  696. break;
  697. case B300:
  698. bitrate = "300";
  699. break;
  700. case B600:
  701. bitrate = "600";
  702. break;
  703. case B1200:
  704. bitrate = "1200";
  705. break;
  706. case B1800:
  707. bitrate = "1800";
  708. break;
  709. case B2400:
  710. bitrate = "2400";
  711. break;
  712. case B4800:
  713. bitrate = "4800";
  714. break;
  715. case B9600:
  716. bitrate = "9600";
  717. break;
  718. #if defined(B19200)
  719. case B19200:
  720. bitrate = "19200";
  721. break;
  722. #endif
  723. #if defined(B38400)
  724. case B38400:
  725. bitrate = "38400";
  726. break;
  727. #endif
  728. #if defined(B57600)
  729. case B57600:
  730. bitrate = "57600";
  731. break;
  732. #endif
  733. #if defined(B115200)
  734. case B115200:
  735. bitrate = "115200";
  736. break;
  737. #endif
  738. default:
  739. switch (ecugetspeed(ttt))
  740. {
  741. case EXTA:
  742. bitrate = "EXTA";
  743. break;
  744. case EXTB:
  745. bitrate = "EXTB";
  746. break;
  747. default:
  748. bitrate = "????";
  749. break;
  750. }
  751. }
  752. #ifndef CSIZE
  753. #define CSIZE CS8
  754. #endif
  755. switch (flag & CSIZE)
  756. {
  757. case CS8:
  758. dbits = '8';
  759. break;
  760. case CS7:
  761. dbits = '7';
  762. break;
  763. case CS6:
  764. dbits = '6';
  765. break;
  766. case CS5:
  767. dbits = '5';
  768. break;
  769. default:
  770. dbits = '?';
  771. break;
  772. }
  773. parity = (flag & PARENB) ? ((flag & PARODD) ? 'O' : 'E') : 'N';
  774. pprintf("%s-%c-%c-%d ", bitrate, dbits, parity, (flag & CSTOPB) ? 2 : 1);
  775. pprintf("CREAD:%d HUPCL:%d CLOCAL:%d",
  776. (flag & CREAD) ? 1 : 0,
  777. (flag & HUPCL) ? 1 : 0,
  778. (flag & CLOCAL) ? 1 : 0);
  779. #if defined(RTSFLOW) /* SCO */
  780. pprintf(" RTSFLOW:%d CTSFLOW:%d",
  781. (flag & RTSFLOW) ? 1 : 0,
  782. (flag & CTSFLOW) ? 1 : 0);
  783. #endif
  784. #if defined(CRTSFL) /* SCO 3.2v4 */
  785. pprintf("\n CRTSFL:%d",
  786. (flag & CRTSFL) ? 1 : 0);
  787. #endif
  788. #if defined(RTSXOFF) /* SVR4 */
  789. pprintf(" RTSXOFF:%d CTSXON:%d",
  790. (hx_flag & RTSXOFF) ? 1 : 0,
  791. (hx_flag & CTSXON) ? 1 : 0);
  792. #endif
  793. #ifdef CRTSCTS /* sun */
  794. pprintf(" CRTSCTS:%d", (flag & CRTSCTS) ? 1 : 0);
  795. #endif
  796. pputs("\n");
  797. #ifdef __FreeBSD__
  798. pputs("ctls: ");
  799. for (i_cc = 0; i_cc < NCC; i_cc++)
  800. {
  801. if (i_cc == 7 || i_cc == 19)
  802. continue;
  803. pprintf("%02x ", ttt->c_cc[i_cc]);
  804. }
  805. pputs("\n");
  806. pputs("(hex) EOF EOL EL2 ERS WRS KIL ");
  807. pputs("RPR INT QUI SSP DSP STA STP LNX DIS MIN TIM STA\n");
  808. #else
  809. pprintf("ctl chars: ");
  810. for (i_cc = 0; i_cc < ((NCC > 8) ? 8 : NCC); i_cc++)
  811. pprintf("%02x ", ttt->c_cc[i_cc]);
  812. pputs(" (hex)\n");
  813. pputs(" INTR QUIT ERAS KILL EOF EOL ");
  814. pputs("EOL2 SWTCH VMIN-EOF VTIME-EOL\n");
  815. #endif
  816. } /* end of disp_termio */
  817. /*+-------------------------------------------------------------------------
  818. disp_stat(st)
  819. --------------------------------------------------------------------------*/
  820. void
  821. disp_stat(st)
  822. struct stat *st;
  823. {
  824. char mdmap[32];
  825. struct passwd *pw;
  826. if (pw = getpwuid(st->st_uid))
  827. pprintf("owner: %s ", pw->pw_name);
  828. else
  829. pprintf("uid: %d ", st->st_uid);
  830. endpwent();
  831. mode_map(st->st_mode, mdmap);
  832. pprintf("mode: %s ", mdmap);
  833. pprintf("inode: %5u dev: %3u rdev: %u,%u (0x%04x)\n",
  834. (UINT) st->st_ino, (UINT) st->st_dev,
  835. (UINT16) st->st_rdev >> 8, (UINT16) st->st_rdev & 0xFF,
  836. (UINT16) st->st_rdev);
  837. } /* end of disp_stat */
  838. /*+-----------------------------------------------------------------------
  839. disp_line_termio(fd)
  840. Get current termio structure for file descriptor fd
  841. and display on stderr
  842. ------------------------------------------------------------------------*/
  843. void
  844. disp_line_termio(fd, text)
  845. int fd; /* file descriptor */
  846. char *text;
  847. {
  848. struct TERMIO fd_termio;
  849. struct stat fd_stat;
  850. char text2[128];
  851. ecugetattr(fd, &fd_termio);
  852. sprintf(text2, "fd: %d %s", fd, text);
  853. disp_termio(&fd_termio, text2);
  854. fstat(fd, &fd_stat);
  855. disp_stat(&fd_stat);
  856. } /* end of disp_line_termio */
  857. /*+-----------------------------------------------------------------------
  858. ascii_name_to_hex(name)
  859. return value of ascii ctl char name (e.g., "NUL") 0 - 0x1F
  860. support CSI "ascii" 0x9B (for ESC + '[' ANSI)
  861. returns -1 if input not valid
  862. ------------------------------------------------------------------------*/
  863. ascii_name_to_hex(name)
  864. char *name;
  865. {
  866. char **cpptr;
  867. int itmp;
  868. char s4[4];
  869. if (!strcmpi(name, "del"))
  870. return (0x7F);
  871. else if (!strcmpi(name, "csi"))
  872. return (0x9B);
  873. else if ((itmp = strlen(name)) < 3)
  874. {
  875. if (!itmp)
  876. return (-1);
  877. memcpy(s4, " ", 4);
  878. memcpy(s4, name, itmp);
  879. name = s4;
  880. }
  881. cpptr = ascii_ctlstr;
  882. for (itmp = 0; itmp <= SPACE; itmp++)
  883. {
  884. if (!strcmpi(name, *cpptr))
  885. return (itmp);
  886. cpptr++;
  887. }
  888. return (-1);
  889. } /* end of ascii_name_to_hex */
  890. /*+-------------------------------------------------------------------------
  891. ascii_to_hex(ascii)
  892. --------------------------------------------------------------------------*/
  893. int
  894. ascii_to_hex(ascii)
  895. char *ascii;
  896. {
  897. int hexval;
  898. if (strlen(ascii) == 1)
  899. return (*ascii);
  900. else if (!strncmp(ascii, "0x", 2))
  901. {
  902. sscanf(ascii + 2, "%x", &hexval);
  903. return (hexval & 0xFF);
  904. }
  905. else if (*ascii == '^')
  906. return (*(ascii + 1) & 0x1F);
  907. else
  908. return (ascii_name_to_hex(ascii));
  909. } /* end of ascii_to_hex */
  910. /*+-------------------------------------------------------------------------
  911. hex_to_ascii_name(char_val)
  912. Returns pointer to static string containing three character ASCII
  913. name for control character followed by a null.
  914. --------------------------------------------------------------------------*/
  915. char *
  916. hex_to_ascii_name(char_val)
  917. char char_val;
  918. {
  919. static char ascii_name[4];
  920. char_val &= 0x7F;
  921. if (char_val == 0x7F)
  922. strcpy(ascii_name, "DEL");
  923. else if (char_val <= SPACE)
  924. strcpy(ascii_name, ascii_ctlstr[char_val]);
  925. else
  926. {
  927. ascii_name[0] = char_val;
  928. ascii_name[1] = 0;
  929. }
  930. return (ascii_name);
  931. } /* end of hex_to_ascii_name */
  932. /*+-------------------------------------------------------------------------
  933. get_curr_dir(cdir,cdir_max) - get current directory into 'cdir'
  934. getcwd()/getwd() not available everywhere nor consistent;
  935. get_curr_dir() has the same shape as getcwd(), but the toil of
  936. keeping up with who supports what is not worth the hassle since
  937. ECU does not use this function very much
  938. --------------------------------------------------------------------------*/
  939. int
  940. get_curr_dir(cdir, cdir_max)
  941. char *cdir;
  942. int cdir_max;
  943. {
  944. #if defined(linux)
  945. char *temp;
  946. char parm[ECU_MAXPN];
  947. char *getcwd();
  948. strcpy(parm, ".");
  949. temp = getcwd(parm,sizeof(parm));
  950. if (!temp)
  951. return (-1);
  952. strncpy(cdir, temp, cdir_max);
  953. cdir[cdir_max] = 0;
  954. return (0);
  955. #else
  956. #if defined(__FreeBSD__)
  957. char *temp;
  958. char parm[ECU_MAXPN];
  959. char *getwd();
  960. strcpy(parm, ".");
  961. temp = getwd(parm);
  962. if (!temp)
  963. return (-1);
  964. strncpy(cdir, temp, cdir_max);
  965. cdir[cdir_max] = 0;
  966. return (0);
  967. #else
  968. FILE *popen();
  969. FILE *pipefp = popen("/bin/pwd", "r");
  970. int itmp;
  971. strcpy(cdir, ".");
  972. if (!pipefp)
  973. return (-1);
  974. fgets(cdir, cdir_max, pipefp);
  975. cdir[cdir_max - 1] = 0;
  976. if ((itmp = strlen(cdir)) && (*(cdir + itmp - 1) == 0x0A))
  977. *(cdir + itmp - 1) = 0;
  978. fclose(pipefp);
  979. return (0);
  980. #endif
  981. #endif
  982. } /* end of get_curr_dir */
  983. /*+-----------------------------------------------------------------------
  984. get_home_dir(home_dir) - get user home directory
  985. ------------------------------------------------------------------------*/
  986. void
  987. get_home_dir(home_dir)
  988. char *home_dir;
  989. {
  990. static char *home_directory = 0;
  991. struct passwd *pw;
  992. char *cp;
  993. *home_dir = 0;
  994. if (home_directory)
  995. {
  996. strcpy(home_dir, home_directory);
  997. return;
  998. }
  999. if (cp = getenv("HOME"))
  1000. {
  1001. if (home_directory = malloc(strlen(cp) + 1))
  1002. strcpy(home_directory, cp);
  1003. strcpy(home_dir, cp);
  1004. return;
  1005. }
  1006. if (pw = getpwuid(getuid()))
  1007. {
  1008. endpwent();
  1009. if (home_directory = malloc(strlen(pw->pw_dir) + 1))
  1010. strcpy(home_directory, pw->pw_dir);
  1011. strcpy(home_dir, pw->pw_dir);
  1012. return;
  1013. }
  1014. endpwent();
  1015. pputs("Cannot find your home directory in\n");
  1016. pperror("$HOME or /etc/passwd");
  1017. termecu(TERMECU_PWENT_ERROR);
  1018. } /* end of get_home_dir */
  1019. /*+-------------------------------------------------------------------------
  1020. make_ecu_subdir()
  1021. must be called early in execution before wierd tty states set, etc.
  1022. --------------------------------------------------------------------------*/
  1023. void
  1024. make_ecu_subdir()
  1025. {
  1026. int itmp = 0;
  1027. struct stat fst;
  1028. char subdir_pathn[ECU_MAXPN];
  1029. get_home_dir(subdir_pathn);
  1030. strcat(subdir_pathn, "/.ecu");
  1031. itmp = stat(subdir_pathn, &fst);
  1032. if (!itmp && ((fst.st_mode & S_IFMT) != S_IFDIR))
  1033. {
  1034. ff(se, "~/.ecu is not a directory. Rename the file and try again.\n\n");
  1035. exit(1);
  1036. }
  1037. if (itmp) /* if stat failed, try to make the directory */
  1038. {
  1039. char pseudo_file_in_subdir[ECU_MAXPN + 2];
  1040. strcpy(pseudo_file_in_subdir, subdir_pathn);
  1041. strcat(pseudo_file_in_subdir, "/x");
  1042. errno = ENOENT;
  1043. if (make_dirs(pseudo_file_in_subdir))
  1044. {
  1045. if (stat(subdir_pathn, &fst))
  1046. {
  1047. pputs("cannot make ~/.ecu subdirectory.\n");
  1048. pperror(subdir_pathn);
  1049. exit(1);
  1050. }
  1051. }
  1052. }
  1053. /*
  1054. * do this on every call whether we make the dir this time or not
  1055. */
  1056. chmod(subdir_pathn, 0700);
  1057. } /* end of make_ecu_subdir */
  1058. /*+-------------------------------------------------------------------------
  1059. mkdir_auto(dirfn)
  1060. returns -1 if error,
  1061. else # levels required to get target
  1062. --------------------------------------------------------------------------*/
  1063. int
  1064. mkdir_auto(dirfn)
  1065. char *dirfn;
  1066. {
  1067. int itmp = strlen(dirfn);
  1068. char *buf;
  1069. if (!(itmp = mkdir(dirfn, 0755)))
  1070. return (1); /* one level */
  1071. if (itmp != ENOENT)
  1072. return (-1);
  1073. errno = 0;
  1074. if (!(buf = malloc(itmp + 4)))
  1075. {
  1076. pputs("mkdir_auto malloc failed\n");
  1077. termecu(TERMECU_MALLOC);
  1078. }
  1079. strcpy(buf, dirfn);
  1080. strcat(buf + itmp, "/a");/* make_dirs() wants dummy fn */
  1081. errno = ENOENT;
  1082. itmp = make_dirs(buf, 0755);
  1083. free(buf);
  1084. return (itmp);
  1085. } /* end of mkdir_auto */
  1086. /*+-------------------------------------------------------------------------
  1087. str_classify(sc,str) - classify a string and return value
  1088. Use the STR_CLASSIFY structure to classify a string (convert str to
  1089. lexical token or error code) and return the value; use last token
  1090. in table if no string matches
  1091. --------------------------------------------------------------------------*/
  1092. str_classify(sc, str)
  1093. STR_CLASSIFY *sc;
  1094. char *str;
  1095. {
  1096. while (sc->str)
  1097. {
  1098. if (minunique(sc->str, str, sc->min_ch))
  1099. return (sc->token);
  1100. sc++;
  1101. }
  1102. return (sc->token);
  1103. } /* end of str_classify */
  1104. /*+-------------------------------------------------------------------------
  1105. yes_or_no(strarg) - lenient yes/no, on/off
  1106. Returns 1 if first char is 'Y' or 'y'
  1107. or if strarg is numeric returns the numeric value
  1108. or if strarg is alpha == "on" returns 1
  1109. Returns 0 otherwise
  1110. --------------------------------------------------------------------------*/
  1111. int
  1112. yes_or_no(strarg)
  1113. char *strarg;
  1114. {
  1115. static STR_CLASSIFY sc[] =
  1116. {
  1117. {"yes", 1, 1},
  1118. {"on", 2, 1},
  1119. {"no", 1, 0},
  1120. {"off", 3, 0},
  1121. {(char *)0, 0, 0},
  1122. };
  1123. if (isdigit((uchar) * strarg))
  1124. return (atoi(strarg));
  1125. else
  1126. return (str_classify(sc, strarg));
  1127. } /* end of yes_or_no */
  1128. /*+-------------------------------------------------------------------------
  1129. find_shell_chars(command) - search for shell metacharacters
  1130. returns 1 if found
  1131. The characters ";|&><" are more to promote security than to
  1132. aid in filename expansion
  1133. --------------------------------------------------------------------------*/
  1134. int
  1135. find_shell_chars(command)
  1136. char *command;
  1137. {
  1138. int schar;
  1139. int cchar;
  1140. char *scptr;
  1141. static char shell_chars[] = "\\\"~*?'`{}[];$|&><";
  1142. while (cchar = *command++)
  1143. {
  1144. scptr = shell_chars;
  1145. while (schar = *scptr++)
  1146. {
  1147. if (schar == cchar)
  1148. return (1);
  1149. }
  1150. }
  1151. return (0);
  1152. } /* end of find_shell_chars */
  1153. /*+-------------------------------------------------------------------------
  1154. strerror(err_no) - safe sys_errlist lookup
  1155. --------------------------------------------------------------------------*/
  1156. #ifndef CFG_HasStrerror
  1157. char *
  1158. strerror(err_no)
  1159. int err_no;
  1160. {
  1161. static char errant[32];
  1162. if ((unsigned)err_no <= (unsigned)sys_nerr)
  1163. return (sys_errlist[errno]);
  1164. sprintf(errant, "Error %d", errno);
  1165. return (errant);
  1166. } /* end of strerror */
  1167. #endif
  1168. /*+-------------------------------------------------------------------------
  1169. perror_errmsg(str)
  1170. --------------------------------------------------------------------------*/
  1171. void
  1172. perror_errmsg(str)
  1173. char *str;
  1174. {
  1175. extern char errmsg[];
  1176. sprintf(errmsg, "%s: %s", str, strerror(errno));
  1177. } /* end of perror_errmsg */
  1178. /*+-------------------------------------------------------------------------
  1179. cfree(p,num,size) - fix bug in XENIX -lmalloc
  1180. --------------------------------------------------------------------------*/
  1181. #if defined(M_XENIX) && defined(XENIX_MALLOC_LIB_BUG)
  1182. cfree(p, num, size)
  1183. char *p;
  1184. int num;
  1185. int size;
  1186. {
  1187. free(p);
  1188. } /* end of cfree */
  1189. #endif
  1190. /*+-------------------------------------------------------------------------
  1191. Rdchk(fd) - for systems without it but with FIONREAD
  1192. --------------------------------------------------------------------------*/
  1193. #if defined(CFG_FionreadRdchk)
  1194. int
  1195. Rdchk(fd)
  1196. int fd;
  1197. {
  1198. int chars_waiting;
  1199. if (ioctl(fd, FIONREAD, &chars_waiting))
  1200. return (0);
  1201. else
  1202. return (!!chars_waiting);
  1203. } /* end of Rdchk */
  1204. #endif
  1205. /*+-------------------------------------------------------------------------
  1206. build_valid_baud_string()
  1207. --------------------------------------------------------------------------*/
  1208. void
  1209. build_valid_baud_string()
  1210. {
  1211. char s2048[2048];
  1212. static int bauds[] =
  1213. {
  1214. 110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400,
  1215. 57600, 115200, 0
  1216. };
  1217. int *b = bauds;
  1218. valid_baud_string = "???";
  1219. s2048[0] = 0;
  1220. while (*b)
  1221. {
  1222. if (valid_baud(*b) != -1)
  1223. sprintf(s2048 + strlen(s2048), ",%u", *b);
  1224. b++;
  1225. }
  1226. valid_baud_string = strdup((s2048[0] == ',') ? s2048 + 1 : s2048);
  1227. } /* end of build_valid_baud_string */
  1228. /*+-------------------------------------------------------------------------
  1229. base_name(fullname) - strip directory name from file_name
  1230. --------------------------------------------------------------------------*/
  1231. char *
  1232. base_name(fullname)
  1233. char *fullname;
  1234. {
  1235. char *start = strrchr(fullname,'/'); /* find last slash */
  1236. return((start) ? start + 1 : fullname);
  1237. } /* end of base_name */
  1238. /*+-------------------------------------------------------------------------
  1239. get_uname_nodename()
  1240. --------------------------------------------------------------------------*/
  1241. char *
  1242. get_uname_nodename()
  1243. {
  1244. struct utsname utsn;
  1245. #ifdef M_SYSV /* SCO before 3.2v5 */
  1246. /*
  1247. * before UNIX, had to use systemid first; 3.2.0, uname
  1248. * might have been bad, but systemid ok; in 3.2v5,
  1249. * /etc/systemid is backward compatibility maintained in
  1250. * /etc/rc2.d by `uname -n > /etc/systemid'
  1251. */
  1252. FILE *fp = fopen("/etc/systemid", "r");
  1253. if (fp)
  1254. {
  1255. uname_rtnstring[0] = 0;
  1256. fgets(uname_rtnstring, sizeof(uname_rtnstring), fp);
  1257. fclose(fp);
  1258. if (itmp = strlen(uname_rtnstring))
  1259. {
  1260. if (*(cp = uname_rtnstring + itmp - 1) == '\n')
  1261. *cp = 0, itmp--;
  1262. strip_trail_break(uname_rtnstring);
  1263. return(uname_rtnstring);
  1264. }
  1265. }
  1266. #endif
  1267. if (uname(&utsn))
  1268. {
  1269. pperror("uname");
  1270. return(0);
  1271. }
  1272. strncpy(uname_rtnstring,utsn.nodename,sizeof(uname_rtnstring));
  1273. uname_rtnstring[sizeof(uname_rtnstring) - 1] = 0;
  1274. return(uname_rtnstring);
  1275. } /* end of get_uname_nodename */
  1276. /*+-------------------------------------------------------------------------
  1277. get_uname_sysname()
  1278. --------------------------------------------------------------------------*/
  1279. char *
  1280. get_uname_sysname()
  1281. {
  1282. struct utsname utsn;
  1283. if (uname(&utsn))
  1284. {
  1285. pperror("uname");
  1286. return(0);
  1287. }
  1288. strncpy(uname_rtnstring,utsn.nodename,sizeof(uname_rtnstring));
  1289. uname_rtnstring[sizeof(uname_rtnstring) - 1] = 0;
  1290. return(uname_rtnstring);
  1291. } /* end of get_uname_sysname */
  1292. /* end of ecuutil.c */
  1293. /* vi: set tabstop=4 shiftwidth=4: */