Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1. //
  2. // Created by Anton Priyma on 15.02.2020.
  3. //
  4.  
  5. #include <stdio.h>
  6. #include <sys/dispatch.h>
  7. #include <string.h>
  8. #include <sys/dtrace.h>
  9. #include <cerrno>
  10. #include "QnxFolderManager.h"
  11.  
  12.  
  13. int QnxFolderManager::create_folder_manager() {
  14. dispatch_t *dpp;
  15. resmgr_attr_t resmgr_attr;
  16. resmgr_context_t *ctp;
  17. resmgr_connect_funcs_t connect_func;
  18. resmgr_io_funcs_t io_func;
  19. iofunc_attr_t attr;
  20. int i;
  21.  
  22. // Создать структуру диспетчеризации
  23. if ((dpp = dispatch_create ()) == NULL)
  24. {
  25. perror ("Ошибка dispatch_create\n");
  26. exit (EXIT_FAILURE);
  27. }
  28.  
  29. // Инициализировать структуры данных
  30. memset(&resmgr_attr, 0, sizeof (resmgr_attr));
  31. resmgr_attr.nparts_max = 1;
  32. resmgr_attr.msg_max_size = 2048;
  33.  
  34. // Назначить обработчики по умолчанию
  35. iofunc_func_init (_RESMGR_CONNECT_NFUNCS, &connect_func,
  36. _RESMGR_IO_NFUNCS, &io_func);
  37.  
  38. // Создать и инициализировать атрибутную запись для каталога ...
  39. iofunc_attr_init (&attr, S_IFDIR | 0666, 0, 0);
  40.  
  41.  
  42. io_funcs.write = write;
  43. io_funcs.read = read;
  44. connect_funcs.open = open;
  45. connect_funcs.mknod = mkdir;
  46. connect_funcs.unlink = unlink;
  47.  
  48. //init sigterm
  49. struct sigaction action;
  50. memset(&action, 0, sizeof(action));
  51. action.sa_handler = term;
  52. sigaction(SIGTERM, &action, NULL);
  53.  
  54. // Зарегестрировать префикс
  55. if (resmgr_attach (dpp, &resmgr_attr, path,
  56. _FTYPE_ANY, _RESMGR_FLAG_DIR, &connect_func, &io_func, &attr) == -1)
  57. {
  58. perror ("Ошибка resmgr_attach\n");
  59. exit (EXIT_FAILURE);
  60. }
  61.  
  62. // Выделить контекст
  63. ctp = resmgr_context_alloc (dpp);
  64.  
  65. // Ждать сообщений в вечном цикле
  66. while (1)
  67. {
  68. if ((ctp = resmgr_block (ctp)) == NULL)
  69. {
  70. perror ("Ошибка resmgr_block\n");
  71. exit (EXIT_FAILURE);
  72. }
  73. resmgr_handler (ctp);
  74. }
  75.  
  76. }
  77.  
  78. int QnxFolderManager::Init_res_manager(char *path) {
  79. this->path = path;
  80. zip_manger = QnxZipCTL(path, false);
  81. return create_folder_manager();
  82. }
  83.  
  84. int QnxFolderManager::read(resmgr_context_t *ctp, io_read_t *msg, iofunc_ocb_t *ocb) {
  85. printf("read\n");
  86. int sts;
  87.  
  88.  
  89. if ((sts = iofunc_read_verify(ctp, msg, ocb, NULL)) != EOK)
  90. return (sts);
  91.  
  92. if (S_ISDIR(ocb->attr->mode)) {
  93. return (my_read_dir(ctp, msg, ocb));
  94. } else if (S_ISREG(ocb->attr->mode)) {
  95. return (my_read_file(ctp, msg, ocb));
  96. } else {
  97. return (EBADF);
  98. }
  99. }
  100.  
  101. int QnxFolderManager::write(resmgr_context_t *ctp, io_write_t *msg, iofunc_ocb_t *ocb) {
  102. int max_value = 512 * 1024;
  103. char value[max_value + 1];
  104. int len_v = max_value;
  105.  
  106.  
  107. printf("WRITE\n");
  108.  
  109. _IO_SET_WRITE_NBYTES(ctp, msg->i.nbytes);
  110. resmgr_msgread(ctp, value, len_v, sizeof(msg->i));
  111. value[--len_v] = 0;
  112.  
  113.  
  114. zip_manger.qnxzip_write(cur_path, value, strlen(value), ocb->offset);
  115.  
  116. return (_RESMGR_NPARTS(0));
  117. }
  118.  
  119. int QnxFolderManager::my_read_dir(resmgr_context_t *ctp, io_read_t *msg, iofunc_ocb_t *ocb) {
  120. int nbytes;
  121. int nleft;
  122. struct dirent *dp;
  123. char *reply_msg;
  124. char fname[_POSIX_PATH_MAX];
  125. int childs_num = zip_manger.child_num(cur_path);
  126.  
  127. reply_msg = (char *) calloc(1, msg->i.nbytes);
  128. if (reply_msg == NULL)
  129. return (ENOMEM);
  130.  
  131.  
  132. nleft = msg->i.nbytes;
  133. off64_t NUM_ENTS = childs_num;
  134.  
  135.  
  136. while (ocb->offset < NUM_ENTS) {
  137. zip_manger.qnxzip_readdir(cur_path, fname, ocb->offset);
  138. sprintf(fname, "%c", fname);
  139.  
  140. if (nleft - nbytes >= 0) {
  141.  
  142. ocb->offset++;
  143.  
  144. nleft -= nbytes;
  145. } else {
  146. break;
  147. }
  148. }
  149.  
  150. MsgReply(ctp->rcvid, nbytes,
  151. reply_msg, nbytes);
  152.  
  153. free(reply_msg);
  154.  
  155. return (_RESMGR_NOREPLY);
  156. }
  157.  
  158. int QnxFolderManager::my_read_file(resmgr_context_t *ctp, io_read_t *msg,
  159. iofunc_ocb_t *ocb) {
  160. int nbytes;
  161. int nleft;
  162.  
  163.  
  164. if ((msg->i.xtype & _IO_XTYPE_MASK) != _IO_XTYPE_NONE)
  165. return (ENOSYS);
  166.  
  167. nleft = ocb->attr->nbytes - ocb->offset;
  168. char *string = (char *) malloc(nleft);
  169. printf("%d %d", ocb->attr->nbytes, ocb->offset);
  170. nbytes = __min (nleft, msg->i.nbytes);
  171.  
  172. if (nbytes) {
  173. if (zip_manger.qnxzip_read(cur_path, string, nbytes, ocb->offset) == 0) {
  174. return (_RESMGR_NOREPLY);
  175. };
  176.  
  177. MsgReply(ctp->rcvid, nbytes, string, nbytes);
  178. ocb->offset += nbytes;
  179. } else {
  180. MsgReply(ctp->rcvid, EOK, NULL, 0);
  181. }
  182. free(string);
  183. return (_RESMGR_NOREPLY);
  184. }
  185.  
  186. int QnxFolderManager::open(resmgr_context_t *ctp, io_open_t *msg, iofunc_attr_t *attr, void *extra) {
  187. printf("OPEN\n");
  188.  
  189. strncpy(cur_path, msg->connect.path, strlen(msg->connect.path));
  190. cur_path[strlen(msg->connect.path)] = 0;
  191.  
  192. if (S_ISREG(attr->mode)) {
  193. zip_manger.qnxzip_open(cur_path);
  194. }
  195.  
  196. return (iofunc_open_default(ctp, msg, attr, extra));
  197. }
  198.  
  199. int QnxFolderManager::mkdir(resmgr_context_t *ctp, io_mknod_t *node, iofunc_attr_t *attr, void *reserved) {
  200. printf("MKDIR\n");
  201. strncpy(cur_path, node->connect.path, strlen(node->connect.path));
  202. zip_manger.qnxzip_mkdir(cur_path);
  203. }
  204.  
  205. void QnxFolderManager::term(int) {
  206. zip_manger.data->save();
  207. delete (zip_manger.data);
  208. }
  209.  
  210. int QnxFolderManager::unlink(resmgr_context_t *ctp, io_unlink_t *msg, iofunc_attr_t *attr, void *reserved) {
  211. printf("Unlink\n");
  212. strncpy(cur_path, msg->connect.path, strlen(msg->connect.path));
  213. if (S_ISREG(attr->mode)) {
  214. if (zip_manger.qnxzip_unlink(cur_path) < 0) {
  215. return ENFILE;
  216. }
  217. }
  218. if (S_ISDIR(attr->mode)) {
  219. if (zip_manger.child_num(cur_path) > 0) {
  220. return ENOTEMPTY;
  221. }
  222. if (zip_manger.qnxzip_rmdir(cur_path) < 0) {
  223. return ENFILE;
  224. }
  225. }
  226.  
  227. return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement