Qt: Add version check for setTextInteractionFlags
[metze/wireshark/wip.git] / ui / export_object_ui.c
1 /* export_object_ui.c
2  * Common routines for tracking & saving objects found in streams of data
3  * Copyright 2007, Stephen Fisher (see AUTHORS file)
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
22  * USA.
23  */
24
25 #include "config.h"
26
27 #include <string.h>
28
29 #include <errno.h>
30
31 #include <glib.h>
32
33 #include <epan/packet_info.h>
34 #include <epan/tap.h>
35
36 #include <wiretap/wtap.h>
37
38 #include <wsutil/file_util.h>
39
40 #include <ui/alert_box.h>
41
42 #include "export_object_ui.h"
43
44 gboolean
45 eo_save_entry(const gchar *save_as_filename, export_object_entry_t *entry, gboolean show_err)
46 {
47     int to_fd;
48     gint64 bytes_left;
49     int bytes_to_write;
50     ssize_t bytes_written;
51     guint8 *ptr;
52     int err;
53
54     to_fd = ws_open(save_as_filename, O_WRONLY | O_CREAT | O_EXCL |
55              O_BINARY, 0644);
56     if(to_fd == -1) { /* An error occurred */
57         if (show_err)
58             open_failure_alert_box(save_as_filename, errno, TRUE);
59         return FALSE;
60     }
61
62     /*
63      * The third argument to _write() on Windows is an unsigned int,
64      * so, on Windows, that's the size of the third argument to
65      * ws_write().
66      *
67      * The third argument to write() on UN*X is a size_t, although
68      * the return value is an ssize_t, so one probably shouldn't
69      * write more than the max value of an ssize_t.
70      *
71      * In either case, there's no guarantee that a gint64 such as
72      * payload_len can be passed to ws_write(), so we write in
73      * chunks of, at most 2^31 bytes.
74      */
75     ptr = entry->payload_data;
76     bytes_left = entry->payload_len;
77     while (bytes_left != 0) {
78         if (bytes_left > 0x40000000)
79             bytes_to_write = 0x40000000;
80         else
81             bytes_to_write = (int)bytes_left;
82         bytes_written = ws_write(to_fd, ptr, bytes_to_write);
83         if(bytes_written <= 0) {
84             if (bytes_written < 0)
85                 err = errno;
86             else
87                 err = WTAP_ERR_SHORT_WRITE;
88             if (show_err)
89                 write_failure_alert_box(save_as_filename, err);
90             ws_close(to_fd);
91             return FALSE;
92         }
93         bytes_left -= bytes_written;
94         ptr += bytes_written;
95     }
96     if (ws_close(to_fd) < 0) {
97         if (show_err)
98             write_failure_alert_box(save_as_filename, errno);
99         return FALSE;
100     }
101
102     return TRUE;
103 }
104
105 /*
106  * Editor modelines
107  *
108  * Local Variables:
109  * c-basic-offset: 4
110  * tab-width: 8
111  * indent-tabs-mode: nil
112  * End:
113  *
114  * ex: set shiftwidth=4 tabstop=8 expandtab:
115  * :indentSize=4:tabSize=8:noTabs=true:
116  */