Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
331c3e36333f09abaeb7edc1536412e8adcb1552
[simgrid.git] / src / msg / msg_io.c
1 /* Copyright (c) 2004 - 2013. The SimGrid Team.
2  * All rights reserved.                                                       */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package.   */
6
7 #include "msg_private.h"
8 #include "xbt/log.h"
9
10 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
11                                 "Logging specific to MSG (io)");
12
13 /** @addtogroup msg_file_management
14  *     \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Files" --> \endhtmlonly
15  * (#msg_file_t) and the functions for managing it.
16  *
17  *  \see #msg_file_t
18  */
19
20 /********************************* File **************************************/
21 void __MSG_file_get_info(msg_file_t fd){
22   xbt_dynar_t info = simcall_file_get_info(fd->simdata->smx_file);
23   fd->info->content_type = xbt_dynar_pop_as(info, char *);
24   fd->info->storage_type = xbt_dynar_pop_as(info, char *);
25   fd->info->storageId = xbt_dynar_pop_as(info, char *);
26   fd->info->mount_point = xbt_dynar_pop_as(info, char *);
27   fd->info->size = xbt_dynar_pop_as(info, size_t);
28
29   xbt_dynar_free_container(&info);
30 }
31 /** \ingroup msg_file_management
32  * \brief Display information related to a file descriptor
33  *
34  * \param fd is a the file descriptor
35  */
36
37 void MSG_file_dump (msg_file_t fd){
38 //   THROW_UNIMPLEMENTED;
39   /* Update the cached information first */
40   __MSG_file_get_info(fd);
41   XBT_INFO("File Descriptor information:\n\t\tFull name: '%s'"
42       "\n\t\tSize: %zu\n\t\tMount point: '%s'\n\t\tStorage Id: '%s'"
43       "\n\t\tStorage Type: '%s'\n\t\tContent Type: '%s'",
44       fd->fullname, fd->info->size, fd->info->mount_point, fd->info->storageId,
45       fd->info->storage_type, fd->info->content_type);
46 }
47
48 /** \ingroup msg_file_management
49  * \brief Read a file
50  *
51  * \param size of the file to read
52  * \param fd is a the file descriptor
53  * \return the number of bytes successfully read
54  */
55 size_t MSG_file_read(size_t size, msg_file_t fd)
56 {
57   return simcall_file_read(size, fd->simdata->smx_file);
58 }
59
60 /** \ingroup msg_file_management
61  * \brief Write into a file
62  *
63  * \param size of the file to write
64  * \param fd is a the file descriptor
65  * \return the number of bytes successfully write
66  */
67 size_t MSG_file_write(size_t size, msg_file_t fd)
68 {
69   return simcall_file_write(size, fd->simdata->smx_file);
70 }
71
72 /** \ingroup msg_file_management
73  * \brief Opens the file whose name is the string pointed to by path
74  *
75  * \param mount is the mount point where find the file is located
76  * \param fullname is the file location on the storage
77  *
78  * \return An #msg_file_t associated to the file
79  */
80 msg_file_t MSG_file_open(const char* mount, const char* fullname)
81 {
82   msg_file_t file = xbt_new(s_msg_file_t,1);
83   file->fullname = xbt_strdup(fullname);
84   file->simdata = xbt_new0(s_simdata_file_t,1);
85   file->info = xbt_new0(s_file_info_t,1);
86   file->simdata->smx_file = simcall_file_open(mount, fullname);
87   return file;
88 }
89
90 /** \ingroup msg_file_management
91  * \brief Close the file
92  *
93  * \param fd is the file to close
94  * \return 0 on success or 1 on error
95  */
96 int MSG_file_close(msg_file_t fd)
97 {
98   int res = simcall_file_close(fd->simdata->smx_file);
99   free(fd->fullname);
100   xbt_free(fd->simdata);
101   xbt_free(fd->info);
102   xbt_free(fd);
103   return res;
104 }
105
106 /** \ingroup msg_file_management
107  * \brief Unlink the file pointed by fd
108  *
109  * \param fd is the file descriptor (#msg_file_t)
110  * \return 0 on success or 1 on error
111  */
112 int MSG_file_unlink(msg_file_t fd)
113 {
114   return simcall_file_unlink(fd->simdata->smx_file);
115 }
116
117 /** \ingroup msg_file_management
118  * \brief Return the size of a file
119  *
120  * \param fd is the file descriptor (#msg_file_t)
121  * \return the size of the file (as a size_t)
122  */
123
124 size_t MSG_file_get_size(msg_file_t fd){
125   return simcall_file_get_size(fd->simdata->smx_file);
126 }
127
128 /** \ingroup msg_file_management
129  * \brief Search for file
130  *
131  * \param mount is the mount point where find the file is located
132  * \param path the file regex to find
133  * \return a xbt_dict_t of file where key is the name of file and the
134  * value the msg_stat_t corresponding to the key
135  */
136 xbt_dict_t MSG_file_ls(const char *mount, const char *path)
137 {
138   xbt_assert(path,"You must set path");
139   int size = strlen(path);
140   if(size && path[size-1] != '/')
141   {
142     char *new_path = bprintf("%s/",path);
143     XBT_DEBUG("Change '%s' for '%s'",path,new_path);
144     xbt_dict_t dict = simcall_file_ls(mount, new_path);
145     xbt_free(new_path);
146     return dict;
147   }
148
149   return simcall_file_ls(mount, path);
150 }
151
152 /********************************* Storage **************************************/
153
154 /** \ingroup msg_storage_management
155  * \brief Return the free space size of a storage element
156  * \param the storage name (#char*)
157  * \return the free space size of the storage element (as a size_t)
158  */
159 size_t MSG_storage_get_free_size(const char* name){
160   return simcall_storage_get_free_size(name);
161 }
162
163 /** \ingroup msg_storage_management
164  * \brief Return the used space size of a storage element
165  * \param the storage name (#char*)
166  * \return the used space size of the storage element (as a size_t)
167  */
168 size_t MSG_storage_get_used_size(const char* name){
169   return simcall_storage_get_used_size(name);
170 }
171
172 /** \ingroup msg_storage_management
173  * \brief Returns a xbt_dict_t consisting of the list of properties assigned to this storage
174  * \param storage a storage
175  * \return a dict containing the properties
176  */
177 xbt_dict_t MSG_storage_get_properties(msg_storage_t storage)
178 {
179   xbt_assert((storage != NULL), "Invalid parameters (storage is NULL)");
180
181   xbt_die( "Not implemented yet");
182   return xbt_dict_new();
183   //return (simcall_host_get_properties(storage));
184 }
185
186 /** \ingroup msg_storage_management
187  * \brief Finds a msg_storage_t using its name.
188  * \param name the name of a storage.
189  * \return the corresponding storage
190  */
191 msg_storage_t MSG_storage_get_by_name(const char *name)
192 {
193   return (msg_storage_t) xbt_lib_get_elm_or_null(host_lib,name);
194 }
195
196