Advertisement
Guest User

Untitled

a guest
May 26th, 2017
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 59.23 KB | None | 0 0
  1. struct {
  2. char username[20];
  3. char password[36];
  4. uint perm;
  5. uint monies;
  6. uint chickens;
  7. uint id;
  8. dword next;
  9. dword prev;
  10. char info[50];
  11. char office[26];
  12. }
  13.  
  14.  
  15.  
  16.  
  17.  
  18. /* This file has been generated by the Hex-Rays decompiler.
  19.  
  20.    Copyright (c) 2009 Hex-Rays <info@hex-rays.com>
  21.  
  22.  
  23.  
  24.    Detected compiler: GNU C++
  25.  
  26. */
  27.  
  28.  
  29.  
  30. #include <defs.h>
  31.  
  32.  
  33.  
  34. #include <stdarg.h>
  35.  
  36.  
  37.  
  38.  
  39.  
  40. //-------------------------------------------------------------------------
  41.  
  42. // Data declarations
  43.  
  44.  
  45.  
  46. extern _UNKNOWN start; // weak
  47.  
  48. extern char format[]; // idb
  49.  
  50. extern char aUnableToCreate[]; // idb
  51.  
  52. extern char aUnableToSetReu[]; // idb
  53.  
  54. extern char aUnableToBindSo[]; // idb
  55.  
  56. extern char aUnableToListen[]; // idb
  57.  
  58. extern char aFailedToFindUs[]; // idb
  59.  
  60. extern char aDrop_privsFail[]; // idb
  61.  
  62. extern char aSetgidCurrentG[]; // idb
  63.  
  64. extern char aSetgidCurrentU[]; // idb
  65.  
  66. extern char a02x[]; // idb
  67.  
  68. extern char aS[]; // idb
  69.  
  70. extern char modes[]; // idb
  71.  
  72. extern char aSCanTBeOpened_[]; // idb
  73.  
  74. extern char aS_0[]; // idb
  75.  
  76. extern char aNodeX[]; // idb
  77.  
  78. extern char aChickensU[]; // idb
  79.  
  80. extern char aEggsU[]; // idb
  81.  
  82. extern char aMoniesU[]; // idb
  83.  
  84. extern char aIdU[]; // idb
  85.  
  86. extern char aUsernameS[]; // idb
  87.  
  88. extern char aInfoS[]; // idb
  89.  
  90. extern char aOfficeS[]; // idb
  91.  
  92. extern char aPasswordS[]; // idb
  93.  
  94. extern char aPermU[]; // idb
  95.  
  96. extern char aNextX[]; // idb
  97.  
  98. extern char aPrevX[]; // idb
  99.  
  100. extern char aLcggedIn[]; // idb
  101.  
  102. extern char s[]; // idb
  103.  
  104. extern char aEnterNewUserna[]; // idb
  105.  
  106. extern char aEnterNewInfo[]; // idb
  107.  
  108. extern char aEnterNewOffice[]; // idb
  109.  
  110. extern char aEnterNewPass[]; // idb
  111.  
  112. extern char aInsertFailed_[]; // idb
  113.  
  114. extern char aYouCurrentlyHa[]; // idb
  115.  
  116. extern char aMarketPriceFor[]; // idb
  117.  
  118. extern char aWouldYouLikeTo[]; // idb
  119.  
  120. extern char aHowMany_[]; // idb
  121.  
  122. extern char aUSold[]; // idb
  123.  
  124. extern char aNotEnoughEggs[]; // idb
  125.  
  126. extern char aYouCurrently_0[]; // idb
  127.  
  128. extern char aWouldYouLike_0[]; // idb
  129.  
  130. extern char aHowMuch_[]; // idb
  131.  
  132. extern char aUBurntToACrisp[]; // idb
  133.  
  134. extern char aOhSnapItSAllGo[]; // idb
  135.  
  136. extern char aYouCurrently_1[]; // idb
  137.  
  138. extern char aMarketPriceF_0[]; // idb
  139.  
  140. extern char aWouldYouLike_1[]; // idb
  141.  
  142. extern char aUPurchased[]; // idb
  143.  
  144. extern char aNotEnoughMoney[]; // idb
  145.  
  146. extern char aWouldYouLike_2[]; // idb
  147.  
  148. extern char aWouldYouLike_3[]; // idb
  149.  
  150. extern char aWouldYouLike_4[]; // idb
  151.  
  152. extern char aWouldYouLike_5[]; // idb
  153.  
  154. extern char aWouldYouLike_6[]; // idb
  155.  
  156. extern char aEnterNewUid[]; // idb
  157.  
  158. extern char aWouldYouLike_7[]; // idb
  159.  
  160. extern char aEnterNewEggCou[]; // idb
  161.  
  162. extern char aYouDonTHaveEno[]; // idb
  163.  
  164. extern char aWouldYouLike_8[]; // idb
  165.  
  166. extern char aEnterNewChicke[]; // idb
  167.  
  168. extern char aYouDonTHaveE_0[]; // idb
  169.  
  170. extern char aWouldYouLike_9[]; // idb
  171.  
  172. extern char aEnterNewMonies[]; // idb
  173.  
  174. extern char aYouDonTHaveE_1[]; // idb
  175.  
  176. extern char aWouldYouLik_10[]; // idb
  177.  
  178. extern char aEnterNewPerm[]; // idb
  179.  
  180. extern char aYouDonTHaveE_2[]; // idb
  181.  
  182. extern char aFinishedUpdate[]; // idb
  183.  
  184. extern char aEnterUsername[]; // idb
  185.  
  186. extern char aEnterPassword[]; // idb
  187.  
  188. extern char aBadUsernameOrP[]; // idb
  189.  
  190. extern char aFantasyChicken[]; // idb
  191.  
  192. extern char aMenuS[]; // idb
  193.  
  194. extern char aLLogout[]; // idb
  195.  
  196. extern char aBBuyChickens[]; // idb
  197.  
  198. extern char aIIncinerateMon[]; // idb
  199.  
  200. extern char aSSellEggs[]; // idb
  201.  
  202. extern char aPDisplayMyInfo[]; // idb
  203.  
  204. extern char aUUpdateMyInfo[]; // idb
  205.  
  206. extern char aPPrintUserlist[]; // idb
  207.  
  208. extern char aMenu[]; // idb
  209.  
  210. extern char aCCreateAccount[]; // idb
  211.  
  212. extern char aLLogin[]; // idb
  213.  
  214. extern char aQQuit[]; // idb
  215.  
  216. extern char s2[]; // idb
  217.  
  218. extern char aUser[]; // idb
  219.  
  220. extern char aAttemptedS_[]; // idb
  221.  
  222. extern char aCya[]; // idb
  223.  
  224. extern char aCanTAllocateUs[]; // idb
  225.  
  226. extern char aHomeFcflUser_d[]; // idb
  227.  
  228. extern char aCanTReadUserDb[]; // idb
  229.  
  230. extern char aDS[]; // idb
  231.  
  232. extern char aThatSNotAValid[]; // idb
  233.  
  234. extern char aC[2]; // weak
  235.  
  236. extern char asc_804D115[2]; // weak
  237.  
  238. extern char aS_1[2]; // weak
  239.  
  240. extern char aI[2]; // weak
  241.  
  242. extern char aB[2]; // weak
  243.  
  244. extern char aU[2]; // weak
  245.  
  246. extern char aP[2]; // weak
  247.  
  248. extern char asc_804D121[2]; // weak
  249.  
  250. extern char aP_0[2]; // weak
  251.  
  252. extern char a6[2]; // weak
  253.  
  254. extern char filename[]; // idb
  255.  
  256. extern char aQ[2]; // weak
  257.  
  258. extern int dword_804E1D8; // weak
  259.  
  260. extern int dword_804E1E0[]; // weak
  261.  
  262. extern _UNKNOWN unk_804E1E4; // weak
  263.  
  264. extern int dword_804E1E8; // weak
  265.  
  266. extern _UNKNOWN unk_804E3C0; // weak
  267.  
  268. extern __int16 word_804E404; // weak
  269.  
  270. extern char name[]; // idb
  271.  
  272. extern char dword_804E40C[]; // idb
  273.  
  274. extern char dword_804E410[]; // idb
  275.  
  276. extern char byte_804E418; // weak
  277.  
  278. extern int dword_804E41C; // weak
  279.  
  280. extern int admin; // weak
  281.  
  282. extern int logged_in; // weak
  283.  
  284. extern char s1; // idb
  285.  
  286. // extern _UNKNOWN _gmon_start__; weak
  287.  
  288.  
  289.  
  290. //-------------------------------------------------------------------------
  291.  
  292. // Function declarations
  293.  
  294.  
  295.  
  296. int __cdecl init_proc();
  297.  
  298. int sprintf(char *s, const char *format, ...);
  299.  
  300. void srand(unsigned int seed);
  301.  
  302. void err(int status, const char *format, ...);
  303.  
  304. __sighandler_t signal(int sig, __sighandler_t handler);
  305.  
  306. int __gmon_start__(void); // weak
  307.  
  308. char *strncpy(char *dest, const char *src, size_t n);
  309.  
  310. int listen(int fd, int n);
  311.  
  312. void *memset(void *s, int c, size_t n);
  313.  
  314. uint16_t htons(uint16_t hostshort);
  315.  
  316. int setegid(__gid_t gid);
  317.  
  318. __pid_t wait4(__pid_t pid, void *stat_loc, int options, struct rusage *usage);
  319.  
  320. ssize_t read(int fd, void *buf, size_t nbytes);
  321.  
  322. int __cdecl setresuid(_DWORD, _DWORD); // weak
  323.  
  324. int __cdecl setresgid(_DWORD, _DWORD); // weak
  325.  
  326. int accept(int fd, struct sockaddr *addr, socklen_t *addr_len);
  327.  
  328. int socket(int domain, int type, int protocol);
  329.  
  330. int fclose(FILE *stream);
  331.  
  332. int setuid(__uid_t uid);
  333.  
  334. size_t strlen(const char *s);
  335.  
  336. FILE *fopen(const char *filename, const char *modes);
  337.  
  338. char *strcpy(char *dest, const char *src);
  339.  
  340. __gid_t getegid(void);
  341.  
  342. int printf(const char *format, ...);
  343.  
  344. int chdir(const char *path);
  345.  
  346. int bind(int fd, const struct sockaddr *addr, socklen_t len);
  347.  
  348. __uid_t getuid(void);
  349.  
  350. int atoi(const char *nptr);
  351.  
  352. int close(int fd);
  353.  
  354. int initgroups(const char *, __gid_t group);
  355.  
  356. time_t time(time_t *timer);
  357.  
  358. void *malloc(size_t size);
  359.  
  360. char *strcat(char *dest, const char *src);
  361.  
  362. ssize_t send(int fd, const void *buf, size_t n, int flags);
  363.  
  364. int vasprintf(char **, const char *, va_list);
  365.  
  366. __pid_t fork(void);
  367.  
  368. int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
  369.  
  370. int rand(void);
  371.  
  372. void bzero(void *s, size_t n);
  373.  
  374. int strncmp(const char *s1, const char *s2, size_t n);
  375.  
  376. size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
  377.  
  378. int seteuid(__uid_t uid);
  379.  
  380. int setgid(__gid_t gid);
  381.  
  382. struct passwd *getpwnam(const char *name);
  383.  
  384. int strcmp(const char *s1, const char *s2);
  385.  
  386. void exit(int status);
  387.  
  388. __gid_t getgid(void);
  389.  
  390. __uid_t geteuid(void);
  391.  
  392. void __cdecl sub_8048CB0();
  393.  
  394. int __cdecl sub_8048D10();
  395.  
  396. int __cdecl sub_8048D34();
  397.  
  398. __pid_t __cdecl handler();
  399.  
  400. int __cdecl read_x_bytes_or_til_escape_char(int fd, int a2, unsigned int a3, char a4);
  401.  
  402. signed int __cdecl send_with_or_without_null(int fd, const char *s, int a3);
  403.  
  404. signed int __cdecl send_data(int fd, int a2, unsigned int a3);
  405.  
  406. int write_string(int fd, const char *a2, ...);
  407.  
  408. int __cdecl sub_8048F7A(uint16_t a1);
  409.  
  410. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD));
  411.  
  412. int __cdecl sub_804915E(const char *name);
  413.  
  414. int __cdecl sub_80491BE(int a1);
  415.  
  416. int __cdecl fill_head_with_madness(int a1);
  417.  
  418. char __cdecl sub_804939E(int a1, int a2, unsigned int a3);
  419.  
  420. int __cdecl sub_80494D4(int a1);
  421.  
  422. int __cdecl sub_8049649(int a1, int a2);
  423.  
  424. int __cdecl sub_804A296(int a1);
  425.  
  426. int __cdecl sub_804A3DC(const char *s);
  427.  
  428. int __cdecl sub_804A443(const char *filename);
  429.  
  430. char *__cdecl sub_804A60A(int a1, char *dest);
  431.  
  432. char *__cdecl (const char *s, char *dest);
  433.  
  434. int __cdecl sub_804A6C0(int fd, int a2);
  435.  
  436. int __cdecl sub_804A820(int fd, int); // idb
  437.  
  438. int __cdecl sub_804A855(int fd, int); // idb
  439.  
  440. int __cdecl check_username_n_pass(int fd, char *a2, const char *s1, const char *s);
  441.  
  442. void __cdecl sub_804A988();
  443.  
  444. signed int __cdecl user_exists(int a1, const char *s2);
  445.  
  446. int __cdecl read_yes_or_no(int fd, int); // idb
  447.  
  448. signed int __cdecl create_user(int fd, const char *s, int a3);
  449.  
  450. int __cdecl buy_eggs(int fd, const char *nptr, int a3);
  451.  
  452. int __cdecl burn_money(int fd, const char *nptr, int a3);
  453.  
  454. int __cdecl buy_chickens(int fd, const char *nptr, int a3);
  455.  
  456. int __cdecl change_info(int fd, const char *nptr, int a3);
  457.  
  458. int __cdecl try_login(int fd, int s1, char *a3);
  459.  
  460. int __cdecl print_menu(int fd); // idb
  461.  
  462. int __cdecl readfromfd(FILE *stream, int a2, unsigned int a3, char a4);
  463.  
  464. void *__cdecl allocandfillstruct(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11);
  465.  
  466. signed int __cdecl opendbandinit(const char *filename, int a2, int fd);
  467.  
  468. void __cdecl sub_804C067(int fd);
  469.  
  470. int __cdecl sub_804C09F(int a1);
  471.  
  472. void __cdecl sub_804C18B(int fd);
  473.  
  474. void __cdecl sub_804C5F0();
  475.  
  476. int *__cdecl sub_804C600();
  477.  
  478. void __cdecl sub_804C65A();
  479.  
  480. void (*__cdecl sub_804C660())(void);
  481.  
  482. void __cdecl term_proc();
  483.  
  484.  
  485.  
  486.  
  487.  
  488. //----- (08048900) --------------------------------------------------------
  489.  
  490. int __cdecl init_proc()
  491.  
  492. {
  493.  
  494.   int v1; // ST04_4@3
  495.  
  496.  
  497.  
  498.   if ( &_gmon_start__ )
  499.  
  500.     __gmon_start__();
  501.  
  502.   sub_8048D10();
  503.  
  504.   sub_804C660();
  505.  
  506.   return v1;
  507.  
  508. }
  509.  
  510. // 8048980: using guessed type int __gmon_start__(void);
  511.  
  512.  
  513.  
  514. //----- (08048C80) --------------------------------------------------------
  515.  
  516. #error "8048C83: positive sp value has been found (funcsize=2)"
  517.  
  518.  
  519.  
  520. //----- (08048CB0) --------------------------------------------------------
  521.  
  522. void __cdecl sub_8048CB0()
  523.  
  524. {
  525.  
  526.   int v0; // eax@2
  527.  
  528.   int i; // ebx@2
  529.  
  530.  
  531.  
  532.   if ( !byte_804E418 )
  533.  
  534.   {
  535.  
  536.     v0 = dword_804E41C;
  537.  
  538.     for ( i = ((signed int)(&unk_804E1E4 - (_UNKNOWN *)dword_804E1E0) >> 2) - 1;
  539.  
  540.           dword_804E41C < (unsigned int)i;
  541.  
  542.           v0 = dword_804E41C )
  543.  
  544.     {
  545.  
  546.       dword_804E41C = v0 + 1;
  547.  
  548.       ((void (*)(void))dword_804E1E0[dword_804E41C])();
  549.  
  550.     }
  551.  
  552.     byte_804E418 = 1;
  553.  
  554.   }
  555.  
  556. }
  557.  
  558. // 804E1E0: using guessed type int dword_804E1E0[];
  559.  
  560. // 804E418: using guessed type char byte_804E418;
  561.  
  562. // 804E41C: using guessed type int dword_804E41C;
  563.  
  564.  
  565.  
  566. //----- (08048D10) --------------------------------------------------------
  567.  
  568. int __cdecl sub_8048D10()
  569.  
  570. {
  571.  
  572.   int result; // eax@1
  573.  
  574.  
  575.  
  576.   result = dword_804E1E8;
  577.  
  578.   if ( dword_804E1E8 )
  579.  
  580.     result = 0;
  581.  
  582.   return result;
  583.  
  584. }
  585.  
  586. // 804E1E8: using guessed type int dword_804E1E8;
  587.  
  588.  
  589.  
  590. //----- (08048D34) --------------------------------------------------------
  591.  
  592. int __cdecl sub_8048D34()
  593.  
  594. {
  595.  
  596.   int v1; // ST1C_4@1
  597.  
  598.  
  599.  
  600.   v1 = sub_8048F7A(word_804E404);
  601.  
  602.   sub_804915E("fcfl");
  603.  
  604.   sub_80490D0(v1, (int (__cdecl *)(_DWORD))sub_804C18B);
  605.  
  606.   return 0;
  607.  
  608. }
  609.  
  610. // 804E404: using guessed type __int16 word_804E404;
  611.  
  612.  
  613.  
  614. //----- (08048D78) --------------------------------------------------------
  615.  
  616. __pid_t __cdecl handler()
  617.  
  618. {
  619.  
  620.   __pid_t result; // eax@1
  621.  
  622.   char stat_loc; // [sp+1Ch] [bp-Ch]@1
  623.  
  624.  
  625.  
  626.   do
  627.  
  628.     result = wait4(-1, &stat_loc, 1, 0);
  629.  
  630.   while ( result > 0 );
  631.  
  632.   return result;
  633.  
  634. }
  635.  
  636.  
  637.  
  638. //----- (08048E0A) --------------------------------------------------------
  639.  
  640. int __cdecl read_x_bytes_or_til_escape_char(int fd, int a2, unsigned int a3, char a4)
  641.  
  642. {
  643.  
  644.   char buf; // [sp+2Bh] [bp-Dh]@2
  645.  
  646.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  647.  
  648.  
  649.  
  650.   for ( i = 0; ; ++i )
  651.  
  652.   {
  653.  
  654.     if ( read(fd, &buf, 1u) <= 0 )
  655.  
  656.       return -1;
  657.  
  658.     if ( buf == a4 )
  659.  
  660.       return i;
  661.  
  662.     if ( i >= a3 )
  663.  
  664.       break;
  665.  
  666.     *(_BYTE *)(i + a2) = buf;
  667.  
  668.   }
  669.  
  670.   return -1;
  671.  
  672. }
  673.  
  674.  
  675.  
  676. //----- (08048E75) --------------------------------------------------------
  677.  
  678. signed int __cdecl send_with_or_without_null(int fd, const char *string, bool sendnull)
  679.  
  680. {
  681.  
  682.   unsigned int len; // eax@2
  683.  
  684.   size_t strlen; // [sp+1Ch] [bp-Ch]@1
  685.  
  686.  
  687.  
  688.   strlen = strlen(string);
  689.  
  690.   if (  sendnull )
  691.  
  692.     len = strlen + 1;
  693.  
  694.   else
  695.  
  696.     len = strlen;
  697.  
  698.   return send_data(fd, string, len);
  699.  
  700. }
  701.  
  702.  
  703.  
  704. //----- (08048EB2) --------------------------------------------------------
  705.  
  706. signed int __cdecl send_data(int fd, int a2, unsigned int a3)
  707.  
  708. {
  709.  
  710.   unsigned int i; // [sp+18h] [bp-10h]@1
  711.  
  712.   ssize_t v5; // [sp+1Ch] [bp-Ch]@2
  713.  
  714.  
  715.  
  716.   for ( i = 0; i < a3; i += v5 )
  717.  
  718.   {
  719.  
  720.     v5 = send(fd, (const void *)(a2 + i), a3 - i, 0);
  721.  
  722.     if ( !v5 )
  723.  
  724.       return -1;
  725.  
  726.   }
  727.  
  728.   return i;
  729.  
  730. }
  731.  
  732.  
  733.  
  734. //----- (08048F10) --------------------------------------------------------
  735.  
  736. int write_string(int fd, const char *a2, ...)
  737.  
  738. {
  739.  
  740.   char *s; // [sp+18h] [bp-10h]@1
  741.  
  742.   int v4; // [sp+1Ch] [bp-Ch]@1
  743.  
  744.   va_list va; // [sp+38h] [bp+10h]@1
  745.  
  746.  
  747.  
  748.   va_start(va, a2);
  749.  
  750.   v4 = 0;
  751.  
  752.   s = 0;
  753.  
  754.   if ( vasprintf(&s, a2, va) != -1 && s )
  755.  
  756.     v4 = send_with_or_without_null(fd, s, 0);
  757.  
  758.   else
  759.  
  760.     v4 = -1;
  761.  
  762.   return v4;
  763.  
  764. }
  765.  
  766.  
  767.  
  768. //----- (08048F7A) --------------------------------------------------------
  769.  
  770. int __cdecl sub_8048F7A(uint16_t a1)
  771.  
  772. {
  773.  
  774.   int optval; // [sp+2Ch] [bp-ACh]@1
  775.  
  776.   __int16 s; // [sp+BCh] [bp-1Ch]@1
  777.  
  778.   uint16_t v4; // [sp+BEh] [bp-1Ah]@1
  779.  
  780.   int fd; // [sp+CCh] [bp-Ch]@3
  781.  
  782.  
  783.  
  784.   optval = 1;
  785.  
  786.   memset(&s, 0, 0x10u);
  787.  
  788.   s = 2;
  789.  
  790.   v4 = htons(a1);
  791.  
  792.   if ( signal(17, (__sighandler_t)handler) == (__sighandler_t)-1 )
  793.  
  794.     err(-1, "Unable to set SIGCHLD handler");
  795.  
  796.   fd = socket(2, 1, 0);
  797.  
  798.   if ( fd == -1 )
  799.  
  800.     err(-1, "Unable to create socket");
  801.  
  802.   if ( setsockopt(fd, 1, 2, &optval, 4u) == -1 )
  803.  
  804.     err(-1, "Unable to set reuse");
  805.  
  806.   if ( bind(fd, (const struct sockaddr *)&s, 0x10u) == -1 )
  807.  
  808.     err(-1, "Unable to bind socket");
  809.  
  810.   if ( listen(fd, 20) == -1 )
  811.  
  812.     err(-1, "Unable to listen on socket");
  813.  
  814.   return fd;
  815.  
  816. }
  817.  
  818.  
  819.  
  820. //----- (080490D0) --------------------------------------------------------
  821.  
  822. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD))
  823.  
  824. {
  825.  
  826.   socklen_t addr_len; // [sp+1Ch] [bp-2Ch]@2
  827.  
  828.   struct sockaddr addr; // [sp+20h] [bp-28h]@2
  829.  
  830.   int v4; // [sp+30h] [bp-18h]@1
  831.  
  832.   int v5; // [sp+34h] [bp-14h]@2
  833.  
  834.   int v6; // [sp+38h] [bp-10h]@3
  835.  
  836.   int status; // [sp+3Ch] [bp-Ch]@5
  837.  
  838.  
  839.  
  840.   v4 = 1;
  841.  
  842.   while ( v4 )
  843.  
  844.   {
  845.  
  846.     addr_len = 16;
  847.  
  848.     v5 = accept(fd, &addr, &addr_len);
  849.  
  850.     if ( v5 != -1 )
  851.  
  852.     {
  853.  
  854.       v6 = fork();
  855.  
  856.       if ( v6 != -1 )
  857.  
  858.       {
  859.  
  860.         if ( !v6 )
  861.  
  862.         {
  863.  
  864.           close(fd);
  865.  
  866.           status = a2(v5);
  867.  
  868.           close(v5);
  869.  
  870.           exit(status);
  871.  
  872.         }
  873.  
  874.         close(v5);
  875.  
  876.       }
  877.  
  878.     }
  879.  
  880.   }
  881.  
  882. }
  883.  
  884.  
  885.  
  886. //----- (0804915E) --------------------------------------------------------
  887.  
  888. int __cdecl sub_804915E(const char *name)
  889.  
  890. {
  891.  
  892.   int v2; // [sp+1Ch] [bp-Ch]@1
  893.  
  894.  
  895.  
  896.   v2 = (int)getpwnam(name);
  897.  
  898.   if ( !v2 )
  899.  
  900.     err(-1, "Failed to find user %s\n", name);
  901.  
  902.   if ( sub_80491BE(v2) == -1 )
  903.  
  904.     err(-1, "drop_privs failed!\n");
  905.  
  906.   return 0;
  907.  
  908. }
  909.  
  910.  
  911.  
  912. //----- (080491BE) --------------------------------------------------------
  913.  
  914. int __cdecl sub_80491BE(int a1)
  915.  
  916. {
  917.  
  918.   int result; // eax@2
  919.  
  920.   int v2; // ebx@8
  921.  
  922.   __gid_t v3; // eax@8
  923.  
  924.   int v4; // ebx@12
  925.  
  926.   __uid_t v5; // eax@12
  927.  
  928.   __uid_t v6; // [sp+14h] [bp-14h]@1
  929.  
  930.   __gid_t v7; // [sp+18h] [bp-10h]@1
  931.  
  932.  
  933.  
  934.   v6 = getuid();
  935.  
  936.   v7 = getgid();
  937.  
  938.   initgroups(*(const char **)a1, *(_DWORD *)(a1 + 12));
  939.  
  940.   if ( setresgid(*(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 12)) >= 0 )
  941.  
  942.   {
  943.  
  944.     if ( setresuid(*(_DWORD *)(a1 + 8), *(_DWORD *)(a1 + 8)) >= 0 )
  945.  
  946.     {
  947.  
  948.       if ( *(_DWORD *)(a1 + 12) == v7 || setgid(v7) == -1 && setegid(v7) == -1 )
  949.  
  950.       {
  951.  
  952.         if ( *(_DWORD *)(a1 + 8) == v6 || setuid(v6) == -1 && seteuid(v6) == -1 )
  953.  
  954.         {
  955.  
  956.           if ( getgid() == *(_DWORD *)(a1 + 12) && getegid() == *(_DWORD *)(a1 + 12) )
  957.  
  958.           {
  959.  
  960.             if ( getuid() == *(_DWORD *)(a1 + 8) && geteuid() == *(_DWORD *)(a1 + 8) )
  961.  
  962.               result = chdir(*(const char **)(a1 + 20));
  963.  
  964.             else
  965.  
  966.               result = -1;
  967.  
  968.           }
  969.  
  970.           else
  971.  
  972.           {
  973.  
  974.             result = -1;
  975.  
  976.           }
  977.  
  978.         }
  979.  
  980.         else
  981.  
  982.         {
  983.  
  984.           v4 = *(_DWORD *)(a1 + 8);
  985.  
  986.           v5 = getuid();
  987.  
  988.           printf("setgid current uid: %d target uid: %d\n", v5, v4);
  989.  
  990.           result = -1;
  991.  
  992.         }
  993.  
  994.       }
  995.  
  996.       else
  997.  
  998.       {
  999.  
  1000.         v2 = *(_DWORD *)(a1 + 12);
  1001.  
  1002.         v3 = getgid();
  1003.  
  1004.         printf("setgid current gid: %d target gid: %d\n", v3, v2);
  1005.  
  1006.         result = -1;
  1007.  
  1008.       }
  1009.  
  1010.     }
  1011.  
  1012.     else
  1013.  
  1014.     {
  1015.  
  1016.       result = -1;
  1017.  
  1018.     }
  1019.  
  1020.   }
  1021.  
  1022.   else
  1023.  
  1024.   {
  1025.  
  1026.     result = -1;
  1027.  
  1028.   }
  1029.  
  1030.   return result;
  1031.  
  1032. }
  1033.  
  1034. // 8048A30: using guessed type int __cdecl setresuid(_DWORD, _DWORD);
  1035.  
  1036. // 8048A40: using guessed type int __cdecl setresgid(_DWORD, _DWORD);
  1037.  
  1038.  
  1039.  
  1040. //----- (0804935C) --------------------------------------------------------
  1041.  
  1042. int __cdecl fill_head_with_madness(int a1)
  1043.  
  1044. {
  1045.  
  1046.   int result; // eax@1
  1047.  
  1048.  
  1049.  
  1050.   *(_DWORD *)(a1 + 4) = 0;
  1051.  
  1052.   *(_DWORD *)a1 = *(_DWORD *)(a1 + 4);
  1053.  
  1054.   *(_DWORD *)(a1 + 8) = -559038737;
  1055.  
  1056.   *(_DWORD *)(a1 + 12) = -782326291;
  1057.  
  1058.   *(_DWORD *)(a1 + 16) = -553727763;
  1059.  
  1060.   result = a1;
  1061.  
  1062.   *(_DWORD *)(a1 + 20) = -1161901314;
  1063.  
  1064.   return result;
  1065.  
  1066. }
  1067.  
  1068.  
  1069.  
  1070. //----- (0804939E) --------------------------------------------------------
  1071.  
  1072. char __cdecl sub_804939E(int a1, int a2, unsigned int a3)
  1073.  
  1074. {
  1075.  
  1076.   char result; // al@9
  1077.  
  1078.   int v4[16]; // [sp+14h] [bp-54h]@6
  1079.  
  1080.   int v5; // [sp+54h] [bp-14h]@1
  1081.  
  1082.   unsigned int v6; // [sp+58h] [bp-10h]@5
  1083.  
  1084.   int v7; // [sp+5Ch] [bp-Ch]@5
  1085.  
  1086.  
  1087.  
  1088.   v5 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1089.  
  1090.   if ( *(_DWORD *)a1 + 8 * a3 < *(_DWORD *)a1 )
  1091.  
  1092.     ++*(_DWORD *)(a1 + 4);
  1093.  
  1094.   *(_DWORD *)a1 += 8 * a3;
  1095.  
  1096.   *(_DWORD *)(a1 + 4) += a3 >> 29;
  1097.  
  1098.   while ( 1 )
  1099.  
  1100.   {
  1101.  
  1102.     result = a3-- != 0;
  1103.  
  1104.     if ( !result )
  1105.  
  1106.       break;
  1107.  
  1108.     *(_BYTE *)(a1 + v5++ + 24) = *(_BYTE *)a2++;
  1109.  
  1110.     if ( v5 == 64 )
  1111.  
  1112.     {
  1113.  
  1114.       v6 = 0;
  1115.  
  1116.       v7 = 0;
  1117.  
  1118.       while ( v6 <= 0xF )
  1119.  
  1120.       {
  1121.  
  1122.         v4[v6++] = (*(_BYTE *)(a1 + v7 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v7 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v7 + 3 + 24) << 24) | *(_BYTE *)(a1 + v7 + 24);
  1123.  
  1124.         v7 += 4;
  1125.  
  1126.       }
  1127.  
  1128.       sub_8049649(a1 + 8, (int)v4);
  1129.  
  1130.       v5 = 0;
  1131.  
  1132.     }
  1133.  
  1134.   }
  1135.  
  1136.   return result;
  1137.  
  1138. }
  1139.  
  1140. // 804939E: using guessed type int var_54[16];
  1141.  
  1142.  
  1143.  
  1144. //----- (080494D4) --------------------------------------------------------
  1145.  
  1146. int __cdecl sub_80494D4(int a1)
  1147.  
  1148. {
  1149.  
  1150.   unsigned int v1; // eax@2
  1151.  
  1152.   int result; // eax@7
  1153.  
  1154.   int v3[14]; // [sp+10h] [bp-58h]@5
  1155.  
  1156.   int v4; // [sp+48h] [bp-20h]@1
  1157.  
  1158.   int v5; // [sp+4Ch] [bp-1Ch]@1
  1159.  
  1160.   int v6; // [sp+50h] [bp-18h]@1
  1161.  
  1162.   unsigned int v7; // [sp+54h] [bp-14h]@4
  1163.  
  1164.   int v8; // [sp+58h] [bp-10h]@4
  1165.  
  1166.   unsigned int v9; // [sp+5Ch] [bp-Ch]@4
  1167.  
  1168.  
  1169.  
  1170.   v4 = *(_DWORD *)a1;
  1171.  
  1172.   v5 = *(_DWORD *)(a1 + 4);
  1173.  
  1174.   v6 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1175.  
  1176.   if ( v6 > 55 )
  1177.  
  1178.     v1 = 120 - v6;
  1179.  
  1180.   else
  1181.  
  1182.     v1 = 56 - v6;
  1183.  
  1184.   v9 = v1;
  1185.  
  1186.   sub_804939E(a1, (int)&unk_804E3C0, v1);
  1187.  
  1188.   v7 = 0;
  1189.  
  1190.   v8 = 0;
  1191.  
  1192.   while ( v7 <= 0xD )
  1193.  
  1194.   {
  1195.  
  1196.     v3[v7++] = (*(_BYTE *)(a1 + v8 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v8 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v8 + 3 + 24) << 24) | *(_BYTE *)(a1 + v8 + 24);
  1197.  
  1198.     v8 += 4;
  1199.  
  1200.   }
  1201.  
  1202.   result = sub_8049649(a1 + 8, (int)v3);
  1203.  
  1204.   v7 = 0;
  1205.  
  1206.   v8 = 0;
  1207.  
  1208.   while ( v7 <= 3 )
  1209.  
  1210.   {
  1211.  
  1212.     *(_BYTE *)(a1 + v8 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8);
  1213.  
  1214.     *(_BYTE *)(a1 + v8 + 1 + 88) = *(_WORD *)(a1 + 4 * v7 + 8) >> 8;
  1215.  
  1216.     *(_BYTE *)(a1 + v8 + 2 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8) >> 16;
  1217.  
  1218.     result = a1;
  1219.  
  1220.     *(_BYTE *)(a1 + v8 + 3 + 88) = *(_DWORD *)(a1 + 4 * v7++ + 8) >> 24;
  1221.  
  1222.     v8 += 4;
  1223.  
  1224.   }
  1225.  
  1226.   return result;
  1227.  
  1228. }
  1229.  
  1230. // 80494D4: using guessed type int var_58[14];
  1231.  
  1232.  
  1233.  
  1234. //----- (08049649) --------------------------------------------------------
  1235.  
  1236. int __cdecl sub_8049649(int a1, int a2)
  1237.  
  1238. {
  1239.  
  1240.   int result; // eax@1
  1241.  
  1242.   int v3; // ST04_4@1
  1243.  
  1244.   int v4; // ST08_4@1
  1245.  
  1246.   int v5; // ST0C_4@1
  1247.  
  1248.   int v6; // et0@1
  1249.  
  1250.   int v7; // ST00_4@1
  1251.  
  1252.   int v8; // et0@1
  1253.  
  1254.   int v9; // ST0C_4@1
  1255.  
  1256.   int v10; // et0@1
  1257.  
  1258.   int v11; // ST08_4@1
  1259.  
  1260.   int v12; // et0@1
  1261.  
  1262.   int v13; // ST04_4@1
  1263.  
  1264.   int v14; // et0@1
  1265.  
  1266.   int v15; // ST00_4@1
  1267.  
  1268.   int v16; // et0@1
  1269.  
  1270.   int v17; // ST0C_4@1
  1271.  
  1272.   int v18; // et0@1
  1273.  
  1274.   int v19; // ST08_4@1
  1275.  
  1276.   int v20; // et0@1
  1277.  
  1278.   int v21; // ST04_4@1
  1279.  
  1280.   int v22; // et0@1
  1281.  
  1282.   int v23; // ST00_4@1
  1283.  
  1284.   int v24; // et0@1
  1285.  
  1286.   int v25; // ST0C_4@1
  1287.  
  1288.   int v26; // et0@1
  1289.  
  1290.   int v27; // ST08_4@1
  1291.  
  1292.   int v28; // et0@1
  1293.  
  1294.   int v29; // ST04_4@1
  1295.  
  1296.   int v30; // et0@1
  1297.  
  1298.   int v31; // ST00_4@1
  1299.  
  1300.   int v32; // et0@1
  1301.  
  1302.   int v33; // ST0C_4@1
  1303.  
  1304.   int v34; // et0@1
  1305.  
  1306.   int v35; // ST08_4@1
  1307.  
  1308.   int v36; // et0@1
  1309.  
  1310.   int v37; // ST04_4@1
  1311.  
  1312.   int v38; // et0@1
  1313.  
  1314.   int v39; // ST00_4@1
  1315.  
  1316.   int v40; // et0@1
  1317.  
  1318.   int v41; // ST0C_4@1
  1319.  
  1320.   int v42; // et0@1
  1321.  
  1322.   int v43; // ST08_4@1
  1323.  
  1324.   int v44; // et0@1
  1325.  
  1326.   int v45; // ST04_4@1
  1327.  
  1328.   int v46; // et0@1
  1329.  
  1330.   int v47; // ST00_4@1
  1331.  
  1332.   int v48; // et0@1
  1333.  
  1334.   int v49; // ST0C_4@1
  1335.  
  1336.   int v50; // et0@1
  1337.  
  1338.   int v51; // ST08_4@1
  1339.  
  1340.   int v52; // et0@1
  1341.  
  1342.   int v53; // ST04_4@1
  1343.  
  1344.   int v54; // et0@1
  1345.  
  1346.   int v55; // ST00_4@1
  1347.  
  1348.   int v56; // et0@1
  1349.  
  1350.   int v57; // ST0C_4@1
  1351.  
  1352.   int v58; // et0@1
  1353.  
  1354.   int v59; // ST08_4@1
  1355.  
  1356.   int v60; // et0@1
  1357.  
  1358.   int v61; // ST04_4@1
  1359.  
  1360.   int v62; // et0@1
  1361.  
  1362.   int v63; // ST00_4@1
  1363.  
  1364.   int v64; // et0@1
  1365.  
  1366.   int v65; // ST0C_4@1
  1367.  
  1368.   int v66; // et0@1
  1369.  
  1370.   int v67; // ST08_4@1
  1371.  
  1372.   int v68; // et0@1
  1373.  
  1374.   int v69; // ST04_4@1
  1375.  
  1376.   int v70; // et0@1
  1377.  
  1378.   int v71; // ST00_4@1
  1379.  
  1380.   int v72; // et0@1
  1381.  
  1382.   int v73; // ST0C_4@1
  1383.  
  1384.   int v74; // et0@1
  1385.  
  1386.   int v75; // ST08_4@1
  1387.  
  1388.   int v76; // et0@1
  1389.  
  1390.   int v77; // ST04_4@1
  1391.  
  1392.   int v78; // et0@1
  1393.  
  1394.   int v79; // ST00_4@1
  1395.  
  1396.   int v80; // et0@1
  1397.  
  1398.   int v81; // ST0C_4@1
  1399.  
  1400.   int v82; // et0@1
  1401.  
  1402.   int v83; // ST08_4@1
  1403.  
  1404.   int v84; // et0@1
  1405.  
  1406.   int v85; // ST04_4@1
  1407.  
  1408.   int v86; // et0@1
  1409.  
  1410.   int v87; // ST00_4@1
  1411.  
  1412.   int v88; // et0@1
  1413.  
  1414.   int v89; // ST0C_4@1
  1415.  
  1416.   int v90; // et0@1
  1417.  
  1418.   int v91; // ST08_4@1
  1419.  
  1420.   int v92; // et0@1
  1421.  
  1422.   int v93; // ST04_4@1
  1423.  
  1424.   int v94; // et0@1
  1425.  
  1426.   int v95; // ST00_4@1
  1427.  
  1428.   int v96; // et0@1
  1429.  
  1430.   int v97; // ST0C_4@1
  1431.  
  1432.   int v98; // et0@1
  1433.  
  1434.   int v99; // ST08_4@1
  1435.  
  1436.   int v100; // et0@1
  1437.  
  1438.   int v101; // ST04_4@1
  1439.  
  1440.   int v102; // et0@1
  1441.  
  1442.   int v103; // ST00_4@1
  1443.  
  1444.   int v104; // et0@1
  1445.  
  1446.   int v105; // ST0C_4@1
  1447.  
  1448.   int v106; // et0@1
  1449.  
  1450.   int v107; // ST08_4@1
  1451.  
  1452.   int v108; // et0@1
  1453.  
  1454.   int v109; // ST04_4@1
  1455.  
  1456.   int v110; // et0@1
  1457.  
  1458.   int v111; // ST00_4@1
  1459.  
  1460.   int v112; // et0@1
  1461.  
  1462.   int v113; // ST0C_4@1
  1463.  
  1464.   int v114; // et0@1
  1465.  
  1466.   int v115; // ST08_4@1
  1467.  
  1468.   int v116; // et0@1
  1469.  
  1470.   int v117; // ST04_4@1
  1471.  
  1472.   int v118; // et0@1
  1473.  
  1474.   int v119; // ST00_4@1
  1475.  
  1476.   int v120; // et0@1
  1477.  
  1478.   int v121; // ST0C_4@1
  1479.  
  1480.   int v122; // et0@1
  1481.  
  1482.   int v123; // ST08_4@1
  1483.  
  1484.   int v124; // et0@1
  1485.  
  1486.   int v125; // ST04_4@1
  1487.  
  1488.   int v126; // et0@1
  1489.  
  1490.   int v127; // ST00_4@1
  1491.  
  1492.   int v128; // et0@1
  1493.  
  1494.   int v129; // ST0C_4@1
  1495.  
  1496.   int v130; // et0@1
  1497.  
  1498.   int v131; // ST08_4@1
  1499.  
  1500.   int v132; // et0@1
  1501.  
  1502.  
  1503.  
  1504.   v3 = *(_DWORD *)(a1 + 4);
  1505.  
  1506.   v4 = *(_DWORD *)(a1 + 8);
  1507.  
  1508.   v5 = *(_DWORD *)(a1 + 12);
  1509.  
  1510.   v6 = __ROR__(*(_DWORD *)a1 + (v5 & ~v3 | v4 & v3) + *(_DWORD *)a2 - 680876936, 25);
  1511.  
  1512.   v7 = v3 + v6;
  1513.  
  1514.   v8 = __ROR__(v5 + (v4 & ~(v3 + v6) | v3 & (v3 + v6)) + *(_DWORD *)(a2 + 4) - 389564586, 20);
  1515.  
  1516.   v9 = v7 + v8;
  1517.  
  1518.   v10 = __ROR__(v4 + (v3 & ~(v7 + v8) | v7 & (v7 + v8)) + *(_DWORD *)(a2 + 8) + 606105819, 15);
  1519.  
  1520.   v11 = v9 + v10;
  1521.  
  1522.   v12 = __ROR__(v3 + (v7 & ~(v9 + v10) | v9 & (v9 + v10)) + *(_DWORD *)(a2 + 12) - 1044525330, 10);
  1523.  
  1524.   v13 = v11 + v12;
  1525.  
  1526.   v14 = __ROR__(v7 + (v9 & ~(v11 + v12) | v11 & (v11 + v12)) + *(_DWORD *)(a2 + 16) - 176418897, 25);
  1527.  
  1528.   v15 = v13 + v14;
  1529.  
  1530.   v16 = __ROR__(v9 + (v11 & ~(v13 + v14) | v13 & (v13 + v14)) + *(_DWORD *)(a2 + 20) + 1200080426, 20);
  1531.  
  1532.   v17 = v15 + v16;
  1533.  
  1534.   v18 = __ROR__(v11 + (v13 & ~(v15 + v16) | v15 & (v15 + v16)) + *(_DWORD *)(a2 + 24) - 1473231341, 15);
  1535.  
  1536.   v19 = v17 + v18;
  1537.  
  1538.   v20 = __ROR__(v13 + (v15 & ~(v17 + v18) | v17 & (v17 + v18)) + *(_DWORD *)(a2 + 28) - 45705983, 10);
  1539.  
  1540.   v21 = v19 + v20;
  1541.  
  1542.   v22 = __ROR__(v15 + (v17 & ~(v19 + v20) | v19 & (v19 + v20)) + *(_DWORD *)(a2 + 32) + 1770035416, 25);
  1543.  
  1544.   v23 = v21 + v22;
  1545.  
  1546.   v24 = __ROR__(v17 + (v19 & ~(v21 + v22) | v21 & (v21 + v22)) + *(_DWORD *)(a2 + 36) - 1958414417, 20);
  1547.  
  1548.   v25 = v23 + v24;
  1549.  
  1550.   v26 = __ROR__(v19 + (v21 & ~(v23 + v24) | v23 & (v23 + v24)) + *(_DWORD *)(a2 + 40) - 42063, 15);
  1551.  
  1552.   v27 = v25 + v26;
  1553.  
  1554.   v28 = __ROR__(v21 + (v23 & ~(v25 + v26) | v25 & (v25 + v26)) + *(_DWORD *)(a2 + 44) - 1990404162, 10);
  1555.  
  1556.   v29 = v27 + v28;
  1557.  
  1558.   v30 = __ROR__(v23 + (v25 & ~(v27 + v28) | v27 & (v27 + v28)) + *(_DWORD *)(a2 + 48) + 1804603682, 25);
  1559.  
  1560.   v31 = v29 + v30;
  1561.  
  1562.   v32 = __ROR__(v25 + (v27 & ~(v29 + v30) | v29 & (v29 + v30)) + *(_DWORD *)(a2 + 52) - 40341101, 20);
  1563.  
  1564.   v33 = v31 + v32;
  1565.  
  1566.   v34 = __ROR__(v27 + (v29 & ~(v31 + v32) | v31 & (v31 + v32)) + *(_DWORD *)(a2 + 56) - 1502002290, 15);
  1567.  
  1568.   v35 = v33 + v34;
  1569.  
  1570.   v36 = __ROR__(v29 + (v31 & ~(v33 + v34) | v33 & (v33 + v34)) + *(_DWORD *)(a2 + 60) + 1236535329, 10);
  1571.  
  1572.   v37 = v35 + v36;
  1573.  
  1574.   v38 = __ROR__(v31 + (v35 & ~v33 | v33 & (v35 + v36)) + *(_DWORD *)(a2 + 4) - 165796510, 27);
  1575.  
  1576.   v39 = v37 + v38;
  1577.  
  1578.   v40 = __ROR__(v33 + (v37 & ~v35 | v35 & (v37 + v38)) + *(_DWORD *)(a2 + 24) - 1069501632, 23);
  1579.  
  1580.   v41 = v39 + v40;
  1581.  
  1582.   v42 = __ROR__(v35 + (v39 & ~v37 | v37 & (v39 + v40)) + *(_DWORD *)(a2 + 44) + 643717713, 18);
  1583.  
  1584.   v43 = v41 + v42;
  1585.  
  1586.   v44 = __ROR__(v37 + (v41 & ~v39 | v39 & (v41 + v42)) + *(_DWORD *)a2 - 373897302, 12);
  1587.  
  1588.   v45 = v43 + v44;
  1589.  
  1590.   v46 = __ROR__(v39 + (v43 & ~v41 | v41 & (v43 + v44)) + *(_DWORD *)(a2 + 20) - 701558691, 27);
  1591.  
  1592.   v47 = v45 + v46;
  1593.  
  1594.   v48 = __ROR__(v41 + (v45 & ~v43 | v43 & (v45 + v46)) + *(_DWORD *)(a2 + 40) + 38016083, 23);
  1595.  
  1596.   v49 = v47 + v48;
  1597.  
  1598.   v50 = __ROR__(v43 + (v47 & ~v45 | v45 & (v47 + v48)) + *(_DWORD *)(a2 + 60) - 660478335, 18);
  1599.  
  1600.   v51 = v49 + v50;
  1601.  
  1602.   v52 = __ROR__(v45 + (v49 & ~v47 | v47 & (v49 + v50)) + *(_DWORD *)(a2 + 16) - 405537848, 12);
  1603.  
  1604.   v53 = v51 + v52;
  1605.  
  1606.   v54 = __ROR__(v47 + (v51 & ~v49 | v49 & (v51 + v52)) + *(_DWORD *)(a2 + 36) + 568446438, 27);
  1607.  
  1608.   v55 = v53 + v54;
  1609.  
  1610.   v56 = __ROR__(v49 + (v53 & ~v51 | v51 & (v53 + v54)) + *(_DWORD *)(a2 + 56) - 1019803690, 23);
  1611.  
  1612.   v57 = v55 + v56;
  1613.  
  1614.   v58 = __ROR__(v51 + (v55 & ~v53 | v53 & (v55 + v56)) + *(_DWORD *)(a2 + 12) - 187363961, 18);
  1615.  
  1616.   v59 = v57 + v58;
  1617.  
  1618.   v60 = __ROR__(v53 + (v57 & ~v55 | v55 & (v57 + v58)) + *(_DWORD *)(a2 + 32) + 1163531501, 12);
  1619.  
  1620.   v61 = v59 + v60;
  1621.  
  1622.   v62 = __ROR__(v55 + (v59 & ~v57 | v57 & (v59 + v60)) + *(_DWORD *)(a2 + 52) - 1444681467, 27);
  1623.  
  1624.   v63 = v61 + v62;
  1625.  
  1626.   v64 = __ROR__(v57 + (v61 & ~v59 | v59 & (v61 + v62)) + *(_DWORD *)(a2 + 8) - 51403784, 23);
  1627.  
  1628.   v65 = v63 + v64;
  1629.  
  1630.   v66 = __ROR__(v59 + (v63 & ~v61 | v61 & (v63 + v64)) + *(_DWORD *)(a2 + 28) + 1735328473, 18);
  1631.  
  1632.   v67 = v65 + v66;
  1633.  
  1634.   v68 = __ROR__(v61 + (v65 & ~v63 | v63 & (v65 + v66)) + *(_DWORD *)(a2 + 48) - 1926607734, 12);
  1635.  
  1636.   v69 = v67 + v68;
  1637.  
  1638.   v70 = __ROR__(v63 + (v65 ^ (v67 + v68) ^ v67) + *(_DWORD *)(a2 + 20) - 378558, 28);
  1639.  
  1640.   v71 = v69 + v70;
  1641.  
  1642.   v72 = __ROR__(v65 + (v67 ^ (v69 + v70) ^ v69) + *(_DWORD *)(a2 + 32) - 2022574463, 21);
  1643.  
  1644.   v73 = v71 + v72;
  1645.  
  1646.   v74 = __ROR__(v67 + (v69 ^ (v71 + v72) ^ v71) + *(_DWORD *)(a2 + 44) + 1839030562, 16);
  1647.  
  1648.   v75 = v73 + v74;
  1649.  
  1650.   v76 = __ROR__(v69 + (v71 ^ (v73 + v74) ^ v73) + *(_DWORD *)(a2 + 56) - 35309556, 9);
  1651.  
  1652.   v77 = v75 + v76;
  1653.  
  1654.   v78 = __ROR__(v71 + (v73 ^ (v75 + v76) ^ v75) + *(_DWORD *)(a2 + 4) - 1530992060, 28);
  1655.  
  1656.   v79 = v77 + v78;
  1657.  
  1658.   v80 = __ROR__(v73 + (v75 ^ (v77 + v78) ^ v77) + *(_DWORD *)(a2 + 16) + 1272893353, 21);
  1659.  
  1660.   v81 = v79 + v80;
  1661.  
  1662.   v82 = __ROR__(v75 + (v77 ^ (v79 + v80) ^ v79) + *(_DWORD *)(a2 + 28) - 155497632, 16);
  1663.  
  1664.   v83 = v81 + v82;
  1665.  
  1666.   v84 = __ROR__(v77 + (v79 ^ (v81 + v82) ^ v81) + *(_DWORD *)(a2 + 40) - 1094730640, 9);
  1667.  
  1668.   v85 = v83 + v84;
  1669.  
  1670.   v86 = __ROR__(v79 + (v81 ^ (v83 + v84) ^ v83) + *(_DWORD *)(a2 + 52) + 681279174, 28);
  1671.  
  1672.   v87 = v85 + v86;
  1673.  
  1674.   v88 = __ROR__(v81 + (v83 ^ (v85 + v86) ^ v85) + *(_DWORD *)a2 - 358537222, 21);
  1675.  
  1676.   v89 = v87 + v88;
  1677.  
  1678.   v90 = __ROR__(v83 + (v85 ^ (v87 + v88) ^ v87) + *(_DWORD *)(a2 + 12) - 722521979, 16);
  1679.  
  1680.   v91 = v89 + v90;
  1681.  
  1682.   v92 = __ROR__(v85 + (v87 ^ (v89 + v90) ^ v89) + *(_DWORD *)(a2 + 24) + 76029189, 9);
  1683.  
  1684.   v93 = v91 + v92;
  1685.  
  1686.   v94 = __ROR__(v87 + (v89 ^ (v91 + v92) ^ v91) + *(_DWORD *)(a2 + 36) - 640364487, 28);
  1687.  
  1688.   v95 = v93 + v94;
  1689.  
  1690.   v96 = __ROR__(v89 + (v91 ^ (v93 + v94) ^ v93) + *(_DWORD *)(a2 + 48) - 421815835, 21);
  1691.  
  1692.   v97 = v95 + v96;
  1693.  
  1694.   v98 = __ROR__(v91 + (v93 ^ (v95 + v96) ^ v95) + *(_DWORD *)(a2 + 60) + 530742520, 16);
  1695.  
  1696.   v99 = v97 + v98;
  1697.  
  1698.   v100 = __ROR__(v93 + (v95 ^ (v97 + v98) ^ v97) + *(_DWORD *)(a2 + 8) - 995338651, 9);
  1699.  
  1700.   v101 = v99 + v100;
  1701.  
  1702.   v102 = __ROR__(v95 + (v99 ^ ((v99 + v100) | ~v97)) + *(_DWORD *)a2 - 198630844, 26);
  1703.  
  1704.   v103 = v101 + v102;
  1705.  
  1706.   v104 = __ROR__(v97 + (v101 ^ ((v101 + v102) | ~v99)) + *(_DWORD *)(a2 + 28) + 1126891415, 22);
  1707.  
  1708.   v105 = v103 + v104;
  1709.  
  1710.   v106 = __ROR__(v99 + (v103 ^ ((v103 + v104) | ~v101)) + *(_DWORD *)(a2 + 56) - 1416354905, 17);
  1711.  
  1712.   v107 = v105 + v106;
  1713.  
  1714.   v108 = __ROR__(v101 + (v105 ^ ((v105 + v106) | ~v103)) + *(_DWORD *)(a2 + 20) - 57434055, 11);
  1715.  
  1716.   v109 = v107 + v108;
  1717.  
  1718.   v110 = __ROR__(v103 + (v107 ^ ((v107 + v108) | ~v105)) + *(_DWORD *)(a2 + 48) + 1700485571, 26);
  1719.  
  1720.   v111 = v109 + v110;
  1721.  
  1722.   v112 = __ROR__(v105 + (v109 ^ ((v109 + v110) | ~v107)) + *(_DWORD *)(a2 + 12) - 1894986606, 22);
  1723.  
  1724.   v113 = v111 + v112;
  1725.  
  1726.   v114 = __ROR__(v107 + (v111 ^ ((v111 + v112) | ~v109)) + *(_DWORD *)(a2 + 40) - 1051523, 17);
  1727.  
  1728.   v115 = v113 + v114;
  1729.  
  1730.   v116 = __ROR__(v109 + (v113 ^ ((v113 + v114) | ~v111)) + *(_DWORD *)(a2 + 4) - 2054922799, 11);
  1731.  
  1732.   v117 = v115 + v116;
  1733.  
  1734.   v118 = __ROR__(v111 + (v115 ^ ((v115 + v116) | ~v113)) + *(_DWORD *)(a2 + 32) + 1873313359, 26);
  1735.  
  1736.   v119 = v117 + v118;
  1737.  
  1738.   v120 = __ROR__(v113 + (v117 ^ ((v117 + v118) | ~v115)) + *(_DWORD *)(a2 + 60) - 30611744, 22);
  1739.  
  1740.   v121 = v119 + v120;
  1741.  
  1742.   v122 = __ROR__(v115 + (v119 ^ ((v119 + v120) | ~v117)) + *(_DWORD *)(a2 + 24) - 1560198380, 17);
  1743.  
  1744.   v123 = v121 + v122;
  1745.  
  1746.   v124 = __ROR__(v117 + (v121 ^ ((v121 + v122) | ~v119)) + *(_DWORD *)(a2 + 52) + 1309151649, 11);
  1747.  
  1748.   v125 = v123 + v124;
  1749.  
  1750.   v126 = __ROR__(v119 + (v123 ^ ((v123 + v124) | ~v121)) + *(_DWORD *)(a2 + 16) - 145523070, 26);
  1751.  
  1752.   v127 = v125 + v126;
  1753.  
  1754.   v128 = __ROR__(v121 + (v125 ^ ((v125 + v126) | ~v123)) + *(_DWORD *)(a2 + 44) - 1120210379, 22);
  1755.  
  1756.   v129 = v127 + v128;
  1757.  
  1758.   v130 = __ROR__(v123 + (v127 ^ ((v127 + v128) | ~v125)) + *(_DWORD *)(a2 + 8) + 718787259, 17);
  1759.  
  1760.   v131 = v129 + v130;
  1761.  
  1762.   v132 = __ROR__(v125 + (v129 ^ ((v129 + v130) | ~v127)) + *(_DWORD *)(a2 + 36) - 343485551, 11);
  1763.  
  1764.   *(_DWORD *)a1 += v127;
  1765.  
  1766.   *(_DWORD *)(a1 + 4) += v131 + v132;
  1767.  
  1768.   *(_DWORD *)(a1 + 8) += v131;
  1769.  
  1770.   result = v129 + *(_DWORD *)(a1 + 12);
  1771.  
  1772.   *(_DWORD *)(a1 + 12) = result;
  1773.  
  1774.   return result;
  1775.  
  1776. }
  1777.  
  1778.  
  1779.  
  1780. //----- (0804A296) --------------------------------------------------------
  1781.  
  1782. int __cdecl sub_804A296(int a1)
  1783.  
  1784. {
  1785.  
  1786.   int result; // eax@2
  1787.  
  1788.   signed int i; // [sp+1Ch] [bp-Ch]@1
  1789.  
  1790.  
  1791.  
  1792.   for ( i = 0; i <= 15; ++i )
  1793.  
  1794.     result = printf("%02x", *(_BYTE *)(a1 + i + 88));
  1795.  
  1796.   return result;
  1797.  
  1798. }
  1799.  
  1800.  
  1801.  
  1802. //----- (0804A3DC) --------------------------------------------------------
  1803.  
  1804. int __cdecl sub_804A3DC(const char *s)
  1805.  
  1806. {
  1807.  
  1808.   char v2; // [sp+14h] [bp-74h]@1
  1809.  
  1810.   unsigned int v3; // [sp+7Ch] [bp-Ch]@1
  1811.  
  1812.  
  1813.  
  1814.   v3 = strlen(s);
  1815.  
  1816.   fill_head_with_madness((int)&v2);
  1817.  
  1818.   sub_804939E((int)&v2, (int)s, v3);
  1819.  
  1820.   sub_80494D4((int)&v2);
  1821.  
  1822.   sub_804A296((int)&v2);
  1823.  
  1824.   return printf(" \"%s\"\n\n", s);
  1825.  
  1826. }
  1827.  
  1828.  
  1829.  
  1830. //----- (0804A443) --------------------------------------------------------
  1831.  
  1832. int __cdecl sub_804A443(const char *filename)
  1833.  
  1834. {
  1835.  
  1836.   int result; // eax@2
  1837.  
  1838.   char ptr; // [sp+10h] [bp-478h]@4
  1839.  
  1840.   char v3; // [sp+410h] [bp-78h]@3
  1841.  
  1842.   FILE *stream; // [sp+478h] [bp-10h]@1
  1843.  
  1844.   unsigned int v5; // [sp+47Ch] [bp-Ch]@4
  1845.  
  1846.  
  1847.  
  1848.   stream = fopen(filename, "rb");
  1849.  
  1850.   if ( stream )
  1851.  
  1852.   {
  1853.  
  1854.     fill_head_with_madness((int)&v3);
  1855.  
  1856.     while ( 1 )
  1857.  
  1858.     {
  1859.  
  1860.       v5 = fread(&ptr, 1u, 0x400u, stream);
  1861.  
  1862.       if ( !v5 )
  1863.  
  1864.         break;
  1865.  
  1866.       sub_804939E((int)&v3, (int)&ptr, v5);
  1867.  
  1868.     }
  1869.  
  1870.     sub_80494D4((int)&v3);
  1871.  
  1872.     sub_804A296((int)&v3);
  1873.  
  1874.     printf(" %s\n", filename);
  1875.  
  1876.     result = fclose(stream);
  1877.  
  1878.   }
  1879.  
  1880.   else
  1881.  
  1882.   {
  1883.  
  1884.     result = printf("%s can't be opened.\n", filename);
  1885.  
  1886.   }
  1887.  
  1888.   return result;
  1889.  
  1890. }
  1891.  
  1892.  
  1893.  
  1894. //----- (0804A60A) --------------------------------------------------------
  1895.  
  1896. char *__cdecl sub_804A60A(int a1, char *dest)
  1897.  
  1898. {
  1899.  
  1900.   char *result; // eax@1
  1901.  
  1902.   char src; // [sp+16h] [bp-42h]@2
  1903.  
  1904.   int i; // [sp+48h] [bp-10h]@1
  1905.  
  1906.   int v5; // [sp+4Ch] [bp-Ch]@2
  1907.  
  1908.  
  1909.  
  1910.   result = dest;
  1911.  
  1912.   *dest = 0;
  1913.  
  1914.   for ( i = 0; i <= 15; ++i )
  1915.  
  1916.   {
  1917.  
  1918.     v5 = sprintf(&src, "%02x", *(_BYTE *)(a1 + i + 88));
  1919.  
  1920.     result = strcat(dest, &src);
  1921.  
  1922.   }
  1923.  
  1924.   return result;
  1925.  
  1926. }
  1927.  
  1928.  
  1929.  
  1930. //----- (0804A666) --------------------------------------------------------
  1931.  
  1932. char *__cdecl md5(const char *s, char *dest)
  1933.  
  1934. {
  1935.  
  1936.   int v3; // [sp+14h] [bp-74h]@1
  1937.  
  1938.   unsigned int v4; // [sp+7Ch] [bp-Ch]@1
  1939.  
  1940.  
  1941.  
  1942.   v4 = strlen(s);
  1943.  
  1944.   fill_head_with_madness((int)&v3);
  1945.  
  1946.   sub_804939E((int)&v3, (int)s, v4);
  1947.  
  1948.   sub_80494D4((int)&v3);
  1949.  
  1950.   return sub_804A60A((int)&v3, dest);
  1951.  
  1952. }
  1953.  
  1954.  
  1955.  
  1956. //----- (0804A6C0) --------------------------------------------------------
  1957.  
  1958. int __cdecl sub_804A6C0(int fd, int a2)
  1959.  
  1960. {
  1961.  
  1962.   write_string(fd, "<node> %x\n", a2);
  1963.  
  1964.   write_string(fd, "  chickens: %u \n", *(_DWORD *)(a2 + 60));
  1965.  
  1966.   write_string(fd, "  eggs:     %u \n", *(_DWORD *)(a2 + 68));
  1967.  
  1968.   write_string(fd, "  monies:   %u \n", *(_DWORD *)(a2 + 64));
  1969.  
  1970.   write_string(fd, "  id:       %u \n", *(_DWORD *)(a2 + 72));
  1971.  
  1972.   write_string(fd, "  username: %s \n", a2);
  1973.  
  1974.   write_string(fd, "  info:     %s \n", a2 + 84);
  1975.  
  1976.   write_string(fd, "  office:   %s \n", a2 + 134);
  1977.  
  1978.   write_string(fd, "  password: %s \n\n", a2 + 20);
  1979.  
  1980.   write_string(fd, "  perm:     %u \n", *(_DWORD *)(a2 + 56));
  1981.  
  1982.   write_string(fd, "  next:     %x \n", *(_DWORD *)(a2 + 76));
  1983.  
  1984.   return write_string(fd, "  prev:     %x \n", *(_DWORD *)(a2 + 80));
  1985.  
  1986. }
  1987.  
  1988.  
  1989.  
  1990. //----- (0804A820) --------------------------------------------------------
  1991.  
  1992. int __cdecl sub_804A820(int fd, int a2)
  1993.  
  1994. {
  1995.  
  1996.   int result; // eax@3
  1997.  
  1998.   int i; // [sp+1Ch] [bp-Ch]@1
  1999.  
  2000.  
  2001.  
  2002.   for ( i = a2; ; sub_804A6C0(fd, i) )
  2003.  
  2004.   {
  2005.  
  2006.     result = *(_DWORD *)(i + 76);
  2007.  
  2008.     if ( !result )
  2009.  
  2010.       break;
  2011.  
  2012.     i = *(_DWORD *)(i + 76);
  2013.  
  2014.   }
  2015.  
  2016.   return result;
  2017.  
  2018. }
  2019.  
  2020.  
  2021.  
  2022. //----- (0804A855) --------------------------------------------------------
  2023.  
  2024. int __cdecl sub_804A855(int fd, int a2)
  2025.  
  2026. {
  2027.  
  2028.   int result; // eax@4
  2029.  
  2030.   int v3; // [sp+1Ch] [bp-Ch]@1
  2031.  
  2032.  
  2033.  
  2034.   v3 = a2;
  2035.  
  2036.   while ( 1 )
  2037.  
  2038.   {
  2039.  
  2040.     result = *(_DWORD *)(v3 + 76);
  2041.  
  2042.     if ( !result )
  2043.  
  2044.       break;
  2045.  
  2046.     v3 = *(_DWORD *)(v3 + 76);
  2047.  
  2048.     if ( !strcmp(&s1, (const char *)v3) )
  2049.  
  2050.       sub_804A6C0(fd, v3);
  2051.  
  2052.   }
  2053.  
  2054.   return result;
  2055.  
  2056. }
  2057.  
  2058.  
  2059.  
  2060. //----- (0804A8A1) --------------------------------------------------------
  2061.  
  2062. int __cdecl check_username_n_pass(int fd, char *a2, const char *s1 /* user */, const char *s /* pass */)
  2063.  
  2064. {
  2065.  
  2066.   char dest; // [sp+17h] [bp-31h]@3
  2067.  
  2068.   char v6; // [sp+37h] [bp-11h]@3
  2069.  
  2070.   int v7; // [sp+38h] [bp-10h]@1
  2071.  
  2072.   char *src; // [sp+3Ch] [bp-Ch]@1
  2073.  
  2074.  
  2075.  
  2076.   v7 = 1;
  2077.  
  2078.   src = a2;
  2079.  
  2080.   while ( *((_DWORD *)src + 19) )
  2081.  
  2082.   {
  2083.  
  2084.     src = (char *)*((_DWORD *)src + 19);
  2085.  
  2086.     if ( !strcmp(s1, src) )
  2087.  
  2088.     {
  2089.  
  2090.       md5(s, &dest); /* md5 */
  2091.  
  2092.       v6 = 0;
  2093.  
  2094.       if ( !strncmp(&dest, src + 20, 0x20u) )
  2095.  
  2096.       {
  2097.  
  2098.         write_string(fd, "lcgged in!\n", src + 20);
  2099.  
  2100.         logged_in = 1;
  2101.  
  2102.         strncpy(&::s1, src, 0x14u);
  2103.  
  2104.         if ( *((_DWORD *)src + 14) > 0x1F3u )
  2105.  
  2106.           admin = 1;
  2107.  
  2108.         return 0;
  2109.  
  2110.       }
  2111.  
  2112.     }
  2113.  
  2114.   }
  2115.  
  2116.   return v7;
  2117.  
  2118. }
  2119.  
  2120. // 804E420: using guessed type int dword_804E420;
  2121.  
  2122. // 804E424: using guessed type int dword_804E424;
  2123.  
  2124.  
  2125.  
  2126. //----- (0804A988) --------------------------------------------------------
  2127.  
  2128. void __cdecl sub_804A988()
  2129.  
  2130. {
  2131.  
  2132.   logged_in = 0;
  2133.  
  2134.   admin = 0;
  2135.  
  2136.   s1 = 0;
  2137.  
  2138. }
  2139.  
  2140. // 804E420: using guessed type int dword_804E420;
  2141.  
  2142. // 804E424: using guessed type int dword_804E424;
  2143.  
  2144.  
  2145.  
  2146. //----- (0804A9CB) --------------------------------------------------------
  2147.  
  2148. signed int __cdecl user_exists(struct *users, const char *username)
  2149.  
  2150. {
  2151.  
  2152.   struct *curuser; // [sp+1Ch] [bp-Ch]@1
  2153.  
  2154.  
  2155.  
  2156.   curuser = users;
  2157.  
  2158.   while ( *(_DWORD *)(curuser.next) )
  2159.  
  2160.   {
  2161.  
  2162.     curuser = *(_DWORD *)(curuser.next);
  2163.  
  2164.     if ( !strcmp((const char *)curuser, username) )
  2165.  
  2166.       return 1;
  2167.  
  2168.   }
  2169.  
  2170.   return 0;
  2171.  
  2172. }
  2173.  
  2174.  
  2175.  
  2176. //----- (0804AA10) --------------------------------------------------------
  2177.  
  2178. int __cdecl read_yes_or_no(int fd, int a2)
  2179.  
  2180. {
  2181.  
  2182.   int i; // [sp+1Ch] [bp-Ch]@1
  2183.  
  2184.  
  2185.  
  2186.   for ( i = read_x_bytes_or_til_escape_char(fd, a2, 0x257u, 10);
  2187.  
  2188.         i != 1 || *(_BYTE *)a2 != 121 && *(_BYTE *)a2 != 110;
  2189.  
  2190.         i = read_x_bytes_or_til_escape_char(fd, a2, 0x257u, 10) )
  2191.  
  2192.     send_with_or_without_null(fd, "[y/n]", 0);
  2193.  
  2194.   return *(_BYTE *)a2;
  2195.  
  2196. }
  2197.  
  2198.  
  2199.  
  2200. //----- (0804AA9F) --------------------------------------------------------
  2201.  
  2202. signed int __cdecl create_user(int fd, const char *s, int head)
  2203.  
  2204. {
  2205.  
  2206.   signed int result; // eax@2
  2207.  
  2208.   const char dest[33]; // [sp+39h] [bp-8Fh]@3
  2209.  
  2210.   const char office[20]; // [sp+5Ah] [bp-6Eh]@3
  2211.  
  2212.   const char info[50]; // [sp+6Eh] [bp-5Ah]@3
  2213.  
  2214.   char user[50]; // [sp+A0h] [bp-28h]@1
  2215.  
  2216.   int id; // [sp+B4h] [bp-14h]@1
  2217.  
  2218.   int v9; // [sp+B8h] [bp-10h]@1
  2219.  
  2220.   int v10; // [sp+BCh] [bp-Ch]@1
  2221.  
  2222.  
  2223.  
  2224.   id = 0;
  2225.  
  2226.   v10 = 0;
  2227.  
  2228.   send_with_or_without_null(fd, "enter new username: ", 0);
  2229.  
  2230.   readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2231.  
  2232.   s[readlen] = 0;
  2233.  
  2234.   strncpy(&user, s, 20);
  2235.  
  2236.   if ( user_exists(head, &src) )
  2237.  
  2238.   {
  2239.  
  2240.     result = 1;
  2241.  
  2242.   }
  2243.  
  2244.   else
  2245.  
  2246.   {
  2247.  
  2248.     send_with_or_without_null(fd, "enter new info: ", 0);
  2249.  
  2250.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2251.  
  2252.     s[readlen] = 0;
  2253.  
  2254.     strncpy((char *)info, s, 50);
  2255.  
  2256.     send_with_or_without_null(fd, "enter new office: ", 0);
  2257.  
  2258.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2259.  
  2260.     s[readlen] = 0;
  2261.  
  2262.     strncpy((char *)office, s, 20);
  2263.  
  2264.     send_with_or_without_null(fd, "enter new pass: ", 0);
  2265.  
  2266.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2267.  
  2268.     s[readlen] = 0;
  2269.  
  2270.     strncpy((char *)password, s, 33);
  2271.  
  2272.     md5(s, (char *)password);
  2273.  
  2274.     if ( allocandfillstruct(fd, head, &username, info, office, password, id, 1, 1000, 0, 0) )
  2275.  
  2276.     {
  2277.  
  2278.       v10 = 1;
  2279.  
  2280.       write_string(fd, "insert failed.\n");
  2281.  
  2282.     }
  2283.  
  2284.     result = v10;
  2285.  
  2286.   }
  2287.  
  2288.   return result;
  2289.  
  2290. }
  2291.  
  2292.  
  2293. //----- (0804ACFC) --------------------------------------------------------
  2294.  
  2295. int __cdecl buy_eggs(int fd, const char *nptr, int a3)
  2296.  
  2297. {
  2298.  
  2299.   int result; // eax@4
  2300.  
  2301.   int v4; // [sp+2E8h] [bp-10h]@1
  2302.  
  2303.   int v5; // [sp+2ECh] [bp-Ch]@5
  2304.  
  2305.  
  2306.  
  2307.   v4 = a3;
  2308.  
  2309.   do
  2310.  
  2311.   {
  2312.  
  2313.     if ( !*(_DWORD *)(v4 + 76) )
  2314.  
  2315.       break;
  2316.  
  2317.     v4 = *(_DWORD *)(v4 + 76);
  2318.  
  2319.   }
  2320.  
  2321.   while ( strcmp(&s1, (const char *)v4) );
  2322.  
  2323.   write_string(fd, "you currently have $%u and %u eggs\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 68));
  2324.  
  2325.   write_string(fd, "market price for an egg is %u\n ", *(_DWORD *)dword_804E410);
  2326.  
  2327.   write_string(fd, "would you like to sell eggs [y/n]: ");
  2328.  
  2329.   result = read_yes_or_no(fd, (int)nptr);
  2330.  
  2331.   if ( (_BYTE)result == 121 )
  2332.  
  2333.   {
  2334.  
  2335.     write_string(fd, "how many?: ");
  2336.  
  2337.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2338.  
  2339.     v5 = atoi(nptr);
  2340.  
  2341.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 68) )
  2342.  
  2343.     {
  2344.  
  2345.       result = write_string(fd, "not enough eggs!\n");
  2346.  
  2347.     }
  2348.  
  2349.     else
  2350.  
  2351.     {
  2352.  
  2353.       *(_DWORD *)(v4 + 68) -= v5;
  2354.  
  2355.       *(_DWORD *)(v4 + 64) += v5 * *(_DWORD *)dword_804E410;
  2356.  
  2357.       result = write_string(fd, "%u sold!\n", v5);
  2358.  
  2359.     }
  2360.  
  2361.   }
  2362.  
  2363.   return result;
  2364.  
  2365. }
  2366.  
  2367.  
  2368.  
  2369. //----- (0804AE76) --------------------------------------------------------
  2370.  
  2371. int __cdecl burn_money(int fd, const char *nptr, int a3)
  2372.  
  2373. {
  2374.  
  2375.   int result; // eax@4
  2376.  
  2377.   int v4; // [sp+2E4h] [bp-14h]@1
  2378.  
  2379.   int v5; // [sp+2ECh] [bp-Ch]@6
  2380.  
  2381.  
  2382.  
  2383.   v4 = a3;
  2384.  
  2385.   do
  2386.  
  2387.   {
  2388.  
  2389.     if ( !*(_DWORD *)(v4 + 76) )
  2390.  
  2391.       break;
  2392.  
  2393.     v4 = *(_DWORD *)(v4 + 76);
  2394.  
  2395.   }
  2396.  
  2397.   while ( strcmp(&s1, (const char *)v4) );
  2398.  
  2399.   write_string(fd, "you currently have $%u\n ", *(_DWORD *)(v4 + 64));
  2400.  
  2401.   write_string(fd, "would you like to incinerate some?[y/n]: ");
  2402.  
  2403.   result = read_yes_or_no(fd, (int)nptr);
  2404.  
  2405.   if ( (_BYTE)result == 121 || (_BYTE)result == 110 )
  2406.  
  2407.   {
  2408.  
  2409.     write_string(fd, "how much?: ");
  2410.  
  2411.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2412.  
  2413.     v5 = atoi(nptr);
  2414.  
  2415.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 64) )
  2416.  
  2417.     {
  2418.  
  2419.       *(_DWORD *)(v4 + 64) = 0;
  2420.  
  2421.       result = write_string(fd, "oh snap!  it's all gone! all that's left is ashes!\n");
  2422.  
  2423.     }
  2424.  
  2425.     else
  2426.  
  2427.     {
  2428.  
  2429.       *(_DWORD *)(v4 + 64) -= v5;
  2430.  
  2431.       result = write_string(fd, "%u burnt to a crisp!\n", v5);
  2432.  
  2433.     }
  2434.  
  2435.   }
  2436.  
  2437.   return result;
  2438.  
  2439. }
  2440.  
  2441.  
  2442.  
  2443. //----- (0804AFC6) --------------------------------------------------------
  2444.  
  2445. int __cdecl buy_chickens(int fd, const char *nptr, int a3)
  2446.  
  2447. {
  2448.  
  2449.   int result; // eax@4
  2450.  
  2451.   int v4; // [sp+2E8h] [bp-10h]@1
  2452.  
  2453.   int v5; // [sp+2ECh] [bp-Ch]@5
  2454.  
  2455.  
  2456.  
  2457.   v4 = a3;
  2458.  
  2459.   do
  2460.  
  2461.   {
  2462.  
  2463.     if ( !*(_DWORD *)(v4 + 76) )
  2464.  
  2465.       break;
  2466.  
  2467.     v4 = *(_DWORD *)(v4 + 76);
  2468.  
  2469.   }
  2470.  
  2471.   while ( strcmp(&s1, (const char *)v4) );
  2472.  
  2473.   write_string(fd, "you currently have $%u and %u chickens\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 60));
  2474.  
  2475.   write_string(fd, "market price for a chicken is %u\n ", *(_DWORD *)dword_804E40C);
  2476.  
  2477.   write_string(fd, "would you like to buy chickens [y/n]: ");
  2478.  
  2479.   result = read_yes_or_no(fd, (int)nptr);
  2480.  
  2481.   if ( (_BYTE)result == 121 )
  2482.  
  2483.   {
  2484.  
  2485.     write_string(fd, "how many?: ");
  2486.  
  2487.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2488.  
  2489.     v5 = atoi(nptr);
  2490.  
  2491.     if ( (unsigned int)(*(_DWORD *)dword_804E40C * v5) > *(_DWORD *)(v4 + 64) )
  2492.  
  2493.     {
  2494.  
  2495.       result = write_string(fd, "not enough money!\n");
  2496.  
  2497.     }
  2498.  
  2499.     else
  2500.  
  2501.     {
  2502.  
  2503.       *(_DWORD *)(v4 + 64) -= v5 * *(_DWORD *)dword_804E40C;
  2504.  
  2505.       *(_DWORD *)(v4 + 60) += v5;
  2506.  
  2507.       result = write_string(fd, "%u purchased!\n", v5);
  2508.  
  2509.     }
  2510.  
  2511.   }
  2512.  
  2513.   return result;
  2514.  
  2515. }
  2516.  
  2517.  
  2518.  
  2519. //----- (0804B148) --------------------------------------------------------
  2520.  
  2521. int __cdecl change_info(int fd, const char *nptr, int a3)
  2522.  
  2523. {
  2524.  
  2525.   int v4; // [sp+C0h] [bp-18h]@1
  2526.  
  2527.   int v5; // [sp+CCh] [bp-Ch]@1
  2528.  
  2529.  
  2530.  
  2531.   v4 = 0;
  2532.  
  2533.   v5 = a3;
  2534.  
  2535.   do
  2536.  
  2537.   {
  2538.  
  2539.     if ( !*(_DWORD *)(v5 + 76) )
  2540.  
  2541.       break;
  2542.  
  2543.     v5 = *(_DWORD *)(v5 + 76);
  2544.  
  2545.   }
  2546.  
  2547.   while ( strcmp(&s1, (const char *)v5) );
  2548.  
  2549.   write_string(fd, "would you like to change username (%s) [y/n]: ", &s1);
  2550.  
  2551.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2552.  
  2553.   {
  2554.  
  2555.     write_string(fd, "enter new username: ");
  2556.  
  2557.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2558.  
  2559.     nptr[v4] = 0;
  2560.  
  2561.     strncpy((char *)v5, nptr, 20);
  2562.  
  2563.     strncpy(&s1, nptr, 20);
  2564.  
  2565.   }
  2566.  
  2567.   write_string(fd, "would you like to change user info (%s) [y/n]: ", v5 + 84);
  2568.  
  2569.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2570.  
  2571.   {
  2572.  
  2573.     write_string(fd, "enter new info: ");
  2574.  
  2575.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2576.  
  2577.     nptr[v4] = 0;
  2578.  
  2579.     strncpy((char *)(v5 + 84), nptr, 50);
  2580.  
  2581.   }
  2582.  
  2583.   write_string(fd, "would you like to change office #(%s) [y/n]: ", v5 + 134);
  2584.  
  2585.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2586.  
  2587.   {
  2588.  
  2589.     write_string(fd, "enter new office: ");
  2590.  
  2591.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2592.  
  2593.     nptr[v4] = 0;
  2594.  
  2595.     strcpy((char *)(v5 + 134), nptr);
  2596.  
  2597.   }
  2598.  
  2599.   write_string(fd, "would you like to change password [y/n]: ");
  2600.  
  2601.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2602.  
  2603.   {
  2604.  
  2605.     write_string(fd, "enter new pass: ");
  2606.  
  2607.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2608.  
  2609.     nptr[v4] = 0;
  2610.  
  2611.     strncpy((char *)(v5 + 20), nptr, 0x21u);
  2612.  
  2613.   }
  2614.  
  2615.   write_string(fd, "would you like to change uid(%u) [y/n]: ", *(_DWORD *)(v5 + 72));
  2616.  
  2617.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2618.  
  2619.   {
  2620.  
  2621.     write_string(fd, "enter new uid: ");
  2622.  
  2623.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2624.  
  2625.     nptr[v4] = 0;
  2626.  
  2627.     *(_DWORD *)(v5 + 72) = atoi(nptr);
  2628.  
  2629.   }
  2630.  
  2631.   write_string(fd, "would you like to change you egg count(%u) [y/n]: ", *(_DWORD *)(v5 + 68));
  2632.  
  2633.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2634.  
  2635.   {
  2636.  
  2637.     write_string(fd, "enter new egg count: ");
  2638.  
  2639.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2640.  
  2641.     nptr[v4] = 0;
  2642.  
  2643.     if ( admin )
  2644.  
  2645.       *(_DWORD *)(v5 + 68) = atoi(nptr);
  2646.  
  2647.     else
  2648.  
  2649.       write_string(fd, "you don't have enough permissions to change egg amount\n");
  2650.  
  2651.   }
  2652.  
  2653.   write_string(fd, "would you like to change chicken count(%u) [y/n]: ", *(_DWORD *)(v5 + 60));
  2654.  
  2655.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2656.  
  2657.   {
  2658.  
  2659.     write_string(fd, "enter new chicken count: ");
  2660.  
  2661.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2662.  
  2663.     nptr[v4] = 0;
  2664.  
  2665.     if ( admin )
  2666.  
  2667.       *(_DWORD *)(v5 + 60) = atoi(nptr);
  2668.  
  2669.     else
  2670.  
  2671.       write_string(fd, "you don't have enough permissions to adjust chickens\n");
  2672.  
  2673.   }
  2674.  
  2675.   write_string(fd, "would you like to change monies(%u) [y/n]: ", *(_DWORD *)(v5 + 64));
  2676.  
  2677.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2678.  
  2679.   {
  2680.  
  2681.     write_string(fd, "enter new monies: ");
  2682.  
  2683.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2684.  
  2685.     nptr[v4] = 0;
  2686.  
  2687.     if ( admin )
  2688.  
  2689.       *(_DWORD *)(v5 + 64) = atoi(nptr);
  2690.  
  2691.     else
  2692.  
  2693.       write_string(fd, "you don't have enough permissions to add monies\n");
  2694.  
  2695.   }
  2696.  
  2697.   write_string(fd, "would you like to change your perms(%u) [y/n]: ", *(_DWORD *)(v5 + 56));
  2698.  
  2699.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2700.  
  2701.   {
  2702.  
  2703.     write_string(fd, "enter new perm: ");
  2704.  
  2705.     nptr[v4] = 0;
  2706.  
  2707.     if ( admin )
  2708.  
  2709.       *(_DWORD *)(v5 + 56) = atoi(nptr);
  2710.  
  2711.     else
  2712.  
  2713.       write_string(fd, "you don't have enough permissions to change permissions\n");
  2714.  
  2715.   }
  2716.  
  2717.   write_string(fd, "finished updates \n");
  2718.  
  2719.   return 0;
  2720.  
  2721. }
  2722.  
  2723. // 804E420: using guessed type int dword_804E420;
  2724.  
  2725.  
  2726.  
  2727. //----- (0804B6F5) --------------------------------------------------------
  2728.  
  2729. int __cdecl try_login(int fd, int s1, char *a3)
  2730.  
  2731. {
  2732.  
  2733.   int result; // eax@1
  2734.  
  2735.   int v4; // eax@1
  2736.  
  2737.   int v5; // eax@1
  2738.  
  2739.   const char s[600]; // [sp+14h] [bp-264h]@1
  2740.  
  2741.   int v7; // [sp+26Ch] [bp-Ch]@1
  2742.  
  2743.  
  2744.  
  2745.   send_with_or_without_null(fd, "enter username: ", 0);
  2746.  
  2747.   v4 = read_x_bytes_or_til_escape_char(fd, s1, 0x257u, 10);
  2748.  
  2749.   v7 = v4;
  2750.  
  2751.   *(_BYTE *)(s1 + v4) = 0;
  2752.  
  2753.   send_with_or_without_null(fd, "enter password: ", 0);
  2754.  
  2755.   v5 = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2756.  
  2757.   v7 = v5;
  2758.  
  2759.   s[v5] = 0;
  2760.  
  2761.   result = check_username_n_pass(fd, a3, (const char *)s1, s);
  2762.  
  2763.   if ( result )
  2764.  
  2765.     result = send_with_or_without_null(fd, "Bad username or pass: ", 0);
  2766.  
  2767.   return result;
  2768.  
  2769. }
  2770.  
  2771.  
  2772.  
  2773. //----- (0804B7E0) --------------------------------------------------------
  2774.  
  2775. int __cdecl print_menu(int fd)
  2776.  
  2777. {
  2778.  
  2779.   send_with_or_without_null(fd, "\n\nfantasy chicken farmin league\n", 0);
  2780.  
  2781.   if ( logged_in )
  2782.  
  2783.   {
  2784.  
  2785.     write_string(fd, "\n\nmenu    (%s)\n", &s1);
  2786.  
  2787.     write_string(fd, " L) logout\n");
  2788.  
  2789.     write_string(fd, " b) buy chickens\n");
  2790.  
  2791.     write_string(fd, " i) incinerate money\n");
  2792.  
  2793.     write_string(fd, " s) sell eggs\n");
  2794.  
  2795.     write_string(fd, " p) display my info\n");
  2796.  
  2797.     write_string(fd, " u) update my info\n");
  2798.  
  2799.     if ( admin )
  2800.  
  2801.       write_string(fd, " P) print userlist\n");
  2802.  
  2803.   }
  2804.  
  2805.   else
  2806.  
  2807.   {
  2808.  
  2809.     write_string(fd, "\n\nmenu\n");
  2810.  
  2811.     write_string(fd, " c) create account\n");
  2812.  
  2813.     write_string(fd, " l) login\n");
  2814.  
  2815.   }
  2816.  
  2817.   return write_string(fd, " q) quit \n");
  2818.  
  2819. }
  2820.  
  2821. // 804E420: using guessed type int dword_804E420;
  2822.  
  2823. // 804E424: using guessed type int dword_804E424;
  2824.  
  2825.  
  2826.  
  2827. //----- (0804B90A) --------------------------------------------------------
  2828.  
  2829. int __cdecl readfromfd(FILE *stream, int a2, unsigned int a3, char a4)
  2830.  
  2831. {
  2832.  
  2833.   char ptr; // [sp+2Bh] [bp-Dh]@2
  2834.  
  2835.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  2836.  
  2837.  
  2838.  
  2839.   for ( i = 0; ; ++i )
  2840.  
  2841.   {
  2842.  
  2843.     if ( !fread(&ptr, 1u, 1u, stream) )
  2844.  
  2845.       return -1;
  2846.  
  2847.     if ( ptr == a4 )
  2848.  
  2849.       return i;
  2850.  
  2851.     if ( i >= a3 )
  2852.  
  2853.       break;
  2854.  
  2855.     *(_BYTE *)(i + a2) = ptr;
  2856.  
  2857.   }
  2858.  
  2859.   return -1;
  2860.  
  2861. }
  2862.  
  2863.  
  2864.  
  2865. //----- (0804B9E6) --------------------------------------------------------
  2866.  
  2867. void *__cdecl allocandfillstruct(int fd, sruct *head, const char *username, const char *info, const char *office, const char *password, int id, int perms, int money, int chickens, int eggs)
  2868.  
  2869. {
  2870.  
  2871.   void *result; // eax@1
  2872.  
  2873.   void *v12; // [sp+1Ch] [bp-Ch]@1
  2874.  
  2875.  
  2876.  
  2877.   result = malloc(0x9Cu);
  2878.  
  2879.   newuser = result;
  2880.  
  2881.   if ( result )
  2882.  
  2883.   {
  2884.  
  2885.     strcpy((char *)newuser.user, username);
  2886.  
  2887.     strcpy((char *)newuser.info, info);
  2888.  
  2889.     strcpy((char *)newuser.office, office);
  2890.  
  2891.     strcpy((char *)newuser.password, password);
  2892.  
  2893.     *((_DWORD *)v12 + 18) = id; //id
  2894.  
  2895.     *((_DWORD *)v12 + 14) = perms;// perm
  2896.  
  2897.     *((_DWORD *)v12 + 16) = money; // monies
  2898.  
  2899.     *((_DWORD *)v12 + 15) = chickens; // chickens
  2900.  
  2901.     *((_DWORD *)v12 + 17) = eggs; // eggs
  2902.  
  2903.     *((_DWORD *)v12 + 19) = *(_DWORD *)(head + 76); // link first ptr to former first
  2904.  
  2905.     *((_DWORD *)v12 + 20) = head; // link last pointer to head
  2906.  
  2907.     *(_DWORD *)(a2 + 76) = v12; // set head next ptr to this
  2908.  
  2909.     result = 0;
  2910.  
  2911.   }
  2912.  
  2913.   return result;
  2914.  
  2915. }
  2916.  
  2917.  
  2918. //----- (0804BAB7) --------------------------------------------------------
  2919.  
  2920. signed int __cdecl opendbandinit(const char *filename, int head, int fd)
  2921.  
  2922. {
  2923.  
  2924.   char password[59ish]; // [sp+39h] [bp-2FFh]@1
  2925.  
  2926.   char office[33]; // [sp+5Ah] [bp-2DEh]@1
  2927.  
  2928.   char info[20]; // [sp+6Eh] [bp-2CAh]@1
  2929.  
  2930.   char username[50]; // [sp+A0h] [bp-298h]@1
  2931.  
  2932.   char v8[20]; // [sp+B4h] [bp-284h]@3
  2933.  
  2934.   signed int v9; // [sp+30Ch] [bp-2Ch]@1
  2935.  
  2936.   int v10; // [sp+310h] [bp-28h]@1
  2937.  
  2938.   int v11; // [sp+314h] [bp-24h]@1
  2939.  
  2940.   int id; // [sp+318h] [bp-20h]@6
  2941.  
  2942.   int perms; // [sp+31Ch] [bp-1Ch]@16
  2943.  
  2944.   int chickens; // [sp+320h] [bp-18h]@18
  2945.  
  2946.   int eggs; // [sp+324h] [bp-14h]@20
  2947.  
  2948.   int money; // [sp+328h] [bp-10h]@22
  2949.  
  2950.   FILE *v17; // [sp+32Ch] [bp-Ch]@1
  2951.  
  2952.  
  2953.  
  2954.   v9 = 0;
  2955.  
  2956.   v10 = 0;
  2957.  
  2958.   v11 = 0;
  2959.  
  2960.   bzero(&username, 0x14u);
  2961.  
  2962.   bzero(&info, 0x32u);
  2963.  
  2964.   bzero(&office, 0x14u);
  2965.  
  2966.   bzero(&password, 0x21u);
  2967.  
  2968.   v17 = fopen(filename, "rb");
  2969.  
  2970.   if ( v17 )
  2971.  
  2972.   {
  2973.  
  2974.     while ( 1 )
  2975.  
  2976.     {
  2977.  
  2978.       v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  2979.  
  2980.       if ( v10 == -1 )
  2981.  
  2982.         break;
  2983.  
  2984.       *(&v8 + v10) = 0;
  2985.  
  2986.       if ( strcmp(&v8, "[user db]") )
  2987.  
  2988.       {
  2989.  
  2990.         if ( strcmp(&v8, "[user]") )
  2991.  
  2992.         {
  2993.  
  2994.           v9 = 1;
  2995.  
  2996.           break;
  2997.  
  2998.         }
  2999.  
  3000.         ++v11;
  3001.  
  3002.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3003.  
  3004.         if ( v10 != -1 )
  3005.  
  3006.         {
  3007.  
  3008.           *(&v8 + v10) = 0;
  3009.  
  3010.           id = atoi(&v8); // size first thing after user
  3011.  
  3012.         }
  3013.  
  3014.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3015.  
  3016.         if ( v10 != -1 )
  3017.  
  3018.         {
  3019.  
  3020.           *(&v8 + v10) = 0;
  3021.  
  3022.           strncpy(&username, &v8, 0x14u);
  3023.  
  3024.         }
  3025.  
  3026.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3027.  
  3028.         if ( v10 != -1 )
  3029.  
  3030.         {
  3031.  
  3032.           *(&v8 + v10) = 0;
  3033.  
  3034.           strncpy(&info, &v8, 0x32u);
  3035.  
  3036.         }
  3037.  
  3038.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3039.  
  3040.         if ( v10 != -1 )
  3041.  
  3042.         {
  3043.  
  3044.           *(&v8 + v10) = 0;
  3045.  
  3046.           strncpy(&office, &v8, 0x14u);
  3047.  
  3048.         }
  3049.  
  3050.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3051.  
  3052.         if ( v10 != -1 )
  3053.  
  3054.         {
  3055.  
  3056.           *(&v8 + v10) = 0;
  3057.  
  3058.           strncpy(&password, &v8, 0x21u);
  3059.  
  3060.         }
  3061.  
  3062.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3063.  
  3064.         if ( v10 != -1 )
  3065.  
  3066.         {
  3067.  
  3068.           *(&v8 + v10) = 0;
  3069.  
  3070.           perms = atoi(&v8);
  3071.  
  3072.         }
  3073.  
  3074.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3075.  
  3076.         if ( v10 != -1 )
  3077.  
  3078.         {
  3079.  
  3080.           *(&v8 + v10) = 0;
  3081.  
  3082.           chickens = atoi(&v8);
  3083.  
  3084.         }
  3085.  
  3086.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3087.  
  3088.         if ( v10 != -1 )
  3089.  
  3090.         {
  3091.  
  3092.           *(&v8 + v10) = 0;
  3093.  
  3094.           eggs = atoi(&v8);
  3095.  
  3096.         }
  3097.  
  3098.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3099.  
  3100.         if ( v10 != -1 )
  3101.  
  3102.         {
  3103.  
  3104.           *(&v8 + v10) = 0;
  3105.  
  3106.           money = atoi(&v8);
  3107.  
  3108.         }
  3109.  
  3110.         if ( allocandfillstruct(fd, head, &username, &info, &office, &password, id, perms, money, chickens, eggs) )
  3111.  
  3112.         {
  3113.  
  3114.           v9 = 1;
  3115.  
  3116.           write_string(fd, "insert failed.\n");
  3117.  
  3118.           break;
  3119.  
  3120.         }
  3121.  
  3122.       }
  3123.  
  3124.     }
  3125.  
  3126.     fclose(v17);
  3127.  
  3128.   }
  3129.  
  3130.   else
  3131.  
  3132.   {
  3133.  
  3134.     write_string(fd, "attempted %s.\n", filename);
  3135.  
  3136.     v9 = 1;
  3137.  
  3138.   }
  3139.  
  3140.   return v9;
  3141.  
  3142. }
  3143.  
  3144.  
  3145.  
  3146. //----- (0804C067) --------------------------------------------------------
  3147.  
  3148. void __cdecl sub_804C067(int fd)
  3149.  
  3150. {
  3151.  
  3152.   send_with_or_without_null(fd, "cya\n", 0);
  3153.  
  3154.   close(fd);
  3155.  
  3156.   exit(0);
  3157.  
  3158. }
  3159.  
  3160.  
  3161.  
  3162. //----- (0804C09F) --------------------------------------------------------
  3163.  
  3164. int __cdecl sub_804C09F(int a1)
  3165.  
  3166. {
  3167.  
  3168.   int v1; // edx@1
  3169.  
  3170.   int result; // eax@11
  3171.  
  3172.   signed int v3; // [sp+8h] [bp-10h]@1
  3173.  
  3174.   int v4; // [sp+Ch] [bp-Ch]@6
  3175.  
  3176.  
  3177.  
  3178.   v1 = rand() % 5;
  3179.  
  3180.   v3 = v1 - 2;
  3181.  
  3182.   if ( v1 != 2 )
  3183.  
  3184.   {
  3185.  
  3186.     *(_DWORD *)dword_804E40C += v3;
  3187.  
  3188.     *(_DWORD *)dword_804E410 += v3 / 2;
  3189.  
  3190.     if ( !*(_DWORD *)dword_804E410 )
  3191.  
  3192.       *(_DWORD *)dword_804E410 = 1;
  3193.  
  3194.     if ( !*(_DWORD *)dword_804E410 )
  3195.  
  3196.       *(_DWORD *)dword_804E410 = 1;
  3197.  
  3198.   }
  3199.  
  3200.   v4 = a1;
  3201.  
  3202.   while ( 1 )
  3203.  
  3204.   {
  3205.  
  3206.     result = *(_DWORD *)(v4 + 76);
  3207.  
  3208.     if ( !result )
  3209.  
  3210.       break;
  3211.  
  3212.     v4 = *(_DWORD *)(v4 + 76);
  3213.  
  3214.     if ( *(_DWORD *)(v4 + 60) )
  3215.  
  3216.     {
  3217.  
  3218.       if ( v3 == 1 )
  3219.  
  3220.         *(_DWORD *)(v4 + 60) += *(_DWORD *)(v4 + 60) >> 2;
  3221.  
  3222.       *(_DWORD *)(v4 + 68) = *(_DWORD *)(v4 + 60) + *(_DWORD *)(v4 + 68) - (*(_DWORD *)(v4 + 60) >> 3);
  3223.  
  3224.     }
  3225.  
  3226.   }
  3227.  
  3228.   return result;
  3229.  
  3230. }
  3231.  
  3232.  
  3233.  
  3234. //----- (0804C18B) --------------------------------------------------------
  3235.  
  3236. void __cdecl sub_804C18B(int fd)
  3237.  
  3238. {
  3239.  
  3240.   unsigned int v1; // eax@1
  3241.  
  3242.   int nptr; // [sp+26Ch] [bp-26Ch]@7
  3243.  
  3244.   char v3[4]; // [sp+4C4h] [bp-14h]@1
  3245.  
  3246.   void *s; // [sp+4C8h] [bp-10h]@1
  3247.  
  3248.   FILE *stream; // [sp+4CCh] [bp-Ch]@40
  3249.  
  3250.  
  3251.  
  3252.   *(_DWORD *)v3 = 0;
  3253.  
  3254.   v1 = time(0);
  3255.  
  3256.   srand(v1);
  3257.  
  3258.   s = malloc(0x9Cu);
  3259.  
  3260.   if ( !s )
  3261.  
  3262.   {
  3263.  
  3264.     send_with_or_without_null(fd, "can't allocate user_list, quitting\n", 0);
  3265.  
  3266.     sub_804C067(fd);
  3267.  
  3268.   }
  3269.  
  3270.   bzero(s, 0x9Cu);
  3271.  
  3272.   *((_DWORD *)s + 19) = 0;
  3273.  
  3274.   *((_DWORD *)s + 20) = 0;
  3275.  
  3276.   sub_804A988();
  3277.  
  3278.   if ( opendbandinit("/home/fcfl/user.db", (int)s, fd) )
  3279.  
  3280.   {
  3281.  
  3282.     send_with_or_without_null(fd, "can't read user db, quitting\n", 0);
  3283.  
  3284.     sub_804C067(fd);
  3285.  
  3286.   }
  3287.  
  3288.   while ( 1 )
  3289.  
  3290.   {
  3291.  
  3292.     sub_804C09F((int)s);
  3293.  
  3294.     print_menu(fd);
  3295.  
  3296.     *(_DWORD *)v3 = read_x_bytes_or_til_escape_char(fd, (int)&nptr, 0x257u, 10);
  3297.  
  3298.     nptr[v3] = 0;
  3299.  
  3300.     write_string(fd, "%d: %s\n", *(_DWORD *)v3, &nptr);
  3301.  
  3302.     if ( *(_DWORD *)v3 == 1 ) // one byte read
  3303.  
  3304.     {
  3305.  
  3306.       if ( (_BYTE)nptr != aC[0] || logged_in )
  3307.  
  3308.       {
  3309.  
  3310.         if ( (_BYTE)nptr != asc_804D115[0] || logged_in )
  3311.  
  3312.         {
  3313.  
  3314.           if ( (_BYTE)nptr == aS_1[0] && logged_in )
  3315.  
  3316.           {
  3317.  
  3318.             buy_eggs(fd, (const char *)&nptr, (int)s);
  3319.  
  3320.           }
  3321.  
  3322.           else
  3323.  
  3324.           {
  3325.  
  3326.             if ( (_BYTE)nptr == aI[0] && logged_in )
  3327.  
  3328.             {
  3329.  
  3330.               burn_money(fd, (const char *)&nptr, (int)s);
  3331.  
  3332.             }
  3333.  
  3334.             else
  3335.  
  3336.             {
  3337.  
  3338.               if ( (_BYTE)nptr == aB[0] && logged_in )
  3339.  
  3340.               {
  3341.  
  3342.                 buy_chickens(fd, (const char *)&nptr, (int)s);
  3343.  
  3344.               }
  3345.  
  3346.               else
  3347.  
  3348.               {
  3349.  
  3350.                 if ( (_BYTE)nptr == aU[0] && logged_in )
  3351.  
  3352.                 {
  3353.  
  3354.                   change_info(fd, (const char *)&nptr, (int)s);
  3355.  
  3356.                 }
  3357.  
  3358.                 else
  3359.  
  3360.                 {
  3361.  
  3362.                   if ( (_BYTE)nptr == aP[0] && logged_in )
  3363.  
  3364.                   {
  3365.  
  3366.                     sub_804A855(fd, (int)s);
  3367.  
  3368.                   }
  3369.  
  3370.                   else
  3371.  
  3372.                   {
  3373.  
  3374.                     if ( (_BYTE)nptr == asc_804D121[0] && logged_in )
  3375.  
  3376.                     {
  3377.  
  3378.                       sub_804A988();
  3379.  
  3380.                     }
  3381.  
  3382.                     else
  3383.  
  3384.                     {
  3385.  
  3386.                       if ( (_BYTE)nptr == aP_0[0] && logged_in && admin )
  3387.  
  3388.                       {
  3389.  
  3390.                         sub_804A820(fd, (int)s);
  3391.  
  3392.                       }
  3393.  
  3394.                       else
  3395.  
  3396.                       {
  3397.  
  3398.                         if ( (_BYTE)nptr == a6[0] && logged_in && admin )
  3399.  
  3400.                         {
  3401.  
  3402.                           stream = fopen("/home/fcfl/key", "rb");
  3403.  
  3404.                           *(_DWORD *)v3 = readfromfd(stream, (int)&nptr, 0x257u, 10);
  3405.  
  3406.                           if ( *(_DWORD *)v3 != -1 )
  3407.  
  3408.                           {
  3409.  
  3410.                             *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  3411.  
  3412.                             send_with_or_without_null(fd, (const char *)&nptr, 1);
  3413.  
  3414.                           }
  3415.  
  3416.                         }
  3417.  
  3418.                         else
  3419.  
  3420.                         {
  3421.  
  3422.                           if ( (_BYTE)nptr == aQ[0] )
  3423.  
  3424.                             sub_804C067(fd);
  3425.  
  3426.                           send_with_or_without_null(fd, "that's not a valid option", 0);
  3427.  
  3428.                         }
  3429.  
  3430.                       }
  3431.  
  3432.                     }
  3433.  
  3434.                   }
  3435.  
  3436.                 }
  3437.  
  3438.               }
  3439.  
  3440.             }
  3441.  
  3442.           }
  3443.  
  3444.         }
  3445.  
  3446.         else
  3447.  
  3448.         {
  3449.  
  3450.           try_login(fd, (int)&nptr, (char *)s);
  3451.  
  3452.         }
  3453.  
  3454.       }
  3455.  
  3456.       else
  3457.  
  3458.       {
  3459.  
  3460.         create_user(fd, (const char *)&nptr, (int)s);
  3461.  
  3462.       }
  3463.  
  3464.     }
  3465.  
  3466.     else
  3467.  
  3468.     {
  3469.  
  3470.       *(_DWORD *)v3 = 0;
  3471.  
  3472.       send_with_or_without_null(fd, "that's not a valid option", 0);
  3473.  
  3474.     }
  3475.  
  3476.   }
  3477.  
  3478. }
  3479.  
  3480. // 804E420: using guessed type int dword_804E420;
  3481.  
  3482. // 804E424: using guessed type int dword_804E424;
  3483.  
  3484.  
  3485.  
  3486. //----- (0804C5F0) --------------------------------------------------------
  3487.  
  3488. void __cdecl sub_804C5F0()
  3489.  
  3490. {
  3491.  
  3492.   ;
  3493.  
  3494. }
  3495.  
  3496.  
  3497.  
  3498. //----- (0804C600) --------------------------------------------------------
  3499.  
  3500. int *__cdecl sub_804C600()
  3501.  
  3502. {
  3503.  
  3504.   init_proc();
  3505.  
  3506.   return &dword_804E1D8;
  3507.  
  3508. }
  3509.  
  3510. // 804E1D8: using guessed type int dword_804E1D8;
  3511.  
  3512.  
  3513.  
  3514. //----- (0804C65A) --------------------------------------------------------
  3515.  
  3516. void __cdecl sub_804C65A()
  3517.  
  3518. {
  3519.  
  3520.   ;
  3521.  
  3522. }
  3523.  
  3524.  
  3525.  
  3526. //----- (0804C660) --------------------------------------------------------
  3527.  
  3528. void (*__cdecl sub_804C660())(void)
  3529.  
  3530. {
  3531.  
  3532.   void (*result)(void); // eax@1
  3533.  
  3534.   int *v1; // ebx@2
  3535.  
  3536.  
  3537.  
  3538.   result = (void (*)(void))dword_804E1D8;
  3539.  
  3540.   if ( dword_804E1D8 != -1 )
  3541.  
  3542.   {
  3543.  
  3544.     v1 = &dword_804E1D8;
  3545.  
  3546.     do
  3547.  
  3548.     {
  3549.  
  3550.       --v1;
  3551.  
  3552.       result();
  3553.  
  3554.       result = (void (*)(void))*v1;
  3555.  
  3556.     }
  3557.  
  3558.     while ( *v1 != -1 );
  3559.  
  3560.   }
  3561.  
  3562.   return result;
  3563.  
  3564. }
  3565.  
  3566. // 804E1D8: using guessed type int dword_804E1D8;
  3567.  
  3568.  
  3569.  
  3570. //----- (0804C68C) --------------------------------------------------------
  3571.  
  3572. void __cdecl term_proc()
  3573.  
  3574. {
  3575.  
  3576.   sub_8048CB0();
  3577.  
  3578. }
  3579.  
  3580.  
  3581.  
  3582. #error "There were 1 decompilation failure(s) on 48 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement